文章目录

  • 主查询 子查询
  • 纲举目张——子查询的分类
  • WHERE语句后的 子查询

主查询 子查询

概念集中于SELECT语句
之前我们所学习的所有,都是SELECT作为独立的一句 是主干,是爸爸
后面跟着几个儿子比如ON WHERE HAVING GROUP BY 这称为主查询 以SELECT为主干的

但是有没有想过 我们如果SELECT完以后的结果 再次进行SELECT 筛选 应该怎么写呢?
嵌套着写嘛?
对了!
被嵌套的儿子SELECT就是 子查询
概念中 SELECT在其他语句 比如HAVING WHERE ON等里面时 就是子查询
注意子查询要加(),增加代码可读性

扯了那么多 我们看案例:
1️⃣阮菜鸡入职了 有工资了 数据库登记了菜鸡的信息:
请运行下面的代码

USE data1;
INSERT INTO `employees` (`employee_id`,`first_name`,`last_name`,`email`,`phone_number`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`,`hiredate`
)
VALUES(2333,'菜鸡','阮','SKING','233.233.233','AD_PRES',6000.00,NULL,NULL,90,'2016-03-03 00:00:00') ;

2️⃣然后 阮菜鸡悄咪咪的 在公司数据库 拿到了公司的工资表如下:

USE data1;
SELECT `salary` AS 工资,CONCAT_WS('-', `last_name`, `first_name`) AS 名字
FROMemployees
ORDER BY 工资


现在问题来了 这么多人 我咋知道谁工资比我高呢?
3️⃣我可以查到我的工资:

加一句

WHERE  `last_name` = '阮';

就行了 可以看到是 6000
4️⃣于是 我可以这么找到比我工资高的大佬们:

USE data1;
SELECT `salary` AS 工资, CONCAT_WS('-', `last_name`, `first_name`) AS 名字
FROMemployees
WHERE `salary` >= 6000
ORDER BY 工资 DESC;

但是哪一天我工资涨了 我还得查 太累了
另外 我的十几个小伙伴(名字已经列成表了)都等着我 帮忙他们查工资
我岂不是得一个个去对?

5️⃣其实不用:)
你把6000这个数字替换成他们的工资变量就好了嘛
那工资变量是查出来的啊? 本身没有的
那就把查询语句丢进去咯!

USE data1;
SELECT `salary` AS 工资, CONCAT_WS('-', `last_name`, `first_name`) AS 名字
FROMemployees
WHERE `salary` >= (SELECT `salary` FROM employees WHERE `last_name` = '阮')
ORDER BY 工资 DESC;


注意:
1️⃣必须有括号
2️⃣SELECT 出来的结果 要什么就写什么 别写多了 没法WHERE比较
比如你这么写:

WHERE `salary` >= (SELECT `salary`,`phone_number` FROM employees WHERE `last_name` = '阮')

加了phone_number,那么WHERE也不知道你想判断什么了

我们给这个套路 丢 SELECT查询语句进去 的套路 就叫做子查询

纲举目张——子查询的分类

我们查工资的案例,有两个特点,
1是 SELECT 子查询语句 放在了WHERE语句后面
2是 子查询的结果只是一个值,也即是标量,一行一列的

那么 我们可以把子查询这么分类:

按位置分类 子查询结果支持
WHERE HAVING语句后面 1️⃣标量子查询 2️⃣列子查询 3️⃣行子查询
SELECT语句后面 标量子查询
FROM 语句后面 表子查询
EXISTS语句后面 表子查询

我们还可以这么分类:对于子查询的结果

按查询结果分类 含义
标量子查询 一行一列
行子查询 一行多列
列子查询 多行一列
表子查询 多行多列

你只需要大致有个印象 每种都会说一下的 当然我们按照第一种分类方式学
其中 WHERE语句为重点 因为常用

WHERE语句后的 子查询

巩固之前学的 标量子查询的知识,用一个新案例来说说:
阮菜鸡想知道 自己所在的 No.90 部门 工资福利在公司中的地位如何
那么也就是 有 最高 最低工资还有平均工资 三个参数
对其他部门进行查询 比较 输出结果
我们先来看最低工资 其他的加几个词就出来了
1️⃣得到自己所在部门的最低工资
2️⃣得到所有公司部门的最低工资
3️⃣where限定 哪些部门的最低工资 > 自己No.90最低工资

第1️⃣步:得到自己所在部门的最低工资 简单 直接SELECT出来

USE data1;
SELECT MIN(`salary`) 最低工资,`department_id` 部门编号
FROMemployees
WHERE `department_id` = 90;

》》》》等一下:)我不会就是那个“最低工资”的那个人吧2333QAQ

第2️⃣步:用到了GROUP BY分组查询 easy

USE data1;
SELECT MIN(`salary`) 最低工资,`department_id` 部门编号
FROMemployees
WHERE `department_id` IS NOT NULL
GROUP BY `department_id`
ORDER BY 最低工资;


还记得GROUP BY是怎么执行的吗?
你可以理解为
轮询所有的员工 ,然后不满足 (分组前筛选条件

WHERE `department_id` IS NOT NULL

条件 就排除
以部门编号进行分组
每一组中 我找MIN 最低工资
最后 输出

如果我想要 找到最低工资后 再加条件 比如最低工资大于6000的部门查询
那么再用HAVING(分组后筛选条件

第3️⃣步:子查询 以第一步的位子查询结果 第2️⃣步为主体:
我们先用6000 也就是第一步查到的结果 写成这样

USE data1;
SELECT MIN(`salary`) 最低工资,`department_id` 部门编号
FROMemployees
WHERE `department_id` IS NOT NULL  GROUP BY `department_id`
HAVING MIN(`salary`) > 6000
ORDER BY 最低工资;

然后 变量放进去 子查询启动:

USE data1;
SELECT MIN(`salary`) 最低工资,`department_id` 部门编号
FROMemployees
WHERE `department_id` IS NOT NULL  GROUP BY `department_id`
HAVING MIN(`salary`) > (SELECT MIN(`salary`)FROMemployees WHERE `department_id` = 90 )ORDER BY 最低工资 DESC;

当然 我们再加些拓展 我们用平均工资为考量:

USE data1;
SELECT AVG(`salary`) 平均工资,MIN(`salary`) 最低工资,MAX(`salary`) 最高工资, `department_id` 部门编号
FROMemployees
WHERE `department_id` IS NOT NULL  GROUP BY `department_id`
HAVING AVG(`salary`) > (SELECT AVG(`salary`)FROMemployees WHERE `department_id` = 90 )ORDER BY 平均工资 DESC;

结果:

喵喵喵??? 没有报错 没结果??
我们把大于号改成小于等于 看看

哦 原来我们部门这么厉害我拉低了部门的平均工资

至此 WHERE 的标量子查询就结束了 因为是值之间的比较 算是简单的 后面就是行 列 表子查询了 敬请期待
下一站:数据库学习之MySQL (十八)—— 子查询 WHERE 列子查询

  • 本文专栏
    MySQL专栏
  • 我的其他专栏 希望能够帮到你 ( •̀ ω •́ )✧
    • 手把手带你学后端(服务端)
    • python这么火 想要深入学习python 玩一下简单的应用嘛?
      python应用
  • 谢谢大佬支持! 萌新有礼了:)

数据库学习之MySQL (十七)—— SQL99 主查询 与 子查询 子查询分类之WHERE的子查询相关推荐

  1. 数据库学习之MySQL (十六)—— SQL99 外连接 左外连接 右外连接 全外连接 交叉连接

    文章目录 外连接 之 左外连接 与 右外连接 为啥要用外连接 全外连接 总结 内连接 外连接 交叉连接 外连接 之 左外连接 与 右外连接 我们先来看个之前的 女神男朋友的案例 传送:数据库学习之My ...

  2. 数据库学习之MySQL (三)——数据库小试牛刀 + 利用对象思维理解表行列

    文章目录 前言 ´・ᴗ・` 获得自己第一个数据库 执行代码 小试牛刀 简单语句的实验方法 表 的理解 总结 ´◡` 前言 ´・ᴗ・` 本文我们将通过运行sql代码 得到自己的第一个数据库 我们学习的重 ...

  3. mysql now str,数据库学习之MySQL (十)—— 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE...

    MySQL学习专栏 正在持续更新中:) 文章目录 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE 下章预告 日期和时间函数 NOW ...

  4. 数据库学习之MySQL (九)—— 数学函数 字符串函数 CONCAT TRIM PAD

    MySQL学习专栏 正在持续更新中:) 文章目录 复习一下 前面学到的函数 LENGTH CONCAT 数学函数 ABS CEIL FLOOR ROUND POW 常用字符串函数 SUBSTR REP ...

  5. 数据库学习(MySQL):JDBC的简单增删改查实现

    本文为原创,转载请注明出处: https://www.cnblogs.com/Tom-shushu/p/9171896.html 这里我们先在数据库建立一个userinfo表: CREATE TABL ...

  6. 数据库学习(mysql)----一些理论

    关于数据库优化的一些理论  以下都是关于MYSQL中的. 一些简单的设计理论 一.字段越小越好.当然要确保满足需求. 二.字段越简单越好.有个例子. MYSQL中: 1.应该用内建的日期和时间类型 不 ...

  7. node数据库学习之mysql 1

    数据库 mysql 关系型数据库 //一张张表 (有关联的数据) mongodb 非关系型数据(文档型数据库) //一个个文档 (数据量大,安全性较低) redis key-value键值对 //存放 ...

  8. 数据库学习笔记—MySQL技术nei幕—第一章—MySQL体系结构和存储引擎

    数据库和实例 数据库和实例很容易混淆,如果要更加深入地理解MySQL,将这两个概念区分开来是必不可少的. 数据库是物理操作系统文件或其他形式文件类型的集合.就比如在MySQL数据库中,数据库文件可以是 ...

  9. 数据库学习之MySQL安装

    前言 数据库在开发中经常用到,用来存储一些数据,既安全又方便,官方的最新版本已经到了8.0版本,但是由于本人常用5版本就不升级了. 本文记录一下MySQL5.7的安装过程 本文原创,创作不易,转载请注 ...

