SQL中的子查询

这篇具有很好参考价值的文章主要介绍了SQL中的子查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、子查询定义

        当我们进⾏语句查询的时候,总会遇到我们需要的条件需要通过另⼀个查询语句查询出来后才能进⾏,就是说A 查询语句需要依赖B 查询语句的查询结果,B 查询就是⼦查询,A 查询语句就是主查询,⼀个SQL语句可以包含多个⼦查询。文章来源地址https://www.toymoban.com/news/detail-600037.html

二、子查询出现的地方

- 在where⼦句中: ⼦查询的结果可⽤作条件筛选时使⽤的值。
- 在from⼦句中: ⼦查询的结果可充当⼀张表或视图,需要使⽤表别名。
- 在having⼦句中: ⼦查询的结果可⽤作分组查询再次条件过滤时使⽤的值
- 在select⼦句中: ⼦查询的结果可充当⼀个字段。仅限⼦查询返回单⾏单列的情况。

1、子查询出现在where子句中 

1、查询⼯资⼤于10号部⻔的平均⼯资的⾮10号部⻔的员⼯信息
分析:
1)10号部⻔的平均⼯资
 select avg(sal) from emp where deptno = 10;
2)查询员工信息
 select * from emp where deptno != 10 and sal > (select avg(sal) from emp where deptno = 10);
 
+-------+-------+---------+------+------------+---------+------+--------+
| empno | ename | job     | mgr  | hiredate   | sal     | comm | deptno |
+-------+-------+---------+------+------------+---------+------+--------+
|  7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL |     20 |
|  7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL |     20 |
|  7902 | FORD  | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL |     20 |
+-------+-------+---------+------+------------+---------+------+--------+
 
 
2、查询与7369同部⻔的同事信息
 
select deptno from emp where empno = 7369;
 
select * from emp where deptno = (select deptno from emp where empno = 7369)
  and empno != 7369;
 
+-------+-------+---------+------+------------+---------+------+--------+
| empno | ename | job     | mgr  | hiredate   | sal     | comm | deptno |
+-------+-------+---------+------+------------+---------+------+--------+
|  7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL |     20 |
|  7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL |     20 |
|  7876 | ADAMS | CLERK   | 7788 | 1987-05-23 | 1100.00 | NULL |     20 |
|  7902 | FORD  | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL |     20 |
+-------+-------+---------+------+------------+---------+------+--------+

 2、子查询出现在from子句中

1、查询员⼯的姓名,⼯资,及其部⻔的平均⼯资
 select ename,sal from emp ;
 思考:
  每一个部门的平均工资是多少?
  select deptno,avg(sal) from emp group by deptno;
+--------+-------------+
| deptno | avg(sal)    |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
|     30 | 1566.666667 |
|    100 | NULL        |
+--------+-------------+
4 rows in set (0.09 sec)
查询员工信息:
select * from emp;
mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename  | job       | mgr  | hiredate   | sal     | comm    | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 | 800.00  | NULL    |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 | 300.00  |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 | 500.00  |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 | NULL    |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 | NULL    |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 | NULL    |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 | NULL    |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL    |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 | 0.00    |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 | NULL    |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 | 950.00  | NULL    |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 | NULL    |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 | NULL    |     10 |
|  8000 | LaoYan | NULL      | NULL | NULL       | NULL    | NULL    |    100 |
+-------+--------+-----------+------+------------+---------+---------+--------+
 
此时:查询出来的平均工资表可以当做一个虚拟的表,和emp表关联起来
 
mysql> select * from 
  ( select deptno,avg(sal) avgMoney from emp group by deptno ) avgTable;
+--------+-------------+
| deptno | avgMoney    |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
|     30 | 1566.666667 |
|    100 | NULL        |
+--------+-------------+
 
现在 avgTable 表  和 emp  通过 deptno 相关联
select  
   ename,sal,avgMoney from 
    emp , 
   (select deptno,avg(sal) avgMoney from emp group by deptno) avgTable   
   where emp.deptno=avgTable.deptno;
+--------+---------+-------------+
| ename  | sal     | avgMoney    |
+--------+---------+-------------+
| SMITH  | 800.00  | 2175.000000 |
| ALLEN  | 1600.00 | 1566.666667 |
| WARD   | 1250.00 | 1566.666667 |
| JONES  | 2975.00 | 2175.000000 |
| MARTIN | 1250.00 | 1566.666667 |
| BLAKE  | 2850.00 | 1566.666667 |
| CLARK  | 2450.00 | 2916.666667 |
| SCOTT  | 3000.00 | 2175.000000 |
| KING   | 5000.00 | 2916.666667 |
| TURNER | 1500.00 | 1566.666667 |
| ADAMS  | 1100.00 | 2175.000000 |
| JAMES  | 950.00  | 1566.666667 |
| FORD   | 3000.00 | 2175.000000 |
| MILLER | 1300.00 | 2916.666667 |
| LaoYan | NULL    | NULL        |
+--------+---------+-------------+
最终的答案!
 
虚拟机的表解释:--任何的查询结果都可以当做一个虚拟机的表来使用!
mysql> select ename,job,sal from emp where job is not null;
+--------+-----------+---------+
| ename  | job       | sal     |
+--------+-----------+---------+
| SMITH  | CLERK     | 800.00  |
| ALLEN  | SALESMAN  | 1600.00 |
| WARD   | SALESMAN  | 1250.00 |
| JONES  | MANAGER   | 2975.00 |
| MARTIN | SALESMAN  | 1250.00 |
| BLAKE  | MANAGER   | 2850.00 |
| CLARK  | MANAGER   | 2450.00 |
| SCOTT  | ANALYST   | 3000.00 |
| KING   | PRESIDENT | 5000.00 |
| TURNER | SALESMAN  | 1500.00 |
| ADAMS  | CLERK     | 1100.00 |
| JAMES  | CLERK     | 950.00  |
| FORD   | ANALYST   | 3000.00 |
| MILLER | CLERK     | 1300.00 |
+--------+-----------+---------+
14 rows in set (0.09 sec)
 
mysql> select * from (select ename,job,sal from emp where job is not null) eemp;
+--------+-----------+---------+
| ename  | job       | sal     |
+--------+-----------+---------+
| SMITH  | CLERK     | 800.00  |
| ALLEN  | SALESMAN  | 1600.00 |
| WARD   | SALESMAN  | 1250.00 |
| JONES  | MANAGER   | 2975.00 |
| MARTIN | SALESMAN  | 1250.00 |
| BLAKE  | MANAGER   | 2850.00 |
| CLARK  | MANAGER   | 2450.00 |
| SCOTT  | ANALYST   | 3000.00 |
| KING   | PRESIDENT | 5000.00 |
| TURNER | SALESMAN  | 1500.00 |
| ADAMS  | CLERK     | 1100.00 |
| JAMES  | CLERK     | 950.00  |
| FORD   | ANALYST   | 3000.00 |
| MILLER | CLERK     | 1300.00 |
+--------+-----------+---------+
14 rows in set (0.06 sec)

3、子查询出现在select后面

2、查询员⼯的姓名,⼯资,及其部⻔的平均⼯资
说一个情况: emp表和emp表也是可以自己关联自己的。
 select * from emp e1, emp e2 where e1.empno = e2.empno;
 
 
select ename,sal, (select avg(sal) from emp e2 where e2.deptno = e1.deptno ) 
 部门平均工资 from emp e1;
拆解:
select avg(sal) from emp e2 where e2.deptno = 10;
select avg(sal) from emp e2 where e2.deptno = 20;
 
