本文首发在我的个人博客:https://jlice.top/p/7q0if/。欢迎大家前去参观,么么哒~
这本书总体上来讲还是比较简单的,SQL入门还是不难的。使用了三种数据库,语法有所不同,有点混乱。在看书的过程中记录了一些笔记,以便查阅吧。就是下面这本:
操作符
=
相等<>
,!=
不等>
,<
,>=
,<=
IS NULL
,IS NOT NULL
BETWEEN
介于(包含端点)NOT BETWEEN
IN
值在列表中,NOT IN
LIKE
通配符匹配:%
(>0个字符),_
(1个字符),NOT LIKE
EXISTS
,NOT EXISTS
UNIQUE
,NOT UNIQUE
ALL
,ANY
,SOME
(ANY
的别名)AND
,OR
+
,-
,*
,/
算术运算
汇总查询
COUNT
, SUM
, MAX
, MIN
, AVG
数据排序与分组
GROUP BY
, ORDER BY
CUBE
, ROLLUP
WHERE
子句设定SELECT
选择字段的条件;HAVING
子句设定GROUP BY
子句形成分组的条件。
字符函数
- 拼接字符串:
||
(Oracle),+
(SQL Sever),CONCAT
(MySQL) TRANSLATE
对应替换(类似于tr
命令)REPLACE
替换UPPER
,LOWER
SUBSTR
,SUBSTRING
字符串子串INSTR
查找,返回位置LTRIM
,RTRIM
在一侧切除字符串DECODE
在字符串中搜索字符串,如果找到了就显示另一个字符串IFNULL
如果是NULL就用替代值COALESCE
依次检查,返回第一个非NULL值LPAD
,RPAD
在一侧填充ASCII
ASCII值- 算术函数:
ABS
,ROUND
,SQRT
,SIGN
(符号函数),POWER
,CEIL
,FLOOR
,EXP
- 与数字转换(有的可以隐式转换):
TO_NUMBER
,STR
,TO_CHAR
日期和时间
不同的实现有所差别
MySQL:NOW
, DATE_ADD
, STR_TO_DATE
在查询里结合表
等值结合/内部结合:利用通用字段(一般是主键)结合两个表
SELECT TABLE1.COLUMN1, TABLE2.COLUMN2...
FROM TABLE1, TABLE2
WHERE TABLE1.COLUMN_NAME = TABLE2.COLUMN_NAME
将上面的=
改为!=
就是不等值结合、
外部结合的一般语法:
FROM TABLE1
{RIGHT | LEFT | FULL} [OUTER] JOIN TABLE2
ON TABLE1.COLUMN_NAME = TABLE2.COLUMN_NAME
使用子查询
子查询就是在另一个查询里执行的查询,用于进一步设置查询的条件。子查询不能使用ORDER BY
。
关联子查询是依赖主查询里的信息的子查询,即子查询里能引用主查询里的表(类似于闭包)。
组合多个查询
组合查询:有两个或多个SELECT
语句
组合操作符(位于两个SELECT
语句之间):
UNION
结合,不包含重复UNION ALL
结合,包含重复INTERSECT
返回前一个SELECT
语句里与后一个SELECT
语句里一样的记录EXCEPT
返回前一个SELECT
语句里有但后一个SELECT
语句里没有的记录
ORDER BY
可以用于组合查询,但只能用于对全部查询结果的排序;GROUP BY
可以用于组合查询中每个SELECT
语句,也可以用于全部查询结果;HAVING
可以用于组合查询里每个SELECT
语句。
SELECT COLUMN1
FROM TABLE1
WHERE
GROUP BY
HAVING
{UNION | UNION ALL | EXCEPT | INTERSECT}
SELECT COLUMN1
FROM TABLE1
WHERE
GROUP BY
HAVING
ORDER BY
高级SQL主题
【存储过程】
存储过程是一组相关联的SQL语句,通常被称为函数和子程序,利用存储过程可以实现过程化编程
MySQL创建存储过程:
CREATE PROCEDURE PROCEDURE_NAME
(ARGUMENT1 {IN | OUT | IN OUT} TYPE, ARGUMENT2 {IN | OUT | IN OUT} TYPE)
AS
BEGIN
PROCEDURE_BODY
END;
【触发器】
MySQL创建触发器:
CREATE TRIGGER TRIGGER_NAME
{BEFORE | AFTER}
{INSERT | UPDATE | DELETE}
ON TABLE_NAME
AS
SQL_STATEMENTS
MySQL里,FOR EACH ROW
可以在每条影响的记录时均执行一次触发器:
CREATE TRIGGER TRIGGER_NAME
ON TABLE_NAME
FOR EACH ROW
SQL_STATEMENTS
删除触发器:
DROP TRIGGER TRIGGER_NAME