SQL 语法
本篇介绍 SQL 通用语法,首先注意 SQL 不区分大小写,包括字符串不区分大小写。
其次 SQL 具有多版本语法,略有不同,请注意区分。
数据库控制语句
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);
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 / 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~] [ 0, 1 ] |
整型 | bigint | [ − 2 63 , 2 63 − 1 ] [~-2^{63},~2^{63}-1~] [ −263, 263−1 ] |
int | [ − 2 31 , 2 31 − 1 ] [~-2^{31},~2^{31}-1~] [ −231, 231−1 ] | |
smallint | [ − 32768 , 32767 ] [~-32768,~32767~] [ −32768, 32767 ] | |
tinyint | [ − 128 , 127 ] [~-128,~127~] [ −128, 127 ] | |
实型 | decimal(size=10, d=0) | 高精度十进制,size 为总十进制位数,d 为小数十进制位数。 |
float | 单精度 | |
double | 双精度 | |
字符串 | char(size) | 定长字符串,size 为字符串长度。 |
varchar(size) | 变长字符串,size 为字符串最长长度。 | |
text | 变长字符串,无需指定 size ,当 varchar(size) 过大时会自动转换为 text 。 | |
日期型 | date | 日期,格式 YYYYmmdd 或 YYYY-mm-dd ,部分版本检测日期错误,YYYY <0 或 >9999 非法。 |
time | 时间,格式 HHMMSS 或 HH:MM:SS ,部分版本检测时间错误,HH <0 或 >23 非法。 | |
datetime | 日期时间,格式 YYYY-mm-dd HH:MM:SS 或 YYYYmmddHHMMSS ,部分版本检测错误。 |
增删改查
插入数据
INSERT INTO <tb> VALUES (<value1>, ...); # 插入记录
# INSERT INTO student VALUES (1, "Jamhus Tao", 20000229);
INSERT INTO <tb> (<field1>, ...) VALUES (<value1>, ...); # 插入记录,仅添加指定列
# INSERT INTO student (id, name) VALUES (1, "Jamhus Tao");
查询数据
SELECT * FROM <tb>; # 查找全部记录
# SELECT * FROM student;
SELECT <field1>, ... FROM <tb>; # 查找全部记录的指定列
# SELECT name, birth FROM student;
SELECT DISTINCT ... FROM <tb>; # 查找记录去除重复值
SELECT <tb1>.<field1>, ... FROM <tb1>, ...; # 查找两个表的笛卡尔积
更改数据
UPDATE <tb> SET <field1> = <value1>, ... WHERE <condition>;
# UPDATE student SET name = "Mike", birth = 19991231 WHERE name = "Jamhus Tao" and birth = 20000229;
删除数据
DELETE FROM <tb> WHERE <condition>;
# DELETE FROM student WHERE id = 1;
修饰词
WHERE 筛选
... 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-%-%" |
ORDER BY 排序
... 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 别名
... <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;