• MiddleWare ❀ MySQL基础概述


    文章目录

    MySQL基础

    MySQL语句不区分大小写

    1、SQL语法与分类

    • DDL:数据定义语言,定义数据库对象(数据库、表、字段);
    • DML:数据操作语言,对数据库表中的数据进行增删改;
    • DQL:数据查询语言,查询数据库中表的数据;
    • DCL:数据控制语言,创建数据库用户、控制访问权限。

    1.1 DDL 数据定义语言

    DDL:数据定义语言,定义数据库对象(数据库、表、字段)

    1.1.1 库操作
    1.1.1.1 查询
    # 查询所有数据库
    SHOW DATABASES;
    # 查询当前数据库
    SELECT DATABASE();
    
    • 1
    • 2
    • 3
    • 4
    1.1.1.2 创建
    CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
    
    • 1
    1.1.1.3 删除
    DROP DATABASE [IF EXISTS] 数据库名;
    
    • 1
    1.1.1.4 使用
    USE 数据库名;
    
    • 1
    1.1.2 表+字段操作
    1.1.2.1 查询
    • 查询当前数据库所有表
    SHOW TABLES;
    
    • 1
    • 查询表结构
    DESC 表名;
    
    • 1
    • 查询指定表的创建语句
    SHOW CREATE TABLE 表名;
    
    • 1
    1.1.2.2 创建
    CREATE TABLE 表名(
    	字段1 字段1类型 [COMMENT 字段1注释],
      字段2 字段2类型 [COMMENT 字段2注释],
      字段3 字段3类型 [COMMENT 字段3注释],
      ...
      字段n 字段n类型 [COMMENT 字段n注释]
    ) [COMMENT 表注释];
    # [...]为可选参数,最后一个自动后面不需要添加逗号
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    数据类型

    MySQL中的数据类型很多,主要分为三类:数值类型、字符串类型、日期时间类型。

    • 数值类型
      在这里插入图片描述

    • 字符串类型
      在这里插入图片描述

    • 日期时间类型
      在这里插入图片描述

    1.1.2.3 修改
    • 添加字段
    ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
    
    • 1
    • 修改数据类型
    ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
    
    • 1
    • 修改字段名和字段类型
    ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
    
    • 1
    • 修改表名
    ALTER TABLE 表名 RENAME TO 新表名;
    
    • 1
    1.1.2.4 删除
    • 删除表
    DROP TABLE [IF EXISTS] 表名;
    
    • 1
    • 删除指定表,并重新创建
    TRUNCATE TABLE 表名;
    
    • 1
    1.1.3 操作案例
    # 创建一个test数据库
    mysql> create database test;
    Query OK, 1 row affected (0.01 sec)
    
    # 进入该数据库
    mysql> use test;
    Database changed
    
    # 创建一张表,名称为aaa
    mysql> create table aaa(
      id int comment 'id', 
      name varchar(50) comment 'name', 
      age int comment 'age', 
      gender varchar(1) comment 'gender'
    );
    Query OK, 0 rows affected (0.08 sec)
    
    # 查看表
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | aaa            |
    +----------------+
    1 row in set (0.00 sec)
    
    # 查看表字段
    mysql> desc aaa;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int         | YES  |     | NULL    |       |
    | name   | varchar(50) | YES  |     | NULL    |       |
    | age    | int         | YES  |     | NULL    |       |
    | gender | varchar(1)  | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)
    
    # 查看建表语句
    mysql> show create table aaa;
    +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                                                                                                                                                                |
    +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | aaa   | CREATE TABLE `aaa` (
      `id` int DEFAULT NULL COMMENT 'id',
      `name` varchar(50) DEFAULT NULL COMMENT 'name',
      `age` int DEFAULT NULL COMMENT 'age',
      `gender` varchar(1) DEFAULT NULL COMMENT 'gender'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
    +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    # 在表aaa中添加一个名称为number的新字段
    mysql> alter table aaa add number int comment 'number';
    Query OK, 0 rows affected (0.02 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc aaa;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int         | YES  |     | NULL    |       |
    | name   | varchar(50) | YES  |     | NULL    |       |
    | age    | int         | YES  |     | NULL    |       |
    | gender | varchar(1)  | YES  |     | NULL    |       |
    | number | int         | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    5 rows in set (0.00 sec)
    
    # 修改name字段的数据类型
    mysql> alter table aaa modify name varchar(30);
    Query OK, 0 rows affected (0.07 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc aaa;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int         | YES  |     | NULL    |       |
    | name   | varchar(30) | YES  |     | NULL    |       |
    | age    | int         | YES  |     | NULL    |       |
    | gender | varchar(1)  | YES  |     | NULL    |       |
    | number | int         | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    5 rows in set (0.00 sec)
    
    # 修改number字段的名称和类型
    mysql> alter table aaa change number numb varchar(10) comment 'change';
    Query OK, 0 rows affected (0.05 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc aaa;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int         | YES  |     | NULL    |       |
    | name   | varchar(30) | YES  |     | NULL    |       |
    | age    | int         | YES  |     | NULL    |       |
    | gender | varchar(1)  | YES  |     | NULL    |       |
    | numb   | varchar(10) | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    5 rows in set (0.00 sec)
    
    # 修改表名
    mysql> alter table aaa rename to bbb;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | bbb            |
    +----------------+
    1 row in set (0.01 sec)
    
    # 删除表
    mysql> drop table if exists bbb;
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> show tables;
    Empty set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121

    1.2 DML 数据操作语言

    DML:数据操作语言,对数据库表中的数据进行增删改;

    1.2.1 数据操作
    1.2.1.1 添加 INSERT
    • 给指定字段添加数据
    INSERT INTO 表名(字段1名,字段名2...) VALUES(1,值2...);
    # 指定字段的顺序与值的顺序一一对应,字段1-值1,字段2-值2
    # 字符串和日期时间类型数据需要带引号
    # 需要注意插入数据的大小需要符合字段类型要求
    
    • 1
    • 2
    • 3
    • 4
    • 给全部字段添加数据
    INSERT INTO 表名 VALUES(1,值2...);
    
    • 1
    • 批量添加数据
    # 批量添加指定字段数据
    INSERT INTO 表名(字段1名,字段名2...) VALUES(1,值2...),(1,值2...),;
    # 批量添加全部字段数据
    INSERT INTO 表名 VALUES(1,值2...),(1,值2...);
    
    • 1
    • 2
    • 3
    • 4
    1.2.1.2 修改 UPDATE
    UPDATE 表名 SET 字段名1=1,字段名2=2,... [WHERE 条件];
    # 条件为非必需项,条件不存在则代表整张表
    
    • 1
    • 2
    1.2.1.3 删除 DELETE
    DELETE FROM 表名 [WHERE 条件];
    # 条件为非必需项,条件不存在则代表整张表
    # DELETE不可以删除表中的某个字段,可以使用UPDATE替换数据为NULL
    
    • 1
    • 2
    • 3
    1.2.2 操作案例
    # 创建表
    mysql> create table aaa(
    	id int comment 'id',
    	number varchar(10) comment 'number',
    	name varchar(10) comment 'name',
    	gender char(1) comment 'gender',
    	age tinyint unsigned comment 'age',
    	idcard char(18) comment 'idcard',
    	date date comment 'date'
    	);
    Query OK, 0 rows affected (0.06 sec)
    
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | aaa            |
    +----------------+
    1 row in set (0.00 sec)
    
    # 添加数据
    mysql> insert into aaa values (1,1,'a1','m',18,'111111111111111111','2022-09-15');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from aaa;
    +------+--------+------+--------+------+--------------------+------------+
    | id   | number | name | gender | age  | idcard             | date       |
    +------+--------+------+--------+------+--------------------+------------+
    |    1 | 1      | a1   | m      |   18 | 111111111111111111 | 2022-09-15 |
    +------+--------+------+--------+------+--------------------+------------+
    1 row in set (0.00 sec)
    
    # 某一行的单个字段修改
    mysql> update aaa set name = 'b1' where id = 2;
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from aaa;
    +------+--------+------+--------+------+--------------------+------------+
    | id   | number | name | gender | age  | idcard             | date       |
    +------+--------+------+--------+------+--------------------+------------+
    |    1 | 1      | a1   | m      |   18 | 111111111111111111 | 2022-09-15 |
    |    2 | 2      | b1   | w      |   28 | 111111111111111112 | 2022-09-15 |
    +------+--------+------+--------+------+--------------------+------------+
    2 rows in set (0.00 sec)
    
    # 某一行的多个字段修改
    mysql> update aaa set name = 'a2',gender = 'w' where id = 1;
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from aaa;
    +------+--------+------+--------+------+--------------------+------------+
    | id   | number | name | gender | age  | idcard             | date       |
    +------+--------+------+--------+------+--------------------+------------+
    |    1 | 1      | a2   | w      |   18 | 111111111111111111 | 2022-09-15 |
    |    2 | 2      | b1   | w      |   28 | 111111111111111112 | 2022-09-15 |
    +------+--------+------+--------+------+--------------------+------------+
    2 rows in set (0.00 sec)
    
    # 所有行的某个字段修改
    mysql> update aaa set date = '2022-01-01';
    Query OK, 2 rows affected (0.01 sec)
    Rows matched: 2  Changed: 2  Warnings: 0
    
    mysql> select * from aaa;
    +------+--------+------+--------+------+--------------------+------------+
    | id   | number | name | gender | age  | idcard             | date       |
    +------+--------+------+--------+------+--------------------+------------+
    |    1 | 1      | a2   | w      |   18 | 111111111111111111 | 2022-01-01 |
    |    2 | 2      | b1   | w      |   28 | 111111111111111112 | 2022-01-01 |
    +------+--------+------+--------+------+--------------------+------------+
    2 rows in set (0.00 sec)
    
    # 所有行的多个字段修改
    mysql> update aaa set gender = 'm',date = '2022-01-02';
    Query OK, 2 rows affected (0.01 sec)
    Rows matched: 2  Changed: 2  Warnings: 0
    
    mysql> select * from aaa;
    +------+--------+------+--------+------+--------------------+------------+
    | id   | number | name | gender | age  | idcard             | date       |
    +------+--------+------+--------+------+--------------------+------------+
    |    1 | 1      | a2   | m      |   18 | 111111111111111111 | 2022-01-02 |
    |    2 | 2      | b1   | m      |   28 | 111111111111111112 | 2022-01-02 |
    +------+--------+------+--------+------+--------------------+------------+
    2 rows in set (0.00 sec)
    
    # 删除数据
    mysql> delete from aaa where name = 'a2';
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from aaa;
    +------+--------+------+--------+------+--------------------+------------+
    | id   | number | name | gender | age  | idcard             | date       |
    +------+--------+------+--------+------+--------------------+------------+
    |    2 | 2      | b1   | m      |   28 | 111111111111111112 | 2022-01-02 |
    +------+--------+------+--------+------+--------------------+------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99

    1.3 DQL 数据查询语言

    DQL:数据查询语言,查询数据库中表的数据;

    1.3.1 查询操作
    1.3.1.1 基础查询
    • 查询多个字段
    SELECT 字段1,字段2,... FROM 表名;
    
    • 1
    • 设置别名
    SELECT 字段1 [AS 别名1],字段2 [AS 别名2],... FROM 表名;
    
    • 1
    • 去重
    SELECT DISTINCT 字段列表 FROM 表名;
    
    • 1
    1.3.1.2 条件查询
    SELECT 字段列表 FROM 表名 [WHERE 条件列表];
    # 无条件代表查询全表
    
    • 1
    • 2
    1.3.1.2.1 比较运算符
    • >:大于
    • >=:大于等于
    • <:小于
    • <=:小于等于
    • =:等于
    • <>或!=:不等于
    • BETWEEN ... AND ...:某个范围之间(包含最大值与最小值)
    • IN (...):在in之后的列表中的值,多选一
    • LIKE 占位符:模糊匹配(_代表多个字符,%代表任意字符)
    • IS NULL:是空值
    3.1.1.2.2 逻辑运算符
    • AND或&&:且
    • OR或||:或
    • NOT或!:非
    1.3.1.3 聚合查询

    将一列数据作为一个整体,进行纵向计算

    • count:统计
    • max:最大值
    • min:最小值
    • avg:平均值
    • sum:求和
    SELECT 聚合函数(字段列表) FROM 表名;
    # NULL值不参与聚合函数的运算
    
    • 1
    • 2
    1.3.1.4 分组查询
    SELECT 字段列表 FROM 表名 [WHERE 条件列表] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
    # WHERE与HAVING的区别:
    # 执行时机不同:WHERE是分组之前进行过滤,不满足WHERE条件不参与分组;HAVING是分组之后对结果进行过滤
    # 判断条件不同:WHERE不能对聚合函数进行判断,HAVING可以
    # 分组之后,查询字段一般为聚合函数和分组的字段,查询其他字段无任何意义
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1.3.1.5 排序查询
    • ASC:升序,默认值,可以省略
    • DESC:降序
    SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
    # 如果是多个字段排序,当第一个字段相同时,才会根据第二个字段进行排序
    
    • 1
    • 2
    1.3.1.6 分页查询
    SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
    # 查询第一页数据,起始索引可以省略
    # 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
    # 分页查询每个数据库的关键词可能都不同
    
    • 1
    • 2
    • 3
    • 4
    1.3.2 编写顺序与执行顺序的关系
    编号编写顺序执行顺序
    1SELECTFROM
    2FROMWHERE
    3WHEREGROUP BY
    4GROUP BYHAVING
    5HAVINGSELECT
    6ORDER BYORDER BY
    7LIMITLIMIT
    1.3.3 操作案例
    1.3.3.1 创建查询环境
    mysql> insert into aaa values 
    	(1,1,'a1','m',18,'123456789012345678','2022-09-15'),
    	(2,2,'a2','m',18,'123456789012345678','2021-09-11'),
    	(3,3,'a3','m',18,'123456789012345678','2022-09-15'),
    	(4,4,'a4','w',18,'123456783212345678','2012-09-22'),
    	(5,5,'a5','m',18,'123456782312345678','2021-09-13'),
    	(6,6,'a6','w',18,'123456789012345678','2020-09-16'),
    	(7,7,'a7','m',18,'12345674312345678','2021-09-15'),
    	(8,8,'a8','m',18,'12345678901234567X','2022-09-15'),
    	(9,9,'a9','w',18,'123452789033345678','2022-09-15'),
    	(10,10,'b1','m',18,'123456789332345678','2022-03-15'),
    	(11,11,'b2','w',18,'12345678901445678','2012-02-15'),
    	(12,12,'b3','m',18,'123455789012345678','2022-09-15'),
    	(13,13,'b4','w',18,'null','2022-09-15'),
    	(14,14,'b5','m',18,'12345678901234567X','2012-09-15');
    Query OK, 14 rows affected (0.01 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1.3.3.2 基础查询
    # 查询某个字段
    mysql> select id from aaa;
    +------+
    | id   |
    +------+
    |    1 |
    |    2 |
    |    3 |
    |    4 |
    |    5 |
    |    6 |
    |    7 |
    |    8 |
    |    9 |
    |   10 |
    |   11 |
    |   12 |
    |   13 |
    |   14 |
    +------+
    14 rows in set (0.00 sec)
    
    # 查询多个字段
    mysql> select id,name from aaa;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | a1   |
    |    2 | a2   |
    |    3 | a3   |
    |    4 | a4   |
    |    5 | a5   |
    |    6 | a6   |
    |    7 | a7   |
    |    8 | a8   |
    |    9 | a9   |
    |   10 | b1   |
    |   11 | b2   |
    |   12 | b3   |
    |   13 | b4   |
    |   14 | b5   |
    +------+------+
    14 rows in set (0.00 sec)
    
    # 查询所有字段
    mysql> select * from aaa;
    +------+--------+------+--------+------+--------------------+------------+
    | id   | number | name | gender | age  | idcard             | date       |
    +------+--------+------+--------+------+--------------------+------------+
    |    1 | 1      | a1   | m      |   18 | 123456789012345678 | 2022-09-15 |
    |    2 | 2      | a2   | m      |   18 | 123456789012345678 | 2021-09-11 |
    |    3 | 3      | a3   | m      |   18 | 123456789012345678 | 2022-09-15 |
    |    4 | 4      | a4   | w      |   18 | 123456783212345678 | 2012-09-22 |
    |    5 | 5      | a5   | m      |   18 | 123456782312345678 | 2021-09-13 |
    |    6 | 6      | a6   | w      |   18 | 123456789012345678 | 2020-09-16 |
    |    7 | 7      | a7   | m      |   18 | 12345674312345678  | 2021-09-15 |
    |    8 | 8      | a8   | m      |   18 | 12345678901234567X | 2022-09-15 |
    |    9 | 9      | a9   | w      |   18 | 123452789033345678 | 2022-09-15 |
    |   10 | 10     | b1   | m      |   18 | 123456789332345678 | 2022-03-15 |
    |   11 | 11     | b2   | w      |   18 | 12345678901445678  | 2012-02-15 |
    |   12 | 12     | b3   | m      |   18 | 123455789012345678 | 2022-09-15 |
    |   13 | 13     | b4   | w      |   18 | null               | 2022-09-15 |
    |   14 | 14     | b5   | m      |   18 | 12345678901234567X | 2012-09-15 |
    +------+--------+------+--------+------+--------------------+------------+
    14 rows in set (0.00 sec)
    
    # 单个字段设置别名,as可以省略
    mysql> select id as id_alias from aaa;
    +----------+
    | id_alias |
    +----------+
    |        1 |
    |        2 |
    |        3 |
    |        4 |
    |        5 |
    |        6 |
    |        7 |
    |        8 |
    |        9 |
    |       10 |
    |       11 |
    |       12 |
    |       13 |
    |       14 |
    +----------+
    14 rows in set (0.01 sec)
    
    # 多个字段设置别名,name设置别名省略了as
    mysql> select id as id_alias,name name_alias from aaa;
    +----------+------------+
    | id_alias | name_alias |
    +----------+------------+
    |        1 | a1         |
    |        2 | a2         |
    |        3 | a3         |
    |        4 | a4         |
    |        5 | a5         |
    |        6 | a6         |
    |        7 | a7         |
    |        8 | a8         |
    |        9 | a9         |
    |       10 | b1         |
    |       11 | b2         |
    |       12 | b3         |
    |       13 | b4         |
    |       14 | b5         |
    +----------+------------+
    14 rows in set (0.00 sec)
    
    # 去重复
    mysql> select distinct * from aaa;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    1.3.3.3 聚合函数
    # 以gender列统计表内数量
    mysql> select count(*) from aaa group by gender;
    +----------+
    | count(*) |
    +----------+
    |        9 |
    |        5 |
    +----------+
    2 rows in set (0.00 sec)
    
    # 若只查询数量,则无法查看到具体某个数量代表什么意思,就需要添加查询的列
    mysql> select gender,count(*) from aaa group by gender;
    +--------+----------+
    | gender | count(*) |
    +--------+----------+
    | m      |        9 |
    | w      |        5 |
    +--------+----------+
    2 rows in set (0.00 sec)
    
    # 添加查询其他的列无任何意义,会产生ERROR
    mysql> select name,gender,count(*) from aaa group by gender;
    ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.aaa.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    
    # 以gender分组,分别统计其平均age
    mysql> select gender,avg(age) from aaa group by gender;
    +--------+----------+
    | gender | avg(age) |
    +--------+----------+
    | m      |  18.0000 |
    | w      |  18.0000 |
    +--------+----------+
    2 rows in set (0.00 sec)
    
    # 查询id大于5,并根据gender分组,获取gender数量小于等于4的gender
    mysql> select gender,count(*) gender_num from aaa where id > 5 group by gender having gender_num <= 4;
    +--------+------------+
    | gender | gender_num |
    +--------+------------+
    | w      |          4 |
    +--------+------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    1.3.3.4 排序查询
    # 倒序查询
    mysql> select number from aaa order by number desc;
    +--------+
    | number |
    +--------+
    | 9      |
    | 8      |
    | 7      |
    | 6      |
    | 5      |
    | 4      |
    | 3      |
    | 2      |
    | 14     |
    | 13     |
    | 12     |
    | 11     |
    | 10     |
    | 1      |
    +--------+
    14 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    1.3.3.5 分页查询
    # 查询第一页
    mysql> select id from aaa limit 10;
    +------+
    | id   |
    +------+
    |    1 |
    |    2 |
    |    3 |
    |    4 |
    |    5 |
    |    6 |
    |    7 |
    |    8 |
    |    9 |
    |   10 |
    +------+
    10 rows in set (0.00 sec)
    
    # 查询第二页,起始索引=(查询页码-1)*每页显示记录数
    # 起始索引:(2-1)*10=10,每页显示数:10
    mysql> select id from aaa limit 10,10;
    +------+
    | id   |
    +------+
    |   11 |
    |   12 |
    |   13 |
    |   14 |
    +------+
    4 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    1.4 DCL 数据控制语言

    DCL:数据控制语言,创建数据库用户、控制访问权限。

    1.4.1 控制操作
    1.4.1.1 管理用户
    • 查询用户
    USE mysql;
    SELECT * FROM user;
    
    • 1
    • 2
    • 创建用户
    CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
    # 主机名可以使用%代替,代表所有
    
    • 1
    • 2
    • 修改用户密码
    ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
    
    • 1
    • 删除用户
    DROP USER '用户名'@'主机名';
    
    • 1
    1.4.1.2 权限控制
    • 查询权限
    SHOW GRANTS FOR '用户名'@'主机名';
    
    • 1
    • 授予权限
    GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
    # 数据库名.表名 支持使用*通配符,代表所有
    # 多个权限使用逗号间隔
    
    • 1
    • 2
    • 3
    • 撤销权限
    REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
    
    • 1
    权限类型
    • ALL/ALL PRIVILEGES:所有权限;
    • SELECT:查询数据
    • INSERT:插入数据;
    • UPDATE:修改数据
    • DELETE:删除数据;
    • ALTER:修改表;
    • DROP:删除数据库/表/视图;
    • CREATE:创建数据库/表。
    1.4.2 操作案例
    # 切换数据库
    mysql> use mysql;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    # 查询当前用户和登录主机信息
    mysql> select user,host from user;
    +------------------+-----------+
    | user             | host      |
    +------------------+-----------+
    | root             | %         |
    | mysql.infoschema | localhost |
    | mysql.session    | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    +------------------+-----------+
    5 rows in set (0.00 sec)
    
    # 添加一个新账户,密码为123456
    mysql> create user 'test'@'localhost' identified by '123456';
    Query OK, 0 rows affected (0.02 sec)
    
    # 查看当前账户权限均为N(无权限,只能登录)
    mysql> select * from user where user = 'test'\G;
    *************************** 1. row ***************************
                        Host: localhost
                        User: test
                 Select_priv: N
                 Insert_priv: N
                 Update_priv: N
                 Delete_priv: N
                 Create_priv: N
                   Drop_priv: N
                 Reload_priv: N
               Shutdown_priv: N
                Process_priv: N
                   File_priv: N
                  Grant_priv: N
             References_priv: N
                  Index_priv: N
                  Alter_priv: N
                Show_db_priv: N
                  Super_priv: N
       Create_tmp_table_priv: N
            Lock_tables_priv: N
                Execute_priv: N
             Repl_slave_priv: N
            Repl_client_priv: N
            Create_view_priv: N
              Show_view_priv: N
         Create_routine_priv: N
          Alter_routine_priv: N
            Create_user_priv: N
                  Event_priv: N
                Trigger_priv: N
      Create_tablespace_priv: N
                    ssl_type: 
                  ssl_cipher: 0x
                 x509_issuer: 0x
                x509_subject: 0x
               max_questions: 0
                 max_updates: 0
             max_connections: 0
        max_user_connections: 0
                      plugin: caching_sha2_password
       authentication_string: $A$005$@>
                                       ]e@](nWSAXZLmMlse0qcw8nocN0xwJPLXw2YKvELqgcoISHqFTI1
            password_expired: N
       password_last_changed: 2022-09-16 07:39:12
           password_lifetime: NULL
              account_locked: N
            Create_role_priv: N
              Drop_role_priv: N
      Password_reuse_history: NULL
         Password_reuse_time: NULL
    Password_require_current: NULL
             User_attributes: NULL
    1 row in set (0.00 sec)
    
    ERROR: 
    No query specified
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    开启第二窗口,使用新账户登录MySQL数据库

    sh-4.4# mysql -utest -p123456
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 15
    Server version: 8.0.30 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2022, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | performance_schema |
    +--------------------+
    2 rows in set (0.00 sec)
    # 当前账户只能查看到数据库信息与计划,并不能查看自建数据库test
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    # 修改test账户密码为1234
    mysql> alter user 'test'@'localhost' identified with mysql_native_password by '1234';
    Query OK, 0 rows affected (0.01 sec)
    
    # 使用第二窗口进行登录测试
    sh-4.4# mysql -u test -p1234  
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 18
    Server version: 8.0.30 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2022, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> 
    
    # 查询test用户权限
    mysql> show grants for 'test'@'localhost';
    +------------------------------------------+
    | Grants for test@localhost                |
    +------------------------------------------+
    | GRANT USAGE ON *.* TO `test`@`localhost` |
    +------------------------------------------+
    1 row in set (0.00 sec)
    
    # 添加test用户权限
    mysql> grant all on test.* to 'test'@'localhost';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> show grants for 'test'@'localhost';
    +--------------------------------------------------------+
    | Grants for test@localhost                              |
    +--------------------------------------------------------+
    | GRANT USAGE ON *.* TO `test`@`localhost`               |
    | GRANT ALL PRIVILEGES ON `test`.* TO `test`@`localhost` |
    +--------------------------------------------------------+
    2 rows in set (0.00 sec)
    
    # 使用第二窗口查看
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | performance_schema |
    | test               |
    +--------------------+
    3 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    2、函数

    函数的使用方法:

    SELECT 函数(参数);
    
    • 1

    2.1 字符串函数

    函数功能
    CONCAT(S1,S2,...Sn)字符串拼接,将S1,S2...Sn拼接成一个字符串
    LOWER(str)将字符串转全部为小写
    UPPER(str)将字符串全部转为大写
    LPAD(str,n,pad)左填充,用字符串pad填充str左边达到n个单位长度
    RPAD(str,n,pad)右填充,用字符串pad填充str右边达到n个单位长度
    TRIM(str)去掉字符串头部和尾部的空格
    SUBSTRING(str, start,len)返回从字符串strstart位置起始的len个长度字符串,索引从1开始
    # 拼接字符串
    mysql> select concat('Hello','World','!');
    +-----------------------------+
    | concat('Hello','World','!') |
    +-----------------------------+
    | HelloWorld!                 |
    +-----------------------------+
    1 row in set (0.00 sec)
    
    # 转为小写
    mysql> select lower('HELLO WORLD');
    +----------------------+
    | lower('HELLO WORLD') |
    +----------------------+
    | hello world          |
    +----------------------+
    1 row in set (0.00 sec)
    
    # 转为大写
    mysql> select upper('hello world');
    +----------------------+
    | upper('hello world') |
    +----------------------+
    | HELLO WORLD          |
    +----------------------+
    1 row in set (0.00 sec)
    
    # 左填充
    mysql> select lpad('Hello',7,'$');
    +---------------------+
    | lpad('Hello',7,'$') |
    +---------------------+
    | $$Hello             |
    +---------------------+
    1 row in set (0.00 sec)
    
    # 右填充
    mysql> select rpad('Hello',7,'$');
    +---------------------+
    | rpad('Hello',7,'$') |
    +---------------------+
    | Hello$$             |
    +---------------------+
    1 row in set (0.01 sec)
    
    # 去除前后端空格,中间不受影响
    mysql> select trim('   Hello  Wor ld      ');
    +--------------------------------+
    | trim('   Hello  Wor ld      ') |
    +--------------------------------+
    | Hello  Wor ld                  |
    +--------------------------------+
    1 row in set (0.00 sec)
    
    # 返回指定位置的固定长度字符串,索引从1开始
    mysql> select substring('Hello World',7,3);
    +------------------------------+
    | substring('Hello World',7,3) |
    +------------------------------+
    | Wor                          |
    +------------------------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    2.2 数值函数

    函数功能
    CEIL(x)向上取整
    FLOOR(x)向下取整
    MOD(x,y)返回x/y的模
    RAND()返回0-1内的随机数
    ROUND(x,y)求参数x的四舍五入值,并保留y位小数
    # 向上取整
    mysql> select ceil(3.2);
    +-----------+
    | ceil(3.2) |
    +-----------+
    |         4 |
    +-----------+
    1 row in set (0.00 sec)
    
    # 向下取整
    mysql> select floor(3.2);
    +------------+
    | floor(3.2) |
    +------------+
    |          3 |
    +------------+
    1 row in set (0.00 sec)
    
    # 取模
    mysql> select mod(3,2);
    +----------+
    | mod(3,2) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.00 sec)
    
    # 取随机数
    mysql> select rand();
    +--------------------+
    | rand()             |
    +--------------------+
    | 0.1530892738635552 |
    +--------------------+
    1 row in set (0.00 sec)
    
    # 四舍五入并保留指定位数
    mysql> select round(rand(),5);
    +-----------------+
    | round(rand(),5) |
    +-----------------+
    |         0.34433 |
    +-----------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    2.3 日期函数

    函数功能
    CURDATE()返回当前日期
    CURTIME()返回当前时间
    NOW()返回当前日期和时间
    YEAR(date)获取指定date的年
    MONTH(date)获取指定date的月
    DAY(date)获取指定date的日
    DATE_ADD(date,INTERVAL express type)返回上一个日期/时间值加上一个时间间隔expr后的时间值
    DATEDIFF(date1,date2)返回date1date2之间的天数
    # 返回当前日期
    mysql> select curdate();
    +------------+
    | curdate()  |
    +------------+
    | 2022-09-20 |
    +------------+
    1 row in set (0.00 sec)
    
    # 获取指定date的年
    mysql> select year(curdate());
    +-----------------+
    | year(curdate()) |
    +-----------------+
    |            2022 |
    +-----------------+
    1 row in set (0.00 sec)
    
    # 返回上一个日期/时间值加上一个时间间隔expr后的时间值
    mysql> select date_add(curdate(),interval 10 year);
    +--------------------------------------+
    | date_add(curdate(),interval 10 year) |
    +--------------------------------------+
    | 2032-09-20                           |
    +--------------------------------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2.4 流程函数

    函数功能
    IF(value,t,f)如果valuetrue,返回t,否则返回f
    IFNULL(value1,value2)如果value1不为空,返回value1,否则返回value2(只要不为null,就返回value1,包含''
    CASE WHEN [val1] THEN [res1] ... ELSE [default] END如果val1为true,返回res1,… 否则返回default
    CASE [expr] WHEN [val1] THEN [res1] ... ELSE [default] END如果expr的值等于val1,返回res1,… 否则返回default
    # IF函数
    mysql> select if(true,'ok','no');
    +--------------------+
    | if(true,'ok','no') |
    +--------------------+
    | ok                 |
    +--------------------+
    1 row in set (0.00 sec)
    
    mysql> select if(false,'ok','no');
    +---------------------+
    | if(false,'ok','no') |
    +---------------------+
    | no                  |
    +---------------------+
    1 row in set (0.00 sec)
    
    # IFNULL函数
    mysql> select ifnull('','bbb');
    +------------------+
    | ifnull('','bbb') |
    +------------------+
    |                  |
    +------------------+
    1 row in set (0.00 sec)
    
    mysql> select ifnull(null,'bbb');
    +--------------------+
    | ifnull(null,'bbb') |
    +--------------------+
    | bbb                |
    +--------------------+
    1 row in set (0.00 sec)
    
    # CASE函数
    mysql> select name,(case gender when 'w' then 'woman' else 'man' end) as xingbie from aaa;
    +------+---------+
    | name | xingbie |
    +------+---------+
    | a1   | man     |
    | a2   | man     |
    | a3   | man     |
    | a4   | woman   |
    | a5   | man     |
    | a6   | woman   |
    | a7   | man     |
    | a8   | man     |
    | a9   | woman   |
    | b1   | man     |
    | b2   | woman   |
    | b3   | man     |
    | b4   | woman   |
    | b5   | man     |
    +------+---------+
    14 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    3、约束

    3.1 概述

    概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

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

    约束描述关键字
    非空约束限制该字段的数据不能为NULLNOT NULL
    唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE
    主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
    默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
    检查约束(8.0.16版本之后)保证字段值满足某个条件CHECK
    外键约束用来让两张表的数据之间建立连接,保证数据一致性与完整性FOREIGN KEY

    约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束

    3.2 演示

    # 按照要求创建表
    mysql> create table user(
    	id int auto_increment primary key comment '标识',
    	name varchar(10) not null unique comment '姓名',
    	age int check(age>0 && age<=120) comment '年龄',
    	status char(1) default '1' comment '状态',
    	gender char(1) comment '性别'
    	);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.3 外键约束

    外键用来让两张表的数据之间建立连接,从而保证数据的一致性与完整性。

    3.3.1 父表与子表

    父表:关联表的目标字段所在的表;

    子表:关联表的起始字段所在的表。
    在这里插入图片描述

    3.3.2 添加外键
    # 创建
    CREATE TABLE 表名(
        字段名 数据类型;
        ...
        [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
    );
    # 更新
    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    3.3.3. 删除外键
    ALTER TABLE 表名 DROP FOREIGN KEY (外键名称);
    
    • 1

    3.3.4 删除/更新行为

    关键字功能
    NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新(与RESTRICT一致)
    RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新(与NO ACTION一致)
    CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则也删除/更新外键在子表中的记录
    SET NULL当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为NULL(要求外键允许NULL
    SET DEFAULT当在父表中删除/更新对应记录时,子表将外键列设置成一个默认的值

    语法结构:

    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表名 (主表列名) ON UPDATE CASCADE ON DELETE CASCADE
    
    • 1

    4、多表查询

    4.1 多表关系

    项目开发中,在进行数据库表名结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

    • 一对多(多对一 )
    • 多对多
    • 一对一
    4.1.1 一对多关系

    案例:一个部门可以对应多个员工,一个员工对应一个部门

    实现方式:在多对一方建立外键,指向一的一方的主键
    在这里插入图片描述

    4.1.2 多对多关系

    案例:一个学生可以选择多门课程,一门课程也可以被多个学生选择

    实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
    在这里插入图片描述

    4.1.3 一对一关系

    案例:一对一关系多用于单表拆分,将一张表的基础字段放在一张表中,其他详细字段放在另一张表中,以提升操作效率

    实现方式:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一UNIQUE
    在这里插入图片描述

    4.2 多表查询

    多表查询:从多张表中查询数据。

    笛卡尔积:笛卡尔积指在数学中,两个集合A和B的所有组合情况,在多表查询中,需要消除无效的笛卡尔积。
    在这里插入图片描述

    多表查询分类:

    • 连接查询
      • 内连接:查询A、B交集部分的数据;
      • 外连接
        • 左外连接:查询左表所有数据+交集数据;
        • 右外连接:查询右表所有数据+交集数据;
    • 子查询
    4.2.1 内连接

    内连接分为隐式内连接与显式内连接两种。

    4.2.1.1 隐式内连接
    SELECT 字段列表 FROM1,2 WHERE 条件 ...; 
    
    • 1
    4.2.1.2 显式内连接
    SELECT 字段列表 FROM1 [INNER] JOIN2 ON 连接条件 ...; 
    
    • 1
    4.2.1.3 操作案例
    # 创建环境
    mysql> create table user(
    	id int comment '标识',
    	name varchar(10) comment '姓名',
    	age int comment '年龄',
    	status char(1) comment '状态',
    	user_id int comment '部门id',
    	gender char(1) comment '性别'
    	);
    
    mysql> create table dept(
    	id int comment '标识',
    	name varchar(20) comment '部门'
    	);
    
    mysql> insert into user values 
    	(1,'aaa',81,'i',4,'m'),
    	(2,'bbb',27,'i',1,'w'),
    	(3,'ccc',33,'i',2,'m'),
    	(4,'ddd',21,'i',2,'w'),
    	(5,'eee',48,'i',3,'w'),
    	(6,'fff',69,'i',3,'m'),
    	(7,'ggg',22,'i',2,'m')
    	;
    
    mysql> insert into dept values
    	(1,'yanfa'),
    	(2,'xiaoshou'),
    	(3,'shouqian'),
    	(4,'CEO')
    	;
    
    mysql> select * from user;
    +------+------+------+--------+---------+--------+
    | id   | name | age  | status | user_id | gender |
    +------+------+------+--------+---------+--------+
    |    1 | aaa  |   81 | i      |       4 | m      |
    |    2 | bbb  |   27 | i      |       1 | w      |
    |    3 | ccc  |   33 | i      |       2 | m      |
    |    4 | ddd  |   21 | i      |       2 | w      |
    |    5 | eee  |   48 | i      |       3 | w      |
    |    6 | fff  |   69 | i      |       3 | m      |
    |    7 | ggg  |   22 | i      |       2 | m      |
    +------+------+------+--------+---------+--------+
    7 rows in set (0.00 sec)
    
    mysql> select * from dept;
    +------+----------+
    | id   | name     |
    +------+----------+
    |    1 | yanfa    |
    |    2 | xiaoshou |
    |    3 | shouqian |
    |    4 | CEO      |
    +------+----------+
    4 rows in set (0.00 sec)
    
    # 
    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表名 (主表列名) ON UPDATE CASCADE ON DELETE CASCADE
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    4.2.2 外连接
    4.2.2.1 左外连接

    相当于查询表1的所有数据包含表1与表2的交集数据。

    SELECT 字段列表 FROM1 LEFT [OUTER] JOIN2 ON 条件 ...;
    
    • 1
    4.2.2.2 右外连接

    相当于查询表2的所有数据包含表1与表2的交集数据。

    SELECT 字段列表 FROM1 RIGHT [OUTER] JOIN2 ON 条件 ...;
    
    • 1
    4.2.3 自连接

    自连接查询可以是内连接查询,也可以是外连接查询。

    SELECT 字段列表 FROM1 别名1 JOIN1 别名2 ON 条件 ...;
    
    • 1
    4.2.4 联合查询

    对于union查询,就是把多次查询的结果合并形成一个新的查询结果集合。

    SELECT 字段列表 FROM1 ...
    UNION [ALL]
    SELECT 字段列表 FROM2 ...;
    # 联合查询的多张表的列数必需保持一致,字段类型也必须一致
    # union all直接合并数据;union去重后进行合并
    
    • 1
    • 2
    • 3
    • 4
    • 5
    4.2.5 嵌套查询/子查询

    SQL语句中嵌套SELECT语句,成为嵌套查询,又称为子查询。

    SELECT * FROM1 WHERE 条件1=(SELECT 字段名称 FROM2);
    
    • 1

    根据子查询结果不同可以分为:

    • 标量子查询:查询结果为单个值;
    • 列子查询:查询结果为列;
    • 行子查询
    • 表子查询

    根据子查询位置可以分为:

    • WHERE之后
    • FROM之后
    • SELECT之后
    4.2.5.1 标量子查询
    mysql> select id from dept where name = 'yanfa';
    +------+
    | id   |
    +------+
    |    1 |
    +------+
    1 row in set (0.00 sec)
    
    mysql> select * from user where user_id = 1;
    +------+------+------+--------+---------+--------+
    | id   | name | age  | status | user_id | gender |
    +------+------+------+--------+---------+--------+
    |    2 | bbb  |   27 | i      |       1 | w      |
    +------+------+------+--------+---------+--------+
    1 row in set (0.00 sec)
    
    # 合并查询
    mysql> select * from user where user_id = (select id from dept where name = 'yanfa');
    +------+------+------+--------+---------+--------+
    | id   | name | age  | status | user_id | gender |
    +------+------+------+--------+---------+--------+
    |    2 | bbb  |   27 | i      |       1 | w      |
    +------+------+------+--------+---------+--------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    4.2.5.2 列子查询
    常用操作符功能
    IN指定范围内多选一
    NOT IN不在指定范围内
    ANY子查询返回列表中满足一个即可
    SOMEANY相同
    ALL子查询返回列表中所有值全部满足
    # 使用IN
    mysql> select id from dept where name = 'yanfa' or name = 'xiaoshou';
    mysql> select * from user where user_id = 1 or user_id =  2;
    
    mysql> select * from user where user_id in (select id from dept where name = 'yanfa' or name = 'xiaoshou'); 
    +------+------+------+--------+---------+--------+
    | id   | name | age  | status | user_id | gender |
    +------+------+------+--------+---------+--------+
    |    2 | bbb  |   27 | i      |       1 | w      |
    |    3 | ccc  |   33 | i      |       2 | m      |
    |    4 | ddd  |   21 | i      |       2 | w      |
    |    7 | ggg  |   22 | i      |       2 | m      |
    +------+------+------+--------+---------+--------+
    4 rows in set (0.00 sec)
    
    # 使用ALL(比最大值大)
    mysql> select id from dept where name = 'xiaoshou';
    mysql> select age from user where user_id = (select id from dept where name = 'xiaoshou');
    +------+
    | age  |
    +------+
    |   33 |
    |   21 |
    |   22 |
    +------+
    3 rows in set (0.00 sec)
    
    mysql> select * from user where age > all(select age from user where user_id = (select id from dept where name = 'xiaoshou'));
    +------+------+------+--------+---------+--------+
    | id   | name | age  | status | user_id | gender |
    +------+------+------+--------+---------+--------+
    |    1 | aaa  |   81 | i      |       4 | m      |
    |    5 | eee  |   48 | i      |       3 | w      |
    |    6 | fff  |   69 | i      |       3 | m      |
    +------+------+------+--------+---------+--------+
    3 rows in set (0.00 sec)
    
    # 使用ANY(比最小值大)
    mysql> select * from user where age > any(select age from user where user_id = (select id from dept where name = 'xiaoshou'));
    +------+------+------+--------+---------+--------+
    | id   | name | age  | status | user_id | gender |
    +------+------+------+--------+---------+--------+
    |    1 | aaa  |   81 | i      |       4 | m      |
    |    2 | bbb  |   27 | i      |       1 | w      |
    |    3 | ccc  |   33 | i      |       2 | m      |
    |    5 | eee  |   48 | i      |       3 | w      |
    |    6 | fff  |   69 | i      |       3 | m      |
    |    7 | ggg  |   22 | i      |       2 | m      |
    +------+------+------+--------+---------+--------+
    6 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    4.2.5.3 行子查询

    常用操作符:=<>INNOT IN

    mysql> select user_id,gender from user where name='ccc';
    +---------+--------+
    | user_id | gender |
    +---------+--------+
    |       2 | m      |
    +---------+--------+
    1 row in set (0.00 sec)
    
    mysql> select * from user where (user_id,gender) = (2,'m');
    +------+------+------+--------+---------+--------+
    | id   | name | age  | status | user_id | gender |
    +------+------+------+--------+---------+--------+
    |    3 | ccc  |   33 | i      |       2 | m      |
    |    7 | ggg  |   22 | i      |       2 | m      |
    +------+------+------+--------+---------+--------+
    2 rows in set (0.00 sec)
    
    mysql> select * from user where (user_id,gender) = (select user_id,gender from user where name='ccc');
    +------+------+------+--------+---------+--------+
    | id   | name | age  | status | user_id | gender |
    +------+------+------+--------+---------+--------+
    |    3 | ccc  |   33 | i      |       2 | m      |
    |    7 | ggg  |   22 | i      |       2 | m      |
    +------+------+------+--------+---------+--------+
    2 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    4.2.5.4 表子查询

    常用操作符:IN

    mysql> select user_id,gender from user where name='ccc' or name = 'ddd';
    +---------+--------+
    | user_id | gender |
    +---------+--------+
    |       2 | m      |
    |       2 | w      |
    +---------+--------+
    2 rows in set (0.00 sec)
    
    mysql> select * from user where (user_id,gender) in (select user_id,gender from user where name='ccc' or name = 'ddd');
    +------+------+------+--------+---------+--------+
    | id   | name | age  | status | user_id | gender |
    +------+------+------+--------+---------+--------+
    |    3 | ccc  |   33 | i      |       2 | m      |
    |    4 | ddd  |   21 | i      |       2 | w      |
    |    7 | ggg  |   22 | i      |       2 | m      |
    +------+------+------+--------+---------+--------+
    3 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    5、事务

    事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

    5.1 事务操作

    默认MySQL得事务是自动提交的,当执行一条DML语句时,会立即隐式提交事务。

    # 查看事务提交方式
    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    |            1 |
    +--------------+
    1 row in set (0.00 sec)
    
    # 设置事务提交方式(0 - 手动提交,1 - 自动提交)
    mysql> set @@autocommit = 0;
    
    # 开启事务(两种方法)
    mysql> start transaction;
    mysql> begin;
    
    # 提交事务
    mysql> commit;
    
    # 回滚事务
    mysql> rollback;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    5.2 事务特性 - ACID

    • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败;
    • 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态;
    • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行;
    • 持久性(Durability):事务一旦提交或回滚,对数据库的改变是永久的。

    5.3 并发事务问题

    • 脏读:一个事物读到另一个事务还没有提交的数据;
    • 不可重复读:一个事务先后读取同一条记录,但是两次读取的数据不同;
    • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,出现了幻影。

    5.4 事务隔离级别

    在这里插入图片描述

  • 相关阅读:
    最后的防线:数据存储加密方案
    Flask 项目结构
    写个续集,填坑来了!关于“Thread.sleep(0)这一行‘看似无用’的代码”里面留下的坑。
    测试平台系列(91) 编写oss管理页面
    人工智能: 一种现代方法 第五章 对抗搜索
    Redis梳理
    RestClould ETL 社区版六月精选问答
    C++经典面试题:内存泄露是什么?如何排查?
    基于单片机的IC卡门禁系统设计
    新增订单如何防止重复提交
  • 原文地址:https://blog.csdn.net/qq_42197548/article/details/127382454