#子查询
/*
含义:出现在其他语句中的select语句,称为子查询(内查询)
           内部嵌套其他select语句的查询,称为主查询(外查询)

特点:
1、子查询都会放在小括号内
2、单行操作符:>, <, =
3、多行操作符: in, any/some, all

分类:
按子查询出现的位置:
  select后面
    子查询的结果集只能是一行一列
  from后面
    支持表子查询
  where或having后面(筛选)------ 重点
    标量子查询 -- 重点
    列子查询 -- 重点
    行子查询
  exists后面(相关子查询)
    表子查询

按结果集的行列数不同:
  标量子查询(子查询的结果集只有一行一列)
  列子查询(子查询的结果集只有一列多行)
  行子查询(子查询的结果集有多行多列,主要为一行多列)
  表子查询(子查询的结果集一般为多行多列)
*/

# 实例
SELECT first_name FROM employees
WHERE department_id IN (
SELECT department_id FROM departments
WHERE location_id = 1700
);

#一、where或having后面
# 1. 标量子查询(单行)
# 2、列子查询(多行)
# 3、行子查询(多行多列)

# 1. 标量子查询
# 案例1:谁的工资比abel高?
# 1) 查询Abel的工资
SELECT salary FROM employees
WHERE last_name = 'Abel'
# 2) 查询员工姓名和工资,满足 salary>上一步的结果
SELECT last_name, salary
FROM employees
WHERE
salary > (
SELECT salary FROM employees
WHERE last_name = 'Abel'
);

# 案例2:查询job_id和141号员工相同,salary比143号员工高的员工姓名,job_id,工资
# 1) 查询141号员工的job_id
SELECT job_id
FROM employees
WHERE employee_id = 141;
# 2)查询143号员工的salary
SELECT salary
FROM employees
WHERE employee_id = 143;
# 3)查询员工姓名,job_id, salary,job_id和1相同,salary比2高
SELECT last_name, job_id, salary
FROM employees
WHERE job_id = (
SELECT job_id
FROM employees
WHERE employee_id = 141
)
AND salary > (
SELECT salary
FROM employees
WHERE employee_id = 143
);

# 案例3: 返回公司工资最少的员工的last_name, job_id, salary

# 1) 查询最小工资
SELECT MIN(salary)
FROM employees;

# 2) 查询工资=1的员工
SELECT last_name,job_id, salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);

# 案例4: 查询最低工资大于50号部门最低工资的部门id和最低工资
# 1)查询50号部门的最低工资
SELECT MIN(salary)
FROM employees
GROUP BY department_id
HAVING department_id = 50;

# 2) 根据部门分组,查询每个部门的最低工资,然后过滤出比1高的
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) > (
SELECT MIN(salary)
FROM employees
GROUP BY department_id
HAVING department_id = 50
);

# 2. where或having后的列子查询

/*
多行操作符:
1)in/not in, 值是子查询结果中的任意一个
2) any|some, 和子查询结果中的某一个比较
3)all, 和子查询结果中的所有值比较
*/

# 案例1:返回location_id是1400或1700的部门中的所有员工姓名
SELECT last_name, d.`location_id`
FROM employees AS e
LEFT JOIN departments AS d
ON e.`department_id` = d.`department_id`
WHERE d.`location_id` IN (1400,1700)
ORDER BY last_name;

# 1) 查询location_id为1400或1700的部门编号
SELECT department_id
FROM departments
WHERE location_id IN (1400,1700);

# 2)查询部门号是1中任意一个的员工的姓名
SELECT last_name
FROM employees
WHERE department_id IN (
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN (1400,1700)
)
ORDER BY last_name;

# 案例2:返回其他部门中比job_id为IT_PROG的部门任一工资低的员工号和姓名
# 1)查询job_id为IT_PROG的部门的工资
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG';
# 2)
SELECT employee_id, last_name
FROM employees
WHERE job_id != 'IT_PROG'
AND salary < ANY (
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG'
);

# 3. where或having后的行子查询(结果集一行多列 或 多行多列)
# 案例:查询员工编号最小,并且工资最高的员工信息
# 1) 查询最大工资
SELECT MAX(salary)
FROM employees;
# 2) 查询最小员工编号
SELECT MIN(employee_id)
FROM employees;
# 3) 查询员工信息
SELECT *
FROM employees
WHERE employee_id = (
SELECT MIN(employee_id)
FROM employees
)
AND salary = (
SELECT MAX(salary)
FROM employees
);

