数据库基础
MySQL数据库基础知识
1. 关系型数据库基本概念
- 关系型数据库
- 概念:建立在关系型模型基础上,由多张相互连接的二维表组成的数据库
- 特点:
- 由表进行存储数据
- 使用
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 小数位)、FLOAT、DOUBLE - 字符串型:
CHAR、VARCHAR(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 BYclause, becauseORDER BYis evaluated after theSELECTclause. You can also refer to a column alias in theGROUP BYclause (this is an extension to standard SQL). However, you cannot refer to a column alias in aWHEREclause, because theWHEREclause is evaluated before theSELECTclause.
7. DCL(待补)
8. 函数
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 参数用于确定结果的单位,begin 和 end 是 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;
总结
- 普通函数(字符串 / 日期 / 数值函数,流程函数):可以在 WHERE/GROUP BY/HAVING/SELECT/ORDER BY 中任意使用;
- 聚合函数(
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)

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

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

10.2 多表查询概述
分类:
-
连接查询

- 内连接:相当于查询A和B的交集
- 外连接:
- 左外连接:查询左表所有的数据和两张表交集的部分的数据
- 右外连接:查询右表所有的数据和两张表交集的部分的数据
- 自连接:当前表与自身的连接查询,自连接必须使用表的别名 ( 相当于一张表copy为2份来查 )
-
子查询
概念:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询
- 标量子查询(子查询结果为单个值)
- 列子查询(子查询结果为一列)
- 行子查询(子查询结果为一行)
- 表子查询(子查询结果为多行多列)
补充:
- 根据子查询位置,分为: WHERE之后 FROM之后 SELECT之后
- 子查询外部的语句可以是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 条件...;
注意点:
- 必须使用表的别名
- 自连接查询可以是内连接查询也可以是外连接查询
案例:
-- 自连接(表中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 ...;
补充点:
union all会将全部数据合并再一起,union会对合并后的数据进行去重- 对于联合查询的多张表的列数(即查询字段数量)必须保持一致,字段类型也须保持一致
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 = '宋远桥' );
浙公网安备 33010602011771号