返回顶部
首页 > 资讯 > 数据库 >mysql子查询如何应用
  • 624
分享到

mysql子查询如何应用

mysql 2022-11-30 23:11:50 624人浏览 薄情痞子
摘要

这篇“Mysql子查询如何应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql子查

这篇“Mysql子查询如何应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql子查询如何应用”文章吧。

  • 简介

子查询要包含在括号内
将子查询放在比较条件的右侧
单行操作符对应单行子查询,多行操作符对应多行子查询
  • 分类

单行子查询:查询的结果只有1行
多行子查询:查询的结果有多行
相关(或关联)子查询:子查询中的参数需要用到主查询中的值
不相关(或非关联)子查询
  • 案例1

# 1.查询工资比Abel高用户
# 方式1:需要2步
SELECT salary FROM employees WHERE last_name = 'Abel';

SELECT last_name, salary FROM employees WHERE salary > 11000;

# 方式2:自连接
SELECT e2.last_name, e2.salary
FROM employees e1, employees e2
WHERE e2.`salary` > e1.`salary` #多表的连接条件
AND e1.last_name = 'Abel';

# 方式3:子查询
SELECT last_name,salary
FROM employees
WHERE salary > 
  (SELECT salary
        FROM employees
        WHERE last_name = 'Abel'
        );
  • 称谓的规范

外查询(或主查询)
内查询(或子查询)
  • 单行比较操作符

  • mysql子查询如何应用

  • 代码案例

# 查询工资大于149号员工工资的员工的信息
SELECT employee_id, last_name, salary
FROM employees
WHERE salary > (
  SELECT salary
  FROM employees
  WHERE employee_id = 149
  );

# 返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资
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
  );


# 返回公司工资最少的员工的last_name,job_id和salary
SELECT last_name, job_id, salary
FROM employees
WHERE salary = (
  SELECT MIN(salary)
  FROM employees
  );

# 查询与141号员工的manager_id和department_id相同的其他员工的employee_id,manager_id,department_id
# 方式1:
SELECT employee_id, manager_id, department_id
FROM employees
WHERE manager_id = (
  SELECT manager_id
  FROM employees
  WHERE employee_id = 141
  )
AND department_id = (
  SELECT department_id
  FROM employees
  WHERE employee_id = 141
  )
AND employee_id <> 141;

# 方式2:
SELECT employee_id, manager_id, department_id
FROM employees
WHERE (manager_id,department_id) = (
  SELECT manager_id,department_id
  FROM employees
  WHERE employee_id = 141
  )
AND employee_id <> 141;

# 查询最低工资大于110号部门最低工资的部门id和其最低工资
SELECT department_id, MIN(salary)
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING MIN(salary) > (
  SELECT MIN(salary)
  FROM employees
  WHERE department_id = 110
  );

# 显式员工的employee_id,last_name和location。其中,若员工department_id与location_id为1800的department_id相同,则location为’Canada’,其余则为’USA’
SELECT employee_id, last_name, CASE department_id WHEN (
  SELECT department_id FROM departments WHERE location_id = 1800) 
THEN 'Canada' ELSE 'USA' END "location" FROM employees;

# 子查询结果为null,则最后结果为null
SELECT last_name, job_id
FROM   employees
WHERE  job_id =
  (SELECT job_id
  FROM   employees
  WHERE  last_name = 'Haas');
  • 多行子查询

也称为集合比较子查询
内查询返回多行
使用多行比较操作符
  • 多行比较操作符

  • mysql子查询如何应用

  • 代码案例

# IN:
SELECT employee_id, last_name
FROM employees
WHERE salary IN
  (SELECT MIN(salary)
  FROM employees
  GROUP BY department_id); 
                 
# ANY 或 ALL:
# 返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE job_id <> 'IT_PROG'
AND salary < ANY (
  SELECT salary
  FROM employees
  WHERE job_id = 'IT_PROG'
  );

# 返回其它job_id中比job_id为‘IT_PROG’部门所有工资低的员工的员工号、姓名、job_id 以及salary
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE job_id <> 'IT_PROG'
AND salary < ALL (
  SELECT salary
  FROM employees
  WHERE job_id = 'IT_PROG'
  );
    
# 查询平均工资最低的部门id
# Mysql中聚合函数是不能嵌套使用的。
# 方式1:
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
  SELECT MIN(avg_sal)
  FROM(
    SELECT AVG(salary) avg_sal
    FROM employees
    GROUP BY department_id
    ) t_dept_avg_sal
  );

# 方式2:
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL( 
  SELECT AVG(salary) avg_sal
  FROM employees
  GROUP BY department_id
  ) 

# 子查询结果为null,则最后结果为null
SELECT last_name
FROM employees
WHERE employee_id NOT IN (
  SELECT manager_id
  FROM employees
  );
  • 相关子查询

子查询中使用主查询中的列

mysql子查询如何应用

  • 代码案例

# 查询员工中工资大于公司平均工资的员工的last_name,salary和其department_id
SELECT last_name, salary, department_id
FROM employees
WHERE salary > (
  SELECT AVG(salary)
  FROM employees
  );
    
# 查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id
# 方式1:使用相关子查询
SELECT last_name, salary, department_id
FROM employees e1
WHERE salary > (
  SELECT AVG(salary)
  FROM employees e2
  WHERE department_id = e1.`department_id`
  );

#方式2:在FROM中声明子查询
SELECT e.last_name, e.salary, e.department_id
FROM employees e,(
  SELECT department_id,AVG(salary) avg_sal
  FROM employees
  GROUP BY department_id) t_dept_avg_sal    # 取别名
WHERE e.department_id = t_dept_avg_sal.department_id
AND e.salary > t_dept_avg_sal.avg_sal

# 查询员工的id,salary,按照department_name排序
SELECT employee_id, salary
FROM employees e
ORDER BY (
  SELECT department_name
  FROM departments d
  WHERE e.`department_id` = d.`department_id`
  ) ASC;
  • 在SELECT中,除了GROUP BY 和 LIMIT之外,其他位置都可以声明子查询

SELECT ....,....,....(存在聚合函数)
FROM ... (LEFT / RIGHT)JOIN ....ON 多表的连接条件 
(LEFT / RIGHT)JOIN ... ON ....
WHERE 不包含聚合函数的过滤条件
GROUP BY ...,....
HAVING 包含聚合函数的过滤条件
ORDER BY ....,...(ASC / DESC )
LIMIT ...,....
  • EXISTS 与 NOT EXISTS关键字

1、关联子查询通常也会和 EXISTS操作符一起来使用,用来检查在子查询中是否存在满足条件的行
2、如果在子查询中不存在满足条件的行:
    条件返回 FALSE
    继续在子查询中查找
3、如果在子查询中存在满足条件的行:
    不在子查询中继续查找
    条件返回 TRUE
4、NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE
  • 代码案例

# 若employees表中employee_id与job_history表中employee_id相同的数目不小于2,输出这些相同id的员工的employee_id,last_name和其job_id
SELECT employee_id, last_name, job_id
FROM employees e
WHERE 2 <= (
  SELECT COUNT(*)
  FROM job_history j
  WHERE e.`employee_id` = j.`employee_id`
  )

# EXISTS 与 NOT EXISTS关键字
# 查询公司管理者的employee_id,last_name,job_id,department_id信息
# 方式1:自连接
SELECT DISTINCT mgr.employee_id, mgr.last_name, mgr.job_id, mgr.department_id
FROM employees emp JOIN employees mgr
ON emp.manager_id = mgr.employee_id;

# 方式2:子查询
SELECT employee_id, last_name, job_id, department_id
FROM employees
WHERE employee_id IN (
  SELECT DISTINCT manager_id
  FROM employees
  );

#方式3:使用EXISTS
SELECT employee_id, last_name, job_id, department_id
FROM employees e1
WHERE EXISTS (
  SELECT *
  FROM employees e2
  WHERE e1.`employee_id` = e2.`manager_id`
  );

# 查询departments表中,不存在于employees表中的部门的department_id和department_name
#方式1:
SELECT d.department_id, d.department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;

# 方式2:
SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS (
  SELECT *
  FROM employees e
  WHERE d.`department_id` = e.`department_id`
  );

以上就是关于“mysql子查询如何应用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: mysql子查询如何应用

本文链接: https://www.lsjlt.com/news/173712.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql子查询如何应用
    这篇“mysql子查询如何应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql子查...
    99+
    2022-11-30
    mysql
  • MySQL如何在查询中使用子查询
    MySQL中可以在查询中使用子查询来实现更复杂的查询逻辑。子查询是一个嵌套在主查询中的查询语句,通常用于获取主查询中某些条件的结果,...
    99+
    2024-03-06
    MySQL
  • 如何使用mysql连接查询、联合查询、子查询
    这篇文章主要讲解了如何使用mysql连接查询、联合查询、子查询,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。连接查询:连接查询就是将多个表联合起来查询,连接查询方式有内连接、外...
    99+
    2024-04-02
  • mysql select后面的子查询应该如何使用
    本文主要给大家简单讲讲mysql select后面的子查询应该如何使用,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql select后面的...
    99+
    2024-04-02
  • MySQL数据库:子查询的应用
    子查询 子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块。当一个查询是另一个查询的条件时,称之为子查询。 # 子查询的用法 # 在字段 select (select cName from courses w...
    99+
    2018-04-26
    MySQL数据库:子查询的应用
  • 如何分析MySQL子句及子查询
    今天就跟大家聊聊有关如何分析MySQL子句及子查询,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. mysql_where子句_聚合函数# ### p...
    99+
    2023-06-28
  • Mysql子查询关键字如何使用
    本文小编为大家详细介绍“Mysql子查询关键字如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql子查询关键字如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. all1.1 格式1.2 特...
    99+
    2023-07-02
  • MySQL子查询
    子查询(嵌套查询) 子查询是指一个查询语句嵌套在另一个查询语句的内部的查询 eg:要查询员工工资比‘Abel’高的员工名字 SELECT name,salary #外查询(主查询) FROM employees WHER&...
    99+
    2021-02-10
    MySQL子查询
  • MYSQL——子查询
       MYSQL的子查询1   求平均值   SELECT AVG (字段 如good_price) FROM  tdb_表名;...
    99+
    2024-04-02
  • Mysql---子查询的三种查询方式( 表子查询,条件子查询,列中子查询)
    mysql子查询 子查询分为: 列中子查询 单列单行表子查询 必须有别名条件子查询 单行单列 多行单列 下列示例表结构: grade表: result表: student表: subject表:...
    99+
    2023-09-04
    mysql sql 数据库
  • MySQL子查询详解(单行子查询、多行子查询与相关子查询)
    目录0.概念1.需求分析与问题解决1.1提出具体问题:1.2 子查询的基本使用: 子查询的基本语法结构:1.3 子查询的分类2.单行子查询2.1实例:2.2空值问题2.3非法使用子查...
    99+
    2024-04-02
  • MYSQL查询--子查询,合并查询
    子查询 带IN关键字的子查询 只有子查询返回的结果列包含一个值时,比较运算符才适用。假如一个子查询返回的结果集是值的列表,这时比较运算符就必须用IN运算符代替。IN运算符可以检测结果集中是否存在某个特定的...
    99+
    2024-04-02
  • MySQL子查询(嵌套查询)
    子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入。 在SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一 个表或者多个表。子查询中常用的操作符有 AN...
    99+
    2023-09-04
    mysql 数据库 sql Powered by 金山文档
  • 什么是mysql子查询及如何运用
    下面讲讲关于什么是mysql子查询及如何运用,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完什么是mysql子查询及如何运用这篇文章你一定会有所受益。 例: 修改后: ...
    99+
    2024-04-02
  • 如何在MySQL中执行子查询
    在MySQL中执行子查询可以通过将子查询语句包含在主查询语句中的方式来实现。以下是一个简单的例子: SELECT colum...
    99+
    2024-03-06
    MySQL
  • 如何使用update 子查询
    本篇文章给大家分享的是有关如何使用update 子查询,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1, 关联子查询和非关联子查询在...
    99+
    2024-04-02
  • MySQL 子查询和分组查询
    概述 子查询是SQL查询中的重要一块,是我们基于多表之间进行数据聚合和判断的一种手段,使得我们的处理复杂数据更加的便捷,这一节我们主要来了解一下子查询。 先做一下数据准备,这边建立三张表:班级、学生、毕业成绩表,用...
    99+
    2022-05-12
    MySQL 子查询 mysql 分组查询
  • mysql子查询怎么使用
    这篇文章主要讲解了“mysql子查询怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql子查询怎么使用”吧!出现在其他语句中的 select 语句,称为子查询或内查询;...
    99+
    2023-06-30
  • MySQL之连接查询和子查询
    多表连接的基本语法 多表连接,就是将几张表拼接为一张表,然后进行查询 select 字段1, 字段2, ... from 表1 {inner|lift|right} join 表2 on 连接条件; 有如下两张表:部门表和员工...
    99+
    2015-01-24
    MySQL之连接查询和子查询
  • mysql的in+子查询
    【mysql最糟糕的子查询:in+子查询】 select * from film where film_id in (select film_id from film_actor where acto...
    99+
    2023-08-18
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作