Reference:
SQL 基础教程读书笔记
p14
SQL 语句种类:
- DDL(Data Definition Language, 数据定义语言) CTEATE; DROP; ALTER.
- DML(Data Munipulation Language, 数据操作语言) SELECT; INSERT; UPDATE; DELETE.
- DCL(Data Control Language, 数据控制语言) COMMIT; ROLLBACK; GRANT; REVOKE.
p21
数据库名称,表名和列名都只能用半角英文,半角数字,下划线.
p22
SQL 最基本的数据类型:
- integer: 整数,不能存储小数.
- char: 定长, 多余位数使用空格补足.
- varchar(varing character): 以可变长字符串形式保存字符串.
- date: 存储日期的列的数据类型.
p24 约束
p44 注释
- 单行注释 --
- 多行注释 /* */
p65 三值逻辑,特殊对待 NULL
p69
5 个常用函数: COUNT, SUM, AVG, MAX, MIN.
p74 聚合函数会将 NULL 排除在外,除了 COUNT(*)
p79
使用聚合函数和 GROUP BY 子句时注意以下四点:
- 只能写在 SELECT 子句之中
- GROUP BY 子句中不能使用 SELECT 子句中的别名
- GROUP BY 子句中的聚合结果是无序的
- WHERE 子句中不能使用聚合函数
p89
WHERE 子句用来指定行记录的条件,HAVING 用来指定组的条件.
p95
WHERE 子句和 HAVING 子句的执行速度,WHERE 子句快.
p101
使用 HAVING 子句时 SELECT 语句的顺序: FROM-WHERE-GROUP BY-HAVING-SELECT-ORDER BY
p107
INSERT INTO TABLE_NAME (列名,列名,...) VALUES(值1, 值2...)
对表中所有列插入时可省略表名后面的列清单.
在 VALUE 子句中指定 DEFAULT 关键字来显式插入默认值;省略语句中的列名,就会自动
设定为该列的默认值(没有默认值时会设定为 NULL).
p117
DROP TABLE TABLE_NAME 将表完全删除
DELET FROM TABLE_NAME 会留下表,而删除表中的全部数据
DELETE FROM TABLE_NAME WHERE <...>
p120
TRUNCATE TABLE_NAME 删除全部数据,不能使用 WHERE 子句,速度比 DELETE 快.
p121
UPDATE TABLE_NAME SET <列名> = <表达式> WHERE <条件>;
同时更新多列时,可以在 UPDATE 语句中的 SET 子句中,使用逗号分隔更新对象的多个列.
p126
事务是需要在同一个处理单元中执行的一系列更新处理的集合.
事务处理的终止命令包括 COMMIT(提交处理)和 ROLLBACK(取消处理).
DBMS 事务具有原子性(Atomicity),一致性(Consistency),隔离性(Isolation),
持久性(Durability), ACID
p127
事务语法
BEGIN TRANSACTION ... ...DML ... COMMIT/ROLLBACK
p137
从 SQL 角度说,视图和表是相同的.两者的区别在于表中保存的是真实的数据,视图中的
保存的是 SELECT 语句.
p138
视图的优点: 1.视图无需保存数据,节省存储设备的空间 2.可以将频繁使用的 SELECT 语句
保存成视图.
p139
CREATE VIEW VIEW_NAME(视图列名1, 视图列名2 ...) AS <SELECT 语句>
p142
多重视图(from VIEW_NAME),多重视图会降低 SQL 性能.
p142
视图的限制:1. 定义视图不能使用 ORDER BY 2. 对视图进行更新.
视图可以更新的条件:
- SELECT 语句中未使用 DISTINCT
- FROM 子句中只有一张表
- 未使用 GROUP BY
- 未使用 HAVING
p145
由于 postgresql 中视图初始设定为只读,需要使用代码来允许更新操作,mysql 中不用.
CREATE OR REPALCE RULE insert_rule AS ON INSERT TO VIEW_NAME DO INSTEAD INSERT INTO TABLE_NAME ( new.列名, new.列名, ...);
p147
使用 DROP VIEW VIEW_NAME CASCADE; 来删除以视图为基础创建出来的多重视图.
p148
子查询就是一次性的视图,但是在 SELECT 语句执行完毕之后就会消失。
标量子查询就是只能返回一行一列的子查询
p156 关联子查询, 关联子查询的的结合条件要写在子查询中.
p165
- 算术函数
- 加减乘除
- ABS(数值)
- MOD(被除数,除数)
- ROUND(对象数值,保留小数的位数)
- 字符串函数
- str1 || str2 拼接
- LENGTH(str)
- LOWER(str)
- REPLACE(对象字符串,替换前的字符串,替换后的字符串)
- SUBSTRING(对象字符串 FROM 截取的起始位置 FOR 截取的字符数)
- UPPER(str)
- 日期函数
- CURRENT_DATE
- CURRENT_TIME
- CURRENT_TIMESTAMP
- EXTRACT(日期元素 FROM 日期)
- 转换函数
- CAST(转换前的值 AS 想要转换的数据类型)
- COALESCE(数据1, 数据2,数据3......) 返回可变参数中左侧开始第一个不是 NULL 的值.
p186
谓词:需要满足特定条件的函数(返回值是真值),有
LIKE % 0字符以上的任意字符串 _ 任意一个字符串 BETWEEN IS NULL, IS NOT NULL IN 可以使用子查询作为参数; 子查询的返回值或指定值中不能包含 NULL,否则结果通常为空. EXITST. 通常指定关联子查询作为 EXIST 的参数,通常会使用 SELECT *
p202
CASE 表达式中的 ELSE 子句最好不要省略;END 不能省略
CASE WHEN <判断表达式> THEN <表达式> WHEN <判断表达式> THEN <表达式> ... ELSE <表达式> END
p213
集合运算: UNION, INTERSECT, EXCEPT. 使用 ALL 保留重复项.
集合运算注意事项: 作为运算对象的列数相同;列的类型一致;可以使用任何 SELECT
语句, ORDER BY 只能在最后使用一次.
p222
UNION 结果是纵向变长,JOIN 是横向变长.
- 内联结
- 外联结
- 交叉联结
p245
窗口函数也陈为 OLAP 函数(OnLine Analytical Processing).
p246
<窗口函数> OVER ([PARTITION BY <列清单>] ORDER BY <排序用清单>)
窗口函数大体可以分为:
能够作为窗口函数的聚合函数(SUM, AVG, COUNT, MAX, MIN)
RANK(1 1 1 4), DENSE_RANK(1 1 1 2), ROW_NUMBER(1 2 3 4) 等专用窗口函数.
p252
只能在 SELECT 语句中使用.
使用窗口函数使用的聚合函数, 累计
p254
框架 PRECEDING FOLLOWING
p260
GROUPING 运算符
- ROLLUP
- CUBE
- GROUPING SET