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
      2
      SHOW 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
      3
      SHOW TABLES;
      DESC 表名;
      SHOW CREATE TABLE 表名;
    • 创建:根据给定的字段和类型创建表。
      1
      2
      3
      4
      5
      6
      CREATE TABLE 表名 (
      字段1 字段1类型 [COMMENT '字段1注释'],
      字段2 字段2类型 [COMMENT '字段2注释'],
      ...
      字段n 字段n类型 [COMMENT '字段n注释']
      ) [COMMENT '表注释'];
    • 修改:向表中添加、修改或删除字段。
      1
      2
      3
      4
      ALTER 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
    3
    INSERT 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
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
  • 基础查询:从表中选择特定的字段。

    1
    2
    SELECT 字段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
2
3
4
5
6
7
8
9
-- 查询用户
USE mysql;
SELECT * FROM user;
-- 创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
-- 修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
-- 删除用户
DROP USER '用户名'@'主机名'

主机名可用 % 通配,表示可供任意主机连接

  • 权限控制**:授予或撤销用户的数据库权限。
权限 说明
ALL, ALL PRIVILEGES 所有权限
SELECT 查询数据
INSERT 插入数据
UPDATE 修改数据
DELETE 删除数据
ALTER 修改表
DROP 删除数据库/表/视图
CREATE 创建数据库/表
1
2
3
4
5
6
-- 查询权限
SHOW GRANTS FOR '用户名'@'主机名' ;
-- 授予权限
GRANT 授权列表 ON 数据库名.表名 TO '用户名'@'主机名' ;
-- 撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名' ;
  • 多权限之间使用逗号分隔
  • 授权时,数据库名和表名可以使用 * 进行通配,代表所有

二、函数

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 字段列表 FROM1, 表2 WHERE 条件 …;
-- 显式内连接
SELECT 字段列表 FROM1 [INNER] JOIN2 ON 连接条件;
  • 隐式内连接: 先做笛卡尔积,然后进行过滤;
  • 显式内连接: 先匹配连接条件,再返回值

故无论是性能还是时间复杂度,都是显示内连接更好

外连接:返回两个表中匹配和不匹配的记录。

语法:

1
2
3
4
-- 左外连接
SELECT 字段列表 FROM1 LEFT [OUTER] JOIN2 ON 条件…;
-- 右外连接
SELECT 字段列表 FROM1 RIGHT [OUTER] JOIN2 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