1.连接方式:左连接,右连接,内连接,笛卡尔积,其中笛卡尔积与内连接类似
2.子查询:一个select语句中包含另一个成多个完整的select语句
子查询出现的位置
出现在where子句中: 将子查询返回的结果作为主查询的条件
出现在from子句中:将子查询返回的结果作为主查询的一个表
子查询分类
标量子查询: 返回的结果是一个数据 (单行单列)
行子查询:返回的结果是一行(单行多列)
列子查询: 返回的结果是一列(多行单列)
表子查询:返回的结是一张临时表(多行多列) 单表多表实现不了的可以考虑子查询
2.练习出现的问题
解决办法:先计算平均工资,再大于平均工资即可,后面可以考虑合并
本节概念较少,代码的逻辑要弄清楚,有难度,要多练
-- union all不去重
select * from emp;
select * from dept;
select * from salgrade;
-- 多表查询练习
select * from emp;
select * from dept;
select * from salgrade;
-- 查询每位员工的ename,dname,sal
-- 查询各地区的员工数
-- 查询manager的姓名、所属部门名称和入职日期:ename,dname,job,hiredate(内连接/笛卡尔积连接)
select ename,dname,job,hiredate from emp,dept
where emp.deptno=deptno=dept.deptno and job='manager';
-- 查询每位员工的工资等级;empno,ename,sal,grade(不等值连接)
select empno,ename,sal,grade from emp left join salgrade on sal
between losal and highsal;
-- 查询每个工资等级的员工数
use test;
select grade,count(empno) 员工数 from salgrade left join emp
on sal between losal and highsal group by grade;
-- 查询所有员工姓名及其直属领导姓名(自连接:通过别名,将同一张表视为多张表)
select 员工表.ename 员工姓名, 领导表.ename 直属领导姓名
from emp as 员工表 left join emp as 领导表 on 员工表.mgr=领导表.empno;
-- 查询入职日期早于其直属领导的员工:empno,ename,dname
#先用自连接找出员工对应的直属领导,部门编号重复了,再次连接化为一个三表相连
select 员工表.empno,员工表.ename,dname from emp as 员工表 left join emp as 领导表
on 员工表.mgr=领导表.empno left join dept
on 员工表.deptno=dept.deptno
where 员工表.hiredate<领导表.hiredate;
-- 子查询
-- 标量子查询:
-- 查询基本工资高于公司平均工资的员工信息
select avg(sal) from emp;
select ename from emp where sal>2073.3;
-- 练习:查询和allen同一个领导的员工:empno,ename,job,mgr
select mgr from emp where ename='allen';
select * from emp where mgr=7698 and ename !='allen';
#合在一起就是
select * from emp where
mgr=(select mgr from emp where ename='allen');
#再进一步进行优化
select empno,ename job,mgr from emp where
mgr=(select mgr from emp where ename='allen');
-- 行子查询
-- 查询和smith同部门同职位的员工:empno,ename,job,deptno
select deptno,job from emp where ename ='smith';
select empno,ename,job,deptno from emp where deptno=20 and job='clerk';
select * from emp;
#进行合并
select empno,ename ,job,deptno
from emp
where(deptno,job)=(select deptno,job from emp where ename ='smith') and ename !='smith';