📖
R‘Notes
  • 关于本仓库/网站
  • Note
    • Golang的知识碎片
      • 关于Golang的一些碎片知识
    • LeetCode
      • LCR 121. 寻找目标值 - 二维数组
      • LCR 125. 图书整理 II
      • LCR 127. 跳跃训练
      • LCR 143. 子结构判断
      • LCR 159. 库存管理 III
      • LCR 161. 连续天数的最高销售额
      • LCR 170. 交易逆序对的总数
      • LCR 174. 寻找二叉搜索树中的目标节点
      • LeetCode--1. 两数之和
      • LeetCode--10. 正则表达式匹配
      • LeetCode--1004. 最大连续1的个数 III
      • LeetCode--101. 对称二叉树
      • LeetCode--102. 二叉树的层序遍历
      • LeetCode--1027. 最长等差数列
      • LeetCode--103. 二叉树的锯齿形层序遍历
      • LeetCode--1035. 不相交的线
      • LeetCode--104. 二叉树的最大深度
      • LeetCode--1044. 最长重复子串
      • LeetCode--105. 从前序与中序遍历序列构造二叉树
      • LeetCode--106. 从中序与后序遍历序列构造二叉树
      • LeetCode--110. 平衡二叉树
      • LeetCode--111. 二叉树的最小深度
      • LeetCode--112. 路径总和
      • LeetCode--113. 路径总和 II
      • LeetCode--1137. 第 N 个泰波那契数
      • LeetCode--114. 二叉树展开为链表
      • LeetCode--1143. 最长公共子序列
      • LeetCode--115. 不同的子序列
      • LeetCode--1191. K 次串联后最大子数组之和
      • LeetCode--120. 三角形最小路径和
      • LeetCode--121. 买卖股票的最佳时机
      • LeetCode--1218. 最长定差子序列
      • LeetCode--122. 买卖股票的最佳时机 II
      • LeetCode--1220. 统计元音字母序列的数目
      • LeetCode--123. 买卖股票的最佳时机 III
      • LeetCode--124. 二叉树中的最大路径和
      • LeetCode--125. 验证回文串
      • LeetCode--128. 最长连续序列
      • LeetCode--1289. 下降路径最小和 II
      • LeetCode--129. 求根节点到叶节点数字之和
      • LeetCode--1301. 最大得分的路径数目
      • LeetCode--1312. 让字符串成为回文串的最少插入次数
      • LeetCode--134. 加油站
      • LeetCode--135. 分发糖果
      • LeetCode--136. 只出现一次的数字
      • LeetCode--138. 随机链表的复制
      • LeetCode--139. 单词拆分
      • LeetCode--14. 最长公共前缀
      • LeetCode--141. 环形链表
      • LeetCode--142. 环形链表 II
      • LeetCode--143. 重排链表
      • LeetCode--144. 二叉树的前序遍历
      • LeetCode--145. 二叉树的后序遍历
      • LeetCode--146. LRU 缓存
      • LeetCode--148. 排序链表
      • LeetCode--15. 三数之和
      • LeetCode--151. 反转字符串中的单词
      • LeetCode--152. 最大乘积子数组【DP】
      • LeetCode--153. 寻找旋转排序数组中的最小值
      • LeetCode--155. 最小栈
      • LeetCode--1584. 连接所有点的最小费用,最小生成树模板题
      • LeetCode--1594. 矩阵的最大非负积
      • LeetCode--16. 最接近的三数之和
      • LeetCode--160. 相交链表
      • LeetCode--162. 寻找峰值
      • LeetCode--165. 比较版本号
      • LeetCode--169. 多数元素
      • LeetCode--174. 地下城游戏
      • LeetCode--179. 最大数
      • LeetCode--1824. 最少侧跳次数
      • LeetCode--188. 买卖股票的最佳时机 IV
      • LeetCode--189. 轮转数组
      • LeetCode--19. 删除链表的倒数第 N 个结点,关于删除链表会遇见的指针问题
      • LeetCode--1964. 找出到每个位置为止最长的有效障碍赛跑路线
      • LeetCode--198. 打家劫舍
      • LeetCode--199. 二叉树的右视图
      • LeetCode--2. 两数相加
      • LeetCode--20. 有效的括号
      • LeetCode--200. 岛屿数量
      • LeetCode--206. 反转链表
      • LeetCode--207. 课程表
      • LeetCode--208. 实现 Trie (前缀树)
      • LeetCode--209. 长度最小的子数组
      • LeetCode--21. 合并两个有序链表,关于链表的复习
      • LeetCode--210. 课程表 II
      • LeetCode--213. 打家劫舍 II
      • LeetCode--2140. 解决智力问题
      • LeetCode--215. 数组中的第K个最大元素
      • LeetCode--22. 括号生成
      • LeetCode--221. 最大正方形
      • LeetCode--2218. 从栈中取出 K 个硬币的最大面值和
      • LeetCode--224. 基本计算器
      • LeetCode--225. 用队列实现栈
      • LeetCode--226. 翻转二叉树
      • LeetCode--2266. 统计打字方案数
      • LeetCode--227. 基本计算器 II
      • LeetCode--23. 合并 K 个升序链表【堆和分治】
      • LeetCode--230. 二叉搜索树中第 K 小的元素
      • LeetCode--2304. 网格中的最小路径代价
      • LeetCode--232. 用栈实现队列
      • LeetCode--2320. 统计放置房子的方式数
      • LeetCode--2321. 拼接数组的最大分数
      • LeetCode--233. 数字 1 的个数
      • LeetCode--234. 回文链表
      • LeetCode--236. 二叉树的最近公共祖先
      • LeetCode--239. 滑动窗口最大值,关于单调队列的复习
      • LeetCode--24. 两两交换链表中的节点
      • LeetCode--240. 搜索二维矩阵 II
      • LeetCode--2435. 矩阵中和能被 K 整除的路径
      • LeetCode--2466. 统计构造好字符串的方案数
      • LeetCode--25. K 个一组翻转链表
      • LeetCode--2533. 好二进制字符串的数量
      • LeetCode--256. 粉刷房子
      • LeetCode--2606. 找到最大开销的子字符串
      • LeetCode--265. 粉刷房子 II
      • LeetCode--2684. 矩阵中移动的最大次数
      • LeetCode--279. 完全平方数【动态规划】
      • LeetCode--283. 移动零
      • LeetCode--287. 寻找重复数
      • LeetCode--295. 数据流的中位数
      • LeetCode--297. 二叉树的序列化与反序列化
      • LeetCode--3. 无重复字符的最长子串
      • LeetCode--300. 最长递增子序列【DP+二分】
      • LeetCode--309. 买卖股票的最佳时机含冷冻期
      • LeetCode--31. 下一个排列
      • LeetCode--3186. 施咒的最大总伤害
      • LeetCode--32. 最长有效括号【栈和dp】
      • LeetCode--322. 零钱兑换
      • LeetCode--328. 奇偶链表
      • LeetCode--329. 矩阵中的最长递增路径
      • LeetCode--33. 搜索旋转排序数组【直接二分】
      • LeetCode--337. 打家劫舍 III
      • LeetCode--3393. 统计异或值为给定值的路径数目
      • LeetCode--34. 在排序数组中查找元素的第一个和最后一个位置
      • LeetCode--3418. 机器人可以获得的最大金币数
      • LeetCode--343. 整数拆分
      • LeetCode--347. 前 K 个高频元素
      • LeetCode--347. 前 K 个高频元素Golang中的堆(containerheap)
      • LeetCode--354. 俄罗斯套娃信封问题
      • LeetCode--377. 组合总和 Ⅳ
      • LeetCode--39. 组合总和
      • LeetCode--394. 字符串解码【栈】
      • LeetCode--395. 至少有 K 个重复字符的最长子串
      • LeetCode--4. 寻找两个正序数组的中位数
      • LeetCode--40. 组合总和 II
      • LeetCode--402. 移掉 K 位数字
      • LeetCode--41. 缺失的第一个正数
      • LeetCode--415. 字符串相加
      • LeetCode--416. 分割等和子集_494. 目标和【01背包】
      • LeetCode--42. 接雨水(单调栈和双指针)
      • LeetCode--426. 将二叉搜索树转化为排序的双向链表
      • LeetCode--43. 字符串相乘
      • LeetCode--437. 路径总和 III【前缀和】
      • LeetCode--44. 通配符匹配
      • LeetCode--440. 字典序的第K小数字
      • LeetCode--442. 数组中重复的数据
      • LeetCode--445. 两数相加 II
      • LeetCode--45. 跳跃游戏 II
      • LeetCode--450. 删除二叉搜索树中的节点
      • LeetCode--46. 全排列
      • LeetCode--460. LFU 缓存
      • LeetCode--468. 验证IP地址
      • LeetCode--470. 用 Rand7() 实现 Rand10()
      • LeetCode--474. 一和零
      • LeetCode--48. 旋转图像
      • LeetCode--498. 对角线遍历
      • LeetCode--5. 最长回文子串
      • LeetCode--50. Pow(x, n)
      • LeetCode--509. 斐波那契数
      • LeetCode--516. 最长回文子序列
      • LeetCode--518. 零钱兑换 II
      • LeetCode--529. 扫雷游戏题解C++广搜
      • LeetCode--53. 最大子数组和
      • LeetCode--54. 螺旋矩阵
      • LeetCode--540. 有序数组中的单一元素
      • LeetCode--543. 二叉树的直径
      • LeetCode--55. 跳跃游戏
      • LeetCode--556. 下一个更大元素 III
      • LeetCode--56. 合并区间
      • LeetCode--560. 和为 K 的子数组
      • LeetCode--572. 另一棵树的子树
      • LeetCode--59. 螺旋矩阵 II
      • LeetCode--61. 旋转链表
      • LeetCode--62. 不同路径
      • LeetCode--622. 设计循环队列
      • LeetCode--63. 不同路径 II
      • LeetCode--64. 最小路径和
      • LeetCode--646. 最长数对链
      • LeetCode--662. 二叉树最大宽度
      • LeetCode--673. 最长递增子序列的个数
      • LeetCode--678. 有效的括号字符串
      • LeetCode--679. 24 点游戏
      • LeetCode--69. x 的平方根
      • LeetCode--695. 岛屿的最大面积
      • LeetCode--7. 整数反转
      • LeetCode--70. 爬楼梯
      • LeetCode--704. 二分查找
      • LeetCode--712. 两个字符串的最小ASCII删除和
      • LeetCode--714. 买卖股票的最佳时机含手续费
      • LeetCode--718. 最长重复子数组
      • LeetCode--72. 编辑距离
      • LeetCode--739. 每日温度
      • LeetCode--74. 搜索二维矩阵
      • LeetCode--740. 删除并获得点数
      • LeetCode--746. 使用最小花费爬楼梯
      • LeetCode--75. 颜色分类
      • LeetCode--76. 最小覆盖子串
      • LeetCode--77. 组合
      • LeetCode--78. 子集
      • LeetCode--79. 单词搜索
      • LeetCode--790. 多米诺和托米诺平铺
      • LeetCode--8. 字符串转换整数 (atoi)
      • LeetCode--82. 删除排序链表中的重复元素 II
      • LeetCode--83. 删除排序链表中的重复元素
      • LeetCode--84. 柱状图中最大的矩形【单调栈】
      • LeetCode--85. 最大矩形
      • LeetCode--87. 扰乱字符串
      • LeetCode--88. 合并两个有序数组
      • LeetCode--887. 鸡蛋掉落
      • LeetCode--91. 解码方法
      • LeetCode--912. 排序数组
      • LeetCode--918. 环形子数组的最大和
      • LeetCode--92. 反转链表 II
      • LeetCode--93. 复原 IP 地址
      • LeetCode--931. 下降路径最小和
      • LeetCode--94. 二叉树的中序遍历
      • LeetCode--958. 二叉树的完全性检验
      • LeetCode--97. 交错字符串
      • LeetCode--98. 验证二叉搜索树
      • LeetCode--983. 最低票价
      • LeetCode--LCR 140. 训练计划 II
      • NC--311.圆环回原点
      • NC--36进制加法
      • 补充题1. 排序奇升偶降链表
    • Redis
      • Redis基础部分
      • 在用Docker配置Redis哨兵节点的时候出现的错误及其解决
    • SQL学习记录
      • SQL碎片知识
      • 系统
        • MySQL学习笔记1【DQL和DCL】
        • MySQL学习笔记2【函数/约束/多表查询】
        • MySQL学习笔记3【事务】
        • MySQL学习笔记4【存储引擎和索引】
        • MySQL学习笔记5【SQL优化/视图/存储过程/触发器】
        • MySQL学习笔记6【锁】
        • MySQL学习笔记7【InnoDB】
    • x86汇编
      • 学习汇编随手记
    • 微服务相关
      • Nacos与gRPC
      • 【Golangnacos】nacos配置的增删查改,以及服务注册的golang实例及分析
    • 手搓
      • Whalebox(仿Docker)的爆诞
    • 操作系统
      • MIT6.S081-lab1
      • MIT6.S081-lab2
      • MIT6.S081-lab3
      • MIT6.S081-lab3前置
      • MIT6.S081-lab4
      • MIT6.S081-lab4前置
      • MIT6.S081-lab5
      • MIT6.S081-lab5前置
      • MIT6.S081-lab7
      • MIT6.S081-lab7前置
      • MIT6.S081-lab8
      • MIT6.S081-lab8前置
      • MIT6.S081-lab9
      • MIT6.S081-环境搭建
    • 消息队列MQ
      • Kafka
    • 算法杂谈
      • 关于二分查找时的边界分类问题
    • 计组笔记
      • 计算机组成原理的学习笔记(1)--概述
      • 计算机组成原理的学习笔记(10)--CPU·其二 组合逻辑控制器和微程序
      • 计算机组成原理的学习笔记(11)--CPU·其三 中断和异常多处理器相关概念
      • 计算机组成原理的学习笔记(12)--总线和IO系统
      • 计算机组成原理的学习笔记(2)--数据的表示和运算·其一
      • 计算机组成原理的学习笔记(3)--数据表示与运算·其二 逻辑门和加减乘
      • 计算机组成原理的学习笔记(4)--数据的表示与运算·其三 补码的乘法以及原码补码的除法
      • 计算机组成原理的学习笔记(4)--数据的表示与运算·其三 补码的乘法以及原码补码的除法
      • 计算机组成原理的学习笔记(6)--存储器·其一 SRAMDRAMROM主存储器的初步认识
      • 计算机组成原理的学习笔记(7)--存储器·其二 容量扩展多模块存储系统外存Cache虚拟存储器
      • 计算机组成原理的学习笔记(8)--指令系统·其一 指令的组成以及数据寻址方式RISK和CISK
      • 计算机组成原理的学习笔记(9)--CPU·其一 CPU的基本概念流水线技术数据通路
    • 闲聊
      • 2025-03-23记
      • 大一上总结
