MySQL笔记整理.md
MySQL笔记整理 > 在线练习平台:牛客 SQL 快速入门 ## MySQL 执行顺序 >视频:数据库面试——SQL执行顺序_哔哩哔哩_bilibili MySQL执行顺序与编写顺序不同,编写顺序: ``sql select from where group by having order by limit ` 编写顺序从上到下依次编写,但执行顺序却不同:中间开始,返回头部,最后执行尾部 `sql 1. FROM 确定数据来源,从指定表中获取数据 2. WHERE 对原始数据进行筛选,只保留满足条件的数据行 3. GROUP BY 对筛选后的数据进行分组 4. HAVING 对分组后的结果再次进行筛选,通常用于筛选聚合结果 5. SELECT 决定最终需要返回哪些字段、表达式或聚合结果 6. ORDER BY 对查询结果进行排序 7. LIMIT 限制最终返回的数据条数 ` 因此,默认情况下,select 语句设置的别名,只有尾部 order by 才能使用(limit 只是限制数量,不做筛选),但 MySQL 对 having、order by 做了优化,having 与 order by 也可以使用 select 设置的别名,示例: `sql SELECT class_name, AVG(score) AS avg_score FROM score GROUP BY class_name HAVING avg_score > 83; ` 执行顺序是: - from - group by - having - select 此时 select 设置的别名,having 等语句访问应该是无效的,但由于 MySQL 做了优化,上面的代码也可以正确运行 ## MySQL基础 Mysql 执行顺序应该是 from, where, group by, having, select, order by, limit | 一级分类 | 二级分类 | 操作 | SQL 示例 | 说明 | | ---------------- | -------- | -------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | 数据库 | 查看 | 查看所有数据库 | SHOW DATABASES; | 查看 MySQL 中已有数据库 | | | 创建 | 创建数据库 | CREATE DATABASE school; | 创建 school 数据库 | | | 删除 | 删除数据库 | DROP DATABASE school; | 删除整个数据库及其中所有表 | | | 选择 | 选择数据库 | USE school; | 后续操作默认针对该数据库 | | | 查看 | 查看当前数据库 | SELECT DATABASE(); | 查看当前正在使用的数据库 | | 表 | 查看 | 查看所有表 | SHOW TABLES; | 查看当前数据库中的所有表 | | | 创建 | 创建表 | CREATE TABLE user (id INT, name VARCHAR(50)); | 创建表 | | | 查看 | 查看表结构 | DESC user; | 查看字段名、类型、NULL 等信息 | | | 删除 | 删除表 | DROP TABLE user; | 删除表结构和其中的数据 | | | 修改 | 添加字段 | ALTER TABLE user ADD age INT; | 为已有表添加字段 | | | 修改 | 删除字段 | ALTER TABLE user DROP COLUMN age; | 删除指定字段 | | | 修改 | 修改字段 | ALTER TABLE user MODIFY name VARCHAR(100); | 修改字段类型等定义 | | | 修改 | 重命名表 | RENAME TABLE user TO users; | 修改表名 | | 行数据 | 新增 | 新增一行 | INSERT INTO user (id, name) VALUES (1, 'Tom'); | 插入一条数据 | | | 新增 | 新增多行 | INSERT INTO user (id, name) VALUES (1, 'Tom'), (2, 'Jack'); | 一次插入多条数据 | | | 修改 | 修改数据 | UPDATE user SET name = 'Jerry' WHERE id = 1; | 修改符合条件的数据 | | | 删除 | 删除指定数据 | DELETE FROM user WHERE id = 1; | 删除符合条件的行 | | | 删除 | 删除全部数据 | DELETE FROM user; | 删除所有数据,但保留表结构 | | 查询 | 基础查询 | 查询全部字段 | SELECT FROM user; | 查询所有字段 | | | 基础查询 | 查询指定字段 | SELECT id, name FROM user; | 查询指定字段 | | | 别名 | 字段别名 | SELECT name AS username FROM user; | AS 可以省略 | | | 去重 | 查询不同值 | SELECT DISTINCT age FROM user; | 去除重复结果 | | | 排序 | 升序 | SELECT FROM user ORDER BY age ASC; | ASC 为升序,也是默认值 | | | 排序 | 降序 | SELECT FROM user ORDER BY age DESC; | DESC 为降序 | | | 排序 | 多列排序 | select device_id, gpa, age from user_profile order by gpa asc, age asc; | 依次放置即可,首先对 gap 进行升序排序,然后再对 age 进行升序排序 | | | 限制结果 | 限制数量 | SELECT FROM user LIMIT 10; | 获取前 10 条 | | | 分页 | 偏移查询 | SELECT FROM user LIMIT 10 OFFSET 20; | 跳过 20 条,再获取 10 条 | | WHERE 条件 | 比较 | 等于 | WHERE age = 18 | SQL 中判断相等使用 = | | | 比较 | 不等于 | WHERE age != 18 | 也可以使用 <> | | | 比较 | 大小比较 | WHERE age >= 18 | 支持 >、<、>=、<= | | | 逻辑 | AND | WHERE age >= 18 AND age <= 25 | 多个条件同时成立 | | | 逻辑 | OR | WHERE age = 18 OR age = 20 | 任一条件成立 | | | 逻辑 | NOT | WHERE NOT age = 18 | 对条件取反 | | | 范围 | BETWEEN | WHERE age BETWEEN 18 AND 25 | 判断是否位于指定范围,包含边界 | | | 集合 | IN | WHERE id IN (1, 2, 3) | 判断值是否属于指定集合 | | | 模糊查询 | LIKE | WHERE name LIKE 'Tom%' | % 表示任意数量字符 | | | 模糊查询 | LIKE | WHERE name LIKE 'To_' | _ 表示任意一个字符 | | | NULL | 判断 NULL | WHERE age IS NULL | 不能使用 age = NULL | | | NULL | 判断非 NULL | WHERE age IS NOT NULL | 判断字段不为 NULL | | 删除方式对比 | DELETE | 删除数据 | DELETE FROM user WHERE id = 1; | 删除行,保留表结构,支持 WHERE,AUTO_INCREMENT 的计数状态通常不会重置 | | | TRUNCATE | 清空表 | TRUNCATE TABLE user; | 删除全部数据,保留表结构,不支持 WHERE,AUTO_INCREMENT 的计数状态重置 | | | DROP | 删除表 | DROP TABLE user; | 删除表结构以及全部数据 | ## 正则 > REGEXP 是 Regular Expression(正则表达式)的缩写 REGEXP 是用于进行正则表达式匹配的运算符,用于检查一个字符串是否匹配指定的正则表达式模式,
示例: 查找 name 字段中以 'st' 为开头的所有数据: `sql SELECT name FROM person_tbl WHERE name REGEXP '^st'; ` | 分类 | 语法 / 符号 | 示例 | 说明 | | -------- | --------------- | ------------------------------------ | ------------------------------------- | | 正则查询 | REGEXP | WHERE name REGEXP 'Tom' | 判断字段是否匹配正则表达式 | | | RLIKE | WHERE name RLIKE 'Tom' | REGEXP 的同义写法 | | | REGEXP_LIKE() | WHERE REGEXP_LIKE(name, 'Tom') | MySQL 8.0 推荐的正则函数写法 | | 位置匹配 | ^ | WHERE name REGEXP '^Tom' | 匹配以 Tom 开头的字符串 | | | $ | WHERE name REGEXP 'Tom