最终的答案:
+--------+---------+--------------+
| ename  | sal     | 部门平均工资 |
+--------+---------+--------------+
| SMITH  | 800.00  | 2175.000000  |
| ALLEN  | 1600.00 | 1566.666667  |
| WARD   | 1250.00 | 1566.666667  |
| JONES  | 2975.00 | 2175.000000  |
| MARTIN | 1250.00 | 1566.666667  |
| BLAKE  | 2850.00 | 1566.666667  |
| CLARK  | 2450.00 | 2916.666667  |
| SCOTT  | 3000.00 | 2175.000000  |
| KING   | 5000.00 | 2916.666667  |
| TURNER | 1500.00 | 1566.666667  |
| ADAMS  | 1100.00 | 2175.000000  |
| JAMES  | 950.00  | 1566.666667  |
| FORD   | 3000.00 | 2175.000000  |
| MILLER | 1300.00 | 2916.666667  |
| LaoYan | NULL    | NULL         |
+--------+---------+--------------+
 
优化一下:工资 保留小数点后2位
select ename,sal, 
   round(
    ( select avg(sal) from emp e2 where e2.deptno = e1.deptno),2) 部门平均工资 
  from emp e1;
+--------+---------+--------------+
| ename  | sal     | 部门平均工资 |
+--------+---------+--------------+
| SMITH  | 800.00  | 2175.00      |
| ALLEN  | 1600.00 | 1566.67      |
| WARD   | 1250.00 | 1566.67      |
| JONES  | 2975.00 | 2175.00      |
| MARTIN | 1250.00 | 1566.67      |
| BLAKE  | 2850.00 | 1566.67      |
| CLARK  | 2450.00 | 2916.67      |
| SCOTT  | 3000.00 | 2175.00      |
| KING   | 5000.00 | 2916.67      |
| TURNER | 1500.00 | 1566.67      |
| ADAMS  | 1100.00 | 2175.00      |
| JAMES  | 950.00  | 1566.67      |
| FORD   | 3000.00 | 2175.00      |
| MILLER | 1300.00 | 2916.67      |
| LaoYan | NULL    | NULL         |
+--------+---------+--------------+
 
再来一遍,仔细品味:
mysql> select ename,sal, ( select avg(sal) from emp e2 where e2.deptno = 10 ) from emp;
+--------+---------+------------------------------------------------------+
| ename  | sal     | ( select avg(sal) from emp e2 where e2.deptno = 10 ) |
+--------+---------+------------------------------------------------------+
| SMITH  | 800.00  | 2916.666667                                          |
| ALLEN  | 1600.00 | 2916.666667                                          |
| WARD   | 1250.00 | 2916.666667                                          |
| JONES  | 2975.00 | 2916.666667                                          |
| MARTIN | 1250.00 | 2916.666667                                          |
| BLAKE  | 2850.00 | 2916.666667                                          |
| CLARK  | 2450.00 | 2916.666667                                          |
| SCOTT  | 3000.00 | 2916.666667                                          |
| KING   | 5000.00 | 2916.666667                                          |
| TURNER | 1500.00 | 2916.666667                                          |
| ADAMS  | 1100.00 | 2916.666667                                          |
| JAMES  | 950.00  | 2916.666667                                          |
| FORD   | 3000.00 | 2916.666667                                          |
| MILLER | 1300.00 | 2916.666667                                          |
| LaoYan | NULL    | 2916.666667                                          |
+--------+---------+------------------------------------------------------+
15 rows in set (0.10 sec)
 
