多表查询 (重点)
多表关系:一对多(多对一),多对多,一对一
一对多:在多的一方建立外键,指向一的一方的主键
case:员工和部门的关系
多对多:建立一张中间表,中间表包含两个外键,分别关联两方主键
case:学生和课程的关系
一对一:用于单表拆分,将一张表的基础信息放在一张表中,其他详情放到另一张表中
case:用户和用户详情的关系
多表查询
查询员工信息和所属部门
select * from user,dept where user.dept_id = dept.id
内连接:查询a,b交集的部分 外连接: 左外:查询左表的所有数据,以及交集的数据 右外:查询右表的所有数据,以及交集的数据 自连接:当前表与自身的连接查询,自连接必须使用表别名
-
内连接
-
隐式内连接
select 字段列表 from 表1,表2 where 条件
select user.name as name,dept.name as dept from user,dept where user.dept_id = dept.id; select u.name,d.name from user u,dept d where u.dept_id = d.id; //起别名,简化开发
-
显示内连接
select 字段列表 from 表1 inner join 表2 on 连接条件;
select user.name as name,dept.name as dept from user inner join dept where user.dept_id = dept.id;
-
sql执行,先执行from关键字
-
外连接
-
左外
select 字段列表 from 表1 left outer join 表2 on 条件; select u.*,d.name from user u left join dept d on u.dept_id = d.id;
-
右外
select 字段列表 from 表1 right outer join 表2 on 条件; select d.*,u.name from user u right join dept d on d.id = u.dept_id;
-
-
自连接
必须对表起别名
select 字段列表 from 表a 别名a join 表a 别名b on 条件; select u.name,m.name from user u join user m on u.managerid = m.id; //内连接 select u.name,m.name from user u left join user m on u.managerid = m.id; //左外连接
联合查询
select 字段列表 from A union all select 字段列别 from B
select 字段列表 from A union // 表示去重查询 select 字段列别 from B
子查询
嵌套查询
select/update/insert/delete * from t1 where column = (select column1 from t2)
-
标量子查询
select * from user where dept_id = ( select id from dept where name = '研发部'); select * from user where entrydate > (select entrydate from user where name = '金庸');
-
列子查询
-
select * from user where dept_id in (select id from dept where name = '销售部' or name = '市场部');
select * from user where salary > all(select salary where id = (select id from dept where name = '财务部')); select * from user where salary > any(select salary where id = (select id from dept where name = '研发部'));
-
行子查询
select * from user where (salary,managerid) = (select salary,managerid from user where name = '张无忌');
-
表子查询
select * from user where (job,salary) in (select job,salary from user where name = '鹿杖客' or name = '宋远桥');