由 GitBook 提供支持
在本页
  • 函数
  • 字符串函数
  • 数值函数
  • 日期函数
  • 流程控制函数
  • 约束
  • 删除/更新行为
  • 多表查询
  • 1. 合并查询(笛卡尔积)
  • 2. 内连接查询
  • 3. 外连接查询
  • 4. 自连接查询
  • 5. 联合查询
  • 6.子查询
  • 值得一提的案例
  1. Note
  2. SQL学习记录
  3. 系统

MySQL学习笔记2【函数/约束/多表查询】


函数

字符串函数

函数
功能

CONCAT(s1, s2, …, sn)

字符串拼接,将s1, s2, …, sn拼接成一个字符串

LOWER(str)

将字符串全部转为小写

UPPER(str)

将字符串全部转为大写

LPAD(str, n, pad)

左填充,用字符串pad对str的左边进行填充,达到n个字符串长度

RPAD(str, n, pad)

右填充,用字符串pad对str的右边进行填充,达到n个字符串长度

TRIM(str)

去掉字符串头部和尾部的空格

SUBSTRING(str, start, len)

截取字符串,从start开始截取len长度的字符串,索引从1开始

REPLACE(column, source, replace)

替换字符串

数值函数

函数
功能

CEIL(x)

向上取整

FLOOR(x)

