MiddleWare ❀ MySQL基础概述

2023-05-16

文章目录

  • MySQL基础
    • 1、SQL语法与分类
      • 1.1 DDL 数据定义语言
        • 1.1.1 库操作
          • 1.1.1.1 查询
          • 1.1.1.2 创建
          • 1.1.1.3 删除
          • 1.1.1.4 使用
        • 1.1.2 表+字段操作
          • 1.1.2.1 查询
          • 1.1.2.2 创建
            • 数据类型
          • 1.1.2.3 修改
          • 1.1.2.4 删除
        • 1.1.3 操作案例
      • 1.2 DML 数据操作语言
        • 1.2.1 数据操作
          • 1.2.1.1 添加 INSERT
          • 1.2.1.2 修改 UPDATE
          • 1.2.1.3 删除 DELETE
        • 1.2.2 操作案例
      • 1.3 DQL 数据查询语言
        • 1.3.1 查询操作
          • 1.3.1.1 基础查询
          • 1.3.1.2 条件查询
            • 1.3.1.2.1 比较运算符
            • 3.1.1.2.2 逻辑运算符
          • 1.3.1.3 聚合查询
          • 1.3.1.4 分组查询
          • 1.3.1.5 排序查询
          • 1.3.1.6 分页查询
        • 1.3.2 编写顺序与执行顺序的关系
        • 1.3.3 操作案例
          • 1.3.3.1 创建查询环境
          • 1.3.3.2 基础查询
          • 1.3.3.3 聚合函数
          • 1.3.3.4 排序查询
          • 1.3.3.5 分页查询
      • 1.4 DCL 数据控制语言
        • 1.4.1 控制操作
          • 1.4.1.1 管理用户
          • 1.4.1.2 权限控制
            • 权限类型
        • 1.4.2 操作案例
    • 2、函数
      • 2.1 字符串函数
      • 2.2 数值函数
      • 2.3 日期函数
      • 2.4 流程函数
    • 3、约束
      • 3.1 概述
      • 3.2 演示
      • 3.3 外键约束
        • 3.3.1 父表与子表
        • 3.3.2 添加外键
        • 3.3.3. 删除外键
      • 3.3.4 删除/更新行为
    • 4、多表查询
      • 4.1 多表关系
        • 4.1.1 一对多关系
        • 4.1.2 多对多关系
        • 4.1.3 一对一关系
      • 4.2 多表查询
        • 4.2.1 内连接
          • 4.2.1.1 隐式内连接
          • 4.2.1.2 显式内连接
          • 4.2.1.3 操作案例
        • 4.2.2 外连接
          • 4.2.2.1 左外连接
          • 4.2.2.2 右外连接
        • 4.2.3 自连接
        • 4.2.4 联合查询
        • 4.2.5 嵌套查询/子查询
          • 4.2.5.1 标量子查询
          • 4.2.5.2 列子查询
          • 4.2.5.3 行子查询
          • 4.2.5.4 表子查询
    • 5、事务
      • 5.1 事务操作
      • 5.2 事务特性 - ACID
      • 5.3 并发事务问题
      • 5.4 事务隔离级别

MySQL基础

MySQL语句不区分大小写

1、SQL语法与分类

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

1.1 DDL 数据定义语言

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

1.1.1 库操作

1.1.1.1 查询
# 查询所有数据库
SHOW DATABASES;
# 查询当前数据库
SELECT DATABASE();
1.1.1.2 创建
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
1.1.1.3 删除
DROP DATABASE [IF EXISTS] 数据库名;
1.1.1.4 使用
USE 数据库名;

1.1.2 表+字段操作

1.1.2.1 查询
  • 查询当前数据库所有表
SHOW TABLES;
  • 查询表结构
DESC 表名;
  • 查询指定表的创建语句
SHOW CREATE TABLE 表名;
1.1.2.2 创建
CREATE TABLE 表名(
	字段1 字段1类型 [COMMENT 字段1注释],
  字段2 字段2类型 [COMMENT 字段2注释],
  字段3 字段3类型 [COMMENT 字段3注释],
  ...
  字段n 字段n类型 [COMMENT 字段n注释]
) [COMMENT 表注释];
# [...]为可选参数,最后一个自动后面不需要添加逗号
数据类型

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

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

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

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

