数据库基础

MySQL数据库基础知识


MySQL 8.0 官方文档

1. 关系型数据库基本概念


image-20251217155814071

image-20251217155906522

  • 关系型数据库
    • 概念:建立在关系型模型基础上,由多张相互连接的二维表组成的数据库
    • 特点:
      • 由表进行存储数据
      • 使用SQL语言进行操作

2. SQL分类

分类 说明
DDL 数据定义语言,用于定义数据库对象(数据库,表,字段)
DML 数据操作语言,用于对数据表中的数据进行增删改查操作
DQL 数据查询语言,用于查询数据库中表的记录
DCL 数据控制语言,用于创建数据库用户,控制数据库的访问权限

3. DDL ——数据定义语言:库


操作语句:

# 增
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];
# 删
drop database [if exists] 数据库名;
# 改
alter database 数据库名 charset utf8mb4;
# 查
show databases;						/*查看所有数据库(文件夹)*/
show create database 数据库名;		/*指定查看创建的数据库(如db1库)*/
select database();				  /*查看现在,在哪个库下面 */

# 使用某个数据库
use 数据库名

4. DDL ——数据定义语言:表


4.1 存储引擎

  • 存储引擎解释:就是表的类型,比如图像有png,文本文档有txt

  • MySQL支持的存储引擎查看:show engines; 一般默认为InnoDB

  • 指定表的存储引擎(比如将默认的引擎指定为CSV)

    create table t1(id int)engine=CSV;
    

4.2 数据类型

4.2.1 数值类型

分类 类型 大小 有符号 (SIGNED) 范围 无符号 (UNSIGNED) 范围 描述
数值类型 TINYINT 1 byte (-128, 127) (0, 255) 小整数值
数值类型 SMALLINT 2 bytes (-32768, 32767) (0, 65535) 大整数值
数值类型 MEDIUMINT 3 bytes (-8388608, 8388607) (0, 16777215) 大整数
数值类型 INT 或 INTEGER 4 bytes (-2147483648, 2147483647) (0, 4294967295) 大整数值
数值类型 BIGINT 8 bytes (-2^63, 2^63-1) (0, 2^64-1) 极大整数值
数值类型 FLOAT 4 bytes (-3.402823466 E+38, 3.402823466351 E+38) 0 和 (1.175494351 E-38, 3.402823466 E+38) 单精度浮点数值
数值类型 DOUBLE 8 bytes (-1.7976931348623157 E+308, 1.7976931348623157 E+308) 0 和 (2.2250738585072014 E-308, 1.7976931348623157 E+308) 双精度浮点数值
数值类型 DECIMAL - 依赖于 M (精度) 和 D (标度) 的值 依赖于 M (精度) 和 D (标度) 的值 小数值 (精确定点数)
  • 示例:
# 显示宽度
int(5) : 
1.int 是 4 字节整数类型,括号内的 5 是显示宽度,不影响数值的存储范围
2.只有搭配 ZEROFILL 属性时,显示宽度才会生效 —— 不足 5 位的数值会在左侧补 0,比如 id int(5) ZEROFILL 存入 12 会显示为 00012;无 ZEROFILL 时,int(5) 和普通 int 完全等价

# 选择tinyint类型进行表示年龄
age tinyint unsigned	# 无符号 (0,255)

# M 和 D
123.66	M:5 D:2
score double(4,1)

4.2.2 字符类型

分类 类型 大小 描述
字符串类型 CHAR 0-255 bytes 定长字符串
字符串类型 VARCHAR 0-65535 bytes 变长字符串
字符串类型 TINYBLOB 0-255 bytes 不超过 255 个字符的二进制数据
字符串类型 TINYTEXT 0-255 bytes 短文本字符串
字符串类型 BLOB 0-65535 bytes 二进制形式的长文本数据
字符串类型 TEXT 0-65535 bytes 长文本数据
字符串类型 MEDIUMBLOB 0-16777215 bytes 二进制形式的中等长度文本数据
字符串类型 MEDIUMTEXT 0-16777215 bytes 中等长度文本数据
字符串类型 LONGBLOB 0-4294967295 bytes 二进制形式的极大文本数据
字符串类型 LONGTEXT 0-4294967295 bytes 极大文本数据
  • 示例:
