SQL
(Structured Query Language)结构化查询语言,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。
语法
SQL
语句可以单行或多行书写,以;
为结束标记SQL
可以使用空格或缩进来增强语句的可读性SQL
分单行注释(-- 注释内容 或 # 注释内容)和多行注释(/* 注释内容 */)MySQL
中SQL
中的语句不区分大小写(建议关键字大写)
分类
SQL
语句,按其功能可划分为4类:DDL、DML、DQL、*DCL。
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库、表、字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据表中的数据进行增、删、改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Langage | 数据控制语言,用来创建数据库用户,控制数据库的访问权限 |
DDL
DDL(Data Definition language),数据定义语言,用来定义数据库对象(数据库、表、字段)。
数据库操作常见命令:
# 查询所有数据库
show databases;
# 查询当前数据库
select database();
# 创建数据库
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];
# 删除数据库
drop database [if exists] 数据库名;
# 切换数据库
use 数据库名;
数据表操作常见命令
# 查询当前数据库中所有表
show tables;
# 查看表结构 (可查看到指定表的字段、字段类型、是否为null,是否存在默认值等信息)
desc 表名;
# 查看建表语句 (查看指定表的建表语句,而部分默认值参数在建表时未指定也会查询到,如存储引擎、字符集等)
show create table 表名;
# 创建表
create table 表名(
字段1 字段1类型 [comment 注释],
字段2 字段2类型 [comment 注释],
...
) [comment 表注释];
# 修改表名
alter talbe 旧表名 rename to 新表名;
# 删除表
drop table [if exists] 表名;
# 清空表 (先删除表,然后重新创建表)
truncate table 表名;
# 添加字段
alter table 表名 add 字段名 字段类型 [comment 注释] [约束];
# 修改数据类型
alter table 表名 modify 字段名 字段类型;
# 修改字符名和字段类型
alter table 表名 change 旧字段名 新字段名 字段类型 [comment 注释] [约束];
# 删除字段
alter table 表名 drop 字段名;
DML
DML(Data Manipulation language),数据操作语言,用来对数据表的数据记录进行增、删、改操作。
- 添加数据 (INSERT)
- 修改数据(UPDATE)
- 删除数据(DELETE)
添加数据常用命令:
# 给全部字段添加数据
insert into 表名 values(值1, 值2, ...);
# 给指定字段添加数据
insert into 表名 (字段1, 字段2, ...) values (值1, 值2, ...);
# 批量插入数据
insert into 表名 values(值1, 值2, ...),(值1, 值2, ...), ...;
insert into 表名 (字段1, 字段2, ...) values(值1, 值2, ...),(值1, 值2, ...), ...;
注意:
- 插入数据时,指定的字段顺序需与值的顺序一一对应
- 字符串和日期类型的数据应该包含在引号中
- 插入的数据大小,应在字段的规定范围内
修改数据常用命令:
update 表名 set 字段1 = 值1, 字段2 = 值2, ... [where 条件];
注意:
修改数据时,where条件可以没有,没有表示修改整张表的数据
删除数据常用命令:
delete from 表名 [where 条件];
注意:
- 删除数据时,where条件可以没有,没有表示删除整张表的数据
- 不能删除某一个字段的值
DQL
DQL(Data Query language),数据查询语言,用来查询数据库中表的记录。其结构语法如下:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
可将上述语法进行拆分,分为:
- 基础查询(不带任何掉件)
- 条件查询(where)
- 聚合函数(count、max、min、avg、sum)
- 分组查询(group by)
- 排序查询(order by)
- 分页查询(limit)
执行顺序
基础查询
# 查询全部字段
select * from 表名;
# 查询指定字段
select 字段1, 字段2, ... from 表名;
# 查询并给字段设置别名
select 字段1 [as] 别名1, 字段2 [as] 别名2, ... from 表名;
# 去重
select distinct 字段列表 from 表名;
条件查询
语法
select 字段列表 from 表名 where 条件列表;
条件
运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
between … and … | 在某个范围内(含最小、最大值) |
in(…) | 在其列表中,多选一 |
like 占位符 | 模糊匹配(_ 匹配单个字符,* 匹配人一个字符) |
is null | 是 null |
is not null | 不是 null |
and 或 && | 且(多个条件同时成立) |
or 或 || | 或(多个条件任意一个成立) |
not 或 ! | 非 |
聚合函数
聚合函数即将一列数据作为一个整体,进行纵向计算。
语法
select 聚合函数(字段列表) from 表名;
常见聚合函数
函数 | 功能 |
---|---|
count | 统计数量 |
max | 计算最大值 |
min | 计算最小值 |
avg | 计算平均值 |
sum | 求和 |
注意:
null值不参与任何的聚合函数计算
分组查询
语法
select 字段列表 from 表名 [where 条件] group by 分组字段列表 [having 分组后过滤条件];
where与having区别
- 执行时机不同。where是分组前进行过滤,不满足即不参与分组;having是分组后对结果进行过滤
- 判断条件不同。where不能对聚合函数进行判断,而having可以
注意:
- 分组后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
- 执行顺序:where > 聚合函数 > having
- 支持多字段分组
排序查询
排序分为升序(ASC
)和降序(DESC
),默认为升序。
语法
select 字段列表 from 表名 order by 字段1 排序方式, 字符2 排序方式, ...
注意:
- 若是升序,可以不指定排序方式ASC
- 若是多字段排序,当前面字段值相同后,才会根据后面的字段进行排序
分页查询
语法
select 字段列表 from 表名 limit 起始索引,查询记录数;
注意:
- 起始索引从0开始,起始索引 = (查询页码 - 1) * 每页显示记录数
- 分页查询是数据库的方言,不同的数据库有不同的实现。MySQL中是 limit
- 若查询第一页数据,起始索引可以省略
DCL
DCL(Data Control language),数据控制语言,用来管理数据库用户、控制数据表的访问权限。
管理用户
# 创建用户
create user '用户名'@'主机名' identified by '密码';
# 修改密码
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
# 删除用户
drop user '用户名'@'主机名'
注意:
- 在MySQL中通过
用户名@主机名
的方式来标识唯一用户 - 主机名可通过
%
匹配
权限控制
MySQL中定义多种权限,常用以下几种:
权限 | 说明 |
---|---|
all, all privileges | 所有权限 |
select | 查询数据权限 |
insert | 插入数据权限 |
update | 修改数据权限 |
alter | 修改表权限 |
drop | 删除数据库/表/视图权限 |
create | 创建数据库/表权限 |
以上只罗列了常见的几种权限,其它权限可参考官方文档。
# 查询用户拥有的权限
show grants for '用户名'@'主机名';
# 授予权限
grant 权限列表 on 数据库.数据表 to '用户名'@'主机名';
# 撤销权限
remove 权限列表 数据库.数据表 to '用户名'@'主机名';
注意:
- 多个权限之间,可用
;
进行分割 - 授权时,数据库和数据表名可使用
*
进行匹配,表示所有