mysql基础
ddl(Data Definition Language 数据定义语言)
用来创建数据库中的库、表、索引、视图、存储过程、触发器等。
数据库操作
- show databases;查看所有数据库
- create databse [if not exists] 数据库名; 创建数据库
- drop database [if exists] 数据库名; 删除数据库
- select database(); 看当时使用的数据库
- use 数据库名; 选中一个数据
表操作
C Create
R Retrieve/Read
U Update
D Delete
show tables; 查看当前数据库下的所有表
desc 数据表名;
ceate table 表名 (字段名1 数据类型,字段名2 数据类型2…); 创建表
drop table 表名; 删除表
修改表
- 修改表名
- ALTER TABLE 旧表名 RENAME TO 新表名
- 添加一列
- ALTER TABLE 表名 ADD 字段名 类型
- 修改数据类型
- ALTER TABLE 表名 MODIFY 列名 新数据类型
- 修改列名和数据类型
- ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型
- 删除列
- ALTER TABLE 表名 DROP 列名
mysql数据类型
- 数值
- 日期
- 字符串
dml (Data Manipulation Language 数据操作语言)
用来对表内数据的添加、更新、删除等。
- insert
- insert into 表名 (列名1,列名2….) values (值1,值2….)
- insert into 表名 (列名1,列名2….) values (值1,值2….),(值1,值2….)…..
- update
- update 表名 set 列名1=值1,列名2=值2,…..[where 条件]
- delete
- delete from 表名 [where 条件]
- truncate table 表名
dql(Data Query Language 数据查询语言)
用于对表内数据的关键字逻辑查询等。
1 | SELECT 字段列表 |
asdistinctifnull
where
| 运算符符号 | 运算符名称 | 运算符类型 | 描述 | 示例 |
|---|---|---|---|---|
= |
等于 | 比较运算符 | 判断两个值是否相等 | WHERE id = 10 |
<> 或 != |
不等于 | 比较运算符 | 判断两个值是否不相等 | WHERE status <> 0 |
> |
大于 | 比较运算符 | 判断左值是否大于右值 | WHERE price > 100 |
< |
小于 | 比较运算符 | 判断左值是否小于右值 | WHERE age < 18 |
>= |
大于等于 | 比较运算符 | 判断左值是否大于或等于右值 | WHERE score >= 60 |
<= |
小于等于 | 比较运算符 | 判断左值是否小于或等于右值 | WHERE quantity <= 50 |
BETWEEN ... AND ... |
范围匹配 | 范围运算符 | 判断值是否在指定闭区间内 | WHERE salary BETWEEN 5000 AND 10000 |
NOT BETWEEN ... AND |
范围排除 | 范围运算符 | 判断值是否不在指定区间内 | WHERE id NOT BETWEEN 1 AND 100 |
IN (...) |
包含于 | 集合运算符 | 判断值是否在指定列表中 | WHERE status IN (1, 3, 5) |
NOT IN (...) |
不包含于 | 集合运算符 | 判断值是否不在指定列表中 | WHERE country NOT IN ('US', 'CN') |
LIKE |
模式匹配 | 模糊匹配运算符 | 用通配符匹配字符串(%:任意字符,_:单个字符) |
WHERE name LIKE 'Tom%' |
NOT LIKE |
模式排除 | 模糊匹配运算符 | 排除匹配模式的字符串 | WHERE email NOT LIKE '%@test.com' |
IS NULL |
是空值 | 空值判断运算符 | 判断字段是否为 NULL |
WHERE phone IS NULL |
IS NOT NULL |
非空值 | 空值判断运算符 | 判断字段是否不为 NULL |
WHERE address IS NOT NULL |
AND |
逻辑与 | 逻辑运算符 | 同时满足所有条件 | WHERE age > 18 AND score >= 60 |
OR |
逻辑或 | 逻辑运算符 | 满足任意一个条件 | WHERE status = 1 OR status = 3 |
NOT |
逻辑非 | 逻辑运算符 | 取反操作 | WHERE NOT deleted |
REGEXP 或 RLIKE |
正则匹配 | 其他运算符 | 用正则表达式匹配字符串 | WHERE name REGEXP '^A.*z$' |
<=> |
空值安全等于 | 其他运算符 | 可安全比较 NULL(包括 NULL = NULL) |
WHERE column <=> NULL |
- 优先级规则:
- 括号
()>NOT>AND>OR - 示例:
WHERE (a=1 OR b=2) AND c=3
- 括号
- 特殊注意:
NULL判断必须用IS NULL/IS NOT NULL(不可用= NULL)- 通配符
%和_需配合LIKE使用 BETWEEN包含边界值(闭区间)
- 性能提示:
IN适用于离散值,BETWEEN适用于连续范围- 避免在
LIKE中使用前置%(如%abc)导致全表扫描
order by
1 | SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式],排序字段名2 [排序方式] |
- asc 升序 默认
- desc 降序
group by
聚合函数
和分组查询密切相关的技术:聚合函数
常用的聚合函数:
- sum
- avg
- min
- max
- count
1
SELECT 聚合函数(列名) FROM 表名 [WHERE 条件]
分组查询
1 | SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 字段名1 [HAVING 分组后条件过滤] |
- 分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
- group by 后边的字段值相同才会划分为一组
where 和 having 区别
- 执行时机不同,where 先筛选数据,不满足条件不参与分组,having是对分组之后的结果进行过滤
- 可判断条件不一样,where不能对聚合函数进行判断 having 可以
limit
1 | SELECT 字段列表 FROM 表名 LIMIT [起始索引,]查询条目数 |
- 起始索引 从0开始 ,索引0表示数据的表的第一行数据
- 起始索引 缺少是默认 0
- 起始索引 计算公式 : 起始索引 = (当前页面-1) * 每页显示的条数
- limit 是mysql方言
sql执行顺序
- from
- where
- group by
- having
- select
- order by
- limit
dcl(Data Control Language 数据控制语言)
表关系
约束
约束是一种限制,用于修饰表中的列数据,通过这种限制来保证表数据的正确性、完整性、有效性
| 约束类型 | 关键字 | 作用描述 | 示例 |
|---|---|---|---|
| 主键约束 | PRIMARY KEY |
唯一标识每行数据,不允许重复和 NULL 值,每表仅一个主键。 | id INT PRIMARY KEY |
| 外键约束 | FOREIGN KEY |
确保两表间数据关联(引用其他表的主键),防止非法数据插入。 | user_id INT, FOREIGN KEY (user_id) REFERENCES Users(id) |
| 唯一约束 | UNIQUE |
保证列的值唯一(允许 NULL 值),可用于非主键字段。 | email VARCHAR(100) UNIQUE |
| 非空约束 | NOT NULL |
强制列的值不允许为 NULL。 | name VARCHAR(50) NOT NULL |
| 默认约束 | DEFAULT |
插入数据时,若未指定值,则自动填充默认值。 | status INT DEFAULT 1 |
| 检查约束 | CHECK |
验证列的值是否符合指定条件(MySQL 8.0.16+ 原生支持)。 | age INT CHECK (age >= 18) |
| 自增约束 | AUTO_INCREMENT |
自动生成唯一递增值(仅用于整数类型主键)。 | id INT PRIMARY KEY AUTO_INCREMENT |
一对多
- 在从表(多方)创建一个字段作为外键,从表外键值指向主表(一方)的主键。
多对多
- 创建第三张表作为中间表,中间表至少2个字段,这两个字段分别作为外键指向各自一方的主键
一对一
- 两张表合并成一张表
- 任选一方为从表建议唯一约束的外键
多表查询
笛卡尔积
多张表查询时,每张表的每条数据组合成的数据结果集,叫做笛卡尔积。这样组合后的数据不是所有的都有用,通过主外键相等条件过滤掉没用的数据是消除笛卡尔积
1 | create table department(id int primary key auto_Increment, name varchar(10) not null); |
多表查询
内连接 inner join : 把多个表中相互关联的数据查询出来
1 | --隐式内连接 |
外连接 left/right/full join
外连接包括三种类型:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)
| 连接类型 | 是否属于外连接 | 保留数据范围 |
|---|---|---|
INNER JOIN |
❌ 否 | 仅匹配记录 |
LEFT JOIN |
✅ 是 | 左表全部 + 右表匹配部分 |
RIGHT JOIN |
✅ 是 | 右表全部 + 左表匹配部分 |
FULL JOIN |
✅ 是 | 左右表全部记录 |
[子查询] 在一个查询语句中嵌套了另一个查询语句
- 单行单列
- 多行单列
事务
事务特性
ACID