MySQL基础
相关概念
名称 | 全称 | 简称 |
---|---|---|
数据库 | 存储数据的仓库,数据是有组织的进行存储 | DataBase(DB) |
数据库管理系统 | 操纵和管理数据库的大型软件 | DataBase Management System(DBMS) |
SQL | 操作关系型数据库的编程语言,定义了一套操作型数据库统一标准 |
Structured Query Language(SQL) |
一、SQL语句
SQL(Structured Query Language,结构化查询语言)是一种用于管理和处理关系型数据库的标准计算机语言。SQL语句主要分为以下几类:
1、DDL(Data Definition Language,数据定义语言)
DDL 用于定义或修改数据库结构,包括创建、删除和修改数据库及表等操作。
-
数据库操作
- 查询:列出所有数据库或当前使用的数据库。
1
2SHOW DATABASES;
SELECT DATABASE(); - 创建:创建一个新的数据库。
1
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET charset_name] [COLLATE collation_name];
- 删除:删除已存在的数据库。
1
DROP DATABASE [IF EXISTS] 数据库名;
- 使用:选择要操作的数据库。
1
USE 数据库名;
- 查询:列出所有数据库或当前使用的数据库。
-
表操作
- 查询:查看当前数据库中的所有表或特定表的结构。
1
2
3SHOW TABLES;
DESC 表名;
SHOW CREATE TABLE 表名; - 创建:根据给定的字段和类型创建表。
1
2
3
4
5
6CREATE TABLE 表名 (
字段1 字段1类型 [COMMENT '字段1注释'],
字段2 字段2类型 [COMMENT '字段2注释'],
...
字段n 字段n类型 [COMMENT '字段n注释']
) [COMMENT '表注释']; - 修改:向表中添加、修改或删除字段。
1
2
3
4ALTER TABLE 表名 ADD 字段名 类型 [COMMENT '注释'] [约束];
ALTER TABLE 表名 MODIFY 字段名 新数据类型;
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [COMMENT '注释'] [约束];
ALTER TABLE 表名 DROP 字段名; - 重命名:更改表的名称。
1
ALTER TABLE 表名 RENAME TO 新表名;
- 删除:删除表。
1
DROP TABLE [IF EXISTS] 表名;
- 清空:删除表中所有数据,但保留表结构。
1
TRUNCATE TABLE 表名;
- 查询:查看当前数据库中的所有表或特定表的结构。
2、DML(Data Manipulation Language,数据操作语言)
DML 用于操作数据库中的数据,如插入、更新和删除等。
-
添加数据:向表中插入一条或多条记录。
1
2
3INSERT INTO 表名 (字段名1, 字段名2...) VALUES (值1, 值2...);
INSERT INTO 表名 VALUES (值1, 值2...);
INSERT INTO 表名 (字段名1, 字段名2...) VALUES (值1, 值2...), (值1, 值2...); -
修改数据:更新表中已有的记录。
1
UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2... [WHERE 条件];
-
删除数据:从表中删除记录。
1
DELETE FROM 表名 [WHERE 条件];
3、DQL(Data Query Language,数据查询语言)
DQL 用于从数据库中查询数据,是最常用的SQL语句之一。
语法
1 | SELECT |
-
基础查询:从表中选择特定的字段。
1
2SELECT 字段1, 字段2... FROM 表名;
SELECT * FROM 表名; -
设置别名:为字段或表设置别名。
1
SELECT 字段1 AS 别名1, 字段2 AS 别名2... FROM 表名;
-
去除重复记录:确保查询结果中没有重复的记录。
1
SELECT DISTINCT 字段列表 FROM 表名;
- 条件查询:基于特定条件筛选记录
SELECT 字段列表 FROM 表名 WHERE 条件列表;
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN…AND… | 在某个范围之内(包含端点值) |
IN(…) | 在in之后的列表中的值,多选一 |
LIKE 占位符 | 模糊匹配 |
IS NULL | NULL |
逻辑运算符 | 功能 |
---|---|
AND 或 && | 并且 |
OR 或 || | 或者 |
NOT 或 ! | 非 |
- 聚合函数
1 | SELECT 聚合函数 (字段列表) FROM 表名; |
- 分组查询
1 | SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件]; |
注:WHERE 与 HAVING 区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
- 排序查询
语法
1 SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2,排序方式2;
排序方式
- ASC 升序(默认值)
- DESC 降序
- 分页查询
语法:
1 SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
注:
- 起始索引从 0 开始,起始索引 = (查询页码 - 1) * 每页显示记录数
分页查询是数据库的方言,不同数据库有不同的实现,MySQL 中是 LIMIT
- 如果查询的是第一页数据,起始索引可以忽略,直接简写为 LIMIT 10
DQL-执行顺序
熟练掌握这部分内容能够帮助我们更好地理解DQL查询
DQL执行顺序 | |
---|---|
SELECT 字段列表 |
4 |
FROM 表名列表 |
1 |
WHERE 条件列表 |
2 |
GROUP BY 分组字段列表 |
3 |
HAVING 分组后条件列表 |
|
ORDER BY 排序字段列表 |
5 |
LIMIT 分页参数 |
6 |
编写顺序
FROM 表名列表 |
WHERE 条件列表 |
GROUP BY 分组字段列表 |
HAVING 分组后条件列表 |
SELECT 字段列表 |
ORDER BY 排序字段列表 |
LIMIT 分页参数 |
执行顺序
4、DCL(Data Control Language,数据控制语言)
DCL 用于管理数据库用户的访问权限。
- 管理用户:查询、创建、修改和删除用户。
1 | -- 查询用户 |
主机名可用 % 通配,表示可供任意主机连接
- 权限控制**:授予或撤销用户的数据库权限。
权限 | 说明 |
---|---|
ALL, ALL PRIVILEGES | 所有权限 |
SELECT | 查询数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
ALTER | 修改表 |
DROP | 删除数据库/表/视图 |
CREATE | 创建数据库/表 |
1 | -- 查询权限 |
- 多权限之间使用逗号分隔
- 授权时,数据库名和表名可以使用 * 进行通配,代表所有
二、函数
MySQL 提供了一系列内置函数来处理数据,主要包括字符串函数、数值函数、日期函数和流程控制函数。
1、字符串函数
函数 | 功能 |
---|---|
CONCAT(S1, S2, ……Sn) | 字符串拼接 |
LOWER(str) | 转小写 |
UPPFR(str) | 转大写 |
LPAD(str, n, pad) | 左填充,用字符串pad对str的左边进行填充,达到n个字符的长度 |
PRAD(str, n, pad) | 右填充,…… |
TRIM(str) | 去掉字符串头部和尾部的空格 |
SUBSTRING(str, start, len) | 返回从字符串str从start位置起的len个长度的字符串 |
2、数值函数
函数 | 功能 |
---|---|
CEIL(X) | 向上取整 |
FLOOR(X) | 向下取整 |
MOD(X, Y) | 返回X/Y的模 |
RAND() | 返回 0 ~ 1 内的随机数 |
ROUND(X, Y) | 求参数X四舍五入的值,保留Y位小数 |
3、日期函数
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前日期和时间 |
YEAR(date) | 获取指定date的年份 |
MONTH(date) | 获取指定date的月份 |
DAY(date) | 获取指定date的日期 |
DATE_ADD(date,INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
DATEDIFF(date1,date2) | 返回起始时间date1和结束时间date2之间的天数 |
4、流程函数
函数 | 功能 |
---|---|
IF(value, t, f) | 如果value为true,则返回t,否则返回f |
IFNULL(value1, value2) | 如果value1不为空,返回value1,否则返回value2 |
CASE WHEN [val1] THEN [res1] … ELSE [default] END | 如果val1为true,返回res1,…否则返回default默认值 |
CASE [val1] THEN [res1] … ELSE[default] END | 如果expr的值等于val1,染回res1,…否则返回default默认值 |
三、约束
约束用于确保数据的完整性和一致性,常见的约束类型包括:
常见约束包括:
约束 描述 关键字 非空约束 限制该字段的数据不能为NULL NOT NULL 唯一约束 保证该字段的所有数据都是唯一、不重复的 UNIQUE 主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY 默认约束 保存数据时,如果未指定该字段的值,则采用默认值 DEFAULT 检查约束 保证字段值满足某一个条件 CHECK 外检约束 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 FOREIGN KEY
- MySQL中的检查约束(CHECK constraint)是在版本8.0.16之后得到全面支持的。
注:约束是作用在表中字段上的,可以在创建表 / 修改表的时候添加约束
外键约束
- 添加外键
1
2
3
4
5 CREATE TABLE 表名(
字段名 数据类型,
…
[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名)
);
1 ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY() REFERENCES 主表(主表列名);
- 删除外键
1 ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
删除 / 更新行为
行为 | 说明 |
---|---|
NO ACTION | 当父表中删除 / 更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除 / 更新。(与 RESTRICT 一致) |
RESTRICT | 当父表中删除 / 更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除 / 更新。(与 NO ACTION 一致) |
CASCADE | 当父表中删除 / 更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除 / 更新外键在子表中的记录 |
SET NULL | 当在父表中删除对应记录时,首先检查该记录是否有对应的外键,如果有则设置子表中该外键的值为NULL |
SET DEFAULT | 父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持) |
1 ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
四、多表查询
多表查询允许从多个表中同时检索数据,常见的多表查询包括内连接、外连接和自连接。
概述
- 概述:指总多张表中查询数据
- 笛卡尔积:笛卡尔乘积是指在数学中,两个集合 A集合 和 B集合 的所有组合情况(
在多表查询时,需要消除无效的笛卡尔积
) 多对多关系需要中间表进行维护
连接查询
内连接:返回两个表中匹配的记录。
- 概念:内连接查询的是两张表的交集部分
语法:
1
2
3
4 -- 隐式内连接
SELECT 字段列表 FROM 表1, 表2 WHERE 条件 …;
-- 显式内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件;
- 隐式内连接: 先做笛卡尔积,然后进行过滤;
- 显式内连接: 先匹配连接条件,再返回值
故无论是性能还是时间复杂度,都是显示内连接更好
外连接:返回两个表中匹配和不匹配的记录。
语法:
1
2
3
4 -- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件…;
-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件…;
- 左外连接:相当于查询
左表
的所有数据并包含左表和右表交集部分的数据 - 同理, 右外连接相当于查询
右表
的所有数据并包含左表和右表交集部分的数据 - 左外连接与右外连接可以互相替代
自连接
语法:
1 SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件;
- 自连接查询,既可以是内连接查询,也可以是外连接查询
联合查询-union, union all
概念:对于union查询,就是吧多次查询的结果合并起来,形成一个新的查询结果集
语法:
1
2
3 SELECT 字段列表 FROM 表A
UNION [ALL]
SELECT 字段列表 FROM 表B …;
子查询
- 概念:SQL语句中嵌套SELECT语句,成为
嵌套查询
,又称子查询
1 SELECT * FROM t1 WHERE column1 = (SELECT coulumn1 FROM t2);子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个
- 根据子查询结果不同,分为:
- 标量子查询(子查询结果为单个值)
- 列子查询(结果为一列)
- 行子查询(结果为一行)
- 表子查询(结果为多行多列)
- 根据子查询位置不同,分为:WHERE 之后,FROM 之后,SELECT 之后
标量子查询
标量子的返回结果为单个值(数字,字符串,日期等),最简单的形式,这种子查询称为
标量子查询
常用操作符: = <> > >= < <=
列子查询
- 子查询结果返回的是一列(可以是多行),这种子查询称为
列子查询
- 常用操作符:IN, NOT IN, ANY, SOME, ALL
操作符 描述 IN 在指定的集合范围之内,多选一 NOT IN 不在指定的集合范围之内 ANY 子查询返回列表中,有任意一个满足即可 SOME 与ANY相同 ALL 子查询返回列表的所有值都必须满足
行子查询
- 子查询返回的结果是一行(可以是多行),这种子查询称为
行子查询
- 常用的操作符:=, <>, IN, NOT IN
表子查询
- 子查询返回的结果是多行多列,这种子查询称为
表子查询
- 常用的操作符:IN