一、连接查询-多表查询
1.概念、语法
SQL语句中嵌套Select语句,称为嵌套查询,又称子查询。
Select * From t1 Where column1 = (Select colunm1 From t2);
2.分类
根据子查询结果不同,分为以下四类:
·标量子查询(子查询的结果为单个值)
·列子查询(子查询结果为一列)
·行子查询(子查询结果为一行)
·表子查询(子查询结果为多行多列)
根据子查询位置,分为以下三种:
·Where之后
·From之后
·Select之后
二、子查询-标量子查询
1.概念
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
常用的操作符:= <> > >= < <=
2.案例
(1)查询“销售部”的所有员工信息。
select * from emp where dept_id = (select id from dept where name = '销售部');
(2)根据在“方东白”之后入职的员工信息
select * from emp where entrydate > (select entrydate from emp where name = '方东白');
三、子查询-列子查询
1.概念
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:In、Any、Some、All。
2.案例
(1)查询“销售部”和“市场部”的所有员工信息。
select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部');
(2)查询比财务部所有人工资都高的员工信息。
注:把“丁敏君”的工资改为“4800”。
select * from emp where salary > all(select salary from emp where dept_id = (select id from dept where name = '财务部'));
(3)查询比研发部其中任意一人的工资高的员工信息。
select * from emp where salary > any (select salary from emp where dept_id = (select id from dept where name = '研发部'));
四、子查询-行子查询
1.概念
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:=、<>、In、Not in。
2.案例
(1)查询与“张无忌”的薪资及直属领导相同的员工信息
select * from emp where salary = (select salary from emp where name='张无忌') and managerid = (select managerid from emp where name = '张无忌');
select * from emp where (salary,managerid) = (select salary,managerid from emp where name = '张无忌');
五、子查询-表子查询
1.概念
子查询返回的结果是多行多列,这种子查询称为表子查询。
常用的操作符:IN
2.案例
(1)查询与“鹿杖客”,“宋远桥”的职位和薪资相同的员工信息
select * from emp where (job,salary) in (select job,salary from emp where name in ('鹿杖客','宋远桥'));
(2)查询入职日期是“2006-01-01”之后的员工信息,及其部门信息。
select e.*,d.* from (select * from emp where entrydate > '2006-01-01') e left join dept d on d.id = e.dept_id;
六、多表查询案例
(1)查询员工的姓名、年龄、职位、部门信息(隐式内连接)
select e.name,e.age,e.job,d.* from emp e ,dept d where e.dept_id = d.id;
(2)查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)
select e.name,e.age,e.job,d.* from (select * from emp where age < 30) e join dept d on e.dept_id = d.id;
(3)查询拥有员工的部门ID、部门名称
select d.* from (select dept_id,count(*) c from emp where dept_id is not null group by dept_id) e left join dept d on e.dept_id = d.id;
select distinct d.* from emp e,dept d where e.dept_id = d.id;
(4)查询所有年龄大于40岁的员工及其归属的部门名称,如果员工没有分配部门,也需要展示出来。
select e.*,d.name from emp e left join dept d on d.id = e.dept_id where e.age > 40;
(5)查询所有员工的工资等级
select e.*,s.grade from emp e,salgrade s where e.salary >= s.losal and e.salary <= s.hisal ;
select e.*,s.grade from emp e,salgrade s where e.salary between s.losal and s.hisal;
(6)查询“研发部”所有员工的信息和工资等级。
select e.*,s.grade from emp e, dept d, salgrade s where e.dept_id = d.id and d.name = '研发部' and e.salary between s.losal and s.hisal;
(7)查询“研发部”员工的平均工资。
select avg(e.salary) from emp e,dept d where e.dept_id = d.id and d.name = '研发部';
(8)查询工资比“灭绝”高的员工信息
select * from emp where salary >(select salary from emp where name ='灭绝');
(9)查询比平均薪资高的员工信息
select * from emp where salary > (select avg(salary) from emp);
(10)询低于本部门平均工资的员工
select * from (select dept_id,avg(salary) v from emp group by dept_id) a ,emp e where a.dept_id=e.dept_id and e.salary>a.v;
(11)查询所有的部门信息,并统计部门的员工人数
select d.id,d.name,(select count(*) from emp e where e.dept_id = d.id ) from dept d;
(12)查询所有学生的选课情况,显示出学生名称、学号、课程名称
select s.name,s.no, c.name from student s,student_course sc, course c where s.id = sc.studentid and c.id=sc.courseid;