微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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'

在这里插入图片描述

原文地址:https://www.jb51.cc/wenti/3288275.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