达永编程网

程序员技术分享与交流平台

[数据库SQL]多表查询-子查询 以及多表查询练习

一、连接查询-多表查询

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;
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言