一、完整 SELECT 查询语句
Complete SELECT query
SELECT DISTINCT column, AGG_FUNC(column_or_expression), ...
FROM mytable
JOIN another_table
ON mytable.column = another_table.column
WHERE constraint_expression
GROUP BY column
HAVING constraint_expression
ORDER BY column ASC/DESC
LIMIT count OFFSET count;
二、SELECT 语句执行顺序
2.1 FROM and JOIN s
确定正在查询的数据的总工作集。
在底层创建临时表,其中包含正在连接的表的所有列和行。
2.2 WHERE
一旦有了数据的总工作集,第一个执行的就是 WHERE 约束,该约束将被应用到单个的行上,丢弃不符合约束的行。
2.3 GROUP BY
WHERE 约束后的其余行,根据GROUP BY子句中指定的列中的公共值进行分组。
GROUP BY 常配合聚合函数一起使用。
select a from mytable group by a;
select a, sum(*) from mytable group by a;
select a, avg(b) from mytable group by a,c;
注意:
这里有一点需要说明一下,多个字段进行分组时,需要将 a 和 c 看成一个整体,只要是 a 和 c 相同的可以分成一组;如果只是 a 相同, c 不同就不是一组。
2.4 HAVING
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以筛选分组后的各组数据。
2.5 SELECT
从表或视图中查询数据。
2.6 DISTINCT
用于返回唯一不同的值。
# DISTINCT 单列
select DISTINCT a from mytable;
# DISTINCT 多列
select distinct a,b,c from mytable;
select a,b,c from mytable group by a,b,c;
注意:
DISTINCT 是同时作用到 a,b,c 三个字段,即“a+b+c”。
2.7 ORDER BY
用于对结果集按照一个列或者多个列进行排序。
SELECT * FROM mytable ORDER BY a, b;
order by A,B 这个时候都是默认按升序排列
order by A desc,B 这个时候 A 降序,B 升序排列
order by A ,B desc 这个时候 A 升序,B 降序排列
注意:
- ORDER BY 多列的时候,先按照第一个 column 排序,在按照第二个 column 排序;
- ORDER BY 排列时,不写明ASC DESC的时候,默认是ASC;
- ORDER BY 多列时, desc 或者 asc 只对它紧跟着的第一个列名有效,其他不受影响,仍然是默认的升序。
2.8 LIMIT / OFFSET
- Limit 后面可接受一个参数或者两个参数;当接受一个参数count时,表示返回的结果集最多有 count 条。
- Limit 后面使用双参数时,第一个参数表示偏移量,即 offset,表示从几个记录后开始返回,第二个参数表示最大数量,即 count,表示最多返回几个记录。我们合起来可以理解为,跳过一定数量(offset)的记录,返回最多 count 个记录。
SELECT [col] FROM [table_name] LIMIT [count];
SELECT [col] FROM [table_name] LIMIT [offset],[count];
- Offset 必须与 Limit 搭配使用,且二者都必须是单参数形式。Limit 和 Offset 搭配的作用等同于 Limit 使用双参数。
SELECT [col] FROM [table_name] LIMIT [count] OFFSET [offset];
- Limit 和 Offset 常搭配用于数据分页,是很多分页工具的核心操作。
Limit 其实完全可以替代 Limit + Offset,但考虑到SQL语句的可读性,Limit + Offset的写法更好。