最新文章

  1. 求数组中的最小子数组,时间复杂度o(n),java
  2. [mybatis]缓存_二级缓存使用细节
  3. 卷积神经网络(CNN)与特殊的卷积
  4. 2013年6月13日星期四
  5. 迭代器——STL关键所在
  6. [python实现设计模式]-3.简单工厂模式-触宝开放平台
  7. 《An Introduction to Ray Tracing》—— 2.4 Ray/Box Intersection
  8. 嵌入Windows User Control到ASP.NET web form
  9. HDU 4931 Happy Three Friends(水)
  10. Git小乌龟分支操作
  11. TCP、UDP、Socket、HTTP网络编程面试题(总结最全面的面试题)
  12. 七大顶级编程学习网站
  13. 口诀计算机,PID算法的通俗讲解及调节口诀[计算机类]
  14. 反射——Reflection
  15. 思考的救赎(一):三消游戏实现探索
  16. 电源中104电容的作用
  17. 天上的街市Unity游戏场景制作案例(一)
  18. 【电脑开机没反应的常见原因和解决方法】
  19. 2012百度校园招聘笔试杭州站
  20. 15.4 MPLS 控制层面 PE和CE设备间的路由更新

热门文章

  1. word中插入endnote 为什么会是大括号,而且后面没有文献
  2. 抢红包 html 模板,微信抢红包源码和模拟demo
  3. 基于nodemailer使用阿里云企业邮箱发送邮件(526错误的解决)
  4. ggplot2画图——点图想要描边但是又需要去除边框
  5. 启动错误:Could not resolve placeholder 'spring.datasource.url' in value ${spring.datasource.url}
  6. Pytorch数据使用列表的卷积层时报错及解决-RuntimeError: Input type (torch.cuda.HalfTensor) and weight type (torch.Floa
  7. [转]数据挖掘在金融行业十大应用
  8. 奥特曼宇宙英雄服务器维修,奥特曼宇宙英雄1.1.7版本
  9. Excel表格数据该怎么读取和写入之——xlsread函数和xlswrite函数
  10. 第11章 命令行操作基础1-(H3CNE)