👀 字符编码
名称 | 描述 | 示例 | 使用场景 |
---|---|---|---|
client | 定义客户端使用的字符编码。 | SET NAMES 'utf8mb4'; | 当你的应用程序需要与MySQL数据库通信并发送UTF-8字符时。 |
connection | 定义客户端与服务器之间的连接使用的字符编码。 | SET character_set_connection = 'utf8mb4'; | 当从不同字符集的数据源读取数据并将其存储在MySQL数据库中时。 |
database | 定义数据库的默认字符编码。 | CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4; | 当你需要创建一个新的数据库来存储多种语言的数据时。 |
result | 定义服务器返回给客户端的数据的字符编码。 | SET character_set_results = 'utf8mb4'; | 当你的应用程序需要接收UTF-8编码的查询结果时。 |
server | 定义MySQL服务器的默认字符编码。 | 在my.cnf 中: [mysqld] character-set-server=utf8mb4 | 当你在部署一个新的MySQL服务器并希望它默认使用UTF-8字符集时。 |
system | 定义MySQL数据库系统使用的字符编码。 | 通常为 utf8 ,不经常改变。 | 当你需要查询MySQL的系统表或某些内部操作时。 |
👀 元数据
编号 | 表格名称 | 描述 |
---|---|---|
1 | SCHEMATA | 1. 描述所有数据库的信息 2. 包括数据库名称 3. 默认字符集 4. 默认排序规则 |
2 | TABLES | 1. 描述所有表的信息 2. 包括所在数据库 3. 表名称 4. 表类型(如基本表或视图) 5. 所用的存储引擎 6. 版本 7. 行格式 8. 表中的行数 9. 平均行长度 10. 数据长度 11. 最大数据长度 12. 索引长度 13. 未使用的空间 |
3 | COLUMNS | 1. 描述所有表的列信息 2. 包括所在数据库 3. 表名称 4. 列名称 5. 列位置 6. 默认值 7. 是否可为NULL 8. 数据类型 9. 字符最大长度 10. 数字精度 11. 数字小数点后的位数 12. 日期时间精度 13. 字符集 14. 排序规则 15. 列类型 16. 列键(如主键、外键) 17. 额外的信息(如自增长) |
4 | STATISTICS | 1. 描述所有表的索引信息 2. 包括所在数据库 3. 表名称 4. 索引名称 5. 是否唯一 6. 列名称 7. 在索引中的位置 8. 排序方式 9. 基数 10. 子部分 11. 打包方式 12. 是否可以为NULL 13. 索引类型(如BTREE、FULLTEXT) |
5 | VIEWS | 1. 描述所有的视图 2. 包括所在数据库 3. 视图名称 4. 视图的定义 5. 检查选项 6. 是否可以更新 7. 定义者 8. 安全类型 |
6 | ROUTINES | 1. 描述存储过程和函数 2. 包括所在数据库 3. 名称 4. 类型(如过程或函数) 5. 数据类型 6. 字符最大长度 7. 数字精度 8. 数字小数点后的位数 9. 日期时间精度 10. 字符集 11. 排序规则 12. 体(即代码) 13. 定义 14. 外部名称 15. 外部语言 16. 参数样式 17. 是否确定 18. SQL数据访问方式 |
7 | TRIGGERS | 1. 描述所有的触发器 2. 包括所在数据库 3. 触发器名称 4. 事件操作(如INSERT、UPDATE、DELETE) 5. 事件对象表 6. 动作顺序 7. 动作条件 8. 动作语句 9. 动作方向 10. 动作时机 11. 事件对象的模式 12. 定义者 13. 客户端字符集 14. 连接排序 15. 数据库排序 |
👀 数据类型
1. 数值数据类型
📌1.1 整数类型
列类型 (发音) | 作用 | 存储空间 | 属性 | 有符号取值范围 | 无符号取值范围 | 用例 |
---|---|---|---|---|---|---|
TINYINT (泰尼因特) | 存储小整数 | 1字节 | 有符号 | -128 到 127 | 0 到 255 | 年龄 (0-100) |
SMALLINT (斯摩因特) | 存储中等大小的整数 | 2字节 | 有符号 | -32,768 到 32,767 | 0 到 65,535 | 学生数 (0-30000) |
MEDIUMINT (米地姆因特) | 存储中等大小的整数 | 3字节 | 有符号 | -8,388,608 到 8,388,607 | 0 到 16,777,215 | 城市人口 |
INT (因特) | 存储大整数 | 4字节 | 有符号 | -2,147,483,648 到 2,147,483,647 | 0 到 4,294,967,295 | 国家人口 |
BIGINT (比姆因特) | 存储非常大的整数 | 8字节 | 有符号 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0 到 18,446,744,073,709,551,615 | 全球人口 |
📌1.2 定点数
- 每 4 个字节存 9 个数字,小数点占一个字节
- decimal 举例: 123456789.987654321 = decimal(18,9) 占用 9 字节
列类型 (发音) | 作用 | 存储空间 | 取值范围 | 用例 |
---|---|---|---|---|
DECIMAL (得西马尔) | 存储定点数 | 取决于精度和小数点后的位数 (最多65位) | 依赖于定义(DOUBLE存储为字符串 ) | 金融计算,货币值 |
NUMERIC (纽默里克) | 存储定点数 | 取决于精度和小数点后的位数 (最多65位) | 依赖于定义(DOUBLE存储为字符串 ) | 金融计算,货币值 |
📌1.3 浮点数
列类型 | 作用 | 存储空间 | 取值范围 | 用例 |
---|---|---|---|---|
FLOAT | 存储单精度浮点数 | 4字节 | 依赖于定义(十进制(精确到 23 位) ) | 小数点后精度不高的计算 |
DOUBLE | 存储双精度浮点数 | 8字节 | 依赖于定义 (十进制(24 到 53 位) ) | 小数点后精度较高的计算 |
📌1.4 位值类型
列类型 (发音) | 作用 | 存储空间 | 取值范围 | 用例 |
---|---|---|---|---|
BIT (比特) | 存储位值 | 1-8字节 | 0 或 1 | 开关,选项等 |
2. 日期和时间类型
列类型 (发音) | 作用 | 存储空间 | 取值范围 | 用例 |
---|---|---|---|---|
DATE | 存储日期 | 3字节 | 1000-01-01 到 9999-12-31 | 出生日期 |
TIME | 存储时间 | 3字节 | -838:59:59 到 838:59:59 | 电影时长 |
DATETIME | 存储日期和时间 | 8字节 | 1000-01-01 00:00:00 到 9999-12-31 23:59:59 | 会议开始时间 |
TIMESTAMP (泰姆斯坦普) | 存储日期和时间 | 4字节 | 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC | 文件修改时间 |
YEAR | 存储年份 | 1字节 | 1901 到 2155 | 创业年份 |
3. 字符串类型
📌3.1 字符字符串
列类型 (发音) | 作用 | 存储空间 | 取值范围 | 用例 |
---|---|---|---|---|
CHAR (查尔) | 存储固定长度的字符串 | 0-255字节 | 最长255字符 | 性别 (M/F) |
VARCHAR (瓦查尔) | 存储可变长度的字符串 | 0-65,535字节 (包括长度前缀) | 最长65,535字符 | 用户名 |
📌3.2 二进制字符串
列类型 (发音) | 作用 | 存储空间 | 取值范围 | 用例 |
---|---|---|---|---|
BINARY (比纳瑞) | 存储固定长度的二进制数据 | 0-255字节 | 最长255字节 | 加密数据 |
VARBINARY (瓦尔比纳瑞) | 存储可变长度的二进制数据 | 0-65,535字节 (包括长度前缀) | 最长65,535字节 | 加密数据 |
📌3.3 文本字符串
列类型 (发音) | 作用 | 存储空间 | 取值范围 | 用例 |
---|---|---|---|---|
TINYTEXT (泰尼泰克斯特) | 存储小文本 | 255字节 | 最长255字符 | 注释 |
TEXT (泰克斯特) | 存储文本 | 65,535字节 | 最长65,535字符 | 文章内容 |
MEDIUMTEXT (米地姆泰克斯特) | 存储中等大小的文本 | 16,777,215字节 | 最长16,777,215字符 | 小说 |
LONGTEXT (龙泰克斯特) | 存储大文本 | 4,294,967,295字节 | 最长4,294,967,295字符 | 百科全书 |
📌3.4 二进制文本
列类型 (发音) | 作用 | 存储空间 | 取值范围 | 用例 |
---|---|---|---|---|
TINYBLOB (泰尼布洛布) | 存储小二进制数据 | 255字节 | 最长255字节 | 缩略图 |
BLOB (布洛布) | 存储二进制数据 | 65,535字节 | 最长65,535字节 | 图片 |
MEDIUMBLOB (米地姆布洛布) | 存储中等大小的二进制数据 | 16,777,215字节 | 最长16,777,215字节 | 视频片段 |
LONGBLOB (龙布洛布) | 存储大二进制数据 | 4,294,967,295字节 | 最长4,294,967,295字节 | 完整电影 |
📌3.5 枚举和集合
列类型 (发音) | 作用 | 存储空间 | 取值范围 | 用例 |
---|---|---|---|---|
ENUM (伊纳姆) | 存储预定义值中的一个值 | 1-2字节 (取决于枚举值数量) | 最多可定义65,535个值 | 性别 (M, F, U) |
SET (设特) | 存储预定义值中的多个值 | 1-8字节 (取决于集合值数量) | 最多可定义64个值 | 语言能力 (English, Spanish, French) |
4. 空间数据类型
列类型 (发音) | 作用 | 存储空间 | 用例 |
---|---|---|---|
GEOMETRY (杰奥梅特里) | 存储任何类型的几何对象 | 取决于对象 | 地理位置信息 |
POINT (点特) | 存储点在空间中的位置 | 取决于对象 | 地点坐标 |
LINESTRING (线斯特林) | 存储两个或多个点的线段 | 取决于对象 | 道路或河流的表示 |
POLYGON (波里贡) | 存储多边形 | 取决于对象 | 地区边界 |
GEOMETRYCOLLECTION (杰奥梅特里集合) | 存储多个几何对象 | 取决于对象 | 多个地理位置组合 |
MULTILINESTRING (多线斯特林) | 存储多个线段 | 取决于对象 | 多条道路或河流的表示 |
MULTIPOINT (多点特) | 存储多个点 | 取决于对象 | 多个地点坐标 |
MULTIPOLYGON (多波里贡) | 存储多个多边形 | 取决于对象 | 多个地区边界 |
5. JSON 数据类型
列类型 (发音) | 作用 | 存储空间 | 取值范围 | 用例 |
---|---|---|---|---|
JSON (杰逊) | 存储和交换数据的轻量级文本格式 | 取决于数据大小 | 根据JSON标准 | 配置设置, 复杂数据结构存储 |
👀 逻辑运算符
运算符 | 描述 | 示例 |
---|---|---|
AND 或 && | 两边的表达式都为真时,结果为真 | age > 18 AND name = 'John' |
OR 或 双竖杠 | 两边的表达式有一条为真时,结果为真 | age > 18 OR name = 'Mike' |
XOR | 一边为真一边为假时,结果为真 | age < 18 XOR name = 'Anna' |
👀 比较运算符
符号/关键字 | 描述 |
---|---|
= | 等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
<> 或 != | 不等于 |
BETWEEN…AND… | 在两个值之间(包括这两个值) |
IS NULL | 值为null |
IS NOT NULL | 值不为null |
LIKE | 模糊匹配,其中%代表任何数量的字符,_代表一个字符 |
NOT LIKE | 不满足LIKE的模糊匹配 |
IN | 值在指定的列表中 |
NOT IN | 值不在指定的列表中 |
👀 DCL(数据库管理语句)
类别 | 归纳语法 | 描述 | 示例 |
---|---|---|---|
权限管理 | grant [permissions] on [database.table] to '[user]@[host]'; | 授予用户权限 | grant select on mydb.mytable to 'john'@'localhost'; |
revoke [permissions] on [database.table] from '[user]@[host]'; | 撤销用户权限 | revoke select on mydb.mytable from 'john'@'localhost'; |
👀 DDL(数据定义类语句)
类别 | 归纳语法 | 描述 | 示例 |
---|---|---|---|
数据库操作 | create database [dbname]; | 创建新数据库 | create database sampledb; |
alter database [dbname] [options]; | 修改数据库属性 | alter database sampledb character set utf8mb4 collate utf8mb4_unicode_ci; | |
drop database [dbname]; | 删除数据库 | drop database sampledb; | |
表操作 | create table [tbl_name] ([columns]); | 创建新表 | create table employees (id int, name varchar(50)); |
alter table [tbl_name] [change_options]; | 修改表的结构 | alter table employees add column salary decimal(10,2); | |
drop table [tbl_name]; | 删除表 | drop table employees; | |
truncate table [tbl_name]; | 清空表数据 | truncate table employees; | |
rename table [old_name] to [new_name]; | 重命名表 | rename table old_employees to new_employees; | |
索引操作 | create index [idx_name] on [tbl_name] ([column_name]); | 创建新索引 | create index idx_name on employees (name); |
drop index [idx_name] on [tbl_name]; | 删除索引 | drop index idx_name on employees; | |
视图操作 | create view [view_name] as [select statement]; | 创建新视图 | create view view_employees as select name from employees; |
alter view [view_name] as [select statement]; | 修改视图 | alter view view_employees as select id, name from employees; | |
drop view [view_name]; | 删除视图 | drop view view_employees; |
👀 DML(数据操作语句)
类别 | 归纳语法 | 描述 | 示例 |
---|---|---|---|
数据检索 | select [columns] from [tbl_name] where [conditions]; | 从表中检索数据 | select name, salary from employees where id=1; |
数据插入 | insert into [tbl_name] ([columns]) values ([values]); | 向表中插入新数据 | insert into employees (id, name) values (1, 'john'); |
数据修改 | update [tbl_name] set [column=value] where [conditions]; | 修改表中的数据 | update employees set salary=5000 where id=1; |
数据删除 | delete from [tbl_name] where [conditions]; | 从表中删除数据 | delete from employees where id=1; |
1. 子查询
-
返回单个值的子查询:
- 常用于和单一值比较的地方。
- 常用操作符: ( <, >, \leq, \geq, = )
示例:
查询销售部的所有员工:
select * from employee where dept = (select id from dept where name = '销售部');
查询xxx入职之后的员工信息:
select * from employee where entrydate > (select entrydate from employee where name = 'xxx');
-
返回一列(多行)的子查询:
- 常用于需要和多个值进行比较的地方。
- 常用操作符: IN, NOT IN, ANY, SOME, ALL
示例:
查询销售部和市场部的所有员工信息:
select * from employee where dept in (select id from dept where name in ('销售部', '市场部'));
查询比财务部所有人工资都高的员工信息:
select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部'));
查询比研发部任意一人工资高的员工信息:
select * from employee where salary > any(select salary from employee where dept = (select id from dept where name = '研发部'));
-
返回一行(多列)的子查询:
- 常用于和一个记录的多个字段进行比较的地方。
- 常用操作符: ( =, <, >, \leq, \geq ), IN, NOT IN
示例:
查询与xxx的薪资及直属领导相同的员工信息:
select * from employee where (salary, manager) = (select salary, manager from employee where name = 'xxx');
-
表子查询:
- 返回的结果是多行多列。
- 常用于需要和多个记录的多个字段进行比较的地方。
- 常用操作符: IN
示例:
查询与xxx1,xxx2的职位和薪资相同的员工:
select * from employee where (job, salary) in (select job, salary from employee where name in ('xxx1', 'xxx2'));
查询入职日期是2006-01-01之后的员工及其部门信息:
select e.*, d.* from (select * from employee where entrydate > '2006-01-01') as e left join dept as d on e.dept = d.id;
2. 合并查询运算符
名称 | 作用 | 示例 | 使用场景 |
---|---|---|---|
UNION | 返回两个查询的并集并消除重复行 | SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; | 当你希望从两个或多个查询中获取不重复的结果集时。 |
UNION ALL | 返回两个查询的并集,包括所有重复行 | SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2; | 当你希望从两个或多个查询中获取完整的结果集,包括重复行。 |
INTERSECT | 返回两个查询的交集 | SELECT column_name(s) FROM table1 INTERSECT SELECT column_name(s) FROM table2; | 当你希望找出在两个或多个查询中都存在的记录。 |
MINUS/EXCEPT | 返回在第一个查询中出现但未在第二个查询中出现的结果 | SELECT column_name(s) FROM table1 MINUS SELECT column_name(s) FROM table2; (或使用 EXCEPT ) | 当你想找出存在于第一个查询中但不存在于第二个查询中的记录。 |
3. ON DUPLICATE KEY UPDATE
项目 | 描述 | 示例或注意事项 |
---|---|---|
描述 | 允许在违反唯一约束或主键时选择更新行,而不返回错误。 | — |
优势 | 可以简化代码,避免先检查是否存在重复的键,再决定是插入还是更新。 | — |
示例 | 插入或更新学生信息。 | INSERT INTO students (student_id, name, age) VALUES (1, 'John Doe', 20) ON DUPLICATE KEY UPDATE name = 'John Doe', age = 20; |
性能 | 使用可能比分别执行INSERT 和UPDATE 更高效。 | 因为它只需要一次表扫描。 |
LAST_INSERT_ID() | 使用自增主键时, 不会更改该函数返回的值。 | 它仍然会是最后插入的行的ID,而不是更新的行的ID。 |
更新多个列 | 可以在语句后列出多个列来进行更新。 | 如上示例中的name 和age 。 |
使用VALUES()函数 | 可以使用这个函数引用尝试插入的值。 | ON DUPLICATE KEY UPDATE name = VALUES(name) |
兼容性 | 这是MySQL特有的特性。 | 如果你正在使用其他数据库或考虑迁移,需要注意这点。 |
👀 TCL(事务控制类语句)
类别 | 归纳语法 | 描述 | 示例 |
---|---|---|---|
事务提交 | commit; | 提交事务,保存所有修改 | commit; |
事务回滚 | rollback; | 回滚事务,撤销所有修改 | rollback; |
设置保存点 | savepoint [savepoint_name]; | 在事务中设置保存点 | savepoint sp1; |
设置事务属性 | set transaction [properties]; | 设置事务的属性 | set transaction isolation level read committed; |
👀 约束管理
约束在数据库中用于指定表的数据的规则。如果存在任何违反这些约束的活动,例如插入、更新、删除等操作,数据库系统通常会生成一个错误。
名称 | 作用 | 示例 | 使用场景 |
---|---|---|---|
NOT NULL | 确保列中的值不能为 NULL。 | CREATE TABLE Persons (ID INT NOT NULL, Name VARCHAR(255)); | 当你想确保某列总是有一个值时,例如,员工的ID或姓名。 |
UNIQUE | 保证列中的所有值都是唯一的。 | CREATE TABLE Persons (ID INT UNIQUE, Name VARCHAR(255)); | 当你想确保某列的每个值都是唯一的,例如,员工的电子邮件地址。 |
PRIMARY KEY | 唯一标识数据库表中的每一行/记录。它是 UNIQUE 和 NOT NULL 约束的组合。 | CREATE TABLE Persons (ID INT PRIMARY KEY, Name VARCHAR(255)); | 当你需要为表中的每一行提供一个唯一的标识符时,例如,员工ID。 |
FOREIGN KEY | 用于确保在一个表中的数据匹配另一个表中的值。这是确保引用完整性的主要工具。 | CREATE TABLE Orders (OrderID INT PRIMARY KEY, ProductID INT, FOREIGN KEY (ProductID) REFERENCES Products(ProductID)); | 当你想确保在一个表中的数据对应另一个表中的已有数据时,例如,确保每个订单引用的产品ID在产品表中都是存在的。 |
CHECK | 确保列中的值满足指定的条件。 | CREATE TABLE Persons (Age INT CHECK (Age>=18)); | 当你想确保某列的值满足某些特定条件时,例如,确保员工的年龄大于或等于18。 |
-
基本约束:
- 主键 (PRIMARY KEY):确保每行的数据在表中是唯一的。
- 自动增长 (AUTO_INCREMENT):确保每次插入新记录时,新的记录具有一个新的、唯一的数字。
- 不为空 (NOT NULL):确保列中没有NULL值。
- 唯一 (UNIQUE):确保在列中的所有值都是唯一的。
- 逻辑条件 (CHECK):确保列中的值满足特定的条件。
- 默认值 (DEFAULT):为列设置默认值。
示例:
create table user( id int primary key auto_increment, name varchar(10) not null unique, age int check(age > 0 and age < 120), status char(1) default '1', gender char(1) );
-
外键约束:
- 外键用于确保在两个表之间的数据完整性。
添加外键示例:
alter table emp add constraint fk_emp_dept_id foreign key(dept_id) references dept(id);
删除外键示例:
ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept_id;
-
删除/更新行为:
当有外键关系的两个表之间的数据发生删除或更新时,可以定义如何处理这些变化。
- NO ACTION / RESTRICT:不允许删除或更新父表中的记录,如果子表中还有引用它的记录。
- CASCADE:删除或更新父表中的记录时,同时删除或更新子表中引用它的记录。
- SET NULL:删除或更新父表中的记录时,设置子表中引用它的外键为NULL。
- SET DEFAULT:删除或更新父表中的记录时,设置子表中引用它的外键为默认值。
更改删除/更新行为的示例:
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE SET NULL;
👀 加速 ALTER TABLE
在MySQL中,当处理大数据表时,ALTER TABLE
可能会变得相当耗时。以下是一些策略和解决方案,以帮助加速此过程:
1. 在线操作 (In-place Operation)
-
📖 描述: MySQL 5.+ 提供了部分「在线」操作支持,这允许我们在不锁定整个表的情况下进行更改。
-
📝 示例:
ALTER TABLE your_table ADD COLUMN new_column INT, ALGORITHM=INPLACE;
-
🌟 优点: 避免了整张表的复制,大大缩短了操作时间。
2. 备份&切换 (Backup & Switch)
-
📖 描述: 先在备份机器上执行
ALTER TABLE
,完成后与生产主机进行切换。 -
📝 示例:
# 在备份机上 mysqldump -u user -p database_name table_name > table_name.sql mysql -u user -p database_name < table_name.sql
-
🌟 优点: 主服务器几乎无等待时间,业务中断时间最小化。
3. 影子拷贝 (Shadow Copy)
-
📖 描述: 创建新表结构,逐渐复制数据,然后重命名和删除原始表。
-
📝 示例:
CREATE TABLE new_table LIKE old_table; INSERT INTO new_table SELECT * FROM old_table; RENAME TABLE old_table TO backup_table, new_table TO old_table; DROP TABLE backup_table;
-
🌟 优点: 可以在业务低峰期进行,避免了长时间锁表。
4. 操作 .frm
文件
-
📖 描述: 有些修改可以直接在
.frm
文件上进行,从而避免重建表。 -
📝 示例:
ALTER TABLE your_table ALTER COLUMN column_name SET DEFAULT new_value;
-
🌟 优点: 由于直接修改
.frm
文件,操作迅速并避免数据迁移。
5. MyISAM 索引的快速创建
-
📖 描述: MyISAM表加载数据的高效方法是先禁用索引,加载数据,然后启用索引。
-
📝 示例:
ALTER TABLE myisam_table DISABLE KEYS; -- 加载数据 ALTER TABLE myisam_table ENABLE KEYS;
-
🌟 优点: 通过延迟索引创建,大大加快了数据加载速度。
6. 注意事项
-
📖 描述: 并非所有的
ALTER TABLE
操作都会导致表重建。例如,删除列的AUTO_INCREMENT
属性,更改ENUM
和SET
常量等可以直接在.frm
文件上修改。 -
⚠️ 建议: 在执行任何大型表更改前,务必先在备份或测试环境上进行验证以确保没有未预料到的问题。
🔍 总结: 根据业务需求和数据表的大小,选择最合适的方法来优化 ALTER TABLE
的执行速度,并始终确保在生产环境中最小化中断和风险。
👀 备忘录
1. 开始与连接
-- 使用用户名和密码连接MySQL
mysql -u <user> -p
-- 使用用户名和密码连接到特定的数据库
mysql [db_name]
-- 使用用户名、密码、主机和端口连接到数据库
mysql -h <host> -P <port> -u <user> -p [db_name]
-- 使用用户名、密码和主机连接到数据库
mysql -h <host> -u <user> -p [db_name]
-- 其他常用命令
EXIT; -- 退出MySQL会话
\q; -- 同样用于退出MySQL会话
2. 进程操作
-- 进程操作
SHOW PROCESSLIST; -- 显示当前MySQL的所有进程
KILL <process_id>; -- 终止指定的进程
3. 备份与恢复
-- 备份指定数据库
mysqldump -u user -p db_name > db.sql
-- 导出指定数据库但不包括数据结构
mysqldump -u user -p db_name --no-data=true --add-drop-table=false > db.sql
-- 从备份中恢复数据库
mysql -u user -p db_name < db.sql
4. MySQL 示例
📌用户管理
USE mysql;
SELECT * FROM user;
创建用户:
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
修改用户密码:
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
删除用户:
DROP USER '用户名'@'主机名';
例子:
-- 创建用户test,只能在当前主机localhost访问
create user 'test'@'localhost' identified by '123456';
-- 创建用户test,能在任意主机访问
create user 'test'@'%' identified by '123456';
create user 'test' identified by '123456';
-- 修改密码
alter user 'test'@'localhost' identified with mysql_native_password by '1234';
-- 删除用户
drop user 'test'@'localhost';
注意事项
主机名可以使用 % 通配
📌权限管理
常用权限:
权限 说明
ALL, ALL PRIVILEGES 所有权限
SELECT 查询数据
INSERT 插入数据
UPDATE 修改数据
DELETE 删除数据
ALTER 修改表
DROP 删除数据库/表/视图
CREATE 创建数据库/表
更多权限请看权限一览表
查询权限:
SHOW GRANTS FOR '用户名'@'主机名';
授予权限:
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
撤销权限:
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意事项
多个权限用逗号分隔
授权时,数据库名和表名可以用 * 进行通配,代表所有
📌数据库管理
查询所有数据库:
SHOW DATABASES;
查询当前数据库:
SELECT DATABASE();
创建数据库:
CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [COLLATE 排序规则 ];
删除数据库:
DROP DATABASE [ IF EXISTS ] 数据库名;
使用数据库:
USE 数据库名;
注意事项:
UTF8字符集长度为3字节,有些符号占4字节,所以推荐用utf8mb4字符集
📌表管理
查询当前数据库所有表:
SHOW TABLES;
查询表结构:
DESC 表名;
查询指定表的建表语句:
SHOW CREATE TABLE 表名;
创建表:
CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段1注释],
字段2 字段2类型 [COMMENT 字段2注释],
字段3 字段3类型 [COMMENT 字段3注释],
...
字段n 字段n类型 [COMMENT 字段n注释]
)[ COMMENT 表注释 ];
最后一个字段后面没有逗号
添加字段:
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
例:ALTER TABLE emp ADD nickname varchar(20) COMMENT '昵称';
修改数据类型:
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
修改字段名和字段类型:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
例:将emp表的nickname字段修改为username,类型为varchar(30)
ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '昵称';
删除字段:
ALTER TABLE 表名 DROP 字段名;
修改表名:
ALTER TABLE 表名 RENAME TO 新表名
删除表:
DROP TABLE [IF EXISTS] 表名;
删除表,并重新创建该表:
TRUNCATE TABLE 表名;
-- 创建新表
CREATE TABLE t (
id INT PRIMARY KEY,
name VARCHAR NOT NULL,
price INT DEFAULT 0
);
-- 删除表
DROP TABLE t;
-- 添加列
ALTER TABLE t ADD column_name column_type;
-- 删除列
ALTER TABLE t DROP COLUMN column_name;
-- 重命名表
ALTER TABLE t1 RENAME TO t2;
-- 重命名列
ALTER TABLE t1 RENAME c1 TO c2 ;
-- 清空表数据
TRUNCATE TABLE t;
📌增删查改
-- 选择表`t`中的`c1`和`c2`两列的所有数据
SELECT c1, c2 FROM t;
-- 选择表`t`中的所有列和所有数据
SELECT * FROM t;
-- 选择表`t`中的`c1`和`c2`两列的数据,但只返回满足某个条件(如c1>10或c2='John')的行
SELECT c1, c2 FROM t WHERE condition;
-- 从表`t`中选择`c1`列的数据,但只返回不重复的、满足某个条件的行
SELECT DISTINCT c1 FROM t WHERE condition;
-- 将新的数据行插入到表`t`中。
-- `column_list`定义了要插入值的列的顺序,`value_list`定义了相应的值。
INSERT INTO t(column_list) VALUES(value_list);
-- 同时将两个新的数据行插入到表`t`中。
-- `column_list`定义了要插入值的列的顺序,`value_list1`和`value_list2`定义了相应的值。
INSERT INTO t(column_list) VALUES(value_list1), (value_list2);
-- 将从表`t2`选择出的数据行插入到表`t1`中。
-- `column_list`定义了要插入/选择的列的顺序。
INSERT INTO t1(column_list) SELECT column_list FROM t2;
-- 忽略已存在数据
insert ignore into t_dept(deptno, dname, loc)
values (40, '企划部', '北京'),
(50, '培训部', '上海'),
(60, '后勤部', '北京'),
(70, '技术部', '北京'),
(80, '市场部', '北京');
-- 实现不存在就插入,存在就更新
insert into t_emp_ip(id, empno, ip)
values (5, 8004, '192.168.99.44'),
(6, 8005, '192.168.99.45'),
(7, 8006, '192.168.99.46'),
(8, 8001, '192.168.99.47')
on duplicate key update ip=values(ip);
-- 更新表`t`中所有行的`c1`列的值。
UPDATE t SET c1=new_value;
-- 更新表`t`中满足某个条件的行的`c1`和`c2`列的值。
-- `condition`定义了哪些行应该被更新。
UPDATE t SET c1=new_value, c2=new_value WHERE condition;
-- 改写成表连接方式过滤数据
-- 由于使用的是内连接:on 里面的条件写在 where 也是一样的,所以也可以改写到 where 中
update t_emp e join t_dept td on e.deptno = td.deptno
and td.dname = 'SALES'
set e.sal = 10000,
td.dname = '销售部'
-- 上面的 update 语句,一次只能修改一张表的数据,使用这种方式,可以修改多张表的表字段数据
--从表`t`中删除所有行。
DELETE FROM t;
-- 删除表`t`中满足某个条件的行。
-- `condition`定义了哪些行应该被删除。
DELETE FROM t WHERE condition;
-- delete 语句中也可以使用表连接
-- 同样,可以删除多张表中的数据, delete 后就是写的要删除表的别名
-- 本列中,删除了上面被更新的两张表中的数据
delete e,td
from t_emp e
join t_dept td on e.deptno = td.deptno and td.dname = '销售部'
-- 要删除的数据用的内连接查询。部门编号一致,并且部门名称是销售部
📌导入 SQL 文件
/*
Navicat Premium Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 50721
Source Host : localhost:3306
Source Schema : test
Target Server Type : MySQL
Target Server Version : 50721
File Encoding : 65001
Date: 08/10/2018 12:37:19
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_bonus
-- ----------------------------
DROP TABLE IF EXISTS `t_bonus`;
CREATE TABLE `t_bonus` (
`empno` int(4) NOT NULL,
`job` varchar(20) DEFAULT NULL,
`sal` decimal(10,2) DEFAULT NULL,
`comm` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for t_dept
-- ----------------------------
DROP TABLE IF EXISTS `t_dept`;
CREATE TABLE `t_dept` (
`deptno` int(2) NOT NULL,
`dname` varchar(20) DEFAULT NULL,
`loc` varchar(20) DEFAULT NULL,
PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of t_dept
-- ----------------------------
BEGIN;
INSERT INTO `t_dept` VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO `t_dept` VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO `t_dept` VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO `t_dept` VALUES (40, 'OPERATIONS', 'BOSTON');
COMMIT;
-- ----------------------------
-- Table structure for t_emp
-- ----------------------------
DROP TABLE IF EXISTS `t_emp`;
CREATE TABLE `t_emp` (
`empno` int(4) NOT NULL,
`ename` varchar(20) DEFAULT NULL,
`job` varchar(20) DEFAULT NULL,
`mgr` int(4) DEFAULT NULL,
`hiredate` date DEFAULT NULL,
`sal` decimal(10,2) DEFAULT NULL,
`comm` decimal(10,2) DEFAULT NULL,
`deptno` int(2) DEFAULT NULL,
PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of t_emp
-- ----------------------------
BEGIN;
INSERT INTO `t_emp` VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17 00:00:00', 800.00, NULL, 20);
INSERT INTO `t_emp` VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20 00:00:00', 1600.00, 300.00, 30);
INSERT INTO `t_emp` VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22 00:00:00', 1250.00, 500.00, 30);
INSERT INTO `t_emp` VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02 00:00:00', 2975.00, NULL, 20);
INSERT INTO `t_emp` VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28 00:00:00', 1250.00, 1400.00, 30);
INSERT INTO `t_emp` VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01 00:00:00', 2850.00, NULL, 30);
INSERT INTO `t_emp` VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09 00:00:00', 2450.00, NULL, 10);
INSERT INTO `t_emp` VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09 00:00:00', 3000.00, NULL, 20);
INSERT INTO `t_emp` VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17 00:00:00', 5000.00, NULL, 10);
INSERT INTO `t_emp` VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08 00:00:00', 1500.00, 0.00, 30);
INSERT INTO `t_emp` VALUES (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12 00:00:00', 1100.00, NULL, 20);
INSERT INTO `t_emp` VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-03 00:00:00', 950.00, NULL, 30);
INSERT INTO `t_emp` VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03 00:00:00', 3000.00, NULL, 20);
INSERT INTO `t_emp` VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-01-23 00:00:00', 1300.00, NULL, 10);
COMMIT;
-- ----------------------------
-- Table structure for t_salgrade
-- ----------------------------
DROP TABLE IF EXISTS `t_salgrade`;
CREATE TABLE `t_salgrade` (
`grade` int(11) NOT NULL,
`losal` decimal(10,2) DEFAULT NULL,
`hisal` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`grade`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of t_salgrade
-- ----------------------------
BEGIN;
INSERT INTO `t_salgrade` VALUES (1, 700.00, 1200.00);
INSERT INTO `t_salgrade` VALUES (2, 1201.00, 1400.00);
INSERT INTO `t_salgrade` VALUES (3, 1401.00, 2000.00);
INSERT INTO `t_salgrade` VALUES (4, 2001.00, 3000.00);
INSERT INTO `t_salgrade` VALUES (5, 3001.00, 9999.00);
COMMIT;
-- ----------------------------
-- Table structure for t_emp_ip
-- ----------------------------
DROP TABLE IF EXISTS `t_emp_ip`;
CREATE TABLE `t_emp_ip` (
`id` int(11) NOT NULL,
`empno` int(11) NOT NULL,
`ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `empno`(`empno`) USING BTREE,
UNIQUE INDEX `ip`(`ip`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
📌排序和限制
-- 选择表`t`中的`c1`和`c2`两列的所有数据,并根据`c1`列进行排序。
-- `ASC`表示升序(默认排序),如果要进行降序排序,则使用`DESC`。
SELECT c1, c2 FROM t ORDER BY c1 ASC; -- 升序示例
-- 或
SELECT c1, c2 FROM t ORDER BY c1 DESC; -- 降序示例
-- 选择表`t`中的`c1`和`c2`两列的数据,并根据`c1`列进行排序。
-- 使用`LIMIT`来限制返回的行数为`n`,并使用`OFFSET`来跳过前`offset`行。
-- 这在分页查询中特别有用,例如每页显示10条记录,第2页的查询可以设置n为10,offset为10。
SELECT c1, c2 FROM t ORDER BY c1 LIMIT n OFFSET offset;
📌聚合函数
-- 从表`t`中选择`c1`列,同时对`c2`列应用一个聚合函数(如SUM, AVG, MAX, MIN等)。
-- 使用`GROUP BY`子句按`c1`列的值进行分组,使每个`c1`的值在结果集中仅出现一次。
-- 对于每个`c1`的唯一值,`aggregate_function(c2)`将计算`c2`列值的聚合结果。
SELECT c1, aggregate_function(c2) FROM t GROUP BY c1;
-- 从表`t`中选择`c1`列,同时对`c2`列应用一个聚合函数。
-- 使用`GROUP BY`子句按`c1`列的值进行分组。
-- 使用`HAVING`子句过滤掉某些分组。`HAVING`子句中的条件应用于聚合函数的结果。
-- 例如,您可能只想选择那些`c2`列的总和超过某个值的`c1`的分组。
SELECT c1, aggregate_function(c2) FROM t GROUP BY c1 HAVING condition;
📌JOIN操作
-- 使用`INNER JOIN`从两个表`t1`和`t2`中选择数据。
-- 只返回满足给定条件的`t1`和`t2`的行。
-- 如果一个`t1`的行和一个`t2`的行满足该条件,它们就会组合成一个结果行。
SELECT c1, c2 FROM t1 INNER JOIN t2 ON condition;
-- 使用`LEFT JOIN`从两个表`t1`和`t2`中选择数据。
-- 返回所有`t1`的行,以及满足给定条件的`t2`的行。
-- 如果`t1`的某一行没有与`t2`的任何行匹配,那么`t2`的所有列将返回NULL值。
SELECT c1, c2 FROM t1 LEFT JOIN t2 ON condition;
-- 使用`RIGHT JOIN`从两个表`t1`和`t2`中选择数据。
-- 返回所有`t2`的行,以及满足给定条件的`t1`的行。
-- 如果`t2`的某一行没有与`t1`的任何行匹配,那么`t1`的所有列将返回NULL值。
SELECT c1, c2 FROM t1 RIGHT JOIN t2 ON condition;
-- 使用`FULL OUTER JOIN`从两个表`t1`和`t2`中选择数据。
-- 返回`t1`和`t2`的所有行。
-- 如果`t1`的某一行没有与`t2`的任何行匹配,那么`t2`的所有列将返回NULL值,反之亦然。
SELECT c1, c2 FROM t1 FULL OUTER JOIN t2 ON condition;
-- 使用`CROSS JOIN`从两个表`t1`和`t2`中选择数据。
-- 返回`t1`的每一行与`t2`的每一行的组合。
-- 结果是`t1`和`t2`的所有可能的行组合。
SELECT c1, c2 FROM t1 CROSS JOIN t2;
-- 这是`CROSS JOIN`的另一种表示方法,它也返回`t1`和`t2`的所有可能的行组合。
SELECT c1, c2 FROM t1, t2;
📌合并查询
-- 使用`UNION`操作符组合来自`t1`和`t2`的结果集。
-- 它删除了重复的行。如果你使用`UNION ALL`,它将包括所有的行,包括重复的。
SELECT c1, c2 FROM t1 UNION [ALL] SELECT c1, c2 FROM t2;
-- 使用`INTERSECT`操作符返回两个结果集的交集。
-- 它返回存在于`t1`和`t2`中的行。
SELECT c1, c2 FROM t1 INTERSECT SELECT c1, c2 FROM t2;
-- 使用`MINUS`操作符从第一个结果集中减去第二个结果集。
-- 它返回存在于`t1`但不在`t2`中的行。
SELECT c1, c2 FROM t1 MINUS SELECT c1, c2 FROM t2;
-- 使用`LIKE`运算符查询匹配给定模式的行。
-- `%`代表0个或多个字符,`_`代表一个字符。
-- `NOT LIKE`查询与给定模式不匹配的行。
SELECT c1, c2 FROM t1 WHERE c1 [NOT] LIKE pattern;
-- 使用`IN`运算符查询在给定值列表中的行。
-- `NOT IN`查询不在给定值列表中的行。
SELECT c1, c2 FROM t WHERE c1 [NOT] IN value_list;
-- 使用`BETWEEN`运算符查询在两个值之间的行。
-- 包括这两个值。
SELECT c1, c2 FROM t WHERE c1 BETWEEN low AND high;
-- 使用`IS NULL`运算符检查列中的值是否为NULL。
-- `IS NOT NULL`检查列中的值是否不为NULL。
SELECT c1, c2 FROM t WHERE c1 IS [NOT] NULL;
📌SQL约束
-- 创建一个名为`t`的表,其中有两个整数列`c1`和`c2`。
-- 同时设置`c1`和`c2`的组合作为此表的主键。
CREATE TABLE t(c1 INT, c2 INT, PRIMARY KEY (c1,c2));
-- 创建一个名为`t1`的表,其中有两个整数列`c1`和`c2`。
-- 其中`c1`被设置为主键。`c2`被设置为外键,引用另一个表`t2`上的`c2`列。
CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, FOREIGN KEY (c2) REFERENCES t2(c2));
-- 创建一个名为`t`的表,其中有两个整数列`c1`和`c2`以及一个列`c3`。
-- 设置`c2`和`c3`的组合为此表的唯一约束,确保这两列的组合是唯一的。
CREATE TABLE t(c1 INT, c2 INT, UNIQUE(c2,c3));
-- 创建一个名为`t`的表,其中有两个整数列`c1`和`c2`。
-- 添加一个检查约束,确保`c1`大于0且`c1`大于或等于`c2`。
CREATE TABLE t(c1 INT, c2 INT, CHECK(c1>0 AND c1>=c2));
-- 创建一个名为`t`的表,其中有一个整数列`c1`和一个VARCHAR类型的列`c2`。
-- `c1`被设置为主键。`c2`被设置为非NULL,确保此列中不会有NULL值。
CREATE TABLE t(c1 INT PRIMARY KEY, c2 VARCHAR NOT NULL);
-- 添加约束
ALTER TABLE t ADD CONSTRAINT constraint_name constraint_definition;
-- 删除约束
ALTER TABLE t DROP CONSTRAINT constraint_name;
-- 修改列确保不为空
ALTER TABLE t
MODIFY column_name datatype NOT NULL;
-- 添加唯一约束
ALTER TABLE t
ADD CONSTRAINT unique_constraint_name UNIQUE (column_name);
-- 设置主键约束
ALTER TABLE t
ADD CONSTRAINT pk_constraint_name PRIMARY KEY (column_name);
-- 设置外键约束
ALTER TABLE t
ADD CONSTRAINT fk_constraint_name FOREIGN KEY (column_name) REFERENCES other_table(other_column);
-- 添加检查约束
ALTER TABLE t
ADD CONSTRAINT check_constraint_name CHECK (column_name condition);
📌管理视图
-- 创建一个名为`v`的视图,该视图包含来自表`t`的`c1`和`c2`列。
CREATE VIEW v(c1,c2) AS SELECT c1, c2 FROM t;
-- 创建一个名为`v`的视图,该视图有检查选项。
-- 该选项确保对基础表`t`的后续修改不会使视图中的行违反`WHERE`子句的条件。
-- 可以选择`CASCADED`(如果视图基于其他视图,则应用此选项)或`LOCAL`(仅应用于当前视图)。
CREATE VIEW v(c1,c2) AS SELECT c1, c2 FROM t WITH [CASCADED | LOCAL] CHECK OPTION;
-- 创建一个名为`v`的递归视图。
-- 递归视图在查询时引用自身,通常用于层次结构或图数据。
-- `select_statement`是查询的主体部分和递归部分,它们通过`UNION`或`UNION ALL`连接。
CREATE RECURSIVE VIEW v AS select_statement UNION [ALL] select_statement;
-- 创建一个名为`v`的临时视图,该视图包含来自表`t`的`c1`和`c2`列。
-- 临时视图仅在当前会话中存在,并在会话结束时自动删除。
CREATE TEMPORARY VIEW v AS SELECT c1, c2 FROM t;
-- 删除名为`view_name`的视图。
DROP VIEW view_name;
📌管理触发器
-- 创建或修改一个触发器。
-- 如果`trigger_name`已存在,则修改它;如果不存在,则创建它。
-- 当在`table_name`上发生指定的`EVENT`(如INSERT、UPDATE或DELETE)时,
-- 该触发器会为每一行数据执行指定的`stored_procedure`。
CREATE OR MODIFY TRIGGER trigger_name
WHEN EVENT
ON table_name FOR EACH ROW
EXECUTE stored_procedure;
📌管理索引
-- 创建一个名为`idx_name`的索引,该索引基于表`t`上的`c1`和`c2`列。
-- 使用索引可以加速查询性能,特别是在处理大量数据时。
CREATE INDEX idx_name ON t(c1,c2);
-- 创建一个名为`idx_name`的唯一索引,该索引基于表`t`上的`c3`和`c4`列。
-- 该索引不仅加速查询性能,还确保`c3`和`c4`列的组合是唯一的,不会有重复值。
CREATE UNIQUE INDEX idx_name ON t(c3,c4);
-- 删除名为`idx_name`的索引,该索引位于`table_name`表上。
-- 可能需要删除索引以改变其结构或释放存储空间。
DROP INDEX idx_name ON table_name;
5. 好用的自定义select
📌查询库里的所有表
select
table_name,
table_comment
from
information_schema.tables
where
table_schema = 'dbname'
📌查询库里的所有表及其字段
use information_schema;
select
t.table_comment '名称',
t.table_schema as '数据库名称',
t.table_name as '表名',
t.table_type as '表类型',
t. engine as '数据库引擎',
c.ordinal_position as '字段编号',
c.column_name as '字段名',
c.column_type as '数据类型',
c.is_nullable as '允许为空',
c.column_key as '键类型',
c.extra as '自增属性',
c.character_set_name as '编码名称',
c.column_comment as '字段说明'
from
columns c
inner join tables t on c.table_schema = t.table_schema and c.column_comment is not null
and c.table_name = t.table_name
where t.table_schema = 'dbname'
📌全表select
set session group_concat_max_len = 102400;
select
concat('select ',group_concat( concat( concat( "a.", a.columnname, " " ), '', char ( 13 ) ) ),' from tablename a')
from
(
select
column_name columnname
from
information_schema.columns
where
table_name = "tablename"
and table_schema = "dbname"
) a
📌mysql横表变纵表
select * from (select `name`,yuwen as score,"语文" as subject from subject
union
select `name`,shuxue as score,"数学" as subject from subject
union
select `name`,yingyu as score,"英语" as subject from subject
) tb
order by `name`;
select
`name` as "姓名",
max( case subject when "语文" then score else 0 end ) 语文,
max( case subject when "数学" then score else 0 end ) 数学,
max( case subject when "英语" then score else 0 end ) 英语,
sum(score) as 总分,
avg(score) as 平均分
from score
group by `name`;
📌批量更改注释
select
c.table_name,
concat(
"alter table ",
c.table_schema,
".",
c.table_name,
" change ",
c.column_name,
" ",
c.column_name,
" ",
c.column_type,
if
( c.column_default is null, " ", concat( " default ", if ( c.column_default = '', "''", c.column_default ) ) ),
if
( is_nullable = 'no', " not null ", '' ),
" comment ",
" ",
concat('"',concat('',a.f_name,a.f_value),'";')
) ,
c.row
from
(
select
b.table_name,
b.table_schema,
b.column_name,
b.column_type,
b.column_default,
b.is_nullable,
concat(
"alter table ",
b.table_schema,
".",
b.table_name,
" change ",
b.column_name,
" ",
b.column_name,
" ",
b.column_type,
if
( b.column_default is null, " ", concat( " default ", if ( b.column_default = '', "''", b.column_default ) ) ),
if
( b.is_nullable = 'no', " not null ", '' ),
" comment ",
" ",
"'12343'"
) ,
(@a:=@a+1) as row
from
information_schema.columns b , (select @a := 0) as i
where
b.table_name = 'd_rp_app_qywx_cashflow'
) c
left join ( select id row, f_name,f_value from f_a ) a on c.row = a.row
📌批量小写列名
select
concat( 'alter table ', table_name, ' change column ', column_name, ' ', lower( column_name ), ' ', column_type, ';' ) as '修改脚本'
from
information_schema.columns
where
table_schema = 'dataanalysis'
and table_name in
(
'd_sync_ap_otherbill',
'd_sync_ap_otherbillentry',
'd_sync_app_qywx_balancetotal',
'd_sync_app_qywx_cashflow',
'd_sync_app_qywx_incometotal',
'd_sync_im_inventoryinitbill',
'd_sync_im_inventoryinitentry',
'd_sync_im_manufacturerecbill',
'd_sync_im_manufacturerecbillentry',
'd_sync_im_materialreqbill',
'd_sync_im_materialreqbillentry',
'd_sync_im_moveinwarehsbill',
'd_sync_im_moveinwarehsbillentry',
'd_sync_im_moveissuebill',
'd_sync_im_moveissuebillentry',
'd_sync_im_movelocationbill',
'd_sync_im_movelocationbillentry',
'd_sync_im_otherinwarehsbill',
'd_sync_im_otherinwarehsbillentry',
'd_sync_im_otherissuebill',
'd_sync_im_otherissuebillentry',
'd_sync_im_purinwarehsbill',
'd_sync_im_purinwarehsentry',
'd_sync_im_purreceivalbill',
'd_sync_im_purreceivalentry',
'd_sync_im_saleissuebill',
'd_sync_im_saleissueentry',
'd_sync_im_stocktransferbill',
'd_sync_im_stocktransferbillentry',
'd_sync_sd_postrequisition',
'd_sync_sd_postrequisitionentry',
'd_sync_sd_saleorder',
'd_sync_sd_saleorderentry',
'd_sync_sm_purorder',
'd_sync_sm_purorderentry'
)
📌用于下划线不超过2的下划线转驼峰
set session group_concat_max_len = 102400;
select group_concat(concat(concat("a.",a.columnname," "),a.newname,char(13)))
from (
select
column_name columnname,
(length(column_name)- length(replace(column_name,"_",""))) num,
case
when (length(column_name)- length(replace(column_name,"_",""))) = 2 then
concat(concat(substring_index(column_name,"_",1),upper(left(substring_index(substring_index(column_name,'_',2),'_',-1),1)),right(substring_index(substring_index(column_name,'_',2),'_',-1),
length(substring_index(substring_index(column_name,'_',2),'_',-1))-1)),upper(left(substring_index(column_name,"_",-1),1)),right(substring_index(column_name,"_",-1), length(substring_index(column_name,"_",-1))-1))
when (length(column_name)- length(replace(column_name,"_",""))) = 1 then
concat(substring_index(column_name,"_",1),upper(left(substring_index(column_name,"_",-1),1)),right(substring_index(column_name,"_",-1), length(substring_index(column_name,"_",-1))-1))
else column_name end newname
from information_schema.columns
where table_name="d_db_tree_warehousepoint"
and table_schema="dataanalysis"
) a