1.1.2.3 修改
  • 添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
  • 修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
  • 修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
  • 修改表名
ALTER TABLE 表名 RENAME TO 新表名;
1.1.2.4 删除
  • 删除表
DROP TABLE [IF EXISTS] 表名;
  • 删除指定表,并重新创建
TRUNCATE TABLE 表名;

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 DML 数据操作语言

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

1.2.1 数据操作

1.2.1.1 添加 INSERT
  • 给指定字段添加数据
INSERT INTO 表名(字段1名,字段名2...) VALUES(1,值2...);
# 指定字段的顺序与值的顺序一一对应,字段1-值1,字段2-值2
# 字符串和日期时间类型数据需要带引号
# 需要注意插入数据的大小需要符合字段类型要求
  • 给全部字段添加数据
INSERT INTO 表名 VALUES(1,值2...);
  • 批量添加数据
# 批量添加指定字段数据
INSERT INTO 表名(字段1名,字段名2...) VALUES(1,值2...),(1,值2...),;
# 批量添加全部字段数据
INSERT INTO 表名 VALUES(1,值2...),(1,值2...);
1.2.1.2 修改 UPDATE
UPDATE 表名 SET 字段名1=1,字段名2=2,... [WHERE 条件];
# 条件为非必需项,条件不存在则代表整张表
1.2.1.3 删除 DELETE
DELETE FROM 表名 [WHERE 条件];
# 条件为非必需项,条件不存在则代表整张表
# DELETE不可以删除表中的某个字段,可以使用UPDATE替换数据为NULL

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.3 DQL 数据查询语言

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

1.3.1 查询操作

1.3.1.1 基础查询
  • 查询多个字段
SELECT 字段1,字段2,... FROM 表名;
  • 设置别名
SELECT 字段1 [AS 别名1],字段2 [AS 别名2],... FROM 表名;
  • 去重
SELECT DISTINCT 字段列表 FROM 表名;
1.3.1.2 条件查询
SELECT 字段列表 FROM 表名 [WHERE 条件列表];
# 无条件代表查询全表
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.3.1.4 分组查询
SELECT 字段列表 FROM 表名 [WHERE 条件列表] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
# WHERE与HAVING的区别:
# 执行时机不同:WHERE是分组之前进行过滤,不满足WHERE条件不参与分组;HAVING是分组之后对结果进行过滤
# 判断条件不同:WHERE不能对聚合函数进行判断,HAVING可以
# 分组之后,查询字段一般为聚合函数和分组的字段,查询其他字段无任何意义
1.3.1.5 排序查询
  • ASC:升序,默认值,可以省略
  • DESC:降序
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
# 如果是多个字段排序,当第一个字段相同时,才会根据第二个字段进行排序
1.3.1.6 分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
# 查询第一页数据,起始索引可以省略
# 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
# 分页查询每个数据库的关键词可能都不同

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.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.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.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.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.4 DCL 数据控制语言

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

1.4.1 控制操作

1.4.1.1 管理用户
  • 查询用户
USE mysql;
SELECT * FROM user;
  • 创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
# 主机名可以使用%代替,代表所有
  • 修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
  • 删除用户
DROP USER '用户名'@'主机名';
1.4.1.2 权限控制
  • 查询权限
SHOW GRANTS FOR '用户名'@'主机名';
  • 授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
# 数据库名.表名 支持使用*通配符,代表所有
# 多个权限使用逗号间隔
  • 撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
权限类型
  • 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

开启第二窗口,使用新账户登录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
# 修改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)

2、函数

函数的使用方法:

SELECT 函数(参数);

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)

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)

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)

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)

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 '性别'
	);

3.3 外键约束

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

3.3.1 父表与子表

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

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

3.3.2 添加外键

# 创建
CREATE TABLE 表名(
    字段名 数据类型;
    ...
    [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
);
# 更新
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名);

3.3.3. 删除外键

ALTER TABLE 表名 DROP FOREIGN KEY (外键名称);

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

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 条件 ...; 
4.2.1.2 显式内连接
SELECT 字段列表 FROM1 [INNER] JOIN2 ON 连接条件 ...; 
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

4.2.2 外连接

4.2.2.1 左外连接

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

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

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

SELECT 字段列表 FROM1 RIGHT [OUTER] JOIN2 ON 条件 ...;