mysql> select ename,sal, ( select avg(sal) from emp e2 where e2.deptno = emp.deptno ) from emp;
+--------+---------+--------------------------------------------------------------+
| ename  | sal     | ( select avg(sal) from emp e2 where e2.deptno = emp.deptno ) |
+--------+---------+--------------------------------------------------------------+
| SMITH  | 800.00  | 2175.000000                                                  |
| ALLEN  | 1600.00 | 1566.666667                                                  |
| WARD   | 1250.00 | 1566.666667                                                  |
| JONES  | 2975.00 | 2175.000000                                                  |
| MARTIN | 1250.00 | 1566.666667                                                  |
| BLAKE  | 2850.00 | 1566.666667                                                  |
| CLARK  | 2450.00 | 2916.666667                                                  |
| SCOTT  | 3000.00 | 2175.000000                                                  |
| KING   | 5000.00 | 2916.666667                                                  |
| TURNER | 1500.00 | 1566.666667                                                  |
| ADAMS  | 1100.00 | 2175.000000                                                  |
| JAMES  | 950.00  | 1566.666667                                                  |
| FORD   | 3000.00 | 2175.000000                                                  |
| MILLER | 1300.00 | 2916.666667                                                  |
| LaoYan | NULL    | NULL                                                         |
+--------+---------+--------------------------------------------------------------+
15 rows in set (0.11 sec)
 
 
再来一题:
查询每个员⼯的信息及其部⻔的平均⼯资,⼯资之和,部⻔⼈数
select *,
  (select avg(sal) from emp e1 where e1.deptno = emp.deptno) 平均工资,
  (select sum(sal) from emp e2 where e2.deptno = emp.deptno) 工资之和,
  (select count(*) from emp e3 where e3.deptno = emp.deptno) 部门人数
from emp;
 
尝试-- 这种不行,报 Operand should contain 1 column(s)
select *,(
   select avg(sal) 平均工资,sum(sal) 工资之和,count(*) 部门人数  from emp e1 where e1.deptno = emp.deptno) from emp;
 
改变思路:在玩一种很新的东西
 
mysql> select deptno,avg(sal) 平均工资,sum(sal) 工资之和,count(*) 部门人数  from emp e1
   group by deptno ;
+--------+-------------+----------+----------+
| deptno | 平均工资    | 工资之和 | 部门人数 |
+--------+-------------+----------+----------+
|     10 | 2916.666667 | 8750.00  |        3 |
|     20 | 2175.000000 | 10875.00 |        5 |
|     30 | 1566.666667 | 9400.00  |        6 |
|    100 | NULL        | NULL     |        1 |
+--------+-------------+----------+----------+
 
硬套进去:失败了,原因是这个地方只允许出现一列数据
select * , (select * from (select deptno,avg(sal) 平均工资,sum(sal) 工资之和,count(*) 部门人数  from emp e1
   group by deptno) pgb where pgb.deptno =emp.deptno ) from emp;

4、子查询出现在having子句中

查询平均⼯资⼤于30号部⻔的平均⼯资的部⻔号,和平均⼯资
分析:30号部⻔的平均⼯资
select avg(sal) from emp where deptno = 30;
查询所有部门的平局工资:
select deptno,avg(sal) from emp group by deptno;
 
整合
select deptno,avg(sal) avgMoney from emp group by deptno 
   having avgMoney > (select avg(sal) from emp where deptno = 30);
+--------+-------------+
| deptno | avgMoney    |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
+--------+-------------+

