基本语法
SELECT <字段列表>
[FROM <表>]
[FORCE|IGNORE|USE INDEX (<索引名称>)]
[WHERE <筛选条件表达式>]
[GROUP BY <分组字段>[WITH ROLLUP]]
[HAVING <筛选条件表达式>]
[ORDER BY <排序字段> <排序方式>]
[LIMIT <偏移量>, <数据行数>]
字段列表
字段列表是一组以逗号 ,
分割的表达式,可以使用 AS
给这些表达式定义别名(也可以省略 AS
直接以空格分割)。
任何表达式都可以用于字段列表,以下列举几种常用的:
通配符表达式
使用通配符 *
查询表的所有字段,字段按照表定义时的顺序显示
除非需要使用表中的所有字段数据,最好不要使用通配符。使用通配符虽然可以节省输入查询语句的时间,查询语句看起来也更短,但是获取不需要的字段值会降低查询效率。
注意:多表查询时,同名的字段在不同的客户端表现可能不一样,比如在 PHP
中只会返回一个
表的字段名
指定查询的表的字段名称
聚合、加密、IF、CASE等函数
可以对字段使用函数
子查询
使用子查询返回子查询的结果(这里的子查询只能返回一列值)
常值
使用常值(如一个具体的字符串、日期等)来返回一个具体的值
自定义变量
select @min_age:=min(age),@max_age:=max(age) from test;
select * from test where age=@min_age or age = @max_age;
全文搜索表达式
MATCH (col1,col2,...) AGAINST (expr [search_modifier])
详见 MySQL——全文索引
其他表达式
例如:
select 1+1;
select 1 is null;
表
这里的表可以是单个的表,也可以使用连接查询多个表,也可以使用子查询的结果作为临时表
单个表
指定表名即可,对临时表或者表名较长的还可以使用 AS
为表指定别名(也可以省略 AS
直接以空格分割)。
内连接查询
显式内连接
<表1> INNER JOIN <表2> ON <连接条件>
隐式内连接
<表1>,<表2> WHERE <连接条件> <其他筛选条件>
如何选择: INNER JOIN
语法是 ANSI SQL
的标准规范,能够确保不会忘记连接条件。而且隐式内连接在某些时候会影响查询性能(具体是哪种情况下尚需研究)
不管是内连接,还是下面说的外连接,连接条件都可以是多个;连接的表也可以是同一个表,叫做自连接
外连接查询
左连接
<表1> LEFT JOIN <表2> ON <连接条件>
返回左表中的所有记录和右表中满足连接条件的记录
右连接
<表1> RIGHT JOIN <表2> ON <连接条件>
返回右表中的所有记录和左表中满足连接条件的记录
干预默认的索引行为
强制使用的索引
FORCE INDEX <索引名>
强制不使用的索引
IGNORE INDEX <索引名>
建议使用的索引
USE INDEX <索引名>
筛选条件表达式
WHERE
子句和 HAVING
子句只会匹配表达式的结果不为 0 和 null
的行
WHERE
子句后面的筛选条件中不能出现聚合函数,必须放在 HAVING
子句后面
还可以结合关键字 ANY
SOME
ALL
EXISTS
对子查询的结果进行比较:
ANY
和SOME
是同义词,表示与子查询的结果集中的所有值进行比较,只要有一个值的比较结果返回 1 则整个结果返回 1,否则返回 0ALL
表示与子查询的结果集中的所有值进行比较,每个值的比较结果均返回 1,整个结果才返回 1,否则返回 0EXISTS
不能与比较运算符一起使用,但可以与逻辑运算符一起使用,只要子查询至少返回一行,则EXISTS
的结果为 true ,否则为false
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
查询结果不重复
DISTINCT
关键字用来限制不返回重复的结果,可以限制单个字段,也可以限制多个字段的联合结果不重复
SELECT DISTINCT field1 FROM table;//field1 不重复
SELECT DISTINCT field1, field2 FROM table;//field1 和 field2 不都重复
对结果进行排序
ORDER BY <字段> [<排序方式>][,<字段> [<排序方式>] ...]
这里的字段可以是单纯的表字段,也可以是经过函数、运算符等处理过的字段
多字段排序,越左越优先,只有当左侧列的值相等时才根据后续的字段进行排序
排序方式有:倒序DESC
和 正序ASC
两种,默认为 ASC
,可以省略
对结果进行分组
GROUP BY <字段> [WITH ROLLUP] [HAVING <筛选条件>]
这里的字段可以是单纯的表字段,也可以是经过函数、运算符等处理过的字段,可以是单个,也可以是逗号分割的多个。
多字段分组采用的是层次分组,先按第一个字段进行分组,第一个字段中相同的记录中,再使用第二个字段进行分组,依次类推
可选的 WITH ROLLUP
子句在所有结果之后增加一条记录,该记录计算查询出的所有记录的总和
可选的 HAVING
子句中可以对聚合函数的结果进行比较运算(聚合函数不能出现在 WHERE
子句)
限制查询结果的数量
LIMIT [<偏移量>,]<行数>
偏移量指示从哪一行开始显示,可选参数,默认为从第一行开始(第一行的偏移量为 0)
行数指示返回的记录条数
合并查询结果
SELECT * FROM table1
UNION [ALL]
SELECT * FROM table2
合并时两个查询结果对应的字段数目和数据类型必须相同
不使用 ALL
关键字,将会对合并后的结果进行去重,反之不删除重复行