WHERE: 对数据进行条件过滤。如:SELECT * FROM table_name WHERE condition。
GROUP BY: 根据指定列对结果集分组。如:SELECT column1, COUNT(*) FROM table_name GROUP BY column1。
HAVING: 对GROUP BY分组后的结果进行条件过滤。如:SELECT column1, COUNT(*) FROM table_name GROUP BY column1 HAVING COUNT(*) > 5。
ORDER BY: 查询结果排序(升序ASC/降序DESC)。如:SELECT * FROM table_name ORDER BY column1 ASC。
DISTINCT: 去除重复行。如:SELECT DISTINCT column1 FROM table_name。
ALL: 返回所有结果(默认,与DISTINCT相对)。如:SELECT ALL column1 FROM table_name。
AS: 为列或表指定别名。如:SELECT column1 AS new_name FROM table_name。
INNER JOIN: 内连接,返回两表匹配的行。如:SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id。
LEFT OUTER JOIN: 左外连接,返回左表所有行及右表匹配行。如:SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.id = table2.id。
RIGHT OUTER JOIN: 右外连接,返回右表所有行及左表匹配行。如:SELECT * FROM table1 RIGHT OUTER JOIN table2 ON table1.id = table2.id。
FULL OUTER JOIN: 全外连接,返回两表所有行(匹配与不匹配)。如:SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.id = table2.id。MySQL 不支持 FULL OUTER JOIN(可通过LEFT JOIN + UNION + RIGHT JOIN模拟),而 PostgreSQL、SQL Server 等支持。
CROSS JOIN: 交叉连接,返回两表的笛卡尔积。如:SELECT * FROM table1 CROSS JOIN table2。
ON: 指定连接条件。如:SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id。
USING: 指定连接双方共享名称的列(简化ON)。如:SELECT * FROM table1 INNER JOIN table2 USING (id)。
UNION: 合并多个查询结果并去重。如:SELECT column1 FROM table1 UNION SELECT column1 FROM table2。UNION 合并的多个查询结果必须列数相同、数据类型兼容。
UNION ALL: 合并多个查询结果且不去重。如:SELECT column1 FROM table1 UNION ALL SELECT column1 FROM table2。UNION 需额外排序去重,性能低于 UNION ALL,若确认无重复数据或无需去重,优先用UNION ALL。
INTERSECT: 返回多个查询结果的交集。如:SELECT column1 FROM table1 INTERSECT SELECT column1 FROM table2。
EXCEPT/MINUS: 返回第一个查询特有的结果。如:SELECT column1 FROM table1 EXCEPT SELECT column1 FROM table2。
WITH (CTE): 定义公共表表达式(临时结果集)。如:WITH temp_table AS (SELECT * FROM table1) SELECT * FROM temp_table。
WITH RECURSIVE:数据查询中递归公共表表达式关键字,基于 WITH (CTE) 扩展,用于处理层级数据。由初始查询(非递归部分)和递归查询(引用自身)组成,通过 UNION ALL 连接。如:查询部门树:先取顶级部门,再递归关联子部门。
OVER(): 定义窗口函数计算范围。如:SELECT column1, ROW_NUMBER() OVER() FROM table_name。
PARTITION BY: 在窗口中分区数据(类似分组但不折叠行)。如:SELECT column1, ROW_NUMBER() OVER(PARTITION BY column2) FROM table_name。
ROWS/RANGE: 指定窗口帧滑动范围。如:SELECT column1, SUM(column2) OVER(ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM table_name。
FETCH FIRST/FETCH NEXT ... ROWS ONLY: 限制返回行数(标准SQL)。如:SELECT * FROM table_name FETCH FIRST 10 ROWS ONLY。
LIMIT/OFFSET: 限制行数和偏移量(MySQL, PostgreSQL)。如:SELECT * FROM table_name LIMIT 10 OFFSET 5。实际分页中 OFFSET 的 “跳过前 N 行” 逻辑(如:LIMIT 10 OFFSET 20表示取第 21-30 行)是高频用法。注意:OFFSET 在数据量较大时性能较差(需跳过大量数据),实际分页推荐用‘主键定位法’(如:WHERE id > 20 LIMIT 10),利用主键索引直接定位,替代OFFSET 20 LIMIT 10的全表扫描跳过逻辑。
TOP: 限制行数(SQL Server)。如:SELECT TOP 10 * FROM table_name。TOP ... PERCENT:TOP除了指定行数,还支持百分比(如:SELECT TOP 10 PERCENT * FROM t取前 10% 数据),属于TOP的扩展高频用法。
ROWNUM: 行号伪列(Oracle,可用于限制行数)。如:SELECT * FROM table_name WHERE ROWNUM <= 10。ROW_NUMBER()配合子查询实现分页(如:SELECT * FROM (SELECT t.*, ROW_NUMBER() OVER() rn FROM t) WHERE rn BETWEEN 11 AND 20)是替代 ROWNUM 的常用方式,依赖窗口函数,属于分页高频写法。
ANY/SOME: 判断值是否满足子查询任意结果。如:SELECT * FROM table1 WHERE column1 > ANY (SELECT column1 FROM table2)。
EXISTS: 判断子查询是否返回结果。如:SELECT * FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE table1.id = table2.id)。
FOR XML/FOR JSON: 格式化结果为 XML/JSON(SQL Server)。如:SELECT * FROM table_name FOR JSON PATH。这是 SQL Server 的扩展功能,非标准 SQL,且仅用于结果格式化,不影响查询逻辑。这类关键字属于数据库扩展功能,仅用于结果格式转换,且不同数据库/中间件实现方式不同。
PIVOT: 行转列操作。如:SELECT * FROM table_name PIVOT (SUM(column1) FOR column2 IN (value1, value2))。
ILIKE: 不区分大小写的模式匹配(PostgreSQL等扩展)。如:SELECT * FROM table_name WHERE column1 ILIKE '%pattern%'。
LATERAL: 允许子查询引用同一FROM中前面的表(关联子查询优化)。如:SELECT * FROM table1, LATERAL (SELECT * FROM table2 WHERE table2.id = table1.id) AS subquery。
TABLESAMPLE: 从表中随机抽取样本数据(如 TABLESAMPLE SYSTEM (10) 抽10%样本)。如:SELECT * FROM table_name TABLESAMPLE SYSTEM (10)。
NOLOCK: SQL Server扩展,查询时不加共享锁(可能读取未提交数据,牺牲一致性换性能,格式如:SELECT * FROM table WITH (NOLOCK))。
FORCE INDEX: MySQL扩展,强制查询使用指定索引(如:SELECT * FROM table FORCE INDEX (idx_name),用于优化查询计划)。
IGNORE INDEX: MySQL扩展,忽略指定索引。如:SELECT * FROM table IGNORE INDEX (idx_name),避免低效索引使用。
NATURAL JOIN: 自然连接,自动根据两表中名称和类型相同的列进行连接(隐含 USING 所有同名列)。如:SELECT * FROM table1 NATURAL JOIN table2。不建议在生产环境使用,因为若表中新增同名列(如:create_time),会意外加入连接条件,导致结果错误,不易排查。
MERGE (UPSERT): 组合插入/更新/删除操作(根据条件执行)。如:MERGE INTO table_name USING source_table ON table_name.id = source_table.id WHEN MATCHED THEN UPDATE SET column1 = source_table.column1 WHEN NOT MATCHED THEN INSERT (id, column1) VALUES (source_table.id, source_table.column1)。
CASCADE: 级联操作(删除对象时自动删除依赖对象)。如:ALTER TABLE table1 DROP COLUMN column1 CASCADE。
RESTRICT: 限制操作(存在依赖时阻止删除)。如:ALTER TABLE table1 DROP COLUMN column1 RESTRICT。
COMMENT: 添加注释。如:COMMENT ON TABLE table_name IS 'This is a table'。
COMMENT ON: 为数据库对象(表、列等)添加注释的标准语法(如:COMMENT ON COLUMN table.col IS '注释内容',PostgreSQL 等支持)。如:COMMENT ON COLUMN table_name.column1 IS 'This is a column'。
FOR UPDATE OF: 指定锁定的列(Oracle 等)。如:SELECT column1 FROM table_name FOR UPDATE OF column1,精细化锁控制。
SET TRANSACTION READ WRITE/READ ONLY: 设置事务读写模式(只读事务可优化性能)。如:SET TRANSACTION READ ONLY。
LOCK ... IN SHARE MODE: 加共享锁(MySQL,允许读但阻止写)。如:SELECT * FROM table_name LOCK IN SHARE MODE。
NOWAIT: 锁等待时立即返回错误(Oracle、PostgreSQL)。如:SELECT * FROM table_name FOR UPDATE NOWAIT。
SKIP LOCKED: 跳过已锁定行(Oracle 12c+、PostgreSQL 9.5+)。如:SELECT * FROM table_name FOR UPDATE SKIP LOCKED。
六、条件与逻辑
AND: 逻辑与(两条件同时满足)。如:SELECT * FROM table_name WHERE column1 > 0 AND column2 < 10。
OR: 逻辑或(两条件满足其一)。如:SELECT * FROM table_name WHERE column1 > 0 OR column2 < 10。
NOT: 逻辑非(取反条件)。如:SELECT * FROM table_name WHERE NOT column1 > 0。
IN: 判断值是否在指定列表。如:SELECT * FROM table_name WHERE column1 IN (1, 2, 3)。
NOT IN:判断值不在指定列表或子查询结果中,是 IN 高频反义用法。如:SELECT * FROM t WHERE id NOT IN (1,2,3)。
BETWEEN: 判断值是否在范围内(包含端点)。如:SELECT * FROM table_name WHERE column1 BETWEEN 1 AND 10。
LIKE: 模式匹配(配合%, _通配符)。如:SELECT * FROM table_name WHERE column1 LIKE 'a%'。实际使用中 %(任意字符)、_(单个字符) 作为LIKE的核心通配符,是高频使用的 “隐性关键字”,常与LIKE配合使用(如:WHERE name LIKE '张%'匹配 “张” 开头的名字)。
ESCAPE: 转义LIKE中的通配符。如:SELECT * FROM table_name WHERE column1 LIKE 'a\%' ESCAPE '\'。
IS NULL: 判断值为 NULL。如:SELECT * FROM table_name WHERE column1 IS NULL。
IS NOT NULL: 判断值不为 NULL。如:SELECT * FROM table_name WHERE column1 IS NOT NULL。
IS NOT NULL 与 != NULL 的区别:虽IS NOT NULL已列出,但需强调:NULL不能用=或!=判断(如:col != NULL永远返回 NULL,需用col IS NOT NULL),这是易错点,属于IS NULL的配套注意事项。
CASE: 条件表达式(类似if-else)。如:SELECT column1, CASE WHEN column1 > 0 THEN 'positive' ELSE 'negative' END FROM table_name。
CASE 表达式完整形式:CASE 除了CASE WHEN ... THEN ... ELSE,还有 “简单 case” 形式(如:CASE col WHEN 1 THEN 'a' WHEN 2 THEN 'b' ELSE 'c' END),虽基于 CASE,但两种形式均为高频用法,需明确区别。
注意:CASE 的所有 THEN 分支返回值必须兼容同一数据类型(如:不能同时返回 INT 和 VARCHAR),否则会报错(如:SQL Server 会强制转换,可能导致非预期结果),如:CASE WHEN col > 0 THEN 1 ELSE 'no' END会报错(INT 与 VARCHAR 不兼容),需统一为:CASE WHEN col > 0 THEN '1' ELSE 'no' END。
COALESCE(): 返回第一个非NULL值。如:SELECT COALESCE(column1, 0) FROM table_name。