定长字符串:
占用空间根据输入的而决定,如果超出指定的则报错
	如,性别: char(1)
	
变长字符串:
占用空间是固定的
	如,用户名:varcahr(10)

4.2.3 日期类型

分类 类型 大小 范围 格式 描述
日期类型 DATE 3 1000-01-01 至 9999-12-31 YYYY-MM-DD 日期值
日期类型 TIME 3 -838:59:59 至 838:59:59 HH:MM:SS 时间值或持续时间
日期类型 YEAR 1 1901 至 2155 YYYY 年份值
日期类型 DATETIME 8 1000-01-01 00:00:00 至 9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
日期类型 TIMESTAMP 4 1970-01-01 00:00:01 至 2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 混合日期和时间值,时间戳

4.2.4 MySQL 数据类型转换

一、核心转换方式

类型 说明 适用场景
隐式转换 MySQL 自动触发,无需手动操作 简单、确定的类型匹配场景
显式转换 通过函数主动指定转换规则,可控性强 所有生产环境核心场景

二、常用显式转换函数

函数 / 语法 功能 典型用法示例
CAST(expr AS type) 通用类型转换 CAST('99.99' AS DECIMAL(10,2)) → 99.99
CONVERT(expr, type) 通用类型转换(同 CAST) CONVERT(123 AS CHAR) → '123'
CONVERT(expr USING 字符集) 字符集转换 CONVERT('测试' USING utf8mb4)
STR_TO_DATE(str, fmt) 字符串转日期 / 时间(精准) STR_TO_DATE('2024-05-20', '%Y-%m-%d')
DATE_FORMAT(date, fmt) 日期 / 时间转字符串(精准) DATE_FORMAT(NOW(), '%Y年%m月%d日')
FROM_UNIXTIME(ts, fmt) 时间戳转日期字符串 FROM_UNIXTIME(1716208200, '%Y-%m-%d %H:%i:%s')
  • 支持的目标数据类型:

    • 数值型:SIGNED(有符号整数)、UNSIGNED(无符号整数)、DECIMAL(M,D)(小数,M 总位数,D 小数位)、FLOATDOUBLE
    • 字符串型:CHARVARCHAR(MySQL 中CHAR即可)
    • 日期时间型:DATE(日期)、DATETIME(日期时间)、TIME(时间)
    • 布尔型:BOOLEAN(实际会转为 1/0)
  • MySQL 数据类型转换的核心要点:

    • 优先显式转换:用CAST()/STR_TO_DATE()等函数明确转换规则,拒绝依赖隐式转换

    • 兼顾合法性与性能:转换前校验值的有效性,且避免转换字段值导致索引失效

    • 适配业务场景:根据需求选择专用转换函数(日期用STR_TO_DATE/DATE_FORMAT,字符集用CONVERT USING

4.3 表操作语句

操作语句:

# 增
	# 1. 创建表
create table 表名(字段1 数据类型,字段2 数据类型);
create table 表名(
	字段1 数据类型 [comment 字段1注释],
    字段2 数据类型 [comment 字段2注释],
	字段3 数据类型 [comment 字段3注释]
) [comment 该表的注释];
	# 2. 复制表结构+记录
create table 表名 select * from 被复制的表名;
	# 3. 只复制表结构
create table 表名 select * from 被复制的表名 where 1=2;		# 无索引
create table 表名 like 被复制的表名;						# 含索引

# 删
drop table [if exists] 表名1,表名2;

# 改(表名,字段)
	# 1. 修改表名
alter table 旧表名 rename 新表名;
	# 2. 增加字段
alter table 表名 add 字段 数据类型[约束条件],add 字段 数据类型[约束条件];
alter table 表名 add 字段 数据类型[约束条件] first;
alter table 表名 add 字段 数据类型[约束条件] after 字段;
	# 3. 删除字段
alter table 表名 drop 字段;
	# 4. 修改字段
alter table 表名 modify 字段 新数据类型[约束条件];
alter table 表名 change 旧字段 新字段 数据类型[约束条件];

# 查(看表信息,而非里面的记录)
show tables;
show create table 表名\G;		/* 仅适用于终端命令行,进行一行行查看表信息 */
desc 表名;

modify vs change 区别

  • modify:只能改字段类型,不能改字段名(如 modify id char(11));
  • change:既能改字段名,也能改类型(如 change id ID int

5. DML——数据操作语言


操作语句:

# 增
	# 给指定字段添加数据
insert into 表名(字段1,字段二...) values(值1,值2...);
	# 给全部字段添加数据
insert into 表名 values(值1,值2...);
	# 批量添加数据
insert into 表名(字段1,字段二...) values(值1,值2...),(值1,值2...);
insert into 表名 values(值1,值2...),(值1,值2...);

# 删
delete from 表名 [where 条件];

# 改
update 表名 set 字段1 = 值1,字段2 = 值2... [where 条件];

6. DQL——数据查询语言


6.1 编写与执行顺序

  • 编写顺序:
select 
	字段列表 
from 
	表名 
where 
	条件列表
group by 
	分组字段列表
having 
	分组过滤条件列表
order by 
	排序字段列表
limit
	分页参数
  • 执行顺序:
from -> where -> group by having -> select -> order by -> limit

FROM	确定查询的表 / 数据源
WHERE	筛选原始数据中的行(分组前筛选)
GROUP BY	对数据进行分组
HAVING	筛选分组后的结果(分组后筛选)
SELECT	选择字段、定义别名、计算表达式
ORDER BY	对结果集排序(可以使用SELECT中的别名)
LIMIT	限制结果集的行数

6.2 基本查询

语句:

# 查询多个字段
select 字段1 [as 别名1],字段2 [as 别名2]... from 表名;
select * from 表名;

# 去除重复记录
select distinct 字段列表 from 表名;

6.3 条件查询

语句:

select 字段列表 from 表名 where 条件列表;

条件:

比较运算符 功能说明
> 大于
>= 大于等于
< 小于
<= 小于等于
= 等于
<>!= 不等于
BETWEEN ... AND ... 在某个范围之内(包含最小值和最大值)
IN(...) 匹配列表中的任意一个值(多选一)
LIKE 占位符 模糊匹配(_匹配单个字符,%匹配任意字符)
IS NULL 判断字段值是否为 NULL
逻辑运算符 功能说明
AND&& 并且
OR 或 `
NOT!

6.4 聚合函数

注意避免聚合函数的嵌套使用

语句:

select 聚合函数(字段列表) from 表名;

聚合函数:

  • NULL值不参与聚合函数的运算
  • 聚合函数是对指定字段(列)求值
函数 功能
count 统计数量
max 求最大值
min 求最小值
avg 求平均值
sum 求和

6.5 分组查询

语句:

select 字段列表 from 表名 [where 条件列表] group by 分组字段名 [having 分组后的条件列表];

where和having区别:

  • 执行时机:where是分组之前进行过滤,不满足条件的不进行分组。having是分组之后再进行过滤
  • 判断条件:where不能对聚合函数进行判断,即where中不能使用聚合函数,而having

注意:

  • 执行顺序:where > 聚合函数 > having
  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无意义

6.6 排序查询

语法:

select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2;

排序方式:

AEC:升序(默认)

DESC:降序

注意:

  • 如果多字段排序,当第一个字段值相同时才会按照第二个字段进行排序

6.7 分页查询

语法:

select 字段列表 from 表名 limit 起始索引,查询记录数;

注意:

  • 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数
  • 如果查询第一页,起始索可忽略

6.8 关于别名的使用

总结

MySQL 中别名的使用规则是 “标准执行顺序 + MySQL 扩展” 的结合:

  • 遵循标准:WHERE/SELECT自身 不能用别名;HAVING/ORDER BY 可以用;
  • MySQL 扩展:GROUP BY 可以用别名(自动解析为表达式)。

这个规则是 MySQL 独有的,换其他数据库(如 Oracle/PostgreSQL)需按标准 SQL 改写

引用自 MySQL 8.0 官方文档

In MySQL, you can refer to a column alias in the ORDER BY clause, because ORDER BY is evaluated after the SELECT clause. You can also refer to a column alias in the GROUP BY clause (this is an extension to standard SQL). However, you cannot refer to a column alias in a WHERE clause, because the WHERE clause is evaluated before the SELECT clause.

7. DCL(待补)


8. 函数


MySQL 函数 | 菜鸟教程

8.1 字符串函数

函数 功能
CHAR_LENGTH(s) 返回字符串 s 的字符数
CONCAT(s1,s2,…Sn) 字符串拼接,将 s1, s2, … Sn 拼接成一个字符串
REPLACE(s,s1,s2) 将字符串 s2 替代字符串 s 中的字符串 s1
LOWER(str) 将字符串 str 全部转为小写
UPPER(str) 将字符串 str 全部转为大写
LPAD(str,n,pad) 左填充,用字符串 pad 对 str 的左边进行填充,达到 n 个字符串长度
RPAD(str,n,pad) 右填充,用字符串 pad 对 str 的右边进行填充,达到 n 个字符串长度
TRIM(str) 去掉字符串头部和尾部的空格
RIGHT(string,number_of_chars) 字符串中提取多个字符(从右开始)
LEFT(string, number_of_chars) 字符串中提取多个字符(从左开始)
SUBSTRING(str,start,len) 返回从字符串 str 的 start 位置起、长度为 len 的子字符串,起始索引在这里为1

8.2 数值函数

函数 功能
CEIL(x) 向上取整
FLOOR(x) 向下取整
MOD(x,y) 返回x/y的余数
RAND() 返回0~1内的随机数,范围是 [0,1)
ROUND(x,y) 对 x 四舍五入,保留 y 位小数
GREATEST(expr1, expr2, expr3, ...) 返回列表中的最大值
LEAST(expr1, expr2, expr3, ...) 返回列表中的最小值

8.3 日期函数

函数 功能
CURDATE() 返回当前日期,如 “2026-01-14”
CURTIME() 返回当前时间,如 “15:30:45”
NOW() 返回当前日期和时间,如 “2026-01-14 15:30:45”
YEAR(date) 获取指定日期的年份
MONTH(date) 获取指定日期的月份
DAY(date) 获取指定日期的日
DAYNAME(d) 返回日期 d 是星期几,如 SELECT DAYNAME('2011-11-11 11:11:11')
DATE_ADD(date, INTERVAL expr type) 给日期 / 时间增加指定间隔
DATEDIFF(date1, date2) 计算两个日期之间的天数差
TIMESTAMPDIFF(unit, begin, end) unit 参数用于确定结果的单位,beginend 是 DATE 或 DATETIME 表达式
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') 将日期时间格式化为任意需要的“年月日时分秒”形式
-- DATE_ADD(date, INTERVAL expr type)
select date_add(curdate(),interval 30 day);

-- DATEDIFF(date1, date2)
select datediff('2025-01-14','2025-01-10');

-- TIMESTAMPDIFF(unit, begin, end)
SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-06-01') AS result;

-- DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') 
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_datetime;

-- 查询所有员工的入职天数,并根据入职天数倒序排序。
select name,datediff(curdate(),entrydate) entryday from emp order by entryday desc;

8.4 流程函数

函数 功能
IF(value , t , f) 条件判断:value 为真返回 t,否则返回 f
IFNULL(value1 , value2) 空值替换:value1 不为空(Null)返回其值,否则返回 value2
CASE WHEN 条件 THEN 结果 ... ELSE [default] END 多条件分支:匹配第一个为真 ,返回对应 结果;无匹配则返回 default,默认为NULL
CASE 字段 WHEN 值 THEN 结果 ... ELSE [default] END 等值匹配:字段等于值 时返回对应 结果;无匹配则返回 default,默认为NULL
-- 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)
select
    name,
    ( case workaddress when '北京' then '一线城市' when '上海' then '二线城市' else '其他城市' end ) '工作地址'
from emp;

-- 统计班级各个学员的成绩,展示的规则如下:
	-- >= 85,展示优秀
	-- >= 60,展示及格
	-- 否则,展示不及格
select
    name,
    ( case when math >= 85 then '优秀' when math between 65 and 85 then '及格' else '不及格' end ) math,
    ( case when english >= 85 then '优秀' when english between 65 and 85 then '及格' else '不及格' end ) english,
    ( case when chinese >= 85 then '优秀' when chinese between 65 and 85 then '及格' else '不及格' end ) chinese
from score;

总结

  1. 普通函数(字符串 / 日期 / 数值函数,流程函数):可以在 WHERE/GROUP BY/HAVING/SELECT/ORDER BY 中任意使用
  2. 聚合函数(AVG/COUNT等):不能用在 WHERE 里,执行顺序:where > 聚合函数 ;

9. 约束


  • 概念:作用于表中字段上的规则,用于限制再表中存储的数据

  • 目的:保证数据库中数据的正确、有效和完整性

  • 分类:

约束 描述 关键字
非空约束 限制该字段的数据不能为 null NOT NULL
唯一约束 保证该字段的所有数据都是唯一、不重复的 UNIQUE
主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY_KEY (自增:auto_increment)
默认约束 保存数据时,如果未指定该字段的值,则采用默认值 DEFAULT
检查约束(8.0.16 版本之后) 保证字段值满足某一个条件 CHECK
外键约束 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 FOREIGN KEY
  • 注意点:其作用于表中字段上,可以在创建修改表时添加约束
-- 示例
create table user(
    id int primary key  auto_increment comment '主键',
    name varchar(10) not null unique,
    age int check( age > 0 and age <= 120),
    status char(1) default '1',
    gender char(1)
) comment '用户表';
  • 外键约束:

    • 概念:用来让两张表的数据之间建立连接,保证数据的一致性和完整性
    • 添加外键约束
    -- 格式一:
    create table 表名(
        字段名 数据类型,
        ...
        constraint 外键约束名 foreign key (子表的外键字段名) references 父表名(父表的主键字段名)
        ...
    );
    
    -- 格式二:
    alter table 表名 add constraint 外键约束名 foreign key (子表的外键字段名) references 父表名(父表的主键字段名);
    
    
    • 删除外键
    alter table 表名 drop foreign key 外键约束名;
    
    • 外键约束名:fk_子表名_字段名
    • 删除更新行为
    行为 说明
    NO ACTION 当在父表中删除 / 更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除 / 更新。(与 RESTRICT 一致)
    RESTRICT 当在父表中删除 / 更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除 / 更新。(与 NO ACTION 一致)
    CASCADE 当在父表中删除 / 更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除 / 更新外键在子表中的记录。
    SET NULL 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为 null(这就要求该外键允许取 null)。
    SET DEFAULT 父表有变更时,子表将外键列设置成一个默认的值 (InnoDB 不支持)
    -- 格式
    上述格式后加: ... on update cascade/set null  on delete cascade/set null
    

10. 多表查询


10.1 多表关系

  • 一对一

    • 案例:用户与用户详情的关系
    • 关系:一对一关系多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另外一张表
    • 实现:在任意一方设置外键,且关联另一方的主键,并且设置外键为唯一的(UNIQUE)

    image-20260119150658305

  • 一对多

    • 案例:部门与员工之间的关系
    • 关系:一个部门对应多个员工,一个员工对应一个部门
    • 实现:在多的一方设置外键对应另外一方的主键

    image-20260119151005770

  • 多对多

    • 案例:学生与课程之间的关系
    • 关系:一个学生可以选修多门课程,一门课程可以被多个学生选择
    • 实现:建立中间表,中间表至少包含2个外键,分别关联两方的主键

    image-20260119151501121

10.2 多表查询概述

分类:

  • 连接查询

    image-20260119152040191

    • 内连接:相当于查询A和B的交集
    • 外连接:
      • 左外连接:查询左表所有的数据和两张表交集的部分的数据
      • 右外连接:查询右表所有的数据和两张表交集的部分的数据
    • 自连接:当前表与自身的连接查询,自连接必须使用表的别名 ( 相当于一张表copy为2份来查 )
  • 子查询

    概念:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询

    • 标量子查询(子查询结果为单个值)
    • 列子查询(子查询结果为一列)
    • 行子查询(子查询结果为一行)
    • 表子查询(子查询结果为多行多列)

    补充:

    1. 根据子查询位置,分为: WHERE之后 FROM之后 SELECT之后
    2. 子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个

10.3 连接查询——内连接

语法:

  • 隐式内连接
select 字段列表 from 表1,表2 where 条件...;
  • 显示内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;

案例:

-- 1. 查询每一个员工的姓名,及关联的部门的名称
-- 表结构:emp,dept
-- 连接条件:emp.dept_id = dept.id

-- 隐式内连接:
select emp.name , dept.name from emp , dept where emp.dept_id = dept.id;
-- 显示内连接:
select emp.name , dept.name from emp join dept on emp.dept_id = dept.id;

10.4 连接查询——外连接

语法(常用左):

  • 左外连接
select 字段列表 from 表1 left join 表2 on 条件...;
# 查询左表(表1)所有数据,包含表1和表2交集部分的数据
  • 右外连接
select 字段列表 from 表1 right join 表2 on 条件...;
# 查询右表(表2)所有数据,包含表1和表2交集部分的数据

案例:

-- 1. 查询emp表的所有数据,和对应的部门信息(左外连接)
-- 表结构:emp,dept
-- 连接条件:emp.dept_id = dept.id
select emp.* , dept.name from emp left join dept on emp.dept_id = dept.id;


-- 2. 查询dept表的所有数据,和对应的员工信息(右外连接)
select dept.* , emp.name from emp right join dept on emp.dept_id = dept.id;

10.5 连接查询——自连接

语法(必须使用表的别名):

select 字段列表 from 表A 别名A join 表A 别名B on 条件...;

注意点:

  1. 必须使用表的别名
  2. 自连接查询可以是内连接查询也可以是外连接查询

案例:

-- 自连接(表中boss无上级领导)
-- 1. 查询员工 及其 所属领导的名字
-- 表结构:emp
select a.name , b.name from emp a join emp b on a.managerid = b.id; 

-- 2. 查询 所有员工  emp 及其领导的名字 emp ,如果员工没有领导,也需要查询出来
-- 表结构:emp a , emp b
select a.name , b.name from emp a left join emp b on a.managerid = b.id;

10.6 联合查询

概念:将多次查询的结果合并起来形成一个新的查询结果集

语法:

select 字段列表 from 表A ...;
union [all]
select 字段列表 from 表B ...;

补充点:

  1. union all会将全部数据合并再一起,union 会对合并后的数据进行去重
  2. 对于联合查询的多张表的列数(即查询字段数量)必须保持一致,字段类型也须保持一致

10.7 子查询——标量子查询

概念:子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询

常用的操作符:= <> > >= < <=

案例:

-- 查询 "销售部" 的所有员工信息
-- ①. 查询 "销售部" 部门ID
select id from dept where name = '销售部';
-- ②. 根据 "销售部" 部门ID, 查询员工信息
select * from emp where dept_id = (select id from dept where name = '销售部');

10.8 子查询——列子查询

概念:子查询返回的结果是一列(可以是多行),这种子查询称为列子查询

常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL

操作符 描述
IN 在指定的集合范围之内,多选一
NOT IN 不在指定的集合范围之内
ANY 子查询返回列表中,有任意一个满足即可
SOME 与ANY等同,使用SOME的地方都可以使用ANY
ALL 子查询返回列表的所有值都必须满足

案例:

-- 查询 "销售部" 和 "市场部" 的所有员工信息
-- ①. 查询 "销售部" 和 "市场部" 的部门ID
select id from dept where name = '销售部' or name = '市场部';
-- ②. 根据部门ID, 查询员工信息
select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部');

10.9 子查询——行子查询

概念:子查询返回的结果是一行(可以是多列),这种子查询称为行子查询

常用的操作符:= 、<> 、IN 、NOT IN

案例:

-- 查询与 "张无忌" 的薪资及直属领导相同的员工信息 ;
-- ①. 查询 "张无忌" 的薪资及直属领导
select salary, managerid from emp where name = '张无忌';
-- ②. 查询与 "张无忌" 的薪资及直属领导相同的员工信息 ;
select * from emp where (salary,managerid) = (select salary, managerid from emp 
where name = '张无忌');

10.10子查询——多表子查询

概念:子查询返回的结果是多行多列,这种子查询称为表子查询

常用的操作符:IN

案例:

-- 查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息
-- ①. 查询 "鹿杖客" , "宋远桥" 的职位和薪资
select job, salary from emp where name = '鹿杖客' or name = '宋远桥';
-- ②. 查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息
select * from emp where (job,salary) in ( select job, salary from emp where name = '鹿杖客' or name = '宋远桥' );
posted @ 2026-01-22 18:20  guohan222  阅读(3)  评论(0)    收藏  举报