MySQL多表查询——子查询临时表,all、any操作符

1.子查询介绍

  1. 查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询
  2. 单行子查询:只返回一行数据的子查询语句。
  3. 多行子查询:指返回多行数据的子查询语句。使用关键字in

1.代码演示多行子查询

-- 子查询的演示
-- 请思考:如何显示与SMITH同一部门的所有员工?
/*
	1. 先查询到 SMITH的部门号得到
	2. 把上面的select 语句当做一个查询来使用
*/
SELECT deptno 
	FROM emp 
	WHERE ename = 'SMITH'

-- 下面的答案.	
SELECT * 
	FROM emp
	WHERE deptno = (
		SELECT deptno 
		FROM emp 
		WHERE ename = 'SMITH'
	)

-- 课堂练习:如何查询和部门10的工作相同的雇员的
-- 名字、岗位、工资、部门号, 但是不含10号部门自己的雇员.

/*
	1. 查询到10号部门有哪些工作
	2. 把上面查询的结果当做子查询使用
*/
SELECT disTINCT job 
	FROM emp 
	WHERE deptno = 10;
	
--  下面语句完整

SELECT ename, job, sal, deptno
	FROM emp
	WHERE job IN (
		SELECT disTINCT job 
		FROM emp 
		WHERE deptno = 10
	) AND deptno <> 10 
	

在这里插入图片描述

在这里插入图片描述

2.子查询临时表

查询ecshop中各个类别中,价格最高的商品

在这里插入图片描述

查询ecshop中各个类别中,价格最高的商品

查询 商品表
– 先得到 各个类别中,价格最高的商品 max + group by cat_id, 当做临时表
– 把子查询当做一张临时表可以解决很多很多复杂的查询



select cat_id , max(shop_price) 
	from ecs_goods
	group by cat_id
	
	
-- 这个最后答案	
select goods_id, ecs_goods.cat_id, goods_name, shop_price 
	from (
		SELECT cat_id , MAX(shop_price) as max_price
		FROM ecs_goods
		GROUP BY cat_id
	) temp , ecs_goods
	where  temp.cat_id = ecs_goods.cat_id 
	and temp.max_price = ecs_goods.shop_price 


在这里插入图片描述

3.all和any操作符

– all 和 any的使用

显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
– 请思考:如何显示工资比部门30的其中一个员工的工资高的员工的姓名、工资和部门号


SELECT ename, sal, deptno
	FROM emp
	WHERE sal > ALL(
		SELECT sal 
			FROM emp
			WHERE deptno = 30
		) 
-- 可以这样写
SELECT ename, sal, deptno
	FROM emp
	WHERE sal > (
		SELECT MAX(sal) 
			FROM emp
			WHERE deptno = 30
		) 

SELECT ename, sal, deptno
	FROM emp
	WHERE sal > ANY(
		SELECT sal 
			FROM emp
			WHERE deptno = 30
		)

 SELECT ename, sal, deptno
	FROM emp
	WHERE sal > (
		SELECT MIN(sal) 
			FROM emp
			WHERE deptno = 30
		)

在这里插入图片描述


在这里插入图片描述

4.多列子查询

– 多列子查询

– 请思考如何查询与allen的部门和岗位完全相同的所有雇员(并且不含allen本人)
– (字段1, 字段2 …) = (select 字段 1,字段2 from 。。。。)

– 分析: 2 把上面的查询当做子查询来使用,并且使用多列子查询的语法进行匹配

-- 分析: 1. 得到smith的部门和岗位

SELECT deptno , job
	FROM emp 
	WHERE ename = 'ALLEN'
	
SELECT * 
	FROM emp
	WHERE (deptno , job) = (
		SELECT deptno , job
		FROM emp 
		WHERE ename = 'ALLEN'
	) AND ename != 'ALLEN'

在这里插入图片描述

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...
win11本地账户怎么改名?win11很多操作都变了样,用户如果想要...