通用语法及分类
- DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)
 - DML: 数据操作语言,用来对数据库表中的数据进行增删改
 - DQL: 数据查询语言,用来查询数据库中表的记录
 - DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限
 
DDL(数据定义语言)
数据定义语言
数据库操作
查询所有数据库: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 表名;
创建表:
1  | CREATE TABLE 表名(  | 
最后一个字段后面没有逗号
添加字段: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 表名;
DML(数据操作语言)
添加数据
指定字段:INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
全部字段:INSERT INTO 表名 VALUES (值1, 值2, ...);
批量添加数据:INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);
注意事项
- 字符串和日期类型数据应该包含在引号中
 - 插入的数据大小应该在字段的规定范围内
 
更新和删除数据
修改数据:UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [ WHERE 条件 ];
例:UPDATE emp SET name = 'Jack' WHERE id = 1;
删除数据:DELETE FROM 表名 [ WHERE 条件 ];
DQL(数据查询语言)
语法:
1  | SELECT  | 
基础查询
查询多个字段:SELECT 字段1, 字段2, 字段3, ... FROM 表名;SELECT * FROM 表名;
设置别名:SELECT 字段1 [ AS 别名1 ], 字段2 [ AS 别名2 ], 字段3 [ AS 别名3 ], ... FROM 表名;SELECT 字段1 [ 别名1 ], 字段2 [ 别名2 ], 字段3 [ 别名3 ], ... FROM 表名;
去除重复记录:SELECT DISTINCT 字段列表 FROM 表名;
转义:SELECT * FROM 表名 WHERE name LIKE '/_张三' ESCAPE '/'
/ 之后的_不作为通配符
条件查询
语法:SELECT 字段列表 FROM 表名 WHERE 条件列表;
条件:
| 比较运算符 | 功能 | 
|---|---|
| > | 大于 | 
| >= | 大于等于 | 
| < | 小于 | 
| <= | 小于等于 | 
| = | 等于 | 
| <> 或 != | 不等于 | 
| BETWEEN … AND … | 在某个范围内(含最小、最大值) | 
| IN(…) | 在in之后的列表中的值,多选一 | 
| LIKE 占位符 | 模糊匹配(_匹配单个字符,%匹配任意个字符) | 
| IS NULL | 是NULL | 
| 逻辑运算符 | 功能 | 
|---|---|
| AND 或 && | 并且(多个条件同时成立) | 
| OR 或 || | 或者(多个条件任意一个成立) | 
| NOT 或 ! | 非,不是 | 
例子:
1  | -- 年龄等于30  | 
聚合查询(聚合函数)
常见聚合函数:
| 函数 | 功能 | 
|---|---|
| count | 统计数量 | 
| max | 最大值 | 
| min | 最小值 | 
| avg | 平均值 | 
| sum | 求和 | 
语法:SELECT 聚合函数(字段列表) FROM 表名;
例:SELECT count(id) from employee where workaddress = "广东省";
分组查询
语法:SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后的过滤条件 ];
where 和 having 的区别:
- 执行时机不同:where是分组之前进行过滤,不满足where条件不参与分组;having是分组后对结果进行过滤。
 - 判断条件不同:where不能对聚合函数进行判断,而having可以。
 
例子:
1  | -- 根据性别分组,统计男性和女性数量(只显示分组数量,不显示哪个是男哪个是女)  | 
注意事项
- 执行顺序:where > 聚合函数 > having
 - 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
 
排序查询
语法:SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;
排序方式:
- ASC: 升序(默认)
 - DESC: 降序
 
例子:
1  | -- 根据年龄升序排序  | 
注意事项
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序
分页查询
语法:SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
例子:
1  | -- 查询第一页数据,展示10条  | 
注意事项
- 起始索引从0开始,起始索引 = (查询页码 - 1) * 每页显示记录数
 - 分页查询是数据库的方言,不同数据库有不同实现,MySQL是LIMIT
 - 如果查询的是第一页数据,起始索引可以省略,直接简写 LIMIT 10
 
DQL执行顺序
FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY -> LIMIT
DCL
管理用户
查询用户:
1  | USER mysql;  | 
创建用户:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
修改用户密码:ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
删除用户:DROP USER '用户名'@'主机名';
例子:
1  | -- 创建用户test,只能在当前主机localhost访问  | 
注意事项
- 主机名可以使用 % 通配
 
权限控制
常用权限:
| 权限 | 说明 | 
|---|---|
| ALL, ALL PRIVILEGES | 所有权限 | 
| SELECT | 查询数据 | 
| INSERT | 插入数据 | 
| UPDATE | 修改数据 | 
| DELETE | 删除数据 | 
| ALTER | 修改表 | 
| DROP | 删除数据库/表/视图 | 
| CREATE | 创建数据库/表 | 
更多权限请看权限一览表
查询权限:SHOW GRANTS FOR '用户名'@'主机名';
授予权限:GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
撤销权限:REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意事项
- 多个权限用逗号分隔
 - 授权时,数据库名和表名可以用 * 进行通配,代表所有
 
