*以下内容来自本人对于《SQL必知必会(第四版)》的笔记与总结*
第一课 了解SQL
数据库是一个以某种有组织的的文件存储的数据集合。
数据库软件应称为数据库管理系统(DBMS)。数据库是通过DBMS创建和操纵的容器。
表是某种特定类型数据的结构化清单,使表名成为唯一的,实际上是数据库名和表名等的组合。
描述表的特性的信息就是所谓的模式(Schema)。
表中的列储存着某种特定的信息,行是表中的一个记录。
主键(primary key)是一列,其值能唯一标识表中每一行。
SQL是一种专门用来与数据库沟通的语言。
第二课 检索数据
关键字,为保留字,例如SELECT,不能作为表或列的名字。
检索单个列:
SELECT prod_name
FROM Products;
如果没有明确排序查询结果,则返回的数据没有特定的顺序;只要返回相同数目的行,就是正常的。
多条SQL语句必须用分号(;)分隔。
SQL不区分大小写。
检索多个列:
SELECT prod_id, prod_name, prod_price
FROM Products;
用逗号分隔。
检索所有列:
SELECT *
FROM Products
检索不同值:
SELECT DISTINCT vend_id
FROM Products;
检索前几行:
SELECT TOP 5 prod_name
FROM Products;
或者
SELECT prod_name
FROM Products
WHERE ROWNUM <= 5;(LIMIT 5;)
也可以规定起始位置: LIMIT 5 OFFSET 5 意思是从第六行开始。
注释:--,或者#是单行注释;
/* */可以用来写多行注释
第三课 检索排序数据
子句(clause):SELECT语句后的FROM也是子句,有些子句不是必须的。
加上ORDER BY子句,可以对数据排序。ORDER BY子句应为最后的子句。
如果按照多个列排序,仅在第一个排序值有相同值时,才在相同值按照第二个排序值排序,否则,仅仅用第一个值排序。
默认是升序,降序需要加DESC。
第四课 过滤数据
使用WHERE子句。
不等于可以是<>,也可以是!=;
过滤字符串时要加引号‘’;
范围过滤用BETWEEN 5 AND 10;
空值过滤用IS NULL。
第五课 高级数据过滤
可在WHERE后加上AND ,OR进行多个条件的组合过滤;
SQL在同时出现OR和AND时,优先处理AND;
可以使用圆括号人为定义运算的优先级顺序。
IN过滤符举例:WHERE vend_id IN (“DLL01”,“BRS01”)
NOT过滤符举例:WHERE NOT vend_id = "DLL01"
第六课 用通配符进行过滤
LIKE通配符:WHERE prod_name LIKE "Fish%";
通配符可以用%,表示0个,1个或多个任意字符;也可以用_,表示一个任意字符。
使用通配符过滤时,区分大小写。
[]可以匹配字符集;
例如WHERE cust_name LIKE "[JM]%",意思是,以J和M开头的都可以;
^(脱字号)表示反向;[^JM]%表示的是除了J和M开头的;
第七课 创建计算字段
字段(field)的意思与列相同。
计算字段意思是直接从数据库中检索出转换、计算或格式化过的数据,而不是先检索出数据再在客户端进行计算。
拼接字段:
SELECT vend_name + "(" + ven_country + ")"
或者SELECT Concat(vend_name,"(",vend_country,")")
FROM Vendors
ORDER BY Vend_name;
用SELECT RTRIM(vend_name) + "(" + RTRIM(ven_country) + ")"可以去掉字符串右侧的空格;
同样的,LTRIM可以去掉左侧的空格
用AS关键词可以赋予列别名(alias)
别名前可以直接用运算符执行算术计算。
第八课 使用函数处理数据
UPPER 将文本转化成大写
LOWER 将文本转化成小写
LENGTH 返回长度
DATEPART(yy,order_date):日期处理函数在各个DBMS很不一样
第九课 汇总数据
AVG()平均值
COUNT()行数
MAX()最大值
MIN()最小值
SUM()某列求和
可以用DISTINCT参数,例如AVG(DISTINCT prod_price)实现特殊聚集
第十课 分组数据
GROUP BY可以将数据分为多个逻辑组,并对每个组进行聚集计算
举例:
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id
分组中过滤数据用HAVING;
HAVING 过滤的是分组,而WHERE 过滤的是行
第十一课 使用子查询
在WHERE条件中写新的SELECT即为子查询。子查询要用小括号整个括起来。
对于子查询的个数没有限制,不过实际中为了使用方便一般都不能嵌套太多的子查询。