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;
退出
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 要应用LINK子句的列名 LINK 匹配模式
通配符:
%:表示零个或多个任意字符
_:表示一个任意字符
不使用%和_时,LINK与 = 效果一样
SELECT * FROM uuu WHERE name LINK _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。
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);
其他:
- 重要的地方要大写,末尾加;才能运行
- 命令后加IF NOT EXISTS ,避免执行出现错误
- 使用mysqladmin前要先保证MySQL在运行
mysqladmin -u 用户名 -p 命令
-
创建/删除数据表前要先选择数据库
-
不写列名连接不到
-
查询中的字符串记住要加引号
-
date < 2006-12-23 是指之前的时间
-
COLLATE utf8mb4_general_ci 不区分大小写
-
插入多行数据,要在一行数据后加上,
-
聚合函数:
SUM():计算某列总和
AVG():计算平均值
MIN():返回最小值
MAX():返回最大值
COUNT():计算某列行数