4.2.3 自连接

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

SELECT 字段列表 FROM1 别名1 JOIN1 别名2 ON 条件 ...;

4.2.4 联合查询

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

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

4.2.5 嵌套查询/子查询

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

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

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

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

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

  • 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)
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)
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)
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)

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;

5.2 事务特性 - ACID

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

5.3 并发事务问题

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

5.4 事务隔离级别

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MiddleWare ❀ MySQL基础概述 的相关文章

  • 【玩转Jetson TX2 NX】(十二)TX2 NX 板载摄像头+UNet算法实时显著目标分割(详细教程+错误解决)

    1 写在前面的话 阅读本博客前 xff0c 需要先熟悉如下博客内容 xff1a 玩转Jetson TX2 NX xff08 八 xff09 TX2 NX Visual Studio Code VSCode 安装 xff08 详细教程 xff
  • 成功解决PackageNotFoundError: Package not found at

    Python使用docx库时 span class token keyword from span docx span class token keyword import span Document document span class
  • vscode导入项目并启动

    不好意思图片不够清晰 我重新编辑一下文本信息 一 添加文件 打开vscode 如果之前没有添加过项目 可以点添加项目 也可以直接拖拽进去都是可以的 之前如果添加过 可以亦可以直接拖进去 但是只要项目之间互不干扰就可以 二 选择项目目录右键打
  • stm32f103c8移植Free RTOS遇到的bug和解决措施

    一 SVC系统调度错误 1 现象 xff1a 进入不了task 2 解决措施 xff1a xff08 1 xff09 将stm32f1xx it c里的void SVC Handler xff08 void xff09 函数给注释了 原因
  • FreeRTOS 实时内核实用指南之第一章任务管理知识总结

    任务函数顶层任务状态创建任务任务优先级扩充 非运行态 空闲任务与空闲任务钩子函数改变任务优先级删除任务调度算法 简述 一 任务函数 1 pvParameters 代表传入函数的参数 2 变量i和变量j 是在任务函数中的变量 xff0c 但是
  • 安装 kubectl

    以 Linux 为例 xff0c 两步 xff1a 1 下载 span class token function curl span span class token parameter variable LO span span clas
  • 关于单应性矩阵的若干思考

    1 名词解释 单应与射影变换是同义的 射影变换描述的是SE 2 到SE 2 的映射关系 映射与变换同义 映射h xff1a SE 2 到SE 2 是射影映射的充要条件是 xff1a 存在一个3x3非奇异矩阵H xff0c 使得任何一个用矢量
  • 自己的Docker Hub仓库 拉取镜像、推送镜像

    docker将本地镜像放入自己的Docker Hub仓库 首先到官网注册账号 xff1a https hub docker com 在本地Linux登录docker xff1a docker login 用户名 xff1a libowen1
  • 在gittee上建立远程仓库

    1 注册登录码云 xff0c 完善个人信息 2 设置本机绑定SSH公钥 xff0c 实现免密码登录 xff01 xff08 免密码登录 xff0c 这一步挺重要的 xff0c 码云是远程仓库 xff0c 我们是平时工作在本地仓库 xff01
  • 用windows自带WSL实现Ubuntu使用及ROS安装及gazebo黑屏解决

    Windows自带WSL实现Ubuntu使用 ROS安装 可视化桌面 gazebo黑屏解决 1 Ubuntu安装1 1 开放权限1 2 安装1 3 初始化 2 桌面环境配置2 1 换镜像源2 2 安装可视化桌面2 2 1 远程桌面连接 3
  • Optitrack视觉定位下基于ROS及PX4搭建四旋翼多机飞行平台

    Optitrack视觉定位下基于ROS及PX4搭建四旋翼多机飞行平台搭建 1 单机平台1 1 四旋翼硬件组装a 注意 1 2 机载板环境配置1 3 飞控参数配置a 注意 1 4 实飞全流程 2 多机通信2 1 多机ip地址存储2 2 ROS
  • Optitrack使用说明-基于ROS&vrpn实现的室内定位

    Optitrack使用说明 基于ROS amp vrpn实现的室内定位 待续
  • C语言实现http请求器

    C语言实现http请求器 项目介绍 本项目完成一个http客户端请求器 xff0c 该请求器往服务器发送请求 xff0c 并接受服务器发来的响应数据 程序执行流程 建立TCP连接在TCP连接获得的socket的基础上 xff0c 发送htt
  • 【 ROS 软件包 】ROS安装软件包的两种方法

    使用apt安装 xff0c 安装在 opt ros melodic share目录下 xff1a sudo apt span class token operator span get install ros span class toke
  • 【 PID 算法 】PID 算法基础

    前言 xff1a 这两天打算找个实习 xff0c 奈何感觉自己有点菜 xff0c 所以 xff0c 就补习了一下知识 xff0c 说一下 xff0c 这个PID算法吧 一 简介 PID即 xff1a Proportional xff08 比
  • 7、OPencv 图形轮廓检测

    要想实现轮廓检测 xff0c 首先我们需要对待检测的图像进行图像处理 xff1a 图像灰度化 高斯滤波 Canny 边缘检测 边缘检测放大处理 提取轮廓 一 实现简单的全图型检测 即只要将drawContours第三个参数设置为 1 既能实
  • Spring Boot 接口统一前缀

    需求 需求如题 xff0c 想给一个 spring boot 项目的所有请求路径添加统一前缀 xff0c 可以通过 context path 来配置 但是在同时存在静态资源和 Controller 接口的项目中 xff0c 如果希望静态资源
  • 一文读懂pid控制器

    文章目录 PID控制器1 控制器1 1 电机速度控制系统1 2 温度或水位控制系统1 3 小小总结 2 PID3 模拟式PID4 数字式PID4 1 位置式PID算法4 1 2 位置式pid算法的缺点 4 2 增量式PID算法4 2 2 增
  • Gazebo创建围墙并生成.world文件

    Gazebo创建围墙并生成 world仿真环境文件 文件说明 world文件是gazebo中搭建的仿真环境保存后的文件格式 xff0c 其中包含了若干个模型文件 world文件如图所示 xff1a 其中相关参数是gazebo基于我们在gaz
  • Ubuntu18.04分区方案

    由于Ubluntu18 04安装和16 04基本一样 xff0c 因此就没什么好说的 xff0c 主要记录一下分区方案 硬盘总容量 xff1a 500G 分区方案 xff1a EFI分区 逻辑分区 xff0c 空间起始位置 xff0c 10