到了这里,关于SQL中的子查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库增删改查及聚合查询SQL语句学习汇总

    目录 数据库增删改查SQL语句 MySQL数据库指令 1.查询数据库 2.创建数据库 3.删除数据库 4.选择数据库 创建表table   查看所有表 创建表 查看指定表的结构 删除表 数据库命令进行注释 增删改查(CRUD)详细说明 增加 SQL库提供了关于时间的函数:now()  查询 查询表作列与列之间进

    2024年02月09日
    浏览(86)
  • 【MySQL】MySQL PHP 语法,PHP MySQL 简介,查询,下载 MySQL 数据库, SQL 教程

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP,在这些语言中,MySQL 在 PHP 的 web 开发中是应用最广泛。 我们

    2024年02月11日
    浏览(58)
  • MySQL数据库中的索引(含SQL语句)

    假设有一张表,表中有100万条数据,这100万条数据在硬盘上是存储在数据页上的,一页数据大小为16k。存储100万条数据那么就需要数据页,假设其中有一条数据是“id为7900”的,那么如果要查询这条数据,其中SQL是SELECT * FROM 表名 WHERE id = 7900。在执行这条SQL语句的时候,MyS

    2024年02月02日
    浏览(80)
  • SQL Server、MySQL和Oracle数据库分页查询的区别与联系

    摘要:本文将通过一个现实例子,详细解释SQL Server、MySQL和Oracle这三种常见关系型数据库在分页查询方面的区别与联系。我们将提供具体场景下的SQL语句示例,并解释每个数据库的分页查询用法以及优化方法,帮助读者更好地选择适合自己需求的分页查询方式。 假设我们有一

    2024年02月11日
    浏览(55)
  • Mysql-------SQL:DDL数据定义语言、DDM数据操作语言、DQL数据库查询语言、DQL数据控制语言

    SQL语言可以分为: DDL(Data Definition Language)语言:数据定义语言,用于 创建或更改数据库中的表、视图、索引等对象 DML(Data Manipulation Language)语言:数据操作语言,用来对 数据库表中的数据进行增删改查操作; DQL(Data Query Language)语言: 数据查询语言,用来查询数据库

    2024年02月13日
    浏览(75)
  • 基于Linux操作系统中的MySQL数据库SQL语句(三十一)

    MySQL数据库SQL语句 目录 一、SQL语句类型 1、DDL 2、DML 3、DCL 4、DQL 二、数据库操作 1、查看 2、创建 2.1、默认字符集 2.2、指定字符集 3、进入  4、删除 5、更改 6、练习 三、数据表操作 (一)数据类型 1、数值类型 1.1、TINYINT 1.2、SMALLINT 1.3、INT 1.4、BIGINT 1.5、FLOAT(M,D) 2、时间

    2024年02月15日
    浏览(68)
  • SQL中的子查询

            当我们进⾏语句查询的时候,总会遇到我们需要的条件需要通过另⼀个查询语句查询出来后才能进⾏,就是说A 查询语句需要依赖B 查询语句的查询结果,B 查询就是⼦查询,A 查询语句就是主查询,⼀个SQL语句可以包含多个⼦查询。

    2024年02月16日
    浏览(33)
  • 关系数据库-9-[mysql8]中的语法校验规则sql_mode应用

    Mysql中sql_mode使用详解 sql_mode是一组mysql的语法校验规则,定义了mysql应该支持的sql语法、数据校验等。 1.3.1 ANSI模式 这是一种宽松模式,该模式下,会对所操作数据进行校验,如果不符合校验规则,数据会按照规则执行,并报warning警告。 1.3.2 STRICT_TRANS_TABLES模式 这是一种严格

    2024年02月02日
    浏览(49)
  • 关系数据库SQL数据查询

    1.查询仅涉及一个表,选择表中的若干列 查询全部列 选出所有属性列: 在SELECT后面列出所有列名 将目标列表达式指定为 * 查询经过计算的值 SELECT子句的目标列表达式不仅可以为表中的属性列,也可以是表达式 使用列别名改变查询结果的列标题: 2.选择表中的若干元组

    2024年02月09日
    浏览(55)
  • 什么是T-SQL编程?T-SQL是Transact-SQL的缩写,是一种扩展了SQL(结构化查询语言)的编程语言,用于Microsoft SQL Server数据库管理系统中的数据管理和操作。T-

    什么是T-SQL编程? T-SQL是Transact-SQL的缩写,是一种 扩展了SQL(结构化查询语言) 的编程语言,用于Microsoft SQL Server数据库管理系统中的数据管理和操作。T-SQL支持创建 存储过程、触发器、函数 等高级特性,能够更加灵活地进行数据操作和处理。基本的T-SQL语法与标准SQL很相

    2024年01月21日
    浏览(97)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包