连接查询
又叫多表连接,当查询结果来自多张表时,需要将多张表连接成一个大的数据集汇总显示
select 字段 from 表1 连接类型 join 表2 on 连接条件 where 筛选条件;
分类:
- 内连接
- 等值连接
- 非等值连接
- 自连接
- 外连接
- 左外连接
- 右外连接
- 全外连接
- 交叉连接
笛卡尔集
select * from student inner join class;
没有有效的连接条件
内连接
- inner join
- n 表连接需要至少 n-1 个连接条件
- 多表的顺序没有要求,底层会拿一个表去匹配另一个表
基础语法
等值连接
select s.name,c.name from student s,class c,teacher t where s.classid=c.id,c.id=t.cid;
非等值连接
select s.name,s.score,l.name
from student s,score_level l
where s.score between l.min_score and l.max_score
order by s.score desc;
自连接
select s.id,s.name,leader.id,leader.name
from student s,student leader
where s.leader_id=leader.id;
等值连接
- 多表等值连接的结果为多个表的交集部分
select s.id,s.name,c.name from student s inner join class c where s.classid=c.id;
非等值连接
select l.name,count(*)
from student s
inner join score_level l on s.score between l.min_score and l.max_score
group by l.name
having count(*)>3
order by l.name asc;
自连接
- 在同一张表内查询多次
select s.id,s.name,leader.id,leader.name
from student s
inner join student leader on s.leaderid=leader.id;
外连接
- 外连接的查询结果为主表中的所有记录,当主表中的记录在次表中没有找到匹配,则为 null
- 外连接查询结果 = 内连接查询结果 + 主表中剩余记录
- 左外连接左边的是主表,右外连接右边的是主表,两种连接方式交换两个表的顺序,可以实现同样的效果
左外连接
- left join
select sel_list
from A
left join B on A.bid=B.id
where B.id is null
右外连接
- right join
select sel_list
from A
right join B on A.id=B.aid
where A.id is null
全外连接
- full join
- 全外连接 = 内连接结果 + 左外连接中主表剩余记录 + 右外连接中主表剩余记录
select sel_list
from A
full join B on A.key=B.key
where A.key is null
and B.key is null
交叉连接
- cross join
- join 语法的笛卡尔集