Structured Query Language 结构化查询语言
RDBMS
Relational Database Management System 关系型数据库管理系统
CREATE USER 'name'@'localhost' IDENTIFIED BY PASSWORD '*password';
GRANT ALL PRIVILEGES ON *.* TO 'name'@'localhost';
# 选择数据库
USE db_name;
# 设置使用的字符集
SET names utf8;
CREATE TABLE table_name
(
-- SQL Server / Oracle 直接使用 UNIQUE 和 PRIMARY KEY, FOREIGN KEY, CHECK
primary_keyname int NOT NULL AUTO_INCREMENT
[UNIQUE|PRIMARY KEY|FOREIGN KEY REFERENCES tbl_nm2(col_nm)],
column_name1 data_type(size) constraint_name,
col_nm varchar(255) NOT NULL,
-- 默认值
col_nm2 varchar(255) DEFAULT 'default_value'|GETDATE(),
-- 索引
UNIQUE (column_name),
-- 多列
CONSTRAINT index_name UNIQUE|PRIMARY KEY (col1, col2),
-- 主键
PRIMARY KEY (primary_key),
-- 通过 CONSTRAINT 定义多列
-- 外键
[CONSTRAINT index_name] FOREIGN KEY (col_nm) REFERENCES table_name2(col_nm),
-- 限制
[CONSTRAINT index_name] CHECK (primary_key > 0 AND col_nm = 'value')
);
CREATE TABLE new_table
AS
SELECT * FROM old_table;
ALTER TABLE table_name
ADD|MODIFY column_name data_type(size) constraint_name;
-- 修改数据类型
ALTER TABLE table_name
ALTER COLUMN column_name data_type(size) constraint_name;
ALTER TABLE table_name
AUTO_INCREMENT = number;
-- 设置
ALTER TABLE table_name
ALTER column_name SET DEFAULT 'default_value';
-- 撤销
ALTER TABLE table_name
ALTER column_name DROP DEFAULT;
ALTER TABLE table_name
DROP COLUMN column_name;
TRUNCATE TABLE table_name;
| 约束 |
描述 |
| NOT NULL |
不能存储 NULL |
| UNIQUE |
唯一得值 |
| PRIMARY KEY |
NOT NULL 和 UNIQUE 的结合 |
| FOREIGN KEY |
外键 |
| CHECK |
值符合条件 |
| DEFAULT |
默认值 |
| 数据类型 |
描述 |
备注 |
| CHARACTER(n) |
固定长度 n |
最多 255 个字符 |
| CHAR |
同上 |
|
| VARCHAR(n) |
最大长度 n |
最多 255 个字符 |
| 数据类型 |
描述 |
| BINARY(n) |
固定长度 n |
| VARBINARY(n) |
最大长度 n |
| 数据类型 |
描述 |
| BOOLEAN |
TRUE 或者 FALSE |
| 数据类型 |
描述 |
| INTERGER(p) |
精度 p 默认 10 |
| SMALLINT |
精度 5 |
| BIGINT |
精度 19 |
| 数据类型 |
描述 |
| DECIMAL(p, s) |
精度 p 小数位 s |
| NUMERIC |
精度 5 |
| 数据类型 |
描述 |
| FLOAT(p) |
尾数精度 p 默认 16 |
| DOUBLE(size, d) |
size 最大位数 d 小数位 |
| REAL |
尾数精度 7 |
| 数据类型 |
描述 |
| DATE |
精度 p 小数位 s |
| TIME |
精度 5 |
| TIMESTAMP |
年月日时分秒 |
| 数据类型 |
描述 |
| INTERVAL |
区间 |
| ARRAY |
固定长度的有序集合 |
| MULTISET |
年月日时分秒 |
| XML |
存储 XML |
| 数据类型 |
描述 |
| TINYTEXT |
最多 255 个字符 |
| TEXT |
最多 65535 个字符 |
| MEDIUMTEXT |
最多 16,777,215 个字符 |
| LONGTEXT |
最多 4,294,967,295 个字符 |
| 数据类型 |
描述 |
| BLOB |
最多 65535 字节 |
| MEDIUMBLOB |
最多 16,777,215 字节 |
| LONGBLOB |
最多 4,294,967,295 字节 |
| 数据类型 |
描述 |
| ENUM(x, y, z, etc.) |
最多 65535 个值 |
| SET |
最多 64 个列表项目 |
| 数据类型 |
描述 |
备注 |
| TINYINT |
带符号 -128 到 127,无符号 0 至 255 |
|
| SMALLINT(size) |
带符号 -32,768 到 32,767,无符号 0 至 65,535 |
size 默认 6 |
| MEDIUMNINT(size) |
带符号 -8,388,608 到 8,388,607,无符号 0 至 16,777,215 |
size 默认 9 |
| INT(size) |
带符号 -2,147,483,648 到 2,147,483,647, 无符号 0 至 4,294,967,295 |
size 默认 11 |
| BIGINT(size) |
带符号 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807, 无符号 0 至 18,446,744,073,709,551,615 |
size 默认 20 |
例如值为 10
int(9) 显示结果为 000000010
int(3) 显示结果为 010
显示长度不一样,都占用 4 个字节
| 数据类型 |
描述 |
| DATE |
1000-01-01 至 9999-12-31 |
| DATETIME |
同上 |
| TIMESTAMP |
UTC 1970-01-01 00:00:01 至 2038-01-09 03:14:07 |
| TIME |
-838:59:59 至 838:59:59 |
| YEAR |
4 位 1901 至 2155,2 位 (19)70 至 (20)69 |
CREATE [OR REPLACE] VIEW view_name AS
SELECT column_name
FROM table_name
WHERE condition;
CREATE [UNIQUE] INDEX index_name
ON table_name (column_name1, column_name2);
ALTER TABLE table_name
ADD UNIQUE (column_name);
ALTER TABLE table_name
DROP INDEX|FOREIGN KEY|CHECK index_name;
-- MySQL
ALTER TABLE table_name
DROP PRIMARY KEY;
-- SQL Server / Oracle
ALTER TABLE table_name
DROP CONSTRAINT index_name;
-- 无需指定列名
INSERT INTO table_name
VALUES (value1, value2, ...);
-- 指定列名
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
-- 使用 SET
INSERT INTO table_name
SET column1 = value1, column2 = value2;
INSERT INTO table2 [(column_name)]
SELECT *, column_name FROM table1;
-- 没有数据返回则创建空表
SELECT *
INTO new_table
FROM old_table
[WHERE 1 = 0];
SELECT [DISTINCT] *, column_name, column_name AS alias_col,
CONCAT(column1, '_', column2) AS alias_column
FROM table_name [AS] alias_tbl
WHERE alias_tbl.column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
ORDER BY column_name, column_name [ASC|DESC]
LIMIT number;
-- MySQL
SELECT column_name
FROM table_name
LIMIT [offset, ]number;
-- SQL Server
SELECT TOP number PERCENT column_name
FROM table_name;
-- Oracle
SELECT column_name
FROM table_name
WHERE ROWNUM <= number;
| 运算符 |
|
描述 |
示例 |
| = |
|
等于 |
|
| <> |
!= |
不等于 |
|
| > |
|
大于 |
|
| < |
|
小于 |
|
| >= |
|
大于等于 |
|
| <= |
|
小于等于 |
|
| BETWEEN |
|
范围内 |
BETWEEN value1 AND value2 |
| LIKE |
|
搜索 |
LIKE 'prefix%' |
| IN |
|
指定列的多个值 |
IN (value1, value2, ...) |
| AND |
|
并 |
|
| OR |
|
或 |
|
| NOT |
|
|
|
| REGEXP |
|
|
REGEXP '^[ABc]' |
| 通配符 |
描述 |
示例 |
| % |
替代 0 个或多个字符 |
|
| _ |
替代一个字符 |
|
| [charlist] |
列中的任一字符 |
[abc] 或 [a-c] |
| [^charlist] 或 [!charlist] |
不在列中的任一字符 |
|
| 操作符 |
描述 |
| IS [NOT] NULL |
是否为 NULL |
| [NOT] EXISTS |
是否有记录 |
SELECT *
FROM table_name
INNER JOIN tbl_name
ON tbl_name.col = table_name.column_name;
| 连接 |
描述 |
| [INNER] JOIN |
表中有至少一个匹配 |
| LEFT [OUTER] JOIN |
即使右表没有匹配 |
| RIGHT [OUTER] JOIN |
即使左表没有匹配 |
| FULL [OUTER] JOIN |
其中一个表存在匹配 |
-- UNION ALL 允许重复的值
SELECT column_name
FROM table1
WHERE ...
UNION [ALL]
SELECT column_name
FROM table12
WHERE ...
ORDER BY column_name;
UPDATE table_name
SET column1 = value1, column2 = value2, ...
[WHERE some_column = some_value];
DELETE [*] FROM table_name
[WHERE some_column = some_value];
| 函数名 |
描述 |
示例 |
| NOW() |
当前的日期和时间 |
2021-04-18 06:41:49 |
| CURDATE() |
当前的日期 |
2021-04-18 |
| CURTIME() |
当前的时间 |
06:41:49 |
| DATE(datetime) |
提取日期 |
|
| EXTRACT(unit FROM datetime) |
返回部分 |
|
| DATE_ADD(datetime, INTERVAL expr type) |
添加时间间隔 |
|
| DATE_SUB(datetime, INTERVAL expr type) |
减去时间间隔 |
|
| DATEDIFF(date1, date2) |
时间差 |
|
| DATE_FORMAT(date, format) |
格式化 |
DATE_FORMAT(NOW(), '%Y-%m-%d') |
| Unit / Type |
描述 |
| YEAR |
|
| MONTH |
|
| DAY |
|
| 格式 |
描述 |
| a |
缩写星期名 |
| b |
缩写月名 |
| c |
月,数值 |
| D |
带有英文前缀的月中的天 |
| d |
月的天,数值(00-31) |
| 函数名 |
备注 |
| IFNULL(old_value, default_value) |
|
| COALESCE() |
同上 |
| ISNULL() |
SQL Server |
| NVL() |
Oracle |
| 函数名 |
描述 |
| AVG(column_name) |
平均值 |
| COUNT([DISTINCT] column_name) |
匹配的行数,NULL 不计入 |
| FIRST(column_name) |
仅 Access 支持 |
| LAST |
同上 |
| MAX(column_name) |
最大值 |
| MIN(column_name) |
最小值 |
| SUM(column_name) |
总和 |
| 函数名 |
描述 |
| UCASE(column_name) |
转为大写 |
| LCASE |
转为小写 |
| MID(column_name, start [, length]) |
提取字符,start 起始值 1 |
| SubString |
|
| LENGTH(column_name) |
长度 |
| ROUND(column_name,decimals) |
小数位,默认保留 0 位 |
| NOW |
|
| FORMAT(column_name,format) |
|