SELECT 分组函数, 列(要求出现在 GROUP BY 之后)
FROM 表
[WHERE CONDITION] # 分组前的筛选-数据来源于原始表
GROUP BY 分组的列表1, 分组的列表2 ... # (多字段分组无先后顺序)
[HAVING CONDITION] # 分组后的筛选-数据来源于分组后的临时表
ORDER BY 子句
sql92 语法
SELECT COLUMNS
FROM TABLE 别名, TABLE 别名
WHERE 筛选条件 AND 连接条件 AND 连接条件
sql99 语法
可读性比sql92要高一些
SELECT COLUMNS
FROM TABLE 别名 # 注意满足连接条件的先后顺序
[连接类型] JOIN TABLE 别名 ON 连接条件
[连接类型] JOIN TABLE 别名 ON 连接条件
WHERE 筛选条件
1. 表于表的交集部分
2. 表的顺序没有要求
3. 表可以使用别名
4. n个表的连接需要n-1个条件
非等值连接:无非是 = 变成了表达式出现在其他语句中的 SELECT 语句(嵌套查询)
- 外部的查询叫 主查询 或 外查询
- 子查询查不到时,返回NULL
SELECT (
SELECT department_name
FROM departments
WHERE department_id = e.department_id
) AS 部门名
FROM employees e
WHERE e.employee_id = 102;
结果集:
# 查询员工编号最小且工资最高的员工信息
SELECT *
FROM employees
WHERE (employee_id, salary) = ( # 同时操作两个子查询
SELECT MIN(employee_id), MAX(salary)
FROM employees
)
# 等价于
SELECT *
FROM employees
WHERE employee_id = (
SELECT MIN(employee_id)
FROM employees
) AND salary = (
SELECT MAX(salary)
FROM employees
)
表子查询 (多行多列)
子查询的特点:
>, <, =, >=, <=
IN, NOT IN, ANY/SOME (any 与 some 等价,所以还是用some比较符合正常逻辑), ALL
<>ALL, = ANY, > or < ANY or ALL (不存在 = ALL 和 != ANY)
IN 可以兼容 =
SELECT 查询列表
FROM 表
LIMIT [OFFSET,] SIZE;
LIMIT 后不能跟 运算符,只能跟常量!!!
- OFFSET: 起始索引
- SIZE: 大小
如果使用传统的第几页的形式:
假设一页有Size条记录,那么
SELECT 查询列表
FROM 表
LIMIT [(Page-1)*Size,] SIZE;
查询1
UNION [ALL]
查询2
...
特点:
查询顺序:
SELECT 查询列表 #6.
FROM 表 #1.
[连接类型 JOIN TABLE_2 ON CONDITION] #2.
[WHERE CONDITION] #3.
[GROUP BY FIELDS] #4.
[HAVING CONDITION] #5.
[ORDER BY FIELDS] #7.
[LIMIT OFFSET, SIZE] #8.
本文由 Frank采用 署名 4.0 国际 (CC BY 4.0)许可
SQL — 2021年9月19日
Made with ❤ and at Hangzhou.