三、MySQL子查询学习笔记(标量子查询、列子查询、行子查询、表子查询 详解)

三、MySQL子查询学习笔记

7:子查询

含义:
一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询;在外面的查询语句,称为主查询或外查询
分类:
一、按子查询出现的位置:

1)select后面:
                       仅支持标量子查询

2)from后面:
                       支持表子查询

3)where或having后面:
                       标量子查询(1行1列)
                       列子查询(n行1列)
                       行子查询(1行n列)

4)exists后面(相关子查询):
                       表子查询

二、按结果集的行列数不同:

  1. 标量子查询(单行子查询):结果集为1行1列
  2. 列子查询(多行子查询):结果集为n行1列
  3. 行子查询:结果集为1行n列
  4. 表子查询:结果集为n行n列

特点:

1、子查询都放在小括号内
2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
3、子查询优先于主查询执行,主查询使用了子查询的执行结果
4、子查询根据查询结果的行数不同分为以下两类:

① 单行子查询:结果集只有一行
一般搭配单行操作符使用:> < = <> >= <=
非法使用子查询的情况:
a、子查询的结果为一组值
b、子查询的结果为空

② 多行子查询:结果集有多行
一般搭配多行操作符使用:any、all、in、not in
in: 属于子查询结果中的任意一个就行
any和all往往可以用其他查询代替

一、where 或 having后面可以加一下三种子查询:

  1. 标量子查询(单行子查询):1行1列
  2. 列子查询(多行子查询):n行1列
  3. 行子查询:1行n列

特点

  1. 子查询放在小括号内
  2. 子查询一遍放在条件的右侧
    3. 标量子查询,一般会搭配着单行操作符来使用:> < >= <= = <>;
    列子查询,一般搭配着多行操作符来使用:in、any/some、all

    在这里插入图片描述
    注意:
    all 是“任意”,是与所有值比较
    例如:小于 any() 等价于 小于 min()
    any 是“任一个”, 是与其中的某个值比较满足即可。
    例如:小于 any() 等价于 小于 max()
  3. 子查询的执行优先于主查询执行,因为 主查询的条件用到了子查询的结果

1.标量子查询

# 1.标量子查询(一行一列)# 【案例1】查询谁的工资比Abel高?
# 1)查询Abel的工资
SELECT salary 
FROM employees
WHERE last_name = 'Abel';# 2) 查询员工的信息,满足 salary > 1)的结果
SELECT * 
FROM employees
WHERE salary > (SELECT salaryFROM employeesWHERE 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的员工的工资
SELECT salary
FROM employees
WHERE employee_id = 143;# 3)查询员工的姓名,job_id,和工资,要求job_id = 1)并且salary > 2)
SELECT last_name , job_id ,salary
FROM employees
WHERE job_id = (SELECT job_id FROM employeesWHERE employee_id = 141
)AND salary >(SELECT salaryFROM employeesWHERE employee_id = 143
) # 【案例3】返回公司工资最少的员工的last_name ,job_id 和salary
# 1) 查询公司的最低工资
SELECT MIN(salary)
FROM employees;# 2) 查询 last_name , job_id和salary,要求salary = 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
WHERE department_id = 50;# 2) 查询每个部门的最低工资
SELECT department_id , min(salary)
FROM employees
GROUP BY department_id;# 3) 在2)的基础上筛选,满足min(salary)>1)  查询department_id > 50 的部门号 和 最低工资
SELECT department_id , MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) > (SELECT MIN(salary) FROM employeesWHERE department_id = 50
)

2.列子查询

