数据查询语句(DQL - Data Query Language)
执行顺序:
from --> where -->group by -->select -->having-->order by-->limit
单表查询
没啥好说的,了解基本的关键字用法和函数的功能即可实现快速查询。
表连接
内连接 inner join
只返回满足连接条件的记录
外连接 outer join
-
左连接 left join
返回左表的所有记录,满足连接条件的显示对应值,不满足显示null
-
右连接 right join
返回右表的所有记录,满足连接条件的显示对应值,不满足显示null
-
全外连接 full join
返回左表和右表的所有记录,满足连接条件的显示对应值,不满足显示null
自连接 self join
应用场景
-
层次结构查询
查询每个员工的上级名称
-
数据纵向比较
对同一表中不同行数据的比较:时间序列、查找重复值等等
交叉连接 cross join
返回两张表的笛卡尔积,即一张表的每一行都会与另一张表的所有行进行匹配,此时写连接条件已经没有意义。
子查询
- 标量子查询:返回一个值
- 列子查询:返回一列值
- 行子查询:返回一行值
- 表子查询:返回一个临时表
根据实际查询需求,确定需要子查询返回的结果,再编写相应的子查询。
函数
单行函数
操作多少行返回多少行
-
字符函数
concat replace substring……
-
日期函数
year month day now date_add datediff……
-
数值函数
abs round ceil floor……
聚合函数
操作多行返回一行
max min sum count avg
窗口函数
-
rank()
有并列排名时,实际会占用后续排名的位置
-
dense_rank()
有并列排名时,不会占用后续排名的位置,所以叫密集排名
-
row_number()
每行一个排名
-
ntile()
将数据分配到指定数量的数据桶中,每个桶中的数据量大致相同
-
lag() lead()
访问前一行或后一行的值
-
max min sum count avg
实现窗口内部的聚合运算
窗口函数和group by的核心区别:
- group by的结果是一张聚合结果表,不保留原表的数据
- 窗口函数只是在原表数据上增加计算结果,查询结果行数与原表相同
因此,窗口函数更适用于在原始数据基础上的分析场景,如累计求和、移动平均、排名等。
数据操作语句(DML - Data Manipulation Language)
插入
INSERT INTO 表名 (列1, 列2, ...)
VALUES (值1, 值2, ...);
更新
UPDATE 表名
SET 列1 = 新值1, 列2 = 新值2, ...
WHERE 条件;
删除
DELETE FROM 表名
WHERE 条件;
数据定义语句(DDL - Data Definition Language)
创建
- 创建数据库
CREATE DATABASE 数据库名;
- 创建表
CREATE TABLE 表名 (
列1 数据类型 [约束],
列2 数据类型 [约束],
...
);
- 创建视图
CREATE VIEW 视图名 AS
SELECT 列1, 列2, ...
FROM 表名
WHERE 条件;
- 创建索引
CREATE INDEX 索引名
ON 表名 (列名);
修改
- 添加列
ALTER TABLE 表名
ADD 列名 数据类型 [约束];
- 删除列
ALTER TABLE 表名
DROP COLUMN 列名;
- 修改列
ALTER TABLE 表名
MODIFY COLUMN 列名 数据类型 [约束];
删除
- 删除数据库
DROP DATABASE 数据库名;
- 删除表
DROP TABLE 表名;
- 删除试图
DROP VIEW 视图名;
- 删除索引
DROP INDEX 索引名 ON 表名;
清空
TRUNCATE TABLE 表名;
delete from 相较于truncate,可以结合where条件进行删除,也可以支持事务的回滚操作
重命名
RENAME TABLE 原表名 TO 新表名;
数据约束语句(DCL - Data Constraint Language)
主键约束 PRIMARY KEY
- 主键列非空不重复
- 主键列还可以单独设置自增功能,又称“自增主键”
- 主键既有单字段主键又有多字段联合主键
非空约束 NOT NULL
唯一性约束 UNIQUE
默认值约束 DEFAULT
外键约束 FOREIGN KEY
从表外键列的值必须引用主表主键列的值,是一种“级联”操作,从而确保数据的一致性。
从表的外键列可以为空,但非空值必须来自于主表主键列
事务控制语句(TCL - Transaction Control Language)
ACID原则
增删改操作会触发事务,MySQL当中执行增删改语句会自动进行提交。
- 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败,不存在部分成功的情况。
- 一致性(Consistency):事务执行前后,数据库的状态必须保持一致,符合所有预定义的规则。
- 隔离性(Isolation):多个事务并发执行时,每个事务的操作不会互相干扰,事务之间是隔离的。
- 持久性(Durability):一旦事务提交成功,其结果将永久保存在数据库中,即使系统崩溃也不会丢失。
从转账的角度来理解以上四条原则:
付款:从付款方账户扣钱 收款:为收款方账户加钱
- 原子性:扣钱和加钱的操作必须都成功,否则就会执行回滚操作;
- 一致性:转账完成后,付款方和收款方的账户的总金额是不变的;
- 隔离性:收款方同时接收多个付款方的转账,是互不干扰的;
- 持久性:转账成功后,将永久保存在数据库中。
COMMIT:提交事务
ROLLBACK:回滚事务
SAVEPOINT:设置事务的保存点
数据控制语句(DCL - Data Control Language)
GRANT:授权权限
REVOKE:撤销权限
设计优化
表设计的三范式
表与表的关系
一对一
一般很少见,因为一对一的情况下完全可以合并成一张表
一对多
一般多见于事实表(多表)和维度表(一表)
多对多
一般需要一个中间表
索引
类型:主键索引、唯一索引、普通索引、复合索引等等
CREATE INDEX 索引名称 ON 表名(字段名);
- 索引可以提高查询效率,但其本身是一种数据结构,会占用一定的存储空间
- mysql中默认的索引数据结构是Btree,是一种多路搜索树
视图
通过封装来提高代码的复用性
标签:MySQL,查询,索引,表名,TABLE,主键,连接 From: https://www.cnblogs.com/wy56297/p/18683820