向下取整

MOD(x, y)

返回x/y的模

RAND()

返回0~1内的随机数

ROUND(x, y)

对x的四舍五入,保留y位小数

日期函数

函数
功能

CURDATE()

返回当前日期

CURTIME()

返回当前时间

NOW()

返回当前日期和时间

YEAR(date)

获取指定date的年份

MONTH(date)

获取指定date的月份

DAY(date)

获取指定date的日期

DATE_ADD(date, INTERVAL expr type)

返回一个日期/时间值加上一个时间间隔expr后的时间值

DATEDIFF(date1, date2)

返回起始时间date2和结束时间date1之间的天数

一个值得说的案例,查询员工入职天数,降序排序:

SELECT 
username, DATEDIFF(NOW(), entrydate) AS entrydays 
FROM users 
ORDER BY entrydays DESC;

流程控制函数

  1. IF(value, t, f)

    • 功能:评估 value 的真假。

    • 用法:如果 value 为真,返回 t;否则返回 f。

    • 示例:

      SELECT IF(age >= 18, 'Adult', 'Minor') AS age_group FROM users;
  2. IFNULL(value1, value2)

    • 功能:检查 value1 是否为空。

    • 用法:如果 value1 不为空,返回 value1;如果为空,返回 value2。

    • 示例:

      SELECT IFNULL(nickname, username) AS display_name FROM users;
  3. CASE WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END

    • 功能:执行多个条件的检查。

    • 用法:如果 val1 为真,返回 res1,依此类推;如果都不满足,则返回 default。

    • 示例:

      SELECT 
        CASE 
          WHEN score >= 90 THEN 'A'
          WHEN score >= 80 THEN 'B'
          ELSE 'C'
        END AS grade
      FROM scores;
  4. CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END

    • 功能:与第3个函数类似,但通过评估一个表达式来进行条件判断。

    • 用法:如果 expr 等于 val1,返回 res1;如果不匹配,返回 default。

    • 示例:

      SELECT 
        CASE user_type
          WHEN 'admin' THEN 'Administrator'
          WHEN 'user' THEN 'Regular User'
          ELSE 'Unknown'
        END AS user_role
      FROM users;