# 三、from后的子查询
# 将子查询的结果集当做临时表

# 案例:查询每个部门的平均工资的工资等级
# 查询每个部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;

# 将1的结果集和job_grades连接,添加连接条件
SELECT avg_dept.*, g.`grade_level`
FROM (
   SELECT AVG(salary) AS ag,department_id
   FROM employees
   GROUP BY department_id
) AS avg_dept
INNER JOIN job_grades AS g
ON avg_dept.ag BETWEEN g.`lowest_sal` AND g.`highest_sal`;

10_MySQL DQL_子查询(嵌套的select)的更多相关文章

  1. sql子查询 嵌套SELECT语句

    嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在sele ...

  2. SQL子查询/嵌套查询

    sql子查询 嵌套SELECT语句 嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为 ...

  3. sql中with的用法(CTE公用表表达式):应用子查询嵌套,提高sql性能

    一.WITH AS的含义 WITH AS短语,也叫子查询部分(subquery factoring),定义一个SQL片断,该片断会被整个SQL语句所用到. 有时是为了让SQL语句的可读性更高些,也可能 ...

  4. Oracle 子查询(复杂select语句)

    在执行数据操作时,如果某个操作需要依赖于另外一个 select语句的查询结果,那么就可以把 select 语句迁入到该操作语句中,这样就形成了一个子查询.实际应用中,表与表之间相互关联,相互依存,这样 ...

  5. 子查询四(在select子句中使用子查询)

    示例一.查询出每个部门的编号,名称,位置,部门人数,平均工资 SELECT d.deptno,d.dname,d.loc, (SELECT COUNT(empno) FROM emp WHERE em ...

  6. Oracle子查询(嵌套查询)

    概念: 所谓子查询,即一个select语句中嵌套了另外的一个或者多个select语句 需求:查找和Smith同部门的所有员工的id和last_name 目标: 员工id,last_name from: ...

  7. [SQL SERVER系列]之嵌套子查询和相关子查询

    子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数:另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的 ...

  8. java数据库编程之嵌套子查询及exists的使用

    第四章:高级查询(二) 4.1:exists和not exists子查询 4.1.1:exists子查询 用exists作为子查询的where条件 语法:select,,,,,,from 表名   w ...

  9. SQL Fundamentals: 子查询 || WHERE,HAVING,FROM,SELECT子句中使用子查询,WITH子句

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

随机推荐

  1. Lucene中的域选项

    Field类是lucene在索引过程中的一个很重要的类,该类控制着域值被索引的方式 域选项主要包括以下几种选项:域索引选项.域存储选项.域的项向量选项.域的排序选项等 域索引选项:通过倒排索引来控制域 ...

  2. create sequence

    create sequence seq_test start with 3 increment by 1 minvalue 1  --范围-(1027 -1) maxvalue 99999999999 ...

  3. POM(project Object Model) Maven包管理依赖 pom.xml文件

    什么是POM POM全称为“Project Object Model”,意思是工程对象模型.Maven工程使用pom.xml来指定工程配置信息,和其他文本信息.该配置文件以xml为格式,使用xml语法 ...

  4. C# tostring 格式化输出

    C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString ...

  5. hihoCoder_1445_后缀自动机二·重复旋律5

    #1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...

  6. 磁盘 I/O 性能监控的指标

    指标 1:每秒 I/O 数(IOPS 或 tps) 对于磁盘来说,一次磁盘的连续读或者连续写称为一次磁盘 I/O, 磁盘的 IOPS 就是每秒磁盘连续读次数和连续写次数之和.当传输小块不连续数据时,该 ...

  7. UML Diagrams Using Graphviz Dot

    Introduction Background This article is about using the dot tool from the Graphviz package to automa ...

  8. spring boot 重定向

    /** * 测试各个html文件用. * @param model * @return */ @RequestMapping("home") public String home( ...

  9. MISC-WHCTF2016-crypto100

    题目:李二狗的梦中情人  找不同! 如图,下载得到“nvshen.png” 流程:看到这个被命名为nvshen的文件,感觉文件本身会有东西.用16进制查看器在图片的末尾发现了一串类似URL的ASCII ...

  10. boost pool 和 object_pool

    内存池(Memory Pool)是一种内存分配方式.        通常我们习惯直接使用new.malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的 ...