连接查询
隐式内连接
select 字段列表 from 表1, 表2 where 条件
显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件
左外连接
左外连接的结果集包括 left outer join 指定的左表(表1)的所有行,如果左表的某行在右表中没有匹配行,则在结果集中该行的右表的所有列的值均为 null
select 字段列表 from 表1 left [outer] join 表2 on 条件
右外连接
右外连接的结果集包括 right outer join 指定的右表(表2)的所有行,如果右表的某行在左表中没有匹配行,则在结果集中该行的左表的所有列的值均为 null
select 字段列表 from 表1 right [outer] join 表2 on 条件
自连接
自连接查询,可以是内连接,也可以是外连接,只需要将同一个表起两个别名即可
select 字段列表 from 表1 别名1 join 表1 别名2 on 条件
联合查询
union 可将多条查询语句的结果合并(两条或两条以上),形成一个新查询结果集
字段列表必须含相同的字段,顺序可以不同
union 会对结果集进行去重,而 union all 不进行去重,合并全部结果
select 字段列表 from 表名 ...
union [all]
select 字段列表 from 表名 ...
子查询
在 SQL 语句中嵌套 select 语句,称为子查询,也称嵌套查询
子查询的外部语句可以是 insert 、update 、delete 、select 中的任意一个
标量子查询
子查询结果为单个值(数字、字符串、日期等),可用比较运算符 = 、< 、> 等进行判断
select 字段列表 from 表名 where 字段名 = (select 字段名 from 表名)
列子查询
子查询结果为一列(多行),可用如下运算符进行判断
运算符 | 说明 |
---|---|
in | 在指定集合中 |
not in | 不在指定集合中 |
any | 集合中有一个满足即可 |
some | 同 any |
all | 集合中所有值都必须满足 |
select 字段列表 from 表名 where 字段名 in (select 字段名 from 表名)
行子查询
子查询结果为一行(可以是多列)
可用括号将字段列表括起来后与子查询的结果集进行比较
select 字段列表 from 表名 where (字段列表) = (select 字段列表 from 表名 [where 条件])
表子查询
子查询的结果为多行多列,可使用类似列子查询的运算符
select 字段列表 from 表名 where (字段列表) in (select 字段列表 from 表名 [where 条件])
也可接在 from 后面,将结果集作为临时表,临时表也可以进行连接
临时表必须使用别名
select 字段列表 from (select 字段列表 from 表名) 别名 [join 表名 on 条件]