约束

约束条件
关键字
说明

主键

PRIMARY KEY

唯一标识表中的每一行,主键列的值不能重复且不能为空。

自动增长

AUTO_INCREMENT

使字段在插入新行时自动增加(常用于主键)。

不为空

NOT NULL

指定字段不能接受空值。

唯一

UNIQUE

确保字段的所有值都是唯一的,允许空值,但不能重复。

逻辑条件(条件一定要加上括号)

CHECK(约束条件)

用于限制列中的值满足某些条件,必须使用括号以包围条件表达式。

默认值

DEFAULT

指定列的默认值,插入时如果不提供该列的值,则使用默认值。

  • 值得一提的是,如果想要同时插入多个数据,只要有一条数据不满足约束,这条语句全部执行失败,就算其他数据符合约束条件,也不会插入进数据。

  • 插入数据违反UNIQUE约束时,自增主键将会+1。

删除/更新行为

ON DELETE/UPDATE


行为
说明

NO ACTION

当在父表中删除或更新对应记录时,首先检查该记录是否有对应的外键。如果有,系统将不允许删除或更新(这与 RESTRICT 行为一致)。

RESTRICT

与 NO ACTION 一样,删除或更新前会检查是否存在对应外键,如果存在,则不允许进行操作。

CASCADE

