Skip to content

SQL 速查

本指南提供了常见 SQL 语句及其现代语法的快速参考。请注意,不同数据库管理系统(DBMS),如 MySQL、PostgreSQL、SQL Server、Oracle 等之间,具体的语法细节有时可能略有差异。

SQL 语句 | 语法 / 示例

AND / OR 运算符 用于在 WHERE 子句中组合多个条件。

SELECT column1, column2
FROM table_name
WHERE condition1 AND condition2;
SELECT column1, column2
FROM table_name
WHERE condition1 OR condition2;

ALTER TABLE 修改现有表结构。

-- 添加列
ALTER TABLE table_name
ADD COLUMN column_name datatype [constraints];
-- 删除列
ALTER TABLE table_name
DROP COLUMN column_name;
-- 修改列的数据类型(语法有所不同)
-- PostgreSQL, SQL Server:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_datatype;
-- MySQL:
ALTER TABLE table_name
MODIFY COLUMN column_name new_datatype;

注意:修改列(类型、约束)很常见,但语法差异很大。添加/删除列更为标准。

AS (别名) 为表或列指定一个临时名称。

-- 列别名
SELECT column_name AS alias_name
FROM table_name;
-- 表别名(常用于 JOIN)
SELECT t1.column1, t2.column2
FROM table_name1 AS t1
JOIN table_name2 AS t2 ON t1.id = t2.fk_id;

BETWEEN 运算符 选择给定范围内的值(包含边界)。

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

CASE 表达式 允许在 SQL 语句中使用条件逻辑。

SELECT column_name,
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE result_else
END AS new_column_name
FROM table_name;

CREATE DATABASE 创建一个新数据库。

CREATE DATABASE database_name;

CREATE TABLE 创建一个新表。

CREATE TABLE table_name (
column1 datatype [constraints],
column2 datatype [constraints],
column3 datatype [constraints],
...
PRIMARY KEY (column_name_pk),
FOREIGN KEY (column_name_fk) REFERENCES other_table(other_column)
);
-- 包含常见约束的示例:
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT, -- PostgreSQL 中为 SERIAL
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
department_id INT,
salary DECIMAL(10, 2) CHECK (salary > 0),
FOREIGN KEY (department_id) REFERENCES departments(id)
);

CREATE INDEX 创建一个索引以提高查询性能。

CREATE INDEX index_name
ON table_name (column1, column2, ...);
-- 创建唯一索引
CREATE UNIQUE INDEX index_name_unique
ON table_name (column_unique);

CREATE VIEW 基于 SQL 语句的结果集创建一个虚拟表。

CREATE VIEW view_name AS
SELECT column1, column2
FROM table_name
WHERE condition;

DELETE 从表中删除行。

-- 删除特定行
DELETE FROM table_name
WHERE condition;
-- 删除所有行(请谨慎使用!)
DELETE FROM table_name;

注意:TRUNCATE TABLE 删除所有行更快,但特性不同。

DROP DATABASE 删除现有数据库(请极其谨慎使用!)。

DROP DATABASE database_name;

DROP INDEX 删除索引。

-- 常见语法 (MySQL, PostgreSQL, SQL Server)
DROP INDEX index_name ON table_name;
-- Oracle 语法
DROP INDEX index_name;
-- 较旧的 MySQL 语法(仍然可用)
-- ALTER TABLE table_name DROP INDEX index_name;

DROP TABLE 删除现有表(请极其谨慎使用!)。

DROP TABLE table_name;

EXISTS 运算符 测试子查询中是否存在任何记录。

SELECT column_name(s)
FROM table_name
WHERE EXISTS (SELECT 1 FROM another_table WHERE condition);

GROUP BY 子句 将指定列中具有相同值的行分组到汇总行中。常与聚合函数一起使用。

SELECT column_name, aggregate_function(column_to_aggregate) AS result
FROM table_name
WHERE condition -- 可选
GROUP BY column_name
ORDER BY column_name; -- 可选

HAVING 子句 过滤由 GROUP BY 创建的分组。使用它是因为 WHERE 无法对聚合函数进行过滤。

SELECT column_name, aggregate_function(column_to_aggregate) AS result
FROM table_name
GROUP BY column_name
HAVING aggregate_function(column_to_aggregate) operator value;

IN 运算符 允许你在 WHERE 子句中指定多个值。

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);
-- 也可以与子查询一起使用
WHERE column_name IN (SELECT column_from_another_table FROM another_table WHERE condition);