# 2.列子查询(n行1列)
# 【案例1】 返回location_id是1400或1700 的部门中的所有员工姓名# 1)查询location_id 是1400或1700的部门编号(多行1列)
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700);# 2)查询员工姓名,要求部门号是1)列表中的某一个
SELECT last_name
FROM employees
WHERE department_id in(SELECT DISTINCT department_idFROM departmentsWHERE location_id IN(1400,1700)
)# 【案例2】 返回其他工种中比 job_id为“IT_PROG” 工种的所有员工的工资 中 "任一" 低的员工的员工号、姓名、job_id和salary# 1) 查询job_id为“IT_PROG” 部门的所有员工的工资 
SELECT DISTINCT salary
FROM employees
WHERE job_id = "IT_PROG";# 2) 查询员工的员工号、姓名、job_id和salary,要求salary< 1)中的任一(比其中某一个小就行)一个结果
SELECT last_name ,employee_id , job_id , salary
FROM employees
WHERE salary < ANY(SELECT DISTINCT salaryFROM employeesWHERE job_id = "IT_PROG"
) AND job_id <> 'IT_PROG';# 2) 或者   小于其中任何一个就行 等价于 小于最大值
SELECT last_name ,employee_id , job_id , salary
FROM employees
WHERE salary < (SELECT max(salary)FROM employeesWHERE job_id = "IT_PROG"
) AND job_id <> 'IT_PROG';# 【案例3】 返回其他部门中比job_id为‘IT_PROG’部门所有工资 ”都要“ 低的员工 的员工号、姓名、job_id 和salary
SELECT last_name ,employee_id , job_id , salary
FROM employees
WHERE salary < ALL(SELECT DISTINCT salaryFROM employeesWHERE job_id = "IT_PROG"
) AND job_id <> 'IT_PROG';# 或者  小于所有(任意)的  等价于  大于最小值
SELECT last_name ,employee_id , job_id , salary
FROM employees
WHERE salary < (SELECT MIN(salary)FROM employeesWHERE job_id = "IT_PROG"
) AND job_id <> 'IT_PROG';

3.行子查询(结果集为1行多列 或 多行多列)


# 3.行子查询(结果集为1行多列 或 多行多列)# 【案例1】 查询员工编号最小并且工资最高的员工信息# 先用标量子查询来实现
# 1) 查询最小的员工编号
SELECT MIN(employee_id)
FROM employees;# 2) 查询最高的工资
SELECT MAX(salary)
FROM employees;# 3) 查询员工的信息
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后面(仅仅支持标量子查询)

二、select后面(仅仅支持标量子查询)# 【案例1】 查询每个部门的员工个数
SELECT d.* , (SELECT COUNT(*) FROM employees eWHERE e.department_id = d.department_id
) 个数
FROM departments d# 【案例2】 查询员工号 = 102 的部门名
SELECT (SELECT department_nameFROM departments dINNER JOIN employees eON e.department_id = d.department_idWHERE e.employee_id = 102	
) 部门名;

三、from后面
注意:将子查询结果充当一张表时,必须要起别名,否则会报错

# 三、from后面
# 注意:将子查询结果充当一张表时,必须要起别名,否则会报错
# 【案例1】 查询每个部门的平均工资的工资等级# 1) 查询每个部门的平均工资
SELECT AVG(salary) , department_id
FROM employees
GROUP BY department_idSELECT * FROM job_grades;# 2) 连接1)的结果集 和 job_grades表,筛选条件为 平均工资 between lowest_sal and highest_sal
SELECT ag_dep.* ,  g.grade_level
FROM (SELECT AVG(salary) ag , department_idFROM employeesGROUP BY department_id
) ag_dep
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;

四、exists后面(相关子查询):只关心查询的东西是否存在,存在返回1,不存在返回0
语法:EXISTS(完整的查询语句)
结果:1或0