当在父表中删除或更新对应记录时,如果该记录有对应的外键,系统会自动删除或更新子表中相关的记录。

SET NULL

当在父表中删除或更新对应记录时,如果该记录有对应的外键,系统会将子表中该外键的值设置为 NULL(前提是该外键允许为 NULL)。

SET DEFAULT

当父表的记录发生变更时,子表中的外键将被设为一个默认值(InnoDB 不支持此选项)。

多表查询

关系类型
定义
示例描述
数据库表示示例

一对多

一个表中的一条记录可以关联到另一个表中的多条记录,而另一表中的每条记录只能关联到一条记录。

员工对应一个部门,部门有多个员工

department 表与 emp 表,通过 dept_id 关联。

多对多

一个表中的多条记录可以关联到另一个表中的多条记录。通常需要一个关联表来实现这种关系。

一个学生可以选修多门课程,一门课程可以被多个学生选修。

students 表与 courses 表,通过 student_courses 关联表。

一对一

一个表中的一条记录只能关联到另一个表中的一条记录,反之亦然。

每个用户有一条用户详情记录。

users 表与 user_details 表,通过 user_id 关联。

  • 一对一可以用来对单表进行拆分,结构更加清晰。

1. 合并查询(笛卡尔积)

  • 定义:合并查询会显示两个表的所有组合结果,即笛卡尔积, 可以理解为19和09可以组合成多少个2位数

  • 示例:

    SELECT * FROM employee, dept;

2. 内连接查询

  • 定义:内连接只返回两张表交集的部分,即满足连接条件的记录。

  • 隐式内连接:

    • 通过逗号分隔表名和用 WHERE 子句指定连接条件:

    SELECT e.name, d.name FROM employee AS e, dept AS d WHERE e.dept = d.id;
  • 显式内连接:

    • 使用 JOIN 关键字来显示连接关系,语法更清晰:

    SELECT e.name, d.name FROM employee AS e INNER JOIN dept AS d ON e.dept = d.id;

3. 外连接查询

  • 左外连接(LEFT OUTER JOIN):

    • 返回左表(employee)的所有数据,包含与右表(dept)交集部分的数据。

    SELECT e.*, d.name FROM employee AS e LEFT OUTER JOIN dept AS d ON e.dept = d.id;
  • 右外连接(RIGHT OUTER JOIN):

    • 返回右表(dept)的所有数据,包含与左表(employee)交集部分的数据。

    SELECT d.name, e.* FROM employee AS e RIGHT OUTER JOIN dept AS d ON e.dept = d.id;
  • tips:

    • 左连接可以查询到没有部门的员工,右连接可以查询到没有员工的部门。