INSERT INTO 向表中插入新行。

-- 为所有列插入值(顺序很重要)
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
-- 为特定列插入值
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

INSERT INTO SELECT 从一个表复制数据并将其插入到另一个表中。

INSERT INTO target_table (column1, column2)
SELECT source_column1, source_column2
FROM source_table
WHERE condition;

JOIN 操作 (INNER, LEFT, RIGHT, FULL OUTER) 根据相关列组合两个或多个表中的行。

-- INNER JOIN(返回两个表中匹配的行)
SELECT columns
FROM table1
INNER JOIN table2 ON table1.common_column = table2.common_column;
-- LEFT JOIN(返回左表的所有行,右表匹配的行,否则为 NULL)
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.common_column = table2.common_column;
-- RIGHT JOIN(返回右表的所有行,左表匹配的行,否则为 NULL)
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.common_column = table2.common_column;
-- FULL OUTER JOIN(在任一表有匹配项时返回所有行,不匹配的为 NULL)
SELECT columns
FROM table1
FULL OUTER JOIN table2 ON table1.common_column = table2.common_column;

注意:某些 DBMS 使用 LEFT OUTER JOIN、RIGHT OUTER JOIN。OUTER 通常是可选的。

LIKE 运算符 用于 WHERE 子句中,在列中搜索指定模式。 通配符:%(匹配任意字符序列),_(匹配任意单个字符)。

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE 'pattern%'; -- 例如:'a%', '%xyz', '_bc%'

LIMIT / FETCH FIRST / TOP 子句 限制查询返回的行数。

-- MySQL, PostgreSQL, SQLite
SELECT column_name(s)
FROM table_name
ORDER BY column_name -- 可选,但建议使用以获得一致结果
LIMIT number_of_rows;
-- SQL Server
SELECT TOP number_of_rows_or_percent column_name(s)
FROM table_name
ORDER BY column_name; -- 可选
-- Oracle, Standard SQL (2008+)
SELECT column_name(s)
FROM table_name
ORDER BY column_name -- 可选
FETCH FIRST number_of_rows ROWS ONLY;

ORDER BY 子句 按升序(ASC - 默认)或降序(DESC)对结果集排序。

SELECT column_name(s)
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;

SELECT 从数据库中提取数据。

SELECT column1, column2, ...
FROM table_name;

SELECT * 选择表中所有列。

SELECT *
FROM table_name;

注意:出于性能和清晰度考虑,通常不建议在生产代码中使用;最好指定具体的列名。

SELECT DISTINCT 仅返回指定列的唯一(去重)值。

SELECT DISTINCT column_name(s)
FROM table_name;

SELECT INTO / CREATE TABLE AS SELECT 将数据复制到新表中。

-- SQL Server (创建 new_table)
SELECT column1, column2
INTO new_table_name
FROM old_table_name
WHERE condition;
-- 标准 SQL, PostgreSQL, MySQL, Oracle (创建 new_table)
CREATE TABLE new_table_name AS
SELECT column1, column2
FROM old_table_name
WHERE condition;

注意:PL/SQL (Oracle) 或 T-SQL (SQL Server) 中的 SELECT ... INTO variable_name 是不同的,它将值赋给变量。

TRUNCATE TABLE 快速移除表中的所有行。此操作通常比 DELETE FROM table_name 更快,并且通常不容易回滚,因为它通常是最小化记录的。在某些 DBMS 中,它还会重置自增计数器。

TRUNCATE TABLE table_name;

警告:请谨慎使用,因为它在许多系统中不可逆地删除所有数据,并且不会触发行级触发器。

UNION / UNION ALL 运算符 组合两个或多个 SELECT 语句的结果集。 UNION 移除重复行。UNION ALL 包含所有行(速度更快)。

SELECT column_name(s) FROM table1
UNION -- 或者 UNION ALL
SELECT column_name(s) FROM table2;

注意:SELECT 语句必须具有相同数量的列,并且对应列的数据类型必须兼容。

UPDATE 修改表中的现有记录。

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition; -- 重要!如果没有 WHERE,所有行都将被更新。

WHERE 子句 根据指定条件过滤记录。

SELECT column_name(s)
FROM table_name
WHERE condition;

本快速参考涵盖了许多基本的 SQL 命令。对于更高级的主题,如窗口函数(Window Functions)、通用表表达式(Common Table Expressions, CTEs)以及特定 DBMS 函数,请参阅更详细的文档。