我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySql中子查询内查询示例详解

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySql中子查询内查询示例详解

  西北望乡何处是,东南见月几回圆。

月亮又慢悠悠的挂上了天空,趁着睡前梦呓,我就带领各位可爱的读者们探索MySql最后的子查询部分。

说明:有些查询结果出来结果截图与题目要求不一样会出现多余的字段是为了方便展示结果的可读性。实际操作的读者可以删除SELECT后面多余的字段得到正确的结果。


#WHERE或HAVING后面
#1.标量子查询(单行子查询)
#2.列子查询(多行子查询)
#3.行子查询(多列多行)
#特点:
# ①子查询放在小括号内
# ②子查询一般放在条件的右侧
# ③标量子查询:一般搭配着单行操作符使用
#  单行操作符: > < >= <= <> !-
#  列子查询,一般搭配着多行操作符使用
#  IN,ANY/SOME(任意),ALL
# ④子查询的执行优先与主查询执行,主查询的条件用到了子查询的结果。

#1.标量子查询
#案例1:谁的工资比Abel高?
#①查询Abel的工资
SELECT salary
FROM employees
WHERE last_name = 'Abel';


#②查询员工的信息,满足Salary>①结果
SELECT *
FROM employees
WHERE salary>(SELECT salary FROM employees WHERE last_name='Abel');


#案例2.返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id,工资。
#①查141员工的job_id
SELECT job_id
FROM employees
WHERE employee_id='141';


#②查143员工的salary
SELECT salary
FROM employees
WHERE employee_id='143';


#③最后合并结果
SELECT CONCAT(last_name,first_name) AS 姓名,
job_id AS 工种编号,
salary AS 工资
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。
SELECT MIN(salary)
FROM employees;


SELECT
last_name AS 姓,
salary AS 工资,
job_id AS 工种编号
FROM employees
WHERE salary=(
 SELECT MIN(salary)
 FROM employees
     );


#案例4.查询最低工资大于50号部门最低工资的部门id和其最低工资。
#①查50部门的最低工资
SELECT MIN(salary)
FROM employees
WHERE department_id=50;


#分组后,筛选条件①.【不用排除没有部门的所以不筛选部门编号】
SELECT department_id AS 部门编号,
MIN(salary) AS 月薪
FROM employees
#WHERE department_id
GROUP BY department_id
HAVING 月薪>(
 SELECT MIN(salary)
 FROM employees
    );


#2.列子查询(多行子查询)
#返回多行
#使用多行比较操作符


#案例1.返回location_id是1400或1700的部门中的所有员工姓名。
#①查询location_id是1400或1700的部门编号
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700);


#②查询员工姓名,要求部门号是①列表的某一个
SELECT CONCAT(last_name,first_name) AS 姓名
FROM employees
WHERE department_id IN (
 SELECT DISTINCT department_id
 FROM departments
 WHERE location_id IN(1400,1700)
 );


用ANY替代IN与上面同样的结果
SELECT CONCAT(last_name,first_name) AS 姓名
FROM employees
WHERE department_id = ANY(
 SELECT DISTINCT department_id
 FROM departments
 WHERE location_id IN(1400,1700)
 );

#案例.返回location_id不是1400或1700的部门中的所有员工姓名。
SELECT CONCAT(last_name,first_name) AS 姓名
FROM employees
WHERE department_id NOT IN(
 SELECT DISTINCT department_id
 FROM departments
 WHERE location_id IN(1400,1700)
);
==============================
SELECT CONCAT(last_name,first_name) AS 姓名
FROM employees
WHERE department_id <> ALL(
 SELECT DISTINCT department_id
 FROM departments
 WHERE location_id IN(1400,1700)
);


#案例2.返回其他工种中比job_id为IT_PROG部门任意一工资低的员工工号,
# 姓名,job_id以及salary
#①把IT_PROG部门中的工资查出来
SELECT DISTINCT salary
FROM employees
WHERE job_id='IT_PROG';


#②把不是IT_PROG部门信息查出来
SELECT *
FROM employees
WHERE job_id != 'IT_PROG';


#③合并①与②在员工表中查出来
SELECT employee_id AS 员工编号,
CONCAT(last_name,first_name) AS 姓名,
job_id AS 工种编号,
salary AS 工资
FROM employees
WHERE job_id != 'IT_PROG'
AND salary<ANY(
 SELECT salary
 FROM employees
 WHERE job_id='IT_PROG'
  );


用MAX代替ANY与上面同样的效果
SELECT employee_id AS 员工编号,
CONCAT(last_name,first_name) AS 姓名,
job_id AS 工种编号,
salary AS 工资
FROM employees
WHERE job_id <> 'IT_PROG'
AND salary<(
 SELECT MAX(salary)
 FROM employees
 WHERE job_id='IT_PROG'
  );

#案例3.返回其他部门中比job_id为‘IT_PROG'部门所有工资都低的员工
#的员工号,姓名,job_id以及salary。
#①先把IT_PROG部门的工资查出来。
SELECT DISTINCT salary
FROM employees
WHERE job_id='IT_PROG';


SELECT employee_id AS 员工号,
CONCAT(last_name,first_name) AS 姓名,
job_id AS 工种编号,
salary AS 工资
FROM employees
WHERE salary<ALL(
 SELECT DISTINCT salary
 FROM employees
 WHERE job_id='IT_PROG'
)
 AND job_id <> 'IT_PROG';
=============================
MIN替代ALL
SELECT employee_id AS 员工号,
CONCAT(last_name,first_name) AS 姓名,
job_id AS 工种编号,
salary AS 工资
FROM employees
WHERE salary<(
  SELECT MIN(salary)
  FROM employees
  WHERE job_id='IT_PROG'
)
 AND job_id <> 'IT_PROG';


#3.行子查询(结果集一行多列或者多行多列)
#案例1.查询员工编号最小并且工资最高的员工信息.引入
SELECT MIN(employee_id)
FROM employees;
=================
SELECT MAX(salary)
FROM employees;


SELECT *
FROM employees
WHERE employee_id = (
 SELECT MIN(employee_id)
 FROM employees
)
AND salary = (
 SELECT MAX(salary)
 FROM employees
     );


这种查询结果使用虚拟字段,单行操作符必须一致可以使用。查出来与上面同样的效果。
SELECT *
FROM employees
WHERE (employee_id,salary)=(
 SELECT MIN(employee_id),
 MAX(salary)
 FROM employees
       );

#二.SELECT子查询
#仅仅支持标量子查询,结果是一行一列
#案例1.查询每个部门的员工个数
SELECT d.*,(SELECT COUNT(*) FROM employees)
FROM departments d; 


添加条件
SELECT d.*,(SELECT COUNT(*)
FROM employees e
WHERE e.department_id=d.department_id
) AS 个数
FROM departments d; 


#案例2.查询员工号=102的部门名。
SELECT department_name
FROM departments;
==============
SELECT employee_id
FROM employees
WHERE employee_id = 102;


SELECT employee_id,
(
 SELECT department_name
 FROM departments d
 WHERE e.department_id=d.department_id
)
FROM employees e
WHERE employee_id=102;


#三.FROM 后面
注意:将子查询结果充当一张表,要求必须起别名
#案例:查询每个部门的平均工资等级。
SELECT ROUND(AVG(salary),2),department_id
FROM employees
GROUP BY department_id;


SELECT e.平均工资,j.grade_level
FROM job_grades AS j
,(
SELECT ROUND(AVG(salary),2) AS 平均工资,department_id
 FROM employees
 GROUP BY department_id
) AS e
WHERE e.平均工资 BETWEEN j.lowest_sal AND j.highest_sal;

#1999语法,老师答案
SELECT e.*,j.grade_level
FROM (
  SELECT ROUND(AVG(salary),2) AS 平均工资,department_id
  FROM employees
  GROUP BY department_id
) AS e
INNER JOIN job_grades j
ON e.平均工资 BETWEEN j.lowest_sal AND j.highest_sal;


#四.EXISTS后面(相关子查询)
语法:EXISTS(完整的查询语句)
备注:完整的查询语句可以是一行一列,可以使一行多列
注意:先走外查询,然后根据某个字段的值再去过滤
EXISTS 判断(布尔类型)值存不存在,结果只有两种:1有,0没有
#引入
SELECT EXISTS(SELECT employee_id FROM employees);


查询工资3W的员工信息
SELECT EXISTS(SELECT * FROM employees WHERE salary=30000);


#案例引入.查询员工名和部门名
#查员工名与部门编号
SELECT first_name,department_id
FROM employees
WHERE department_id;


#查部门名
SELECT department_name
FROM departments;


#查员工名与部门名
SELECT e.first_name,d.department_name
FROM employees e
INNER JOIN (  SELECT department_name,department_id
 FROM departments
) AS d
ON e.department_id=d.department_id;


#案例1..查有员工的部门名
SELECT department_name
FROM departments d
WHERE EXISTS(
 SELECT *
 FROM employees e
 WHERE d.department_id=e.department_id
    );


使用IN代替EXISTS,同样是上面的结果
SELECT department_name
FROM departments d
WHERE d.department_id IN(
 SELECT department_id
 FROM employees
     );

#案例2.查询没有女朋友的男神信息
#IN方法
SELECT *
FROM boys bo
WHERE bo.id NOT IN(
 SELECT boyfriend_id
 FROM beauty be
);
===============
#EXISTS方法
SELECT *
FROM boys bo
WHERE NOT EXISTS(
 SELECT boyfriend_id
 FROM beauty be
 WHERE bo.id=be.boyfriend_id
);


进阶9:联合查询
UNION 联合 合并:将多条查询语句的结果合并成一个结果。
语法:
 查询语句1
 UNION
 查询语句2
 UNION
 ...

应用场景:
要查询的结果来自于多个表,且多个表没有直接的连接关系,
但查询信息一致时。
网页搜索内容,内容从不同的表中检索联合起来返回给用户。

特点:
1.要求多条查询语句的查询列数是一致的。
2.要求多条查询语句的查询的每一列的类型和顺序最好一致。
3.使用UNION关键字默认去重,如果使用UNION ALL全部展示,包含重复项

感谢能认真读到这里的伙伴们,MySql查询部分结束,相信屏幕前的你照着我博客里的模板可以完成一些简单的SQL查询语句,SQL既然学了,以后还是要多练习一下,SQL1992与1999语法在主流的关系型数据库都是通用的。后续我会继续进行对MySql的知识进行扩展,感兴趣的同志互相关注一呗!o(^?^)o

到此这篇关于MySql中子查询内查询示例详解的文章就介绍到这了,更多相关MySql 子查询内查询内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySql中子查询内查询示例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySql中子查询内查询示例详解

西北望乡何处是,东南见月几回圆。 月亮又慢悠悠的挂上了天空,趁着睡前梦呓,我就带领各位可爱的读者们探索MySql最后的子查询部分。 说明:有些查询结果出来结果截图与题目要求不一样会出现多余的字段是为了方便展示结果的可读性。实际操作的读者可以
2022-05-25

实例详解mysql子查询

子查询分类 按返回结果集分类 子查询按返回结果集的不同分为4种:表子查询,行子查询,列子查询和标量子查询。 表子查询:返回的结果集是一个行的集合,N行N列(N>=1)。表子查询经常用于父查询的FROM子句中。 行子查询:返回的结果集是一个列
2022-05-19

MySQL中子查询的示例分析

这篇文章主要介绍了MySQL中子查询的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、子查询定义   定义:  子查询允许把一个查询嵌套在另一个查询当中。  子查询
2023-06-20

mysql连接查询、联合查询、子查询原理与用法实例详解

本文实例讲述了mysql连接查询、联合查询、子查询原理与用法。分享给大家供大家参考,具体如下: 本文内容:连接查询联合查询子查询from子查询where子查询exists子查询首发日期:2018-04-11连接查询:连接查询就是将多个表联合
2022-05-12

MySql的回顾六:子查询(内查询)

西北望乡何处是,东南见月几回圆。       月亮又慢悠悠的挂上了天空,趁着睡前梦呓,我就带领各位可爱的读者们探索MySql最后的子查询部分。      说明:有些查询结果出来结果截图与题目要求不一样会出现多余的字段是为了方便展示结果的可读性。实际操作的读者可
MySql的回顾六:子查询(内查询)
2018-07-12

Elasticsearchpercolate查询示例详解

这篇文章主要为大家介绍了Elasticsearchpercolate查询示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-28

MySQL:子查询(全面详解)

MySQL:子查询 前言一、需求分析与问题解决1、实际问题2、子查询的基本使用3、子查询的分类 二、单行子查询1、单行比较操作符2、代码示例3、HAVING 中的子查询4、CASE中的子查询5、子查询中的空值问题6、非法使用子查
2023-08-16

MYSQL聚合查询、分组查询、联合查询举例详解

目录聚合查询聚合函数count()sum()avg()max()和min()总结分组查询group by 子句having 子句联合查询笛卡尔积内连接外连接自连接子查询单行子查询多行子查询from子句使用子查询合并查询总结 聚合查询聚合查
MYSQL聚合查询、分组查询、联合查询举例详解
2024-09-23

MySQL 中,子查询能否替代联合查询?(MySQL子查询能替代联合查询吗)

在 MySQL 数据库中,子查询和联合查询都是非常常用的查询技术,它们各自具有独特的优势和适用场景。那么,子查询能否替代联合查询呢?这是一个值得探讨的问题。

一、子查询的基本概念

子查询是在一个查询语句中嵌套另一个查询语句。外层查询可以基于子查询的结果进行进一步的操作,如筛选、排序等。子查询通常用于获取中间结果或满足特定条件的数据集。

例如,以下是一个简单的子查询示例:

SELECT column1
FROM table1
WHERE column2 = (SELECT column3 FROM table2 WHERE condition);

在这个例子中,子查询 (SELECT column3 FROM table2 WHERE condition) 首先在 table2 中查找满足条件的 column3 值,然后外层查询在 table1 中筛选出 column2 等于子查询结果的行,并返回 column1 的值。

二、联合查询的基本概念

联合查询用于将多个查询的结果合并成一个结果集。它通过 UNIONUNION ALL 操作符将多个查询的结果组合在一起。联合查询通常用于合并具有相似结构的数据集或在不同的表中查找相关的数据。

例如,以下是一个简单的联合查询示例:

SELECT column1 FROM table1
UNION
SELECT column1 FROM table2;

在这个例子中,两个查询分别从 table1table2 中选择 column1 的值,然后通过 UNION 操作符将它们合并成一个结果集,去除重复的行。

三、子查询与联合查询的适用场景

  1. 子查询的适用场景

    • 当需要在查询中使用另一个查询的结果作为条件时,子查询非常有用。例如,在筛选数据时,可以使用子查询来获取特定条件的中间结果,并在主查询中使用该结果进行进一步的筛选。
    • 子查询可以用于获取聚合函数的结果或计算中间值。例如,可以使用子查询计算某个表中的最大值或平均值,并在主查询中使用该值进行条件筛选。
    • 子查询可以用于在不同的表之间进行关联查询。通过在子查询中获取关联表的相关数据,然后在主查询中使用该数据进行进一步的操作。
  2. 联合查询的适用场景

    • 当需要合并多个具有相似结构的数据集时,联合查询是一个很好的选择。例如,可以使用联合查询将多个表中的相同字段合并成一个结果集,以便进行统一的分析和处理。
    • 联合查询可以用于在不同的数据库或数据源之间进行数据集成。通过将多个数据源的查询结果合并成一个结果集,可以实现数据的整合和共享。
    • 联合查询可以用于在查询结果中去除重复的行。通过使用 UNION ALL 操作符,可以保留所有的行,包括重复的行;而使用 UNION 操作符,则会去除重复的行。