# 四、exists后面(相关子查询):只关心查询的东西是否存在,存在返回1,不存在返回0
# 语法:
#    EXISTS(完整的查询语句)
# 结果:
#    1或0
SELECT EXISTS (SELECT employee_id FROM employees);SELECT EXISTS (SELECT employee_id FROM employees WHERE salary = 300000);# 【案例1】 查询有员工的部门名
# 方法1 , exists
SELECT department_name
FROM departments d
WHERE EXISTS(SELECT *FROM employees e , departments dWHERE d.department_id = e.department_id
);# 方法2 , in
SELECT department_name
FROM departments d
WHERE d.department_id IN(SELECT department_id FROM employees
);# 【案例2】 查询没有女朋友的男神信息
USE girls;
# 方法一,not in 
SELECT bo.*
FROM boys bo
WHERE bo.id NOT IN (SELECT boyfriend_idFROM beauty
);# 方法二 not EXISTS
SELECT bo.*
FROM boys bo
WHERE NOT EXISTS(SELECT boyfriend_idFROM beauty bWHERE bo.id = b.boyfriend_id
);

子查询练习部分:

# 子查询练习部分:# 1、查询和Zlotkey相同部门的员工姓名和工资
use myemployees;
# 1)查询Zlotkey的部门id
SELECT department_id
FROM employees
WHERE last_name = 'Zlotkey';# 2) 查询部门号等于 1)的查询结果的 员工姓名和工资
SELECT last_name , salary,department_id
FROM employees
WHERE department_id = (SELECT department_idFROM employeesWHERE last_name = 'Zlotkey'
);# 2、查询工资比公司平均工资高的员工的 员工号、姓名和工资# 1) 查询平均工资
SELECT AVG(salary)
FROM employees;# 2) 查询工资高于 1)的查询结果的 员工的 员工号、姓名和工资
SELECT employee_id , last_name , salary
FROM employees
WHERE salary > (SELECT AVG(salary)FROM employees
);# 3、查询各部门中工资比本部门平均工资高的员工 的 员工号、姓名和工资# 1) 查询每个部门的平均工资
SELECT department_id , AVG(salary)
FROM employees
GROUP BY department_id;# 2) 把1)查询的结果 与 employees表连接起来,进行筛选
SELECT employee_id , last_name , salary,e.department_id
FROM employees e
INNER JOIN (SELECT AVG(salary) ag, department_idFROM employees GROUP BY department_id
) ag_dep
ON e.department_id = ag_dep.department_id
WHERE salary > ag_dep.ag# 4、查询和 姓名中包含字母 u 的员工 在相同部门的员工的员工号和姓名# 1) 查询姓名中包含字母 u 的员工的部门
SELECT DISTINCT last_name,department_id
FROM employees e
WHERE last_name LIKE '%u%';# 2)查询 部门号 = 1)中任意一个的 员工的员工号和姓名
SELECT employee_id ,last_name ,department_id 
FROM employees
WHERE department_id IN(SELECT DISTINCT department_idFROM employeesWHERE last_name LIKE '%u%'
)# 5、查询在部门的location_id 为 1700的部门工作的员工的员工号# 1) 查询location_id为1700的部门号
SELECT DISTINCT department_id
FROM departments
WHERE location_id = 1700;# 2) 查询部门号 = 1) 中任意一个部门号的 员工号
SELECT employee_id
FROM employees
WHERE department_id = ANY(SELECT DISTINCT department_idFROM departmentsWHERE location_id = 1700
);# 6、查询管理者是K_ing 的员工编号# 1) 查询姓名为King的员工编号
SELECT employee_id
FROM employees
WHERE last_name = 'K_ing';# 2) 查询哪个员工的manger_id = 1)的查询结果
SELECT last_name ,salary
FROM employees
WHERE manager_id IN (SELECT employee_idFROM employeesWHERE last_name = 'K_ing'
);# 7、查询工资最高的员工的姓名,要求first_name 和 last_name显示为一列,列名为 姓.名# 1) 查询最高工资
SELECT MAX(salary)
FROM employees;# 2) 查询工资 = 1)的姓.名
SELECT CONCAT(first_name , last_name) "姓.名"
FROM employees
WHERE salary = (SELECT MAX(salary)FROM employees);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 2120. 执行所有后缀指令(模拟)

