10 min read

SQL 常用命令

SQL

DDL

数据库操作

DDL Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段) 。

查询所有数据库

show databases;

查询当前数据库

select database();

创建数据库

在同一个数据库服务器中,不能创建两个名称相同的数据库,否则将会报错。可以通过 if not exists 参数来解决这个问题,数据库不存在, 则创建该数据库,如果存在,则不创建。

create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序
规则 ] ;

案例:

# A. 创建一个itcast数据库, 使用数据库默认的字符集。
create database itcast;

B. 创建一个itheima数据库,并且指定字符集。
create database itheima default charset utf8mb4;

删除数据库

如果删除一个不存在的数据库,将会报错。此时,可以加上参数 if exists ,如果数据库存在,再 执行删除,否则不执行删除。

drop database [ if exists ] 数据库名 ;

切换数据库

use 数据库名 ;

表操作

查询创建

查询当前数据库所有表

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 表注释 ] ;
注意: [...] 内为可选参数,最后一个字段后面没有逗号

数据类型

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 Bytes (-128,127) (0,255) 小整数值
SMALLINT 2 Bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 Bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT 或 INTEGER 4 Bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 Bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 Bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 Bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对 DECIMAL(M,D) ,如果 M>D,为 M+2 否则为 D+2 依赖于 M 和 D 的值 依赖于 M 和 D 的值 小数值

字符串类型

类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

日期时间类型

类型 大小 ( bytes) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' YYYY-MM-DD hh:mm:ss 混合日期和时间值
TIMESTAMP 4 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038 年 1 月 19 日 凌晨 03:14:07 YYYY-MM-DD hh:mm:ss 混合日期和时间值,时间戳

修改

添加字段

ALTER TABLE 表名 ADD 字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];

修改数据类型

ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);

修改字段名和字段类型

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];

删除字段

ALTER TABLE 表名 DROP 字段名;

修改表名

ALTER TABLE 表名 RENAME TO 新表名;

删除

删除表

可选项 IF EXISTS 代表,只有表名存在时才会删除该表,表名不存在,则不执行删除操作(如果不 加该参数项,删除一张不存在的表,执行将会报错)。

DROP TABLE [ IF EXISTS ] 表名;

删除指定表, 并重新创建表

个人理解:将一个表内的数据清空;
TRUNCATE TABLE 表名;

DML

DML 英文全称是 Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进 行增、删、改操作。

  • 添加数据(INSERT)
  • 修改数据(UPDATE)
  • 删除数据(DELETE)

添加数据

# 给指定字段添加数据
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 条件 ] ;

删除数据

DELETE FROM 表名 [ WHERE 条件 ] ;

DQL

DQL 英文全称是 Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。 查询关键字: SELECT 在一个正常的业务系统中,查询操作的频次是要远高于增删改的,当我们去访问企业官网、电商网站, 在这些网站中我们所看到的数据,实际都是需要从数据库中查询并展示的。而且在查询的过程中,可能还会涉及到条件、排序、分页等操作。

基本语法

DQL 查询语句,语法结构如下:

SELECT
    字段列表
FROM
    表名列表
WHERE
    条件列表
GROUP BY
    分组字段列表
HAVING
    分组后条件列表
ORDER BY
    排序字段列表
LIMIT
    分页参数

基础查询

# 按字段查询
SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;

# 查询所有字段
SELECT * FROM 表名 ;

字段设置别名

SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;

SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;

去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;

条件查询

语法

SELECT 字段列表 FROM 表名 WHERE 条件列表 ;

条件

常用的比较运算符如下:

操作符 描述
= 等号,检测两个值是否相等,如果相等返回 true
<>, != 不等于,检测两个值是否相等,如果不相等返回 true
> 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回 true

常用的逻辑运算符如下:

逻辑运算符 功能
AND 或 && 并且 (多个条件同时成立)
OR
NOT 或 ! 非 , 不是

聚合函数

将一列数据作为一个整体,进行纵向计算 。 常见的聚合:

函数 功能
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和
注意 : NULL 值是不参与所有聚合函数运算的。

语法:

SELECT 聚合函数(字段列表) FROM 表名 ;

分组查询

语法:

SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组
后过滤条件 ];

where 与 having 区别:

  • 执行时机不同:where 是分组之前进行过滤,不满足 where 条件,不参与分组;而 having 是分组之后对结果进行过滤。
  • 判断条件不同:where 不能对聚合函数进行判断,而 having 可以。
注意事项: • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。 • 执行顺序: where > 聚合函数 > having 。 • 支持多字段分组, 具体语法为 : group by columnA,columnB

排序查询

语法:

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;

排序方式:

  • ASC : 升序(默认值)
  • DESC: 降序
注意事项:如果是升序, 可以不指定排序方式 ASC ;如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;

分页查询

语法:

SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
注意事项:起始索引从 0 开始,起始索引 = (查询页码 - 1)* 每页显示记录数。分页查询是数据库的方言,不同的数据库有不同的实现,MySQL 中是 LIMIT。如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。

DCL

DCL 英文全称是 Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。

管理用户

查询用户

select * from mysql.user;
其中 Host 代表当前用户访问的主机, 如果为 localhost, 仅代表只能够在当前本机访问,是不可以远程访问的。 User 代表的是访问该数据库的用户名。在 MySQL 中需要通过 Host 和 User 来唯一标识一个用户。

创建用户

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

修改用户密码

ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;

删除用户

DROP USER '用户名'@'主机名' ;
注意事项:在 MySQL 中需要通过用户名@主机名的方式,来唯一标识一个用户。主机名可以使用 % 通配。这类 SQL 开发人员操作的比较少,主要是 DBA( Database Administrator 数据库管理员)使用。

权限控制

MySQL 中定义了很多种权限,但是常用的就以下几种:

权限 说明
ALL, ALL PRIVILEGES 所有权限
SELECT 查询数据
INSERT 插入数据
UPDATE 修改数据
DELETE 删除数据
ALTER 修改表
DROP 删除数据库/表/视图
CREATE 创建数据库/表

上述只是简单罗列了常见的几种权限描述,其他权限描述及含义,可以直接参考官方文档

查询权限

SHOW GRANTS FOR '用户名'@'主机名' ;

授予权限

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';

撤销权限

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意事项:多个权限之间,使用逗号分隔授权时, 数据库名和表名可以使用 * 进行通配,代表所有。