1 进阶查询
1.1 子查询
定义
一个sql语句中有2个及以上的select语句
一个select语句的结果作为另一个select语句的条件
# ======================单表子查询=====================
# 语法: select 结果 from 表 where 列 > < =(select 语句);
#练习:查询工资比张三工资高的员工信息
# 1.查询sal>"张三的工资"的员工信息
select * from emp where sal > '张三工资';
# 2.查询张三的工资
select sal from emp where ename = '张三';
# 3.组合最终语句
select * from emp where sal > (select sal from emp where ename = '张三');
#练习:查询工资比张三工资高,且跟张三是同一个部门的员工信息
# 1.查询sal>"张三的工资"and deptno = "张三的部门"的员工信息
select * from emp where sal>"张三的工资"and deptno = "张三的部门";
# 2.查询 张三的工资
select sal from emp where ename = '张三';
# 3.查询 张三的部门
select deptno from emp where ename = '张三';
# 4.组合最终语句
select * from emp where sal>(select sal from emp where ename = '张三') and deptno = (select deptno from emp where ename = '张三');
#练习:查询工资比张三工资高的员工信息
select * from emp where sal > (select sal from emp where ename = '张三');
#练习:查询工资比张三工资高,且跟张三是同一个部门的员工信息
select * from emp where sal > (select sal from emp where ename = '张三') and deptno = (select deptno from emp where ename = '张三');
# ******01.1.2多行子查询:如果子查询的结果返回多行数据,此时可以in
# 语法:select 结果 from 表 where 列 in (select语句);
# 案例:查询工资跟部门20员工工资相同的员工信息
select * from emp where sal in (select sal from emp where deptno = 20);
# 练习:查询岗位和10部门员工岗位一致的员工信息
select * from emp where job in (select job from emp where deptno = 10);
# 练习:查询部门编号和名字包含有'鲤'字部门编号一样的员工姓名
select ename from emp where deptno in (select deptno from emp where ename like '%鲤%');
# ===============================多表子查询=============================
# 语法:select 结果 from 表 where 多表共同列 in (select 多表共同列 from 表 后续有条件就加);
# 案例:查询工作地点在北京的员工信息
select * from emp where deptno in(select deptno from dept where loc = '北京');
#练习:查询工作地点在北京且工资高于2000的员工信息
select * from emp where deptno in (select deptno from dept where loc = '北京') and sal>2000;
#练习:查询工作地点在北京且工资高于张三工资的员工信息
select * from emp where deptno in (select deptno from dept where loc = '北京') and sal > (select sal from emp where ename = '张三');
#案例:查询工作地点为北京或者上海的员工信息
select * from emp where deptno in (select deptno from dept where loc = '北京') or
deptno in (select deptno from dept where loc = '上海');
# 练习:查询姓名为三个字符的员工的部门名称
select dname from dept where deptno in (select deptno from emp where ename like '___');
# 练习:查询有员工的部门名称
select dname from dept where deptno in (select deptno from emp);
# 练习:查询没有员工的部门名称
select dname from dept where deptno not in (select deptno from emp);
# 知识点1: where sal is not null /is null
#====================all any============================================
# all 表示与所有比较 any 表示与其中任何一个比较
# 案例:查询比所有推销员工资都高的员工信息
select * from emp where sal > (select max(sal) from emp where job = '推销员');
select * from emp where sal > all(select sal from emp where job = '推销员');
# 练习1:查询高于其中某一个推销员工资的员工信息,使用2种方法写(any)
select * from emp where sal > (select min(sal) from emp where job = '推销员');
select * from emp where sal > any(select sal from emp where job = '推销员');
# 练习2:查询高于推销员最高工资的员工信息,使用2种方法写
select * from emp where sal > (select max(sal) from emp where job = '推销员');
select * from emp where sal > all(select sal from emp where job = '推销员');
# 练习3:查询低于推销员最低工资的员工信息,使用2种方法写
select * from emp where sal < any(select sal from emp where job = '推销员');
select * from emp where sal < all(select sal from emp where job = '推销员');
# =================================组合查询===================
# 语法: sql语句 union sql语句
# 案例:把emp表的empno和ename这两列和dept表的deptno和loc放一张表里面
select empno,ename from emp union select deptno,loc from dept;
# 适用:两个表的列的数据类型一致
# union默认去重
# union all 不去重
# 案例:把dept表上下连接起来
select * from dept union all select * from dept;
本文详细讲解了SQL子查询的运用,包括单表子查询、多行子查询和多表子查询实例,如查询比张三工资高及部门匹配的员工信息,以及利用IN和ALL/ANY关键字的场景。通过实例演示,帮助读者掌握子查询在查询复杂条件时的高效应用。
1533

被折叠的 条评论
为什么被折叠?



