day05多表查询01( 三 )


  • 多行子查询
多行子查询指返回多行数据的子查询使用关键字 in
3.1多行子查询
练习1
-- 请思考:如何显示与Smith同一部门的所有员工?/* 1.先查询到Smith的部门编号 2.把上面的select语句当做是一个子查询来使用*/SELECT deptnoFROM empWHERE ename = 'SMITH';-- 先查询到Smith的部门编号-- 单行子查询SELECT * FROM emp WHERE deptno = (SELECT deptnoFROM empWHERE 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( -- 返回了一个集合,用inSELECT DISTINCT jobFROM empWHERE deptno=10)AND deptno !=10; -- 不含10号部门自己的雇员
day05多表查询01

文章插图
day05多表查询01

文章插图
3.2all操作符
  • 在多行子查询中使用all操作符
请思考:显示工资比部门30所有员工工资高的员工的姓名、工资和部门号
-- 显示工资比部门30所有员工工资高的 员工的姓名、工资和部门号SELECT ename,sal,deptno FROM emp WHERE sal>ALL(SELECT salFROM empWHERE deptno = 30)-- 或者SELECT ename,sal,deptno FROM emp WHERE sal>(SELECT MAX(sal)FROM empWHERE deptno = 30)
day05多表查询01

文章插图
3.3any操作符
  • 在多行子查询中使用any操作符
请思考:如何显示工资比部门30其中一个员工工资高的 员工的姓名、工资和部门号
-- 请思考:如何显示工资比部门30其中一个员工工资高的 员工的姓名、工资和部门号SELECT ename,sal,deptno FROM emp WHERE sal>ANY(SELECT salFROM empWHERE deptno = 30)-- 或者SELECT ename,sal,deptno FROM emp WHERE sal>(SELECT MIN(sal)FROM empWHERE deptno = 30)
day05多表查询01

文章插图
3.4子查询临时表
  • 子查询当做一张表来使用
例子
ecshop表:
day05多表查询01

文章插图

day05多表查询01

文章插图
要求:查询ecshop中各个类别中价格最高的商品
  1. 先得到各个类别中,价格最高的商品 --当做一个临时表

day05多表查询01

文章插图
day05多表查询01

文章插图
  1. 选择临时表和原本的表格,过滤条件为
    临时表的cat_id = 原商品表的cat_id
    && 临时表的max_price=原商品表的price

day05多表查询01

文章插图
day05多表查询01

文章插图

经验总结扩展阅读