文章目录1. 题目2. 解题1. 题目 现有一个 n x n 大小的网格&#xff0c;左上角单元格坐标 (0, 0) &#xff0c;右下角单元格坐标 (n - 1, n - 1) 。 给你整数 n 和一个整数数组 startPos &#xff0c;其中 startPos [startrow, startcol] 表示机器人最开始在坐标为 (startrow…

android代理生命周期,了解 Activity 生命周期

当用户浏览、退出和返回到您的应用时&#xff0c;您应用中的在生命周期回调方法中&#xff0c;您可以声明用户离开和再次进入 Activity 时 Activity 的行为方式。例如&#xff0c;如果您正构建流媒体视频播放器&#xff0c;当用户切换至另一应用时&#xff0c;您可能要暂停视频…

LeetCode 2121. 相同元素的间隔之和(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始、由 n 个整数组成的数组 arr 。 arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地&#xff0c;arr[i] 和 arr[j] 之间的间隔是 |i - j| 。 返回一个长度为 n 的数组 intervals &#xff0c;其中 interva…

在android添加数据采集,一种基于Android系统的地理信息数据采集方法与流程

本方法属于采集地理信息数据的发明&#xff0c;是一种基于android操作系统和gis地理信息系统进行户外地理信息数据采集的方法。背景技术&#xff1a;众所周知地理信息数据采集在很多行业中都有应用&#xff0c;比如说农业中的土地普查、城市管理中的地下管线普查、工业中的地质…

LeetCode 2124. 检查是否所有 A 都在 B 之前

文章目录1. 题目2. 解题1. 题目 给你一个 仅 由字符 a 和 b 组成的字符串 s 。 如果字符串中 每个 ‘a’ 都出现在 每个 ‘b’ 之前&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;s "aaabbb" 输出&#x…

设计模式—桥接模式

前言 这里以电视遥控器为例子引出桥接模式&#xff0c;首先每个牌子的电视都有一个遥控器&#xff0c;可以设计吧遥控器作为一个抽象类&#xff0c;抽象类中提供遥控器的所有实现&#xff0c;其他具体电视品牌的遥控器都继承这个抽象类 这样的实现使得每个不同型号的电视都有自…

LeetCode 2125. 银行中的激光束数量

文章目录1. 题目2. 解题1. 题目 银行内部的防盗安全装置已经激活。 给你一个下标从 0 开始的二进制字符串数组 bank &#xff0c;表示银行的平面图&#xff0c;这是一个大小为 m x n 的二维矩阵。 bank[i] 表示第 i 行的设备分布&#xff0c;由若干 ‘0’ 和若干 ‘1’ 组成。…

LeetCode 2126. 摧毁小行星(贪心)

文章目录1. 题目2. 解题1. 题目 给你一个整数 mass &#xff0c;它表示一颗行星的初始质量。 再给你一个整数数组 asteroids &#xff0c;其中 asteroids[i] 是第 i 颗小行星的质量。 你可以按 任意顺序 重新安排小行星的顺序&#xff0c;然后让行星跟它们发生碰撞。如果行星…

bzoj:2018 [Usaco2009 Nov]农场技艺大赛

Description Input 第1行&#xff1a;10个空格分开的整数: N, a, b, c, d, e, f, g, h, M Output 第1行&#xff1a;满足总重量最轻&#xff0c;且用度之和最大的N头奶牛的总体重模M后的余数。 Sample Input 2 0 1 5 55555555 0 1 0 55555555 55555555Sample Output 51HINT 样例…

LeetCode 2129. 将标题首字母大写

文章目录1. 题目2. 解题1. 题目 给你一个字符串 title &#xff0c;它由单个空格连接一个或多个单词组成&#xff0c;每个单词都只包含英文字母。请你按以下规则将每个单词的首字母 大写 &#xff1a; 如果单词的长度为 1 或者 2 &#xff0c;所有字母变成小写。否则&#xf…

LeetCode 2130. 链表最大孪生和(链表快慢指针+反转链表+双指针)

文章目录1. 题目2. 解题1. 题目 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪生节点为第 (n-1-i) 个节点 。 比方说&#xff0c;n 4 那么节点 0 是节点 3 的孪…

Splay初步【bzoj1503】

做了一道水题&#xff0c;把bzoj1503用Splay重新写了一下。 1 #include <bits/stdc.h>2 #define rep(i, a, b) for (int i a; i < b; i)3 #define REP(i, a, b) for (int i a; i < b; i)4 #define drep(i, a, b) for (int i a; i > b; i--)5 #define mp make…

原生html5时间组件,JFinal遇到了原生Html5时间组件格式转换问题怎么处理?

今天JBolt种子用户群里有人提问&#xff0c;JFinal针对原生Html5的日期时间选择组件的格式转换支持有问题&#xff0c;报错。于是我在JBolt的Demo中加入了这些去测试一下&#xff0c;这里使用的都是原生Html组件。Input type“text”默认就是一个简单的单行文本输入框。如果修改…

LeetCode 2131. 连接两字母单词得到的最长回文串

文章目录1. 题目2. 解题1. 题目 给你一个字符串数组 words 。words 中每个元素都是一个包含 两个 小写英文字母的单词。 请你从 words 中选择一些元素并按 任意顺序 连接它们&#xff0c;并得到一个 尽可能长的回文串 。每个元素 至多 只能使用一次。 请你返回你能得到的最长…

LeetCode 2132. 用邮票贴满网格图(DP/二维差分)

文章目录1. 题目2. 解题1. 题目 给你一个 m x n 的二进制矩阵 grid &#xff0c;每个格子要么为 0 &#xff08;空&#xff09;要么为 1 &#xff08;被占据&#xff09;。 给你邮票的尺寸为 stampHeight x stampWidth 。我们想将邮票贴进二进制矩阵中&#xff0c;且满足以下…

blue html中转换,BlueFox Free PDF to HTML Converter(PDF文件转换软件)

BlueFox Free PDF to HTML Converter是一款pdf文件转换软件&#xff0c;能直接查看PDF文件和对PDF文件进行编辑&#xff0c;支持批量进行转换&#xff0c;使用非常方便&#xff0c;操作简单&#xff0c;有需要可以下载。软件特色通过将PDF转换为HTML网页&#xff0c;您的网站访…

二、前端pink老师的CSS定位学习笔记(超详细,简单易懂)

定位(position) 1. CSS 布局的三种机制 网页布局的核心 —— 就是用 CSS 来摆放盒子位置。 CSS 提供了 3 种机制来设置盒子的摆放位置&#xff0c;分别是普通流、浮动和定位&#xff0c;其中&#xff1a; 普通流&#xff08;标准流&#xff09; 浮动 让盒子从普通流中浮起来 …

LeetCode 2133. 检查是否每一行每一列都包含全部整数

文章目录1. 题目2. 解题1. 题目 对一个大小为 n x n 的矩阵而言&#xff0c;如果其每一行和每一列都包含从 1 到 n 的 全部 整数&#xff08;含 1 和 n&#xff09;&#xff0c;则认为该矩阵是一个 有效 矩阵。 给你一个大小为 n x n 的整数矩阵 matrix &#xff0c;请你判断…

上传图片自动加水印html,html5上传多个文件并添加水印 实例源码

【实例简介】【实例截图】【核心代码】html5上传多个文件并添加水印body{font-size:12px;}a{text-decoration:none;}a,a:after{-webkit-transition:all 0.3s;-moz-transition:all 0.3s;transition:all 0.3s;}a.btn i{display:block;width:100%;height:100%;position:relative;z…

LoadRunner培训初级教程

一 LoadRunner简介 1.1 Loadrunner介绍 LoadRunner 是 HP Mercury Interactive用来测试应用程序性能的工具 LoadRunner 通过模拟一个多用户并行工作的环境来对应用程序进行负载测试。通过使用最少的硬件资源&#xff0c;这些虚拟用户提供一致的、可重复并可度量的负载&#xf…