四、子查询能否替代联合查询

子查询和联合查询在某些情况下可以相互替代,但在其他情况下,它们各自具有不可替代的优势。

  1. 子查询可以替代简单的联合查询

    • 对于简单的联合查询,即只需要合并两个具有相似结构的数据集且不需要去除重复行的情况,子查询可以通过嵌套查询来实现相同的功能。
    • 例如,以下两个查询是等价的:
      SELECT column1 FROM table1
      UNION
      SELECT column1 FROM table2;
      SELECT column1 FROM (SELECT column1 FROM table1
      UNION ALL
      SELECT column1 FROM table2) AS temp;

      在这个例子中,第二个查询使用子查询将两个表的查询结果合并成一个临时表,然后在主查询中选择 column1 的值。

  2. 联合查询可以替代简单的子查询

    • 对于简单的子查询,即只需要在一个查询中使用另一个查询的结果作为条件的情况,联合查询可以通过连接操作来实现相同的功能。
    • 例如,以下两个查询是等价的:
      SELECT column1
      FROM table1
      WHERE column2 = (SELECT column3 FROM table2 WHERE condition);
      SELECT t1.column1
      FROM table1 t1
      JOIN (SELECT column3 FROM table2 WHERE condition) t2 ON t1.column2 = t2.column3;

      在这个例子中,第二个查询使用连接操作将 table1 和一个子查询的结果连接起来,然后在主查询中选择 column1 的值。

  3. 子查询和联合查询在复杂查询中的应用

    • 在复杂的查询中,子查询和联合查询都有各自的优势。子查询可以更灵活地处理嵌套查询和中间结果,而联合查询可以更方便地合并多个数据集。
    • 例如,以下是一个使用子查询和联合查询的复杂查询示例:
      SELECT column1
      FROM table1
      WHERE column2 IN (SELECT column3 FROM table2 WHERE condition1)
      OR column2 IN (SELECT column4 FROM table3 WHERE condition2);
      SELECT column1
      FROM table1
      WHERE EXISTS (SELECT 1 FROM table2 WHERE condition1 AND table1.column2 = table2.column3)
      OR EXISTS (SELECT 1 FROM table3 WHERE condition2 AND table1.column2 = table3.column4);

      在这个例子中,第一个查询使用子查询在 table2table3 中查找满足条件的 column3column4 值,并将结果作为 IN 条件用于在 table1 中筛选数据;第二个查询使用存在量词 EXISTStable2table3 中查找满足条件的行,并通过连接操作将结果与 table1 关联起来。

五、结论

子查询和联合查询在 MySQL 数据库中都具有重要的作用,它们各自适用于不同的场景。在某些情况下,子查询可以替代联合查询,而在其他情况下,联合查询可以替代子查询。在实际应用中,需要根据具体的需求和查询结构来选择合适的查询技术。

总之,了解子查询和联合查询的基本概念、适用场景以及它们之间的关系,对于编写高效的 MySQL 查询语句非常重要。通过合理使用子查询和联合查询,可以提高查询的性能和灵活性,满足不同的业务需求。

MySQL 中,子查询能否替代联合查询?(MySQL子查询能替代联合查询吗)
2024-12-13

Mysql查询优化之IN子查询优化方法详解

这篇文章主要给大家介绍了关于Mysql查询优化之IN子查询优化的相关资料,需要的朋友可以参考下
2023-02-09

SQL 查询详解:连接查询、子查询和聚合函数

本文详细介绍了 SQL 中的连接查询、子查询以及聚合函数的使用方法和应用场景。
SQL数据库2024-11-29

Elasticsearch查询之MatchQuery示例详解

这篇文章主要为大家介绍了Elasticsearch查询之Match查询示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-17

编程热搜

目录