# SQL 简介
SQL(Structured Query Language),结构化查询语言,用于访问和处理数据库的标准的计算机语言
SQL 语法特征:
-
大小写不敏感
-
可以单行或多行书写,最后以
;
号结束 -
支持单行、多行注释:
- 单行注释:
-- 注释内容
(-- 后面一定要有一个空格) - 单行注释:
# 注释内容
(# 后面可以不加空格,但推荐加上) - 多行注释:
/* 注释内容 */
- 单行注释:
根据 SQL 语句的功能,可将其分为四类:
-
数据定义:DDL(Data Definition Language)
- 库的创建删除、表的创建删除等
-
数据操纵:DML(Data Manipulation Language)
- 新增数据、删除数据、修改数据等
-
数据控制:DCL(Data Control Language)
- 新增用户、删除用户、密码修改、权限管理等
-
数据查询:DQL(Data Query Language)
- 基于需求查询和计算数据
# DDL
# 数据库操作
查看所有数据库
show databases; |
查看当前使用的数据库
select database(); |
创建数据库
create database 数据库名 charset utf8; |
删除数据库
drop database 数据库名; |
使用数据库
use 数据库名; |
# 表操作
查看数据库中所有表(需要先选择数据库)
show tables; |
查看表结构
desc 表名; |
创建表
create table 表名( | |
列名 列类型 [约束条件], | |
列名 列类型 [约束条件], | |
... | |
); |
[]
表示可选的内容
其中,列类型有:
int
:整数float
:浮点数varchar(长度)
:文本(长度填写整数类型,用于限制文本长度,可填的最大数字为 255)date
:日期类型timestamp
:时间戳类型
修改表–添加字段
alter table 表名 add 列名 类型; |
修改表–修改字段–重命名版
alert table 表名 change 原名 新名 类型及约束; |
修改表–修改字段–不重命名
alter table 表名 modify 列名 类型及约束; |
删除表–删除字段
alter table 表名 drop 列名; |
删除表
drop table 表名; | |
# 如果表存在,则删除;如不存在,则跳过 | |
drop table if exists 表名; |
有些数据库系统不支持
if exists
选项,支持if exists
选项的有:MySQL,PostgreSQL 和 SQL Server 2016
查看表的创建语句–详细过程
show create table 表名; |
# DML
# 数据插入
全列插入:值的顺序与表结构字段的顺序完全对应,此时可以省略列名的列表
insert into 表名 values (...); |
部分列插入:值的顺序与给出的列名顺序对应
insert into 表名 (列1, 列2, ...) values (值1, 值2, ...); |
全列多行插入
insert into 表名 values (...), (...), ...; |
部分列多行插入
insert into 表名 (列1, 列2, ...) values (值1, 值2, ...), (值1, 值2, ...), ...; |
注意:如果数据是字符型,必须使用单引号或双引号包围
例如:
# 创建名为 test 的数据库 | |
create database test charset UTF8; | |
# 使用名为 test 的数据库 | |
use test; | |
# 创建表 | |
create table student( | |
id int, | |
name varchar(10), | |
age int | |
); | |
# 为 id 列插入多行数据 | |
insert into student(id) values(1), (2), (3); | |
# 为 id 列和 name 列插入多行数据 | |
insert into student(id, name) values(4, 'Ellon'), (5, 'John'); | |
# 为全部列插入数据 | |
insert into student values(6, 'Ale', 20); |
# 数据删除
清空表(删除整个表中的数据)
delete from 表名; |
按特定条件删除数据
delete from 表名 where 条件; |
例如:
# 删除 id 为 3 的行 | |
delete from student where id = 3; |
# where
where
后面跟条件语句,以进行条件处理
条件语句支持以下运算符:
- 比较运算符
- 等于:
=
- 大于:
>
- 大于等于:
>=
- 小于:
<
- 小于等于:
<=
- 不等于:
!=
或<>
- 等于:
- 逻辑运算符
- 与:
and
- 或:
or
- 非:
not
- 与:
- 使用 like 关键字的模糊查询
%
通配符:表示任意多个任意字符_
通配符:表示一个任意字符
- 范围查询
- 连续范围查询:
between ... and ...
- 非连续范围查询:
in(... , ...)
- 连续范围查询:
- 空判断
- 判断为空:
is null
- 判断不为空:
is not null
- 判断为空:
条件的优先级:
- 优先级由高到低的顺序为:小括号,
not
,比较运算符,逻辑运算符 and
比or
先运算(如果同时出现并希望先算or
,需要结合()
使用)
参考资料:
# 数据修改
update 表名 set 列名 = 值 [where 条件]; |
例如:
# 将 id 为 2 所对应的 name 修改为 Mike | |
update student set name = 'Mike' where id = 2; |
update 表名 set 列名 = 值
会修改整列的数据
# DQL
# 基础查询
查询所有列
select * from 表名; |
查询指定列
select 列1,列2,... from 表名; |
条件查询
select 列1,列2,... from 表名 where 条件; |
例如:
# 查询 id 和 name 两列,年龄小于 35 | |
select id, name from student where age >= 18 and age < 35; |
# 分组聚合
select 字段, 聚合函数 from 表名 [where 条件] group by 列名; |
聚合函数:
- 求和:
sum(列)
- 求平均值:
avg(列)
- 求最小值:
min(列)
- 求最大值:
max(列)
- 求数量:
count(列/*)
注意:
- 一条 SQL 查询语句可以写多个聚合函数,以同时展示多个统计信息
- 除了聚合函数外,
select 字段
中的 字段 只能包含GROUP BY 列名
中出现的 列名
例如:
create table person( | |
id int, | |
name varchar(10), | |
age int, | |
gender varchar(10) | |
); | |
insert into person values(1, 'Tom', 23, 'male'), (2, 'Jerry', 22, 'male'), | |
(3, 'Morty', 21, 'male'), (4, 'Rick', 26, 'male'), (5, 'Marry', 23, 'female'), (6, 'Angel', 22, 'female'); | |
# 按性别分组,统计各组人数 | |
select gender, count(*) from person group by gender; | |
# 按性别分组,统计平均年龄 | |
select gender, avg(age) from person group by gender; | |
# 按性别分组,统计最大年龄和最小年龄 | |
select gender, max(age), min(age) from person group by gender; |
# 排序分页
# 结果排序
可以对查询的结果使用 order by
关键字,指定某个列进行排序
select 列|聚合函数|* from 表名 | |
where ... | |
group by ... | |
order by ... [asc / desc]; |
其中:
- 升序(默认):
asc
- 降序:
desc
例如:
# 显示 age > 22 的所有数据(按 age 列降序排列) | |
select * from person where age > 22 order by age desc; |
# 结果分页
可以使用 limit
关键字,对查询结果进行数量限制或者分页显示
select 列|聚合函数|* from 表名 | |
where ... | |
group by ... | |
order by ... [asc / desc] | |
limit n[, m]; |
其中:
n
表示:显示n
条数据n, m
表示:跳过前n
条数据,显示后续的m
条数据
注意:
select
和from
是必写的,where
、group by
、order by
、limit
均可按需求省略- 执行顺序:from ->
where
->group by
和聚合函数 ->select
->order by
->limit
limit
后面不可以直接加公式
例如:
# 按 age 列升序排列,查询结果只保留 5 条数据 | |
select * from person limit 5; | |
# 筛选出年龄最大的 5 人 | |
select * from person order by age desc limit 5; | |
# 按 age 列升序排列,查询结果只保留从第 3 条开始的 2 条数据 | |
select * from person order by age limit 2, 2; |
参考资料: