1.子查询介绍
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 举报,一经查实,本站将立刻删除。