一、多表查询
1.联合查询
在这里插入代码片
2.连接查询
(1)交叉连接
cross join用于连接两个要查询的表。
产生的结果是笛卡尔积,无实际应用意义。
select 查询字段 from 表1 [as 表1别名] cross join 表2 [as 表2别名];
#[]表示可加可不加
#查询字段可以为”别名.字段名“
#cross join可以用,代替
(2)内连接
根据匹配条件,返回表1和表2匹配成功的记录。
select 查询字段 from 表;
[inner] join 表2 on 匹配条件;
#[]表示可写可不写
#不设置on则与cross join等价,此时用where,但是在数据量很大的情况下会浪费性能
自连接:相互连接的表在物理上为同一个表,逻辑上分为两个表。
select distinct 字段1,字段2 from 表 别名1 join 表 别名2 on 匹配条件;
交叉连接 | 内连接 |
---|---|
cross join | [inner] join |
只连接表的笛卡尔积 | 获取符合on筛选条件的连接数据 |
语法功能相同,可以使用on | 语法功能相同,可以使用on |
(3)左外连接
返回连接关键字左表中所有的记录,以及右表中符合连接条件的记录(左表的记录在右表没有匹配的记录的话,右表对应处显示NULL)
select 查询字段 from 表1 left [outer] join 表2 on 匹配条件
(4)右外连接
二、子查询
1.子查询分类
(1)标量子查询
where 条件判断 {=|<>} (select 字段名 from 数据源 [where][group by][having][order by][limit]);
#{=|<>}的意思是条件判断可以使用”=“或者”<>“
(2)列子查询
where 条件判断 {in|not in} (select 字段名 from 数据源 [where][group by][having][order by][limit]);
#{in|not in}的意思是可以利用比较运算函数in()或者not in()
(3)行子查询
运算符的行比较
(4)表子查询
select 字段列表 from (select语句)[as] 别名 [where][group by][having][order by][limit];
#必须设置别名
#from后的数据源都是表名
2.子查询关键字
(1)带exists关键字的子查询
判断子查询语句是否有返回的结果,存在返回1,不存在返回0
where exists(子查询语句);
(2)带any关键字的子查询
(3)带all关键字的子查询
全部符合判断条件返回1,否则返回0
where 表达式 比较运算符 all(子查询语句);