首页 > 代码库 > 数据库学习笔记

数据库学习笔记

sql server DBMS 学习SQL必知必会 第4版做的笔记

空置检查 Is NULL

没有重复的  distinct

前五条   top  5

值范围在两者之间    between

以什么方式排序 order by     默认升序     desc为降序

求值顺序:处理OR前优先处理AND,需要用括号明确分组以免得到不符合预期的结果,括号消除歧义

 

IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。下面的例子说明了这个操作
符:(这样写IN比OR执行得快)

SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ( ‘DLL01‘, ‘BRS01‘ )
ORDER BY prod_name;

 

NOT
WHERE子句中用来否定其后条件的关键字。

 

通配符搜索,只能用于文本段,在搜索串中,

%表示任何字符出现任意次数,可以在搜索模式任意位置使用,可使用多个通配符,只写一个%不会匹配NULL

_下划线通配符,只匹配单个字符,_总是刚好匹配一个字符,不能多也不能少。

[]通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符。

select cust_contact
from Customers
where cust_contact like ‘[JM]%‘  --代表找出cust_contact以J或M开头    [^JM]则表示不以J和M为开头的字符串
order by cust_contact;

通配符耗费时间更长

不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

 

计算字段

在SQL语句内可完成的许多转换和格式化工作都可以直接在客户端应用程序内完成。但一般来说,在数据库服务器上完成这些操作比在客户
端中完成要快得多。

拼接字段可用+或者||来拼接(SQL SERVER用+),可将两列拼接成一列显示

SQL RTRIM(str)可去掉str右边空格字符 LTRIM去掉左边空格字符  TRIM去掉左右两边的空格字符  

使用AS可以给列赋予别名,给拼接后的列一个别名可以像正常列那样使用拼接后的列,可以用加减乘除等计算字段

 

SQL函数

SQLSERVER使用SUBSTRING提取字符串部分  数据类型转换CONVERT()  提取当前日期 GETDATE

UPPER返回大写形式字符串 LOWER小写 LEFT(str,num)返回左边num位的字符  LENGTH()返回字符串长度  RIGHT(str,num)返回右边num为字符

soundex寻找发音相似的字符串

DATEPART()函数
有两个参数,它们分别是返回的成分和从中返回成分的日期。yy年 mm月 dd日

数值处理函数:

abs()返回绝对值   cos()返回余弦  exp()返回指数值   PI()圆周率  SIN()正弦值   sqrt()平方根  tan()一个角度的正切

 

聚集函数

需要汇总表中的数据,而不需要实际数据本身。因此,返回实际表数据纯属浪费时间和处理资源(更不用说带宽了)。再说一遍,
我们实际想要的是汇总信息。

五个聚集函数

AVG()返回平均值,参数值为列名,忽略值为NULL的值

COUNT()返回某列的行数 

使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。
使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。

MAX()返回某列的最大值,参数为列名,如果用于文本列则返回排序后的最后一列

MIN()返回某列的最小值,参数为列名,与MAX()相反

SUM()用来返回指定列值的和(总计),参数为列名

以上均可使用distinct,只包含不同的值,distinct不可用于COUNT(*)

可以组合使用聚集函数

警告:取别名
在指定别名以包含某个聚集函数的结果时,不应该使用表中实际的列名。虽然这样做也算合法,但许多SQL实现不支持,可能会产生模糊的
错误消息。

 

分组数据

使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。

group by 

GROUP BY子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行数据分组。
如果在GROUP BY子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以
不能从个别的列取回数据)。
GROUP BY子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP
BY子句中指定相同的表达式。不能使用别名。

如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

过滤分组

where过滤行,having过滤分组

过滤是基于分组聚集值,而不是特定行的值。

WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。

HAVING与WHERE非常类似,如果不指定GROUP BY,则大多数DBMS会同等对待它们。不过,你自己要能区分这一点。使用HAVING时应
该结合GROUP BY子句,而WHERE子句用于标准的行级过滤。

一般在使用GROUP BY子句时,应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据。

SELECT子句及其顺序

技术分享

 

使用子查询

在SELECT语句中,子查询总是从内向外处理。在处理上面的SELECT语句时,DBMS实际上执行了两个操作。

SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = ‘RGAN01‘);内部先返回一些值成为in操作符所需参数形式然后进行外部查询

包含子查询的SELECT语句难以阅读和调试,它们在较为复杂时更是如此。如上所示,把子查询分解为多行并进行适当的缩进,能极大地简
化子查询的使用。

在WHERE子句中使用子查询能够编写出功能很强且很灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性
能的限制,不能嵌套太多的子查询。使用子查询并不总是执行这类数据检索的最有效方法

子查询中的WHERE子句与前面使用的WHERE子句稍有不同,因为它使用了完全限定列名,而不只是列名。它指定表名和列名

虽然子查询在构造这种SELECT语句时极有用,但必须注意限制有歧义的列。即内部查询与外部查询可能有相同列,所以要指定列名

没有具体指定就会返回错误结果,因为DBMS会误解你的意思。有时候,由于出现冲突列名而导
致的歧义性,会引起DBMS抛出错误信息。例如,WHERE或ORDER BY子句指定的某个列名可能会出现在多个表中。好的做法是,如果
在SELECT语句中操作多个表,就应使用完全限定列名来避免歧义。

数据库学习笔记