-- 多表连接查询 create table t1(key1 char,v1 int); create table t2(key2 char,v2 int); insert into t1 values('a',1),('a',2),('b',3),('c',4),('a',13); insert into t2 values('b',10),('b',11),('a',12),('a',13),('e',14); select * from t1; select * from t2; -- 内连接 select * from t1 inner join t2 on key1=key2;-- inner 可以省略 select * from t1 join t2 on t1.key1=t2.key2;-- 标准写法需要加上表限定,当两个字段名字不一致的时候可以省略表限定,on后面的前后顺序没有关系,只是判断该条件是否成立 -- 左连接 select * from t1 left join t2 on key1=key2; -- 右连接 select * from t1 right join t2 on key1=key2; -- 合并查询 -- union去重 select * from t1 union select * from t2;-- 纵向合并后去重 -- union all不去重 select * from t1 union all select * from t2;-- union all纵向合并,不去重 -- mysql实现全连接的方法 select * from t1 left join t2 on key1=key2 union select * from t1 right join t2 on key1=key2; -- 采用左连接+右连接 然后用union进行连接去重 -- 多表查询练习 create table salgrade(grade int,losal int,hisal int); insert into salgrade values(1,700,1200), (2,1201,1400), (3,1401,2000), (4,2001,3000), (5,3001,9999); select * from salgrade;-- 5 select * from emp;-- 14 select * from dept;-- 4 -- 查询每位员工的ename,dname,sal select ename,dname,sal from emp left join dept on dept.deptno=emp.deptno; -- 查询各地区的员工数(统计每个地区,没有员工计为0) select loc,count(empno) from dept left join emp on dept.deptno=emp.deptno group by loc;-- count后面直接加()中间不能有空格 -- 查询manager的姓名、所属部门名称和入职日期:ename,dname,job,hiredate(内连接/笛卡尔积连接) select ename,dname,job,hiredate from emp inner join dept on dept.deptno=emp.deptno having job='manager';-- 方法一 本次内连接和左连接结果是一致的,当主表中关键字段的取值在附表中都存在的情况下,老师用的是where 不是having select ename,dname,job,hiredate from emp,dept where dept.deptno=emp.deptno and job='manager';-- 方法二,采用笛卡尔连接,然后用where进行条件筛选,相比内连接速度更快 -- 查询所有员工姓名及其直属领导姓名(自连接:通过表别名,将同一张表视为多张表) select 员工表.ename as 员工姓名,领导表.ename as 领导姓名 from emp as 员工表 left join emp as 领导表 on 员工表.mgr=领导表.empno;-- -- 查询入职日期早于其直属领导的员工姓名及其所属部门:empno,ename,dname (两张以上的多表连接) select 员工表.empno as 编号,员工表.ename as 姓名,dname as 所属部门 from emp as 员工表 left join emp as 领导表 on 员工表.mgr=领导表.empno left join dept on 员工表.deptno=dept.deptno where 员工表.hiredate<领导表.hiredate;-- 三张表相连,先连接前两张表,继续left join(inner join)的三张表 -- 查询每位员工的工资等级;empno,ename,sal,grade(不等值连接) select empno,ename,sal,grade from emp left join salgrade on emp.sal>losal and emp.sal<hisal;--