MySQL
RDBMS 术语
数据库: 数据库是一些关联表的集合
数据表: 表是数据的矩阵
列: 一列包含了相同类型的数据
行:一行一组相关的数据
冗余:存储两倍数据
主键:主键是唯一的,可以用主键来查询数据
外键:外键用于关联两个表
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引
索引:使用索引可快速访问数据库表中的特定信息,类似于书籍的目录
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性
启动及关闭 MySQL
启动
sudo systemctl start mysql
关闭
sudo systemctl stop mysql
重启
sudo systemctl restart mysql
检查
sudo systemctl status mysql
MySQL连接
mysql -u username -p
执行 SQL 查询
列出可用的数据库
SHOW DATEBASES;
选择需要使用的数据库
USE datebase;
列出所选数据中的所有表
SHOW TABLES;
查看表的结构
DESC table_name;
查看表的索引
SHOW INDEX FROM table_name;
查看表的创建语句
SHOW CREATE TABLE table_name;
查看表的行数
SELECT COUNT(*) FROM table_name;
退出
mysql>EXIT;/QUIT;
创建数据库、数据表
CREATE DATABASE 数据库名
CHARACTER SET 字符集名称
COLLATE 校对规则;
字符集是可以识别、储存和表示的字符和符号的集合,
校对规则是字符集内部字符比较和排序的规则。
CREATE TABLE 数据表名(
表名1,数据类型1,
表名2,数据类型2,
);
NOT NULL 字段不为空;
AUTO_INCREMENT 用于创建自增长的列;
PRIMARY KEY 用于定义主键;
ENGINE 设置存储引擎,CHARSET 设置编码
使用mysqladmin创建数据库
mysqladmin -u 用户名 -p 数据库名\
--default-character-set=字符集名称\
--default-collation=校对规则
删除数据库、数据表
DROP DATABASE/TABLE 数据库/表名
插入数据
INSERT INTO 表名(列名1,2,3)
VALUES(具体数值1,2,3),
(.....);
查询数据
SELECT 列名 FROM 表名;
查询所有列时用*表示
WHERE 子句
SELECT 列名
FROM 表名
WHERE 过滤条件
- 查询多个表用,隔开
- <> != 相当于不等于
- 组合条件(AND,OR)
- 模糊匹配条件(LINK)
- IN条件(和=类似)
- BETWEEN AND
- IS NULL / IS NOT NULL
UPDATE 更新
UPDATE 表名
SET 列名 = 新的值
WHERE 指定要更改的行
省略WHERE将更新所有行,可以更新多列
DELETE 语句
DELETE FROM 表名
WHERE 指定要删除的行
省略WHERE删除所有行,
可以使用子查询删除符合条件的行
LIKE 子句
SELECT 要选择的列名列名
FROM 表名
WHERE 要应用LIKE子句的列名 LIKE 匹配模式
通配符:
%:表示零个或多个任意字符
_:表示一个任意字符
不使用%和_时,LINK与 = 效果一样
SELECT * FROM uuu WHERE name LIKE _a%o
查询uuu中,第二个字符是a以o结尾的name
UNION 操作符
SELECT 列名 FROM 表名
UNION
SELECT 列名 FROM 表名
- 使用 UNION ALL 不去除重复行
- UNION 操作中的列数和数据类型必须相同
- 可以通过 UNION 过滤条件
ORDER BY 语句
SELECT 列名
FROM 表名
ORDER BY 指定排序顺序的表名
-
ASC 为升序(默认),DESC 为降序
-
可以多列排序,哪个在前先按哪个排,在内容一样时再考虑下一项
-
用数字表示列的位置
其中,weight 为第二列,height 为第三列
-
使用表达式排序
-
从 MySQL 8.0.16 版本开始,可以使用 NULLS FIRST 或 NULLS LAST 处理 NULL 值
GROUP BY 语句
SELECT 列名,对分组后的每个组执行的聚合函数
FROM 表名
WHERE(可选,用于过滤条件)
GROUP BY 列名
-
聚合函数:
SUM() AVG() MIN() MAX() COUNT()
-
按country分组,并统计每个国家有几个
-
按name分组,并计算每个人的平均身高
-
WITH ROLLUP 可实现在分组统计数据基础上再进行相同的统计,
其中记录 NULL 表示所有人的登录次数,
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称
coalesce(a,b,c)
连接的使用
INNER JOIN
SELECT column1,column2,...
FROM table1 AS 1
INNER JOIN table2 AS 2 ON 1.column1_name=2.column2_name;
- 使用表别名
- 多表连接
SELECT orders.order_id, customers.customer_name, products.product_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id
INNER JOIN order_items ON orders.order_id = order_items.order_id
INNER JOIN products ON order_items.product_id = products.product_id;
- 使用 WHERE 子句进行过滤
LEFT JOIN
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
LEFT JOIN 会读取左边数据表的全部数据,即使右边表无对应数据;当右表中没有匹配的行时,相关列将显示为 NULL
RIGHT JOIN
SELECT column1,column2...
FROM table1
RIGHT JOIN table2 ON table1.column_name=table2.column_name;
RIGHT JOIN 会读取右边数据表的全部数据,即使左边边表无对应数据;RIGHT JOIN 并不经常使用,因为它可以用 LEFT JOIN 和表的顺序交换来实现相同的效果。
NULL值处理
IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
<=>: 比较操作符(不同于 = 运算符),当比较的两个值相等或者都为 NULL 时返回 true。
正则表达式
MySQL 可以通过 LIKE ...% 来进行模糊匹配;
MySQL 同样也支持其他正则表达式的匹配, MySQL 中使用 REGEXP 和 RLIKE操作符来进行正则表达式匹配
RLIKE 和 REGEXP
RLIKE 是 MySQL 中用于进行正则表达式匹配的运算符,与 REGEXP 是一样的,RLIKE 和 REGEXP 可以互换使用,没有区别
REGEXP
SELECT column1,column2,...
FROM table_name
WHERE column_name REGEXP 'pattern';
RLIKE
SELECT column1,column2,...
FROM table_name
WHERE column_name RLIKE 'pattern';
正则模式
正则表达式匹配的字符类
- .:匹配任意单个字符
- ^:匹配字符串的开始
- $:匹配字符串的结束
- *:匹配零个或多个前面的元素
- +:匹配一个或多个前面的元素
- ?:匹配零个或一个前面的元素
- [abc]:匹配字符集中的任意一个字符
- [^abc]:匹配除了字符集中的任意一个字符以外的字符
- [a-z]:匹配范围内的任意一个小写字母
- [0-9]:匹配一个数字字符
- \w:匹配一个字母数字字符(包括下划线)
- \s:匹配一个空白字符
MySQL 事务
MySQL 事务主要用于处理操作量大,复杂度高的数据
在 MySQL 中,事务是一组SQL语句的执行,它们被视为一个单独的工作单元
- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行
- 事务用来管理 insert、update、delete 语句
事务是必须满足4个条件(ACID):原子性、一致性、隔离性、持久性
原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交、读提交、可重复读和串行化。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
MYSQL 事务处理主要有两种方法
1、用 BEGIN, ROLLBACK, COMMIT 来实现
BEGIN 或 START TRANSACTION:开用于开始一个事务
ROLLBACK 事务回滚,取消之前的更改
COMMIT:事务确认,提交事务,使更改永久生效
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
开始事务
BENGIN/START TRANSACTION;
提交事务
COMMIT;
回滚事务,撤销自上次提交以来所做的所有更改
ROLLBACK;
在事务中设置保存点,以便稍后能够回滚到该点
SAVEPOINT savepoint_name;
回滚到之前设置的保存点
ROLLBACK TO SAVEPOINT savepoint_name;
ALTER 命令
添加列
ALTER TABLE table_name
ADD COLUMN new_column_name datatpye
修改列的数据类型
ALTER TABLE table_name
MODIFY COLUMN
修改列名
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
删除列
ALTER TABLE table_name
DROP COLUMN column_name
添加 PRIMARY KEY
ALTER TABLE table_name
ADD PRIMARY KEY (column_name);
添加 FOREIGN KEY
ALTER TABLE child_table
ADD CONSTRAINT fk_name
FOREIGN KEY (column_name)
REFERENCES parent_table (column_name);
修改表名
ALTER TABLE old_table_name
RENAME TO new_table_name;
索引
MySQL 索引类似于书籍的索引,通过存储指向数据行的指针,可以快速定位和访问表中的特定数据
单列索引和组合索引
单列索引,即一个索引只包含单个列,一个表可以有多个单列索引
组合索引,即一个索引包含多个列
创建索引
CREATE INDEX index_name
ON table_name (column1[ASC|DESC],column2[ASC|DESC],...);
默认情况 索引升序ASC
添加索引
使用 ALTER TABLE 命令可以在已有的表中创建索引
ALTER TABLE table_name
ADD INDEX index_name (column1[ASC|DESC],column2[ASC|DESC],...);
创建表的时候直接指定
CREATE TABLE table_name(
column1 data_type,
column2 data_type,
...,
INDEX index_name(column1[ASC|DESC],column2[ASC|DESC],...)
)
删除索引的语法
DROP INDEX index_name ON table_name;
使用 ALTER TABLE 语句删除索引
ALTER TABLE table_name
DROP INDEX index_name;
显示索引信息
SHOW INDEX FROM table_name\G
命令大全
数据库相关命令
数据表相关命令
其他:
- 重要的地方要大写,末尾加;才能运行
- 命令后加IF NOT EXISTS ,避免执行出现错误
- 使用mysqladmin前要先保证MySQL在运行
mysqladmin -u 用户名 -p 命令
-
创建/删除数据表前要先选择数据库
-
不写列名连接不到
-
查询中的字符串记住要加引号
-
date < 2006-12-23 是指之前的时间
-
COLLATE utf8mb4_general_ci 不区分大小写
-
插入多行数据,要在一行数据后加上,
-
聚合函数:
SUM():计算某列总和
AVG():计算平均值
MIN():返回最小值
MAX():返回最大值
COUNT():计算某列行数