看了《SQL进阶教程》之后,感觉很不错,趁618入手了这本《SQL基础教程》,希望有什么可以让人眼前一亮的知识。
- 将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合称为数据库。
- DCL(Data Control Language,数据控制语言)用来确认或者取消对数据库中的数据进行的变更。比如:COMMIT,ROLLBACK,GRANT,REVOKE。
- 列的数据类型是CHAR型,字符串以定长字符串的形式存储在被指定为CHAR型的列中。所谓定长字符串,就是当列中存储的字符串长度达不到最大长度的时候,使用半角空格进行补足。
- VARCHAR型是可变长字符串。
- 在使用DISTINCT时,NULL也被视为一类数据,NULL存在于多行中时,也会被合并为一条NULL数据。
- DISTINCT关键字只能用在查询的第一个列名之前。
- 算术运算符有NULL时,结果都是NULL。比如
NULL/0
不会发生错误,结果是NULL。 - 比较字符串以字典顺序进行比较。
- 用于汇总的函数称为聚合函数或聚集函数,就是将多行汇总为一行。
- 不使用GROUP BY子句时,是将表中的所有数据作为一组来对待的。
- 把聚合键之外的列名书写在SELECT子句之中会出现错误,MYSQL除外。
- 实际上,只有SELECT子句和HAVING子句,以及ORDER BY子句中能使用COUNT等聚合函数。(执行顺序在GROUP BY之后的)
- HAVING子句中能够使用的3种要素是:①常数;②聚合函数;③GROUP BY子句中指定的列名(即聚合键)。都是对组来说是唯一值得。
- SELECT执行的顺序:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY;这也是为什么ORDER BY可以使用列的别名的原因。
- 多行INSERT可以同时插入多行数据,但是ORACLE并不支持,ORACLE使用如下实现多行插入:
INSERT ALL INTO table1() VALUES() INTO table2() VALUES() SELECT 1 FROM dual;
INSERT ALL WHEN condition1 THEN INTO table1 VALUES() WHEN condition2 THEN INTO table2 VALUES() SELECT * FROM table
INSERT ALL WHEN condition1 THEN INTO table1 VALUES() ELSE INTO table2 VALUES() SELECT * FROM table
- 事务就是需要在同一个处理单元中执行的一系列更新处理的集合。
- MySQL的事务开始语句是
START TRANSACTION
,ORACLE没有;事务的结束语句都是:COMMIT
,ROLLBACK
。 - 实际上,几乎所有的数据库产品的事务都无需开始指令。这是因为大部分情况下,事务在数据库连接建立时就已经悄悄开始了,并不需要用户再明确发出开始指令。例如,使用ORACLE时,数据库建立连接以后,第一条SQL执行的同时,事务就已经悄悄开始了。
- 通常有两种模式:①每条SQL就是一个事务。比如MYSQL。②直到用户执行COMMIT或者ROLLBACK为止算作一个事务。比如ORACLE。所以ORACLE执行了DELETE也可以通过ROLLBACK回滚。
- 事务的一致性:指的是事务中包含的处理要满足数据库提前设置的约束。
- 视图不保存实际的数据。实际上视图保存的是SELECT语句。
- 视图中的数据会随着原表的变化自动更新,视图归根到底是SELECT语句,所谓“参照视图”也就是“执行SELECT语句”的意思。
- 多重视图会降低SQL的性能,应该避免在视图的基础上创建视图。
- 定义视图时,不要使用ORDER BY。
- 视图只有满足以下条件,才能被更新:①SELECT子句中没有使用DISTINCT。②FROM子句中只有一张表。③未使用GROUP BY子句。④未使用HAVING子句。
- 子查询就是一张一次性视图。
- 标量子查询必须而且只能返回一行一列的结果。就是返回单一值的查询,所以可以使用
=
,<>
等进行比较。 CAST(转换前的值 AS 想要转换的数据类型)
- COALESCE函数会返回可变参数中左侧开始第一个不是NULL的值。
- 谓词的返回值是真值(TRUE、FALSE、UNKNOWN)。
- 内联结是交叉联结的一部分,“内”也可以理解为“包含在交叉联结结果中的部分”。相反,外联结的“外”可以理解为“交叉联结结果之外的部分”。
- 窗口函数也称作OLAP函数,意思是对数据库数据进行实时分析处理。
- 能够作为窗口函数使用的函数:①聚合函数(SUM、AVG、COUNT、MAX、MIN)。②RANK、DENSE_RANK、ROW_NUMBER等专用窗口函数。
- PARTITION BY子句并不具备GROUP BY子句的汇总功能。
- 通过PARTITION BY分组后的记录集合称为窗口。此处的窗口并非“窗户”的意思,而是代表范围。
- 窗口函数只写在SELECT子句中。在SELECT子句外使用窗口函数是没有意义的。
- 在DBMS内部,窗口函数是对WHERE子句或者GROUP BY子句处理后的“结果”进行的操作。
- 窗口函数指定范围:
ROWS n PRECENDING
(从自身往前n行,加上自己一共n+1行),ROWS n FOLLOWING
(从自身往后n行,加上自己一共n+1行),ROWS BETWEEN n PRECENDING AND n FOLLOWING
(自身前后n行,加上自己一共2n+1行)。 - OVER子句中的ORDER BY只是用来决定窗口函数按照什么样的顺序进行计算的,对结果的排列顺序并没有影响。
ROLLUP
可以同时得出合计和小计。会同时得出①GROUP BY()
②GROUP BY(colum1)
③GROUP BY(colum1,colum2)
…GROUP BY(colum1...column)
的汇总。- 使用
GROUPING
函数能够简单地分辨出原始数据中的NULL和超级分组记录中的NULL。 CUBE
函数是在ROLLUP
的基础上增加GROUP BY中的每个单独聚合键汇总结果。
更多推荐
《SQL基础教程》读书小记
发布评论