随机推荐

  • Ubuntu18.04搭建AirSim+ROS仿真环境

    AIRSIM在UBuntu 18 04上构建的官网文档 一 安装UE4引擎 AIRSIM是依赖于UE4引擎实现的 因此在安装AIRSIM之前要安装UE4引擎 1 获取UE4的github许可 在Ubuntu上安装UE4引擎需要从源文件进行编
  • OpenCV-Python学习笔记(使用opencv识别物体的位置,找到中心点位)

    使用opencv识别物体的位置 xff0c 找到中心点位 xff1a 步骤 xff1a 先拿到图像 gt 进行高斯滤波 gt 进行灰度处理 gt 进行二值化 gt 进行开运算 gt 轮廓提取 gt 计算中心点位 效果图如下 xff1a 代码
  • ROS下使用realsense-d435i跑通 rgbdslam_v2运行踩坑完成

    准备工作 rbgdslam v2 按照github 实验环境Ubuntu 16 04 ROS kinetic 如果你电脑安装PCL版本是1 7 xff0c 那么请直接跳到错误1 xff0c 如果你也不知道有没有 xff0c 或者版本多少 x
  • ROS学习 catkin CMakeList.txt详细介绍

    ROS中catkin CMakeLists txt的内容 CMakeList txt文件是CMake编译系统编译软件包过程的输入文件 任何CMake兼容包都包含一个或多个CMakeLists txt文件 xff0c 这些文件描述了如何编译代
  • ROS Catkin 教程之 CMakeLists.txt

    1 概览 CMakeLists txt 是用 CMake 构建系统构建 ROS 程序包的输入文件 任何兼容 CMake 的包都包含一个或多个 CMakeLists txt 文件 xff0c 用以描述怎样构建和安装代码 catkin 项目采用
  • ROS在roslaunch时,提示“is neither a launch file in package”或TAB时没有补全

    描述 已经设置了source devel setup bash xff0c 在同一终端用roslaunch可以 xff0c 但我在这个终端起的是roscore xff0c 新终端再用roslaunch就不行了 分析 报错是因为没找到对应的p
  • ros绑定串口

    本文主要介绍ros绑定串口设备的一种方法 1 检查有多少个设备 span class token function ls span dev ttyUSB 2 查看对应串口 查看KERNELS后面的设备的硬件端口号 udevadm info
  • Spring Boot 配置文件配置自动提示 Configuration Processor

    效果 在使用Idea等开发工具时 xff0c 配置文件中输入前缀就有对应的补全提示 xff0c 使开发者可以很方便配置相应属性 xff0c 效果截图如下 xff1a 元数据说明 这些提示来自于 spring 自动配置规范中的源数据文件 sp
  • ubuntu20.4安装python3.8

    ubuntu20 4中安装python3 8 注 ubuntu20 4自带python3 10 软连接python3与pip3指向的为python3 10本文意在安装python3 8 并将软连接python与pip指向python3 8
  • C/C++多线程、线程同步(互斥锁与信号量)

    参考链接2 中写的非常好 xff0c 简单易懂 xff0c 上手快 xff0c 非常好的博文 使用多线程及互斥锁样例 xff1a include lt iostream gt include lt windows h gt using na
  • Python ❀ 初学者学习笔记与知识点梳理

    软件安装与环境部署变量与数据类型列表与元组条件判断语句字典while循环函数类文件与异常 推荐代码练习地址 xff1a https www runoob com python python 100 examples html 点击此处直接跳
  • Shell ❀ Linux系统自动挂载本地yum源并安装rpm依赖包

    文章目录 1 脚本代码详解2 代码执行结果3 脚本参数调整 1 脚本代码详解 span class token comment bin bash span span class token builtin class name echo s
  • Windows ❀ Windows系统下端口连通性常见的验证方法

    文章目录 1 telnet1 1 telnet服务开启方法1 2 端口连通性验证 2 tcping2 1 tcping下载与安装2 2 端口连通性验证 3 netstat ano findstr3 1 findstr使用语法3 2 端口连通
  • Security ❀ 安全设备学习规范(第二版)

    文章目录 安全设备学习规范1 设备部署环境1 1 部署方式1 2 配置IP地址与路由1 3 设备冗余机制1 4 会话同步机制1 5 设备账户管理1 6 设备故障诊断 2 产品授权方式2 1 序列号2 2 Hash值 3 相关设备联动3 1
  • Windows ❀ 解决Google浏览器无法访问网页问题

    文章目录 问题 xff1a Google浏览器无法访问网页解决方法 问题 xff1a Google浏览器无法访问网页 使用Google浏览器打开某个已知安全网页时 xff0c 弹出如下信息 xff0c 错误内容如下 xff1a NET ER
  • Security ❀ CSP Bypass 内容安全策略绕过

    文章目录 内容安全策略绕过 CSP Bypass1 Low Level2 Medium Level3 High Level4 Impossible Level 内容安全策略绕过 CSP Bypass CSP 内容安全策略 xff1a 为了缓
  • Security ❀ JavaScript Attacks 前端攻击

    文章目录 JavaScript Attacks 前端攻击1 Low Level2 Medium Level3 High Level4 Impossible Level JavaScript Attacks 前端攻击 JavaScript是一
  • MiddleWare ❀ Zookeeper基础概述

    文章目录 1 认识Zookeeper1 1 数据类型1 2 监听器1 3 基本功能1 3 1 统一配置管理1 3 2 统一命名服务1 3 3 分布式锁1 3 4 集群状态 2 下载安装包3 安装服务3 1 服务端命令3 2 客户端命令 3
  • Java文件内容变更及内容追加监听方案

    简介 对于文件内容变动的监听处理 xff0c 一般分为两种主要应用场景 1 只关心文件内容是否发生变更 文件的内容发生变动的场景是全量修改模式 xff0c 不是内容追加模式 例如某xml文件内容发生变动 这种情况 xff0c 我们一般只需要
  • MiddleWare ❀ MySQL基础概述

    文章目录 MySQL基础1 SQL语法与分类1 1 DDL 数据定义语言1 1 1 库操作1 1 1 1 查询1 1 1 2 创建1 1 1 3 删除1 1 1 4 使用 1 1 2 表 43 字段操作1 1 2 1 查询1 1 2 2 创