《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 <SELECT语句>

例如,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 <SELECT 列名 FROM 已存在的视图>

避免使用多重视图,严重影响数据库引擎效率

·视图不能使用ORDER BY

·最好不要对视图进行写操作(INSERT, DELETE, UPDATE)。只有能和原表一一对应的视图才可以进行写操作:

1、SELECT中没有使用DISTINCT

2、FROM中只有一个表,没有使用连接查询

3、没有使用GROUP BY和HAVING

·删除视图 DROP  VIEW

5.2子查询

·子查询:将用来定义视图的SELECT语句直接作为外层的FROM语句中

SELECT a FROM (SELECT a FROM A) AS 子查询名称

执行顺序显然由内向外。最好用AS设定子查询名称

·理论子查询可以无限嵌套,但是子查询会严重影响性能

·标量子查询:返回单一值的子查询(一行一列)。常常在WHERE中使用,可以避免WHERE不能使用聚合函数的缺陷。也可以使用在SELECT、GROUP BY语句中

例,SELECT ID FROM PRODUCT WHERE SALE > (

SELECT AVG(SALE) FROM PRODUCT)

·注意,标量子查询必须返回一行一列,否则在SELECT中可能出错,因为行数无法对应

5.3关联子查询

·背景:查询每个种类中高于该种类均价的商品

·错误写法:

SELECT NAME FROM PRODUCT

WHERE SALE > (

SELECT AVG(SALE)  FROM PRODUCT 

GROUP BY TYPE )

因为SELECT AVG(SALE)  FROM PRODUCT GROUP BY TYPE得到的数据是多行,不是标量子查询 

·正确写法:

SELECT NAME FROM PRODUCT AS P1

WHERE SALE > (

SELECT AVG(SALE)  FROM PRODUCT AS P2 

WHERE P1.TYPE = P2.TYPE GROUP BY TYPE )

·在GROUP BY分组后的细分组内比较时,需要关联子查询

·关联条件必须放在子查询的WHERE中,因为AS别名的作用域是外部看不见内部,内部看得见外部


第六章 函数、谓词、case

6.1函数

·常见函数包括:聚合函数、算书函数、日期函数、字符串函数

具体使用是查阅API

6.2谓词

·LIKE:字符串模糊查询。%表示任意长度字符串,_表示一个字符。=是精确查询

SELECT <列名> FROM <表名> WHERE type LIKE ‘%dd_’

·BETWEEN a AND b等价于 >=a && <= b。想不包含边界值,必须用<,>

·IS NULL ,IS NOT NULL

·IN的作用相当于OR。

WHERE price = 100 OR price = 200 等价于WHERE price IN(100,200)

但是IN无法选取出NULL数据,NULL必须用IS NULL判断!NOT IN的参数中若包括NULL,则无法筛选出任何数据,如WHERE price NOT IN (100, NULL)

·使用子查询,也就是视图,作为IN的参数。

SELECT <列名> FROM <表1> WHERE id IN (

SELECT id FROM <表2> WHERE<条件>)

·EXIST只有一个参数,在右侧,通常是一个关联子查询

SELECT name FROM product WHERE EXIST (

SELECT * FROM shop WHERE product.pid = shop.pid AND shop.sid = 1)

等价于

SELECT name FROM product WHERE pid IN (

SELECT * FROM shop WHERE shop.sid = 1)

EXIST中的子查询SELECT后为什么列并不影响结果,EXIST只关心有没有存在的行,写成*只是一种习惯

·IN,NOT IN可以和EXIST,NO EXIST互相替换

6.3CASE表达式

·语法:CASE WHEN <求值表达式> THEN <表达式>

CASE就像一个表达式,可以写在任意位置,但通常和SELECT配合使用,处理查询结果




第七章 集合运算

7.1表的加减法

·并集UNION。会自动去重,想要不去重,使用UNION ALL字段

注意事项:运算的两个对象记录必须列数相同且类型相同;ORDER BY必须在最后使用

SELECT A, B FROM T1 UNION SELECT A, B FROM T2

·INTERSECT交集,EXCEPT差集

7.2联结

·JOIN,就是将其他表的列添加过来。a有三列, JOIN b三列,会得到一个六列的临时表

·INNER JOIN。以表a中的列为桥梁,将b中满足相同条件的列汇集到一个临时表中。

FROM t1 INNER JOIN t2 ON t1.id = t2.id

三要素:用在FROM子句中;ON设置联结条件,一般用=,也可以用<等条件;SELECT子句中列名注意区分在不同表

·OUTER JOIN。语法同内链接相同。不同之处在于,表a中联结条件存在的数据若表b中不存在,在最后的临时表中仍会有记录,以NULL的形式存在

·LEFT,RIGHT JOIN。OUTER JOIN是左右两个表都为主表,可以选择单个主表

·可以联结多个表

·交叉联结(笛卡尔积)CROSS JOIN。完全交叉,新表的行数为len(a) * len(b)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350