权限一览表
具体权限的作用详见官方文档
GRANT 和 REVOKE 允许的静态权限
| Privilege | Grant Table Column | Context | 
|---|---|---|
ALL [PRIVILEGES] | 
Synonym for “all privileges” | Server administration | 
ALTER | 
Alter_priv | 
Tables | 
ALTER ROUTINE | 
Alter_routine_priv | 
Stored routines | 
CREATE | 
Create_priv | 
Databases, tables, or indexes | 
CREATE ROLE | 
Create_role_priv | 
Server administration | 
CREATE ROUTINE | 
Create_routine_priv | 
Stored routines | 
CREATE TABLESPACE | 
Create_tablespace_priv | 
Server administration | 
CREATE TEMPORARY TABLES | 
Create_tmp_table_priv | 
Tables | 
CREATE USER | 
Create_user_priv | 
Server administration | 
CREATE VIEW | 
Create_view_priv | 
Views | 
DELETE | 
Delete_priv | 
Tables | 
DROP | 
Drop_priv | 
Databases, tables, or views | 
DROP ROLE | 
Drop_role_priv | 
Server administration | 
EVENT | 
Event_priv | 
Databases | 
EXECUTE | 
Execute_priv | 
Stored routines | 
FILE | 
File_priv | 
File access on server host | 
GRANT OPTION | 
Grant_priv | 
Databases, tables, or stored routines | 
INDEX | 
Index_priv | 
Tables | 
INSERT | 
Insert_priv | 
Tables or columns | 
LOCK TABLES | 
Lock_tables_priv | 
Databases | 
PROCESS | 
Process_priv | 
Server administration | 
PROXY | 
See proxies_priv table | 
Server administration | 
REFERENCES | 
References_priv | 
Databases or tables | 
RELOAD | 
Reload_priv | 
Server administration | 
REPLICATION CLIENT | 
Repl_client_priv | 
Server administration | 
REPLICATION SLAVE | 
Repl_slave_priv | 
Server administration | 
SELECT | 
Select_priv | 
Tables or columns | 
SHOW DATABASES | 
Show_db_priv | 
Server administration | 
SHOW VIEW | 
Show_view_priv | 
Views | 
SHUTDOWN | 
Shutdown_priv | 
Server administration | 
SUPER | 
Super_priv | 
Server administration | 
TRIGGER | 
Trigger_priv | 
Tables | 
UPDATE | 
Update_priv | 
Tables or columns | 
USAGE | 
Synonym for “no privileges” | Server administration | 
GRANT 和 REVOKE 允许的动态权限
| Privilege | Context | 
|---|---|
APPLICATION_PASSWORD_ADMIN | 
Dual password administration | 
AUDIT_ABORT_EXEMPT | 
Allow queries blocked by audit log filter | 
AUDIT_ADMIN | 
Audit log administration | 
AUTHENTICATION_POLICY_ADMIN | 
Authentication administration | 
BACKUP_ADMIN | 
Backup administration | 
BINLOG_ADMIN | 
Backup and Replication administration | 
BINLOG_ENCRYPTION_ADMIN | 
Backup and Replication administration | 
CLONE_ADMIN | 
Clone administration | 
CONNECTION_ADMIN | 
Server administration | 
ENCRYPTION_KEY_ADMIN | 
Server administration | 
FIREWALL_ADMIN | 
Firewall administration | 
FIREWALL_EXEMPT | 
Firewall administration | 
FIREWALL_USER | 
Firewall administration | 
FLUSH_OPTIMIZER_COSTS | 
Server administration | 
FLUSH_STATUS | 
Server administration | 
FLUSH_TABLES | 
Server administration | 
FLUSH_USER_RESOURCES | 
Server administration | 
GROUP_REPLICATION_ADMIN | 
Replication administration | 
GROUP_REPLICATION_STREAM | 
Replication administration | 
INNODB_REDO_LOG_ARCHIVE | 
Redo log archiving administration | 
NDB_STORED_USER | 
NDB Cluster | 
PASSWORDLESS_USER_ADMIN | 
Authentication administration | 
PERSIST_RO_VARIABLES_ADMIN | 
Server administration | 
REPLICATION_APPLIER | 
PRIVILEGE_CHECKS_USER for a replication channel | 
REPLICATION_SLAVE_ADMIN | 
Replication administration | 
RESOURCE_GROUP_ADMIN | 
Resource group administration | 
RESOURCE_GROUP_USER | 
Resource group administration | 
ROLE_ADMIN | 
Server administration | 
SESSION_VARIABLES_ADMIN | 
Server administration | 
SET_USER_ID | 
Server administration | 
SHOW_ROUTINE | 
Server administration | 
SYSTEM_USER | 
Server administration | 
SYSTEM_VARIABLES_ADMIN | 
Server administration | 
TABLE_ENCRYPTION_ADMIN | 
Server administration | 
VERSION_TOKEN_ADMIN | 
Server administration | 
XA_RECOVER_ADMIN | 
Server administration |