建站提交历史文章,原文写作时间 2023 年 5 月 18 日前后。

SQL 语法

本篇介绍 SQL 通用语法,并这里以 MySQL 为例,首先注意 MySQL 不区分大小写,包括字符串不区分大小写。

其次 SQL 具有多版本语法,略有不同,请注意区分。

数据定义语句 DDL

其中包含一些如 SHOWMysql 语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SHOW DATABASES;  -- 显示所有数据库

CREATE DATABASE {db}; -- 创建新的数据库

USE {db}; -- 设置活动数据库

DROP DATABASE {db}; -- 删除该数据库

SHOW TABLES; -- 显示所有数据表

CREATE TABLE {tb} ({field1} {type1} {addition1}, ...); -- 创建数据表
-- e.g. CREATE TABLE student (id int, name varchar(255), birth date);

-- 增删列, COLUMN 可缺省
ALTER TABLE {tb} ADD [COLUMN] {field1} {type1} {addition1};
ALTER TABLE {TB} DROP [COLUMN] {field1};

TRUNCATE TABLE {tb}; -- 清空表记录
-- equal to. DELETE FROM {tb} WHERE True;

DROP TABLE {tb}; -- 删除数据表

CREATE TABLE 的修饰词包括:

修饰词 描述 示例
IF NOT EXISTS 不存在时创建 CREATE TABLE IF NOT EXISTS student (id int);
PRIMARY KEY 主键(至多一个) CREATE TABLE student (id int KEY);
UNIQUE 不可重复(可空) CREATE TABLE student (id int UNIQUE);
NOT NULL 不可为空 CREATE TABLE student (id int NOT NULL);
AUTO_INCREMENT 自增(必须为主键) CREATE TABLE student (id int KEY AUTO_INCREMENT);

常用数据类型

数据类型 表达式 描述
布尔型 bit [ 0, 1 ][~0,~1~]
整型 bigint [ 263, 2631 ][~-2^{63},~2^{63}-1~]
int [ 231, 2311 ][~-2^{31},~2^{31}-1~]
smallint [ 32768, 32767 ][~-32768,~32767~]
tinyint [ 128, 127 ][~-128,~127~]
实型 decimal(size=10, d=0) 高精度十进制,size 为总十进制位数,d 为小数十进制位数。
float 单精度
double 双精度
字符串 char(size) 定长字符串,size 为字符串长度。适合存储短字符串和定长字符串。
varchar(size) 变长字符串,size为字符串最长长度。
text 变长字符串,无需指定 size ,当 varchar(size) 过大时会自动转换为 text ,查询时不区分大小写。
blob 变长二进制,无需指定 size,与 text 类似,但直接存储二进制,区分大小写。
日期型 date 日期,格式 YYYYmmddYYYY-mm-dd ,部分版本检测日期错误,YYYY <0 或 >9999 非法。
time 时间,格式 HHMMSSHH:MM:SS ,部分版本检测时间错误,HH <0 或 >23 非法。
datetime 日期时间,格式 YYYY-mm-dd HH:MM:SSYYYYmmddHHMMSS,部分版本检测错误。

数据操作语句 DML

插入数据

1
2
3
4
5
6
7
-- 插入数据 VALUES(...) 到 tb, VALUES 中的值必须与 tb 字段有序对应
INSERT INTO {tb} VALUES ({value1}, ...);
-- INSERT INTO student VALUES (1, "Jamhus Tao", 20000229);

-- 插入数据 VALUES(...) 到 tb, VALUES 中的值必须与 tb(...) 中给出的字段有序对应
INSERT INTO {tb} ({field1}, ...) VALUES ({value1}, ...);
-- INSERT INTO student (id, name) VALUES (1, "Jamhus Tao");

查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 查找全部记录
SELECT * FROM {tb};
-- SELECT * FROM student;

-- 查找全部记录的指定列
SELECT {field1}[, ...] FROM {tb};
-- SELECT name, birth FROM student;

-- 查找记录去除重复值
SELECT DISTINCT ... FROM {tb};

-- 查找两个表的笛卡尔积
SELECT {tb1}.{field1}[, ...] FROM {tb1}, {tb2}[, ...];

更改数据

1
2
3
-- 更新 tb1 中满足 condition1 的记录, 更新执行多个 {field} = {value} 指令
UPDATE {tb1} SET {field1} = {value1}[, ...] WHERE {condition1};
-- UPDATE student SET name = "Mike", birth = 19991231 WHERE name = "Jamhus Tao" and birth = 20000229;

删除数据

1
2
3
-- 删除 tb1 中满足 condition1 的记录
DELETE FROM {tb} WHERE {condition1};
-- DELETE FROM student WHERE id = 1;

子句

WHERE 筛选

1
2
3
... WHERE {condition};
-- SELECT * FROM student WHERE name = "Jamhus Tao";
-- 除 INSERT INTO 均可使用 WHERE 筛选

表达式的运算符包括:

操作符 描述 示例 补充
= <> > < >= <= 比较运算符 WHERE id <= 10 在某些 SQL 版本中,<> 可作 !=
NOT AND OR 逻辑运算符 WHERE NOT name = "Jamhus Tao"
IN 多值查找 WHERE id IN (1, 2)
BETWEEN 区间比较 WHERE name BETWEEN "a" AND "b" 如果使用字符串表示字典序,忽略大小写,含边界。
LIKE 模式匹配 WHERE birth LIKE "2000-%-%" % 匹配多字符(0\ge 0)、_ 匹配单字符。

ORDER BY 排序

只有 SELECT FROM 可以使用 ORDER BY 排序,ORDER BY 必须放在最后。

1
2
3
4
... ORDER BY {field1} [ASC|DESC][, ...]
-- SELECT * FROM student ORDER BY id; # 按 id 升序排序, 默认均使用升序排列
-- SELECT * FROM student ORDER BY name ASC, birth DESC; # 首要按 name 升序排序, 次要按 birth 降序排序
-- 只有 SELECT FROM 可使用 ORDER BY 排序

AS 别名

1
2
3
4
... {tb} [AS] {alias} ...  # 表别名, 用于快捷表示列, AS 可缺省, 使用了别名就不能使用原名
-- SELECT s.name, c.name FROM student AS s, course AS c;
... {field} [AS] {alias} ... # 列别名, 用于自定义输出列名, AS 可缺省
-- SELECT student.name AS student, course.name AS course FROM student, course;