4. 自连接查询

  • 定义:当前表与自身进行连接查询,需要使用表别名。

  • 语法:

    SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;
  • 示例:

    • 查询员工及其所属领导的名字:

    SELECT a.name, b.name FROM employee AS a, employee AS b WHERE a.manager = b.id;
    • 查询没有领导的员工:

    SELECT a.name, b.name FROM employee AS a LEFT JOIN employee AS b ON a.manager = b.id;

5. 联合查询

SELECT 字段列表 FROM 表A
UNION [ALL]
SELECT 字段列表 FROM 表B;

注意事项

  1. 去重行为:

    • UNION:会去掉重复的记录,只返回唯一的结果集。

    • UNION ALL:包括所有结果,保留重复记录。

  2. 查询效率:

    • 在某些情况下,使用UNION可能会比OR效率高。这是因为对于UNION,数据库可以对每个查询的结果集进行合并,而避免了对整个数据表的扫描。

    • 使用OR条件可能会导致某些情况下索引(现在还不知道这个是什么, 姑且先记一下)失效,从而导致查询性能下降。

  3. 字段要求:

    • 使用UNION或UNION ALL时,所有的SELECT查询返回的字段数和数据类型必须一致。

  4. 执行顺序:

    • 如果查询的顺序很重要,可以使用ORDER BY对最终的结果集进行排序,但需要注意ORDER BY只能在最后一个查询之后使用。

使用示例

-- 查询两个表中用户的名字,去重
SELECT name FROM Customers
UNION
SELECT name FROM Employees;

-- 查询两个表中用户的名字,包括重复
SELECT name FROM Customers
UNION ALL
SELECT name FROM Employees;

6.子查询

嵌套查询,也称为子查询,是一个查询嵌入在另一个查询内部。这种结构可以让我们在一个查询中利用另一个查询的结果。


子查询的分类

  1. 根据结果形式:

    • 标量子查询:返回单个值(如一个数字、一个字符串等)。

    • 列子查询:返回一列,可以是多行。

    • 行子查询:返回一行,包含多个列。

    • 表子查询:返回多行多列的结果。

  2. 根据位置:

    • WHERE之后:用于过滤主查询的结果。

    • FROM之后:作为数据源提供给主查询。

    • SELECT之后:用于计算和生成字段值。

常用的操作符

  • 标量子查询:常用操作符包括=, <, >, >=, <=。

  • 列子查询:常用操作符包括IN, NOT IN, ANY, SOME, ALL。

  • 行子查询:可以使用=, <, >, IN, NOT IN。

  • 表子查询:多用于IN操作符。

示例分析

  1. 标量子查询示例:

    SELECT * 
    FROM employee 
    WHERE entrydate > ( #子查询返回一个常量
        SELECT entrydate 
        FROM employee 
        WHERE name = 'xxx'
    );
  2. 列子查询示例:

    SELECT * 
    FROM employee 
    WHERE dept 
    IN (	#子查询返回很多列,如果dept存在于查询的结果之中,则算满足条件.
        SELECT id 
        FROM dept 
        WHERE name = '销售部' OR name = '市场部'
    );
  3. 行子查询示例:

    SELECT * 
    FROM employee
    WHERE (salary, manager) = (   #查询一列,返回N行,如果这几行全部相等,那么则算满足条件,
        SELECT salary, manager 
        FROM employee 
        WHERE name = 'xxx'
    );
  4. 表子查询示例:

    SELECT e.*, d.* 
    FROM (  #查询一张表,从这张表中再进行条件过滤或者左连接
        SELECT * 
        FROM employee 
        WHERE entrydate > '2006-01-01'
    ) AS e
    LEFT JOIN dept AS d 
    ON e.dept = d.id;

​ TIPS:表字查询也可以放在WHERE '字段' IN后面, 和列子查询类似,只要满足其中一列全部相等,那么则算满足条件

值得一提的案例

SELECT 
    d.id, 	#此处可以理解为先从FROM中查询到了id,再将id传入子查询中,通过count得出人数
    d.name, 
    (
        SELECT 
        	COUNT(*) 
        FROM 
        	emp e 
        WHERE 
        	e.dept_id = d.id
    ) AS '人数'
FROM 
	dept d;
上一页MySQL学习笔记1【DQL和DCL】下一页MySQL学习笔记3【事务】

最后更新于1天前