一些关于 SQL 及 MySQL 某些机制的相关笔记。
SQL 查询语句
select
子句
select
子句用于在所有可能的列中,选择查询结果应当包含哪些列。
命令格式
SELECT
[DISTINCT]/[ALL] # 指定是否对行去重,默认为 ALL
# 注意对行去重操作需要对数据进行排序,可能相当耗时
[column 1] ([AS] [alias 1]), [column 2] ([AS] [alias 2]), ...
# [column] 指定列名或相关的操作,如调用函数、字符串、表达式等
# [alias] 为列指定别名,显示为查询结果中列的标签
# 可以显式地使用 [AS] 关键字阐明为列指定别名的意图,但通常情况下,这是不必要的
[FROM] # 仅调用内建函数的情况下不需要使用 FROM 子句,如 SELECT DATABASE();
... # 可添加其他子句,如 WHERE
from
子句
from
子句定义查询中所使用的表,及其连接方式。
命令格式
最普通的使用格式为:
|
|
也可以在 from
子句中显式地指定表的别名,并在 select
子句中的列名中使用:
|
|
from
子句也可指明表连接的方式:
|
|
表的概念
表的概念包含如下三种:
- 永久表:存储在数据库中,使用
CREATE TABLE
语句创建的表。 - 临时表:子查询所返回的表。
- 虚拟表:使用
CREATE VIEW
语句创建的视图。
以上三种表都可以在 from
子句中使用。
子查询返回的表
子查询可以出现在 select
子句中的任何部分,使用圆括号进行标示。在 from
语句中,可以使用子查询返回的临时表进行查询,如:
|
|
视图
视图是存储在数据字典中的查询,行为表现得像一个表;视图内的数据字段都来源于真实的数据字段。视图只能用于查询,不能对数据进行增删改。
当对视图发出一个查询时,这个查询会被绑定到视图定义上,以执行最终查询。因此,视图总是显示最近的数据;当用户发出查询时,数据是数据库引擎通过 SQL 语句重建的。
视图的使用目的一般是为了对用户隐藏列,或者简化数据库设计。
命令格式
|
|
例:
|
|
之后可直接对视图 employee_view
执行查询:
|
|
where
子句
where
子句用于在查询结果中过滤掉不感兴趣的行。
命令格式
|
|
类似其他语言,可以使用圆括号对条件进行分组。
操作符
between
操作符
between
操作符用于同时限定范围的上下限,用法为 between <下限> and <上限>
。
between
的查询范围是闭区间。
in
操作符
in
操作符用于检查被查询的值是否属于一个有限集合。例如:
|
|
等价于如下语句:
|
|
in
操作符也可以被 not
修饰。
like
操作符
使用 like
操作符,可以使用通配符构建搜索表达式进行查询。
例如:
|
|
regexp
操作符
regexp
操作符接受一个正则表达式做为搜索表达式进行查询。例如:
|
|
对 null
的测试
null
有两个特性:
- 表达式的值可以为
null
,但测试<表达式> = null
总会失败。 - 两个
null
值不能彼此判断为相等。
想要测试某个表达式的值是否为 null
,可以使用IS NULL
操作符:
|
|
相应地,可以使用 IS NOT NULL
操作符来判断表达式的值是否不为 NULL
。
需要注意的一点是,当进行普通的条件判断时,值为 NULL
的行可能不会出现在查询结果中;如这个例子中,想要查询所有 superior_emp_id
不为 6 的人:
|
|
将会遗漏某一行的 superior_emp_id
对应值为 NULL
的可能性。因此,为了查询所有 superior_emp_id
不为 6 的人,需要将对 NULL
的判断显式加入条件中:
|
|
使用子查询
子查询的结果也可以做为 where
的条件。例如:
|
|
group by
和 having
子句
group by
子句根据列值对数据进行分组,having
子句对分组数据进行过滤,类似 where
子句。
命令格式
|
|
order by
子句
order by
子句根据某些列值或表达式的计算结果对数据进行排序。
命令格式
|
|
order by
根据后面跟随的列名/表达式/列编号,逐个做为第 1 至第 k 关键字对结果进行排序。
order by
中使用的列编号是 select
中出现的列的顺序编号。
多表联查
内连接
内连接使用 inner join
标识。
命令格式
|
|
如果 ON
之后的限定条件类似 table_1.column = table_2.column
,且两个 column
相同,此时可以改写为
|
|
多数情况下,数据库查询引擎能够接受类似如下比较老的内连接语句:
|
|
这种语法在 FROM
后将表用逗号隔开,并将连接条件写在 WHERE
内。这种语法在处理较为复杂的多表联查时过于复杂,且难以分清 WHERE
后的条件究竟是连接条件还是过滤条件,也不易于指明连接类型。如以下代码:
在这里使用三表联查,同时 WHERE
后还有其他过滤条件,显得十分混乱。使用 JOIN
形式书写的查询代码如下:
立刻变得清晰许多。
多于两个表的联查
可以对多于两个表进行联查,并且可以对每个表采用不同的连接类型。
命令格式
|
|
如以下代码所示:
STRAIGHT_JOIN
关键字
一般而言,多个表连接的具体顺序在查询过程中由优化器决定。如果想要手工指定连接方式,可以使用 STRAIGHT_JOIN
关键字。