数据库DQL高阶语法

本文详细讲解了SQL子查询的运用,包括单表子查询、多行子查询和多表子查询实例,如查询比张三工资高及部门匹配的员工信息,以及利用IN和ALL/ANY关键字的场景。通过实例演示,帮助读者掌握子查询在查询复杂条件时的高效应用。

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;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值