《SQL基础教程》读书笔记


第一章 数据库和SQL

1.2数据库的结构

·关系型数据库:行代表记录,列代表字段,以行为单位进行读写

1.3SQL概要

·SQL包括DDL、DML、DCL。SQL不区分大小写,以分号为结尾,可逐句执行

·特殊常量:字符串用单引号标识,如‘db’。日期‘年-月-日’

1.4创建表

·创建数据库:CREATE DATABASE <数据库名>  

·创建表:CREATE TABLE <表名>

(<列名><数据类型><列约束>,

 <表约束>,<表约束>)

·数据类型:数字型、字符型(CHAR,VARCHAR)、日期型(DATE)。注意,CHAR在存储字符串未达到最大程度时,自动空格补足,如‘ABC      ’;而VARCHAR不会自动补空格

·约束

列约束:NOT NULL。当某记录该字段为空时,该记录写入失败

表约束:PRIMARY KEY (列名)。每个记录主键不重复,否则写入失败

1.5表的删除和更新

·删除表:DROP TABLE <表名> 

·更改表:ALTER TABLE<表名> ADD COLUMN<列定义>

                                    DROP COLUMN <列定义>


第二章 查询基础

2.1SELECT、FROM、WHERE

·SELECT <列名,列名> FROM <表名> WHERE <条件>

执行顺序:FROM选定操作的表, WHERE过滤满足条件的记录(行), SELECT选出指定的列

·列名可以为*,表示所有列

·SELECT <列名> AS <自定义列名>

·SELECT DISTINCT <列名1,列名2>。删除重复行,NULL看作一类数据。DISTINCT只能放在第一个列名之前

2.2算术运算符和比较运算符

·算术运算:加减乘除

·包含NULL字段的算术运算,结果都为NULL

·比较运算:=,<>,<,>,<=,>=

·字符型CHAR,VARCHAR比较大小是按照字典序比较,而不是数字大小。DATE可以直接比较大小

·对NULL值字段进行比较运算,结果都为NULL。判断是否为NULL不能用<字段名>=NULL,这样什么结果都得不到,应该用IS NULL, IS NOT NULL

2.3逻辑运算符

·逻辑运算:AND, OR, NOT。结合括号匹配优先级

·对NULL做逻辑运算(三值逻辑):TRUE AND NULL = NULL; FALSE AND NULL = FALSE;TRUE OR NULL = TRUE; FALSE OR NULL = NULL。例,WHERE 28 = NULL AND TRUE 值为NULL,所以WHERE过滤后得不到任何记录

·因此,列约束NOT NULL的重要性得以体现


第三章 聚合和排序

3.1聚合查询

·所谓聚合,就是将多行数据汇总为一行。一条记录为一行,将记录按某些列的不同值分组为一组

·聚合函数:SUM,COUNT,MAX等。例,

SELECT COUNT(<列名>) FROM <表名> 

·COUNT(*)得到包含NULL的行数。 COUNT(<列名>)得到该列去除NULL后的行数

·除COUNT(*)外,所有聚合函数都将NULL排除在外计算结果,如SUM,AVG,MAX等。注意,不是把NULL值当做0计算,而是不参加计算

·聚合函数和DISTINCT配合使用。如去重后计数:

SELECT COUNT(DISTINCT <>) FROM <>

注意DISTINCT的位置,如果写成SELECT DISTINCT COUNT(<>)则达不到效果

3.2对表分组GROUP BY

·书写顺序:SELECT <列名> FROM <表名> WHERE 条件 GROUP BY <列名>

聚合键值为NULL的行会被聚合为一类。GROUP BY常常和SELECT、HAVING中的聚合函数配合使用

·执行顺序:FROM WHERE GROUP BY SELECT

·使用聚合函数和GROUP BY常见错误:

1、SELECT中出现聚合键之外的其他列名。GROUP BY和SELECT配合使用时,SELECT只能包含聚合键、聚合函数和常数。因为其他列无法和聚合键一一对应。

如表A有如下列:c1,c2,c3,c4。GROUP BY c1后,得到的临时表为:c1,聚合函数(c2,c3,c4)

错误例子:SELECT C1, C2, AVG(C1) FROM T1

2、GROUP BY中写了列的别名。注意执行顺序,SELECT中定义的别名在GROUP BY中还未生效

3、GROUP BY得到的结果是随机无序的

4、在WHERE中使用聚合函数。聚合函数只有在SELECT, HAVING, ORDER BY中使用

错误例,选出有两行记录的那一类:SELECT <> FROM <> WHERE COUNT(*) = 2 GROUP BY<>。应该用HAVING实现

3.3聚合结果条件语句HAVING

·WHERE=某一行的过滤条件,HAVING=聚合后以组为单位的过滤条件(如,数据行数为2的组,平均值为20的组)

·书写顺序:SELECT FROM WHERE GROUP BY HAVING。例,选择有两条单价大于100的记录的商品种类:SELECT type FROM product WHERE sale > 100 GROUP BY type HAVING BY COUNT(*) = 2

·HAVING字句只能包含:常数、聚合函数、GROUP BY中的聚合键。不能出现其他列的原因同上,GROUP BY后其他列无法和聚合键一一对应

·聚合键对应的条件,既可以写在WHERE中,也可以写在HAVING中,结果相同。不过,推荐写在WHERE中,原因如下:

1、语意更明确

2、WHERE中的列可以利用索引,提高处理速度

3、HAVING中常使用聚合函数,而使用聚合函数时会涉及对数据的排序。应该优先在WHERE中过滤掉部分数据,减小排序的数据量,而不是把过滤条件放在执行考后的HAVING中

3.4排序ORDER BY

·书写顺序:SELECT FROM WHERE GROUP BY HAVING ORDER BY。ORDER BY<列名1>,<列名2>,成为排序键。默认升序排列,DESC为降序

·选为排序键的列若含有NULL,会排在最前或最后,这取决于具体数据库

·执行顺序:FROM WHERE GROUP BY HAVING SELECT ORDER BY。所以select中的别名,order by中可以识别

·ORDER BY中可以使用聚合函数和SELECT中未出现的列


第四章 数据更新

4.1插入

·INSERT

4.2删除

·DELETE

4.3更新

·UPDATE

4.4事务性

·ACID特性

·TRANSACTION、COMMIT、ROLLBACK


第五章 复杂查询

5.1视图

·创建视图

CREATE VIEW 视图名称(视图列名1,列名2) AS

例如,CREATE VIEW productSum (type, count)

AS SELECT type, COUNT(*) FROM product GROUP BY type

·使用视图

SELECT 视图列名 FROM 视图名,例如,SELECT type FROM productSum

·视图的用处:保存高频使用的SELECT语句

·视图就是临时表。视图和表的区别:是否保存了实际数据

·多重视图:在视图的基础上再建新视图

CREATE VIEW 视图名称(视图列名1,列名2) AS