# 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 ,比较运算符,逻辑运算符
  • andor 先运算(如果同时出现并希望先算 or ,需要结合 () 使用)

参考资料:

# 数据修改

update 表名 set 列名 =[where 条件];

例如:

# 将 id 为 2 所对应的 name 修改为 Mike
update student set name = 'Mike' where id = 2;

update 表名 set 列名 = 值 会修改整列的数据

# DQL

# 基础查询

查询所有列

select * from 表名;

查询指定列

select1,列2... from 表名;

条件查询

select1,列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 条数据

注意:

  • selectfrom 是必写的, wheregroup byorder bylimit 均可按需求省略
  • 执行顺序: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;

参考资料: