一对多:多的一方建立外键指向一方的主键
多对多:建立中间表,包含两个外键连接两个表的主键
一对一:拆分单表,任意一方加入外键关联主键,设置外键唯一unique
多表查询:
笛卡尔积:两个集合的所有组合情况,设置外键条件
select * from emp , dept where emp.dept_id = dept.id;
内连接:查询A ,B交集数据
查询员工姓名和关联部门的名称
隐式内连接:
select emp.name , dept.name from emp , dept where emp.dept_id = dept.id;
显示内连接:3张以上速度快一点
select emp.name , dept.name from emp inner join dept on emp.dept_id = dept.id;
外连接:左外连接:查询左表和交集数据;右外连接:查询右表和交集数据
查询emp的所有数据和对应部门信息
select emp.* , dept.name from emp left join dept on emp.dept_id = dept.id
查询dept的所有数据和对应员工信息
select dept.* , emp.* from emp right join dept on emp.dept_id = dept.id
自连接:表与自身的连接查询,自连接使用表别名
查询员工和所属领导名称
select a.name , b.name from emp a , emp b where a.mangerid=b.id; //必须取别名
查询员工和所属领导名称,没有领导也要
select a.name '员工', b.name '领导' from emp a left join emp b on a.mangerid=b.id;
联合查询 union
查询薪资低于5000和年龄大于50的员工
select name from emp where salary<5000
union all select name from emp where age>50;//可以重复
字段列表一致,字段类型一致
union all不去重
union 去重
子查询:sql内嵌套查询
查询销售部的员工信息
标量子查询
select * from emp where dept_id = (select id from dept where name = '销售部');
列子查询
常见操作符
in 范围多选一
not in 不在范围内
any 返回列表任意一个满足即可
some 等同any
all 所有值都满足
查询销售部和市场部的所有员工信息
select id from dept where name ='销售部' or name ='市场部'
根据部门id,查询员工信息
select * from emp where dept_id in (select id from dept where name ='销售部' or name ='市场部');
查询财务部人员工资
select salary from emp where dept_id = (select id from dept where name = '财务部');
比财务部工资都高的人员工资
select name from emp where salary > all (select salary from emp where dept_id = (select id from dept where name = '财务部'));
行子查询
常见操作符:=,<>(不等于),in,not,in
查询与 张无忌和直属领导薪资 相同的员工信息
select * from emp where (salary,managerid) = (select salary,managerid form emp where name='张无忌');
表子查询:in
查询与阿波罗和必胜客职位和薪资相同的员工信息
select *from emp where (job,salary) in (select job,salary from emp where name = '阿波罗' or name = '必胜客');
查询入职日期是 2022年之前的员工和部门信息
select e.*,d.* from (select * from emp where entrydate <'2022') e left join dept d on e.dept_id= d.id; //e员工信息,d部门信息