一文吃透286个SQL关键字及相关扩展语法元素
|
admin
2025年8月30日 12:47
本文热度 57
|
SQL关键字是SQL语言中具有特殊含义和功能的词汇,是构成SQL语句的基础元素。SQL关键字用于定义数据查询、操作、定义、控制以及事务处理等操作。根据功能的不同,可分为以下几个类别: 一、数据查询(SELECT)- SELECT: 从数据库中查询数据。如:
SELECT * FROM table_name 。 - FROM: 指定查询的目标表或视图。如:
SELECT * FROM table_name 。 - 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,且仅用于结果格式化,不影响查询逻辑,不要误认为是通用查询关键字。这类关键字属于数据库扩展功能,仅用于结果格式转换,不影响查询逻辑,且不同数据库实现方式不同(如:SQL Server 支持,MySQL 需用函数实现类似功能)。 - 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 。不建议在生产环境使用 NATURAL JOIN,因为若表中新增同名列(如:create_time),会意外加入连接条件,导致结果错误,还不易排查。 - QUALIFY: 过滤窗口函数计算结果的条件(如:
QUALIFY ROW_NUMBER() OVER() < 5 ,Hive、PostgreSQL 13+ 等支持)。如:SELECT * FROM table_name QUALIFY ROW_NUMBER() OVER() < 5 。 - MATERIALIZED VIEW: 物化视图,存储查询结果的物理表(需刷新,Oracle、PostgreSQL 等支持,区别于普通视图)。如:
CREATE MATERIALIZED VIEW mv_name AS SELECT * FROM table_name 。 - ONLY: 查询基表时排除继承表(PostgreSQL 扩展)。如:
SELECT * FROM ONLY table_name 。 - VERBOSE: 显示详细查询信息(部分数据库扩展,如:PostgreSQL 的 EXPLAIN VERBOSE)。如:
EXPLAIN VERBOSE SELECT * FROM table_name 。
二、数据操作(DML)- INSERT: 向表插入新行。如:
INSERT INTO table_name VALUES (value1, value2) 。 - INTO: 指定插入目标表。如:
INSERT INTO table_name (column1, column2) VALUES (value1, value2) 。 - VALUES: 指定插入值列表。如:
INSERT INTO table_name VALUES (value1, value2) 。 - INSERT ... VALUES: 多行插入。标准INSERT支持一次性插入多行(如:
INSERT INTO t (id) VALUES (1), (2), (3) ),虽基于 INSERT 和 VALUES,但 “多行逗号分隔” 是高频场景,VALUES 可接收多组值。 - DEFAULT: 使用列默认值。如:
INSERT INTO table_name (column1, column2) VALUES (DEFAULT, value2) 。 - UPDATE: 修改表数据。如:
UPDATE table_name SET column1 = value1 WHERE condition 。UPDATE 多表关联更新(MySQL 高频):MySQL 中除了UPDATE ... SET ... WHERE ,UPDATE ... JOIN ... SET 是多表关联更新的常用语法(如:UPDATE t1 JOIN t2 ON t1.id = t2.id SET t1.name = t2.name ),基于 UPDATE 和 JOIN,属于高频多表更新场景。 - SET: 指定更新的列和新值。如:
UPDATE table_name SET column1 = value1 。 - DELETE: 删除行。如:
DELETE FROM table_name WHERE condition 。 - TRUNCATE: 快速清空表数据(保留表结构)。如:
TRUNCATE TABLE table_name 。TRUNCATE 在多数数据库中是 DDL 操作,会自动提交事务,且无法回滚(区别于 DELETE(DML,可回滚)),但 PostgreSQL 中 TRUNCATE 支持事务回滚,是个例外。这是关键特性差异,易错。 - 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) 。 - RETURNING: 返回操作影响的行数据(PostgreSQL/Oracle)。如:
INSERT INTO table_name (column1, column2) VALUES (value1, value2) RETURNING * 。 - FROM: 在 DELETE/UPDATE 中指定额外关联表。如:
DELETE FROM table1 USING table2 WHERE table1.id = table2.id 。 - OUTPUT: 返回受影响行数据(SQL Server)。如:
DELETE FROM table_name OUTPUT DELETED.* WHERE condition 。 - INSERT ... ON DUPLICATE KEY UPDATE: 主键冲突时执行更新(MySQL 扩展)。如:
INSERT INTO table_name (column1, column2) VALUES (value1, value2) ON DUPLICATE KEY UPDATE column2 = value2 。 - REPLACE: 主键冲突时先删旧行再插新行(MySQL)。如:
REPLACE INTO table_name (column1, column2) VALUES (value1, value2) 。 - INSERT ... SELECT: 将查询结果插入表。如:
INSERT INTO table1 SELECT * FROM table2 。 - UPDATE ... FROM: 结合多表数据更新(PostgreSQL 等支持)。如:
UPDATE table1 SET column1 = table2.column1 FROM table2 WHERE table1.id = table2.id 。 - DELETE ... USING: 结合多表条件删除(PostgreSQL 语法)。如:
DELETE FROM table1 USING table2 WHERE table1.id = table2.id 。 - COPY: 高效批量导入/导出数据(PostgreSQL)。如:
COPY table_name FROM 'file.csv' 。 - BULK INSERT: 批量插入数据(SQL Server)。如:
BULK INSERT table_name FROM 'file.csv' 。
三、数据定义(DDL)- CREATE: 创建数据库对象(表、视图等)。如:
CREATE TABLE table_name (column1 datatype, column2 datatype) 。 - ALTER: 修改对象定义(如新增列)。如:
ALTER TABLE table_name ADD COLUMN column3 datatype 。 - DROP: 删除对象。如:
DROP TABLE table_name 。 - IF EXISTS: 仅在对象存在时执行操作(避免报错)。如:
DROP TABLE IF EXISTS table_name 。 - IF NOT EXISTS: 仅在对象不存在时执行操作(避免报错)。如:
CREATE TABLE IF NOT EXISTS table_name (column1 datatype, column2 datatype) 。 - TABLE: 操作表对象(如:CREATE TABLE)。如:
CREATE TABLE table_name (column1 datatype, column2 datatype) 。 - VIEW: 创建视图。如:
CREATE VIEW view_name AS SELECT * FROM table_name 。 - INDEX: 创建索引(提升查询效率)。如:
CREATE INDEX idx_name ON table_name (column1) 。KEY:MySQL 索引相关,MySQL 中 KEY 是 INDEX 的简写(仅用于索引定义),在 CREATE TABLE 中常用在快速定义非主键索引(如:KEY idx_id (id) ),主键索引需用 PRIMARY KEY 明确定义(如:CREATE TABLE t (id INT, KEY idx_id (id) )等价于 CREATE INDEX),经常用在建表时快速定义索引。FULLTEXT:全文索引关键字(如:CREATE FULLTEXT INDEX idx_content ON t(content) ),用在文本模糊搜索(配合 MATCH ... AGAINST),是 MySQL 文本检索常用功能。 - SCHEMA: 操作数据库模式(逻辑命名空间)。如:
CREATE SCHEMA schema_name 。 - DATABASE: 操作数据库(如:CREATE DATABASE)。如:
CREATE DATABASE db_name 。 - COLUMN: 操作列(如:
ALTER TABLE ... ADD COLUMN )。如:ALTER TABLE table_name ADD COLUMN column3 datatype 。 - CONSTRAINT: 定义约束(如:命名 CHECK 约束)。如:
CREATE TABLE table_name (column1 datatype, CONSTRAINT chk_name CHECK (column1 > 0)) 。ALTER TABLE 新增约束:除了ALTER TABLE ... ADD COLUMN ,ALTER TABLE ... ADD CONSTRAINT 是新增表级约束的高频操作(如:ALTER TABLE t ADD CONSTRAINT uk_name UNIQUE (name) 添加唯一约束),依赖 ALTER 和 CONSTRAINT,属于常用 DDL 场景。 - PRIMARY KEY: 主键约束(唯一标识表中每行)。如:
CREATE TABLE table_name (id INT PRIMARY KEY, column1 datatype) 。CREATE TABLE 约束简写:实际建表时约束的简写形式(如:CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(20) NOT NULL) )中,NOT NULL(非空约束)是高频基础约束,常用列级约束(NOT NULL 属于约束关键字)。 - FOREIGN KEY: 外键约束(关联两表的列)。如:
CREATE TABLE table1 (id INT PRIMARY KEY, column1 datatype), CREATE TABLE table2 (id INT PRIMARY KEY, table1_id INT, FOREIGN KEY (table1_id) REFERENCES table1(id)) 。 - UNIQUE: 唯一约束(列值不可重复)。如:
CREATE TABLE table_name (column1 datatype UNIQUE, column2 datatype) 。 - CHECK: 检查约束(限制列值范围)。如:
CREATE TABLE table_name (column1 datatype, CONSTRAINT chk_name CHECK (column1 > 0)) 。 - DEFAULT: 默认值约束(列的默认值)。如:
CREATE TABLE table_name (column1 datatype DEFAULT value) 。 - SEQUENCE: 创建序列(生成自增数字,Oracle/PostgreSQL)。如:
CREATE SEQUENCE seq_name 。 - 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' 。 - TABLESPACE: 指定物理存储位置。如:
CREATE TABLE table_name (column1 datatype) TABLESPACE ts_name 。 - TEMPORARY/TEMP: 创建临时表(会话结束后自动删除)。如:
CREATE TEMPORARY TABLE temp_table (column1 datatype) 。 - UNLOGGED: 创建不写事务日志的表(PostgreSQL 高性能扩展)。如:
CREATE UNLOGGED TABLE unlogged_table (column1 datatype) 。 - DROP ... CASCADE: 删除对象时自动删除依赖它的对象(如:
DROP TABLE table CASCADE )。如:DROP TABLE table_name CASCADE 。 - ALTER COLUMN: 修改列的属性(如类型、约束等,标准语法)。如:
ALTER TABLE table_name ALTER COLUMN column1 INT 。 - DROP COLUMN: 删除表中的列(标准语法)。如:
ALTER TABLE table_name DROP COLUMN column1 。 - CLUSTERED: 指定聚簇索引(SQL Server 等,影响数据物理存储)。如:
CREATE CLUSTERED INDEX idx_name ON table_name (column1) 。 - NONCLUSTERED: 指定非聚簇索引(SQL Server 等,不影响数据物理存储)。如:
CREATE NONCLUSTERED INDEX idx_name ON table_name (column1) 。 - ALTER INDEX: 修改索引(如:重建、重命名,
ALTER INDEX idx RENAME TO idx_new )。如:ALTER INDEX idx_name RENAME TO idx_new_name 。 - RENAME: 重命名数据库对象(部分数据库支持独立 RENAME 语句)。如:
ALTER TABLE table1 RENAME TO table2 。 - FREEZE: 创建表时冻结元组(PostgreSQL 扩展,
CREATE TABLE ... WITH (FREEZE) ,减少 VACUUM 开销)。如:CREATE TABLE table_name (column1 datatype) WITH (FREEZE) 。 - STORAGE: 指定列存储参数(PostgreSQL 扩展)。如:
ALTER TABLE table_name ALTER COLUMN column1 SET STORAGE PLAIN 。 - INHERITS: 表继承(PostgreSQL 扩展)。如:
CREATE TABLE table2 INHERITS (table1) 。
四、数据控制(DCL)- GRANT: 授予权限。如:
GRANT SELECT ON table_name TO user1 。 - REVOKE: 撤销权限。如:
REVOKE SELECT ON table_name FROM user1 。 - DENY: 明确拒绝权限(SQL Server)。如:
DENY SELECT ON table_name TO user1 。 - ROLE: 创建/操作角色(权限组)。如:
CREATE ROLE role_name 。 - TO: 指定权限授予对象(用户/角色)。如:
GRANT SELECT ON table_name TO user1 。 - FROM: 指定权限撤销对象(用户/角色)。如:
REVOKE SELECT ON table_name FROM user1 。 - PUBLIC: 指代所有用户(公共角色)。如:
GRANT SELECT ON table_name TO PUBLIC 。 - WITH GRANT OPTION: 允许被授权者转授权限。如:
GRANT SELECT ON table_name TO user1 WITH GRANT OPTION 。 - CREATE USER: 创建数据库用户。如:
CREATE USER user1 WITH PASSWORD 'pwd' 。 - ALTER USER: 修改用户属性。如:
ALTER USER user1 SET DEFAULT_SCHEMA = schema1 。 - DROP USER: 删除用户。如:
DROP USER IF EXISTS user1 。 - GRANT ... WITH ADMIN OPTION: 授予角色管理权限(可授予或撤销角色,区别于:
WITH GRANT OPTION )。如:GRANT role_name TO user1 WITH ADMIN OPTION 。
五、事务控制与锁- BEGIN TRANSACTION (START TRANSACTION): 启动事务。如:
BEGIN TRANSACTION 。 - COMMIT: 提交事务(永久保存修改)。如:
COMMIT 。 - ROLLBACK: 回滚事务(撤销未提交修改)。如:
ROLLBACK 。 - SAVEPOINT: 设置事务保存点。如:
SAVEPOINT savepoint_name 。 - ROLLBACK TO SAVEPOINT: 回滚到保存点。如:
ROLLBACK TO SAVEPOINT savepoint_name 。 - RELEASE SAVEPOINT: 删除保存点。如:
RELEASE SAVEPOINT savepoint_name 。 - SET TRANSACTION: 设置事务属性(如隔离级别)。如:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED 。 - SET AUTOCOMMIT: 设置自动提交模式(开/关)。如:
SET AUTOCOMMIT ON 。 - WAIT/NOWAIT: 处理锁等待行为。如:
SELECT * FROM table_name FOR UPDATE NOWAIT 。 - FOR UPDATE: 查询时对行加排他锁(防其他事务修改)。如:
SELECT * FROM table_name FOR UPDATE 。 - FOR SHARE: 查询时对行加共享锁(允许读禁止写)。如:
SELECT * FROM table_name FOR SHARE 。 - LOCK TABLE: 显式锁定整个表。如:
LOCK TABLE table_name IN EXCLUSIVE MODE 。 - SET TRANSACTION ISOLATION LEVEL: 明确设置事务隔离级别。如:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED 。 - READ COMMITTED: 事务隔离级别之一(读取已提交数据)。如:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED 。 - REPEATABLE READ: 事务隔离级别之一(可重复读)。如:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 。 - SERIALIZABLE: 事务隔离级别之一(串行化,最高隔离级别)。如:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 。 - 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 。 - NULLIF(): 两值相等返回 NULL,否则返回第一个值。如:
SELECT NULLIF(column1, 0) FROM table_name 。典型用途:用于避免除法除零错误(如:SELECT 1 / NULLIF(column1, 0) ,当 column1=0 时返回 NULL,而非报错),在 MySQL、PostgreSQL 等数据库中,1/0 会直接报错,而1/NULLIF(0,0) 返回 NULL,从而避免报错。 - XOR: 逻辑异或(MySQL,两条件一真一假则为真)。如:
SELECT * FROM table_name WHERE column1 > 0 XOR column2 < 10 。 - NULLS FIRST: 在 ORDER BY 中指定 NULL 值排在前面。如:
SELECT * FROM table_name ORDER BY column1 NULLS FIRST 。 - NULLS LAST: 在 ORDER BY 中指定 NULL 值排在后面。如:
SELECT * FROM table_name ORDER BY column1 NULLS LAST 。 - REGEXP: 正则表达式匹配(MySQL扩展,如:
col REGEXP '^[0-9]+$' )。如:SELECT * FROM table_name WHERE column1 REGEXP '^[0-9]+$' 。 - ALL: 与比较运算符结合,判断值满足子查询所有结果(如:
col > ALL (SELECT col FROM t2) )。如:SELECT * FROM table1 WHERE column1 > ALL (SELECT column1 FROM table2) 。 - SIMILAR TO: 正则风格模式匹配(PostgreSQL 扩展,支持 % 、 _ 及正则元字符)。如:
SELECT * FROM table_name WHERE column1 SIMILAR TO 'a%' 。 - COLLATE: 在表达式中临时指定排序规则。如:
SELECT column1 COLLATE "en_US" FROM table_name 。
七、函数与表达式- CAST(): 数据类型转换(
CAST(expr AS type) )。如:SELECT CAST('123' AS INT) FROM table_name 。 - CONVERT(): 数据类型转换(SQL Server)。如:
SELECT CONVERT(INT, '123') FROM table_name 。 - COLLATE: 指定字符排序规则。如:
SELECT column1 COLLATE "en_US" FROM table_name 。 - 聚合函数: SUM()(求和)、AVG()(平均值)、COUNT()(计数)、MIN()(最小值)、MAX()(最大值)等。如:
SELECT SUM(column1) FROM table_name 。 - 字符串函数: CONCAT()(拼接)、SUBSTRING()(截取子串)、LENGTH()(长度)等。如:
SELECT CONCAT(column1, column2) FROM table_name 。 - 数值函数: ROUND()(四舍五入)、CEIL()(向上取整)、FLOOR()(向下取整)、ABS()(绝对值)等。如:
SELECT ROUND(column1, 2) FROM table_name 。 - 日期函数: CURRENT_DATE(当前日期)、CURRENT_TIMESTAMP(当前时间戳)、DATEADD()(日期加减)等。如:
SELECT CURRENT_DATE FROM table_name 。 - 窗口函数: ROW_NUMBER()(行号)、RANK()(排名)、LEAD()(后n行值)、LAG()(前n行值)等。如:
SELECT column1, ROW_NUMBER() OVER() FROM table_name 。 - GREATEST: 返回参数列表的最大值(如:
GREATEST(1,3,5)=5 )。如:SELECT GREATEST(column1, column2) FROM table_name 。 - LEAST: 返回参数列表的最小值。如:
SELECT LEAST(column1, column2) FROM table_name 。 - NVL(): 替换NULL值(Oracle, NVL(col, 0) 类似 COALESCE)。如:
SELECT NVL(column1, 0) FROM table_name 。 - NVL2(): 扩展NULL替换(Oracle,
NVL2(col, val1, val2) ,非空返回 val1 否则 val2)。如:SELECT NVL2(column1, 'a', 'b') FROM table_name 。 - DECODE(): 多条件匹配(Oracle,如:
DECODE(col, 1, 'a', 2, 'b', 'c') )。如:SELECT DECODE(column1, 1, 'a', 2, 'b', 'c') FROM table_name 。 - TO_CHAR(): 转换为字符串(Oracle、PostgreSQL,如:
TO_CHAR(date, 'YYYY-MM-DD') )。如:SELECT TO_CHAR(date_column, 'YYYY-MM-DD') FROM table_name 。 - TO_DATE(): 字符串转日期(Oracle、PostgreSQL,如:
TO_DATE('2023-01-01', 'YYYY-MM-DD') )。如:SELECT TO_DATE('2023-01-01', 'YYYY-MM-DD') FROM table_name 。
八、特殊用途与扩展- VALUES: 表值构造器。如:
SELECT * FROM (VALUES (1), (2)) AS tmp 。VALUES 作为表值构造器时的用法,区别于 INSERT 中的 VALUES。 - DUAL: 虚拟表(Oracle、MySQL,用于无表查询)。如:
SELECT 1 FROM DUAL 。 - USE/SET DATABASE: 切换数据库。如:
USE db_name 。 - DECLARE: 声明变量。如:
DECLARE @var INT 。 - SET @variable: 设置变量值。如:
SET @var = 1 。 - AUTO_INCREMENT: 自增列属性(MySQL)。如:
CREATE TABLE table_name (id INT AUTO_INCREMENT PRIMARY KEY) 。 - IDENTITY: 自增列属性(SQL Server)。如:
CREATE TABLE table_name (id INT IDENTITY(1,1) PRIMARY KEY) 。 - SERIAL: 自增列属性(PostgreSQL)。如:
CREATE TABLE table_name (id SERIAL PRIMARY KEY) 。 - GENERATED ALWAYS AS: 定义计算列(值由表达式生成)。如:
CREATE TABLE table_name (column1 INT, column2 INT GENERATED ALWAYS AS (column1 * 2) STORED) 。 - CREATE PROCEDURE: 创建存储过程。如:
CREATE PROCEDURE proc_name AS SELECT * FROM table_name 。 - CREATE FUNCTION: 创建函数。如:
CREATE FUNCTION func_name() RETURNS INT AS $$ SELECT 1 $$ LANGUAGE SQL 。 - CREATE TRIGGER: 创建触发器。如:
CREATE TRIGGER trig_name BEFORE INSERT ON table_name FOR EACH ROW EXECUTE PROCEDURE func_name() 。 - EXEC/EXECUTE: 执行存储过程(SQL Server)。如:
EXEC proc_name 。 - CALL: 调用存储过程(标准 SQL)。如:
CALL proc_name 。 - EXPLAIN: 生成查询执行计划(分析查询如何执行,如索引使用、表扫描方式),用于优化查询性能。所有数据库通用。如:EXPLAIN SELECT * FROM table_name WHERE column1 = 'value'。
- EXPLAIN ANALYZE: 执行查询并返回实际执行计划+性能统计(PostgreSQL 扩展)。如:
EXPLAIN ANALYZE SELECT * FROM table_name 。 - SHOW: 查看元信息(
SHOW DATABASES , SHOW TABLES 等)。如:SHOW TABLES 。 - DESCRIBE/DESC: 查看表/索引结构。如:
DESCRIBE INDEX idx_name ON table 。 - PREPARE: 预编译 SQL 语句,提升重复执行效率。如:
PREPARE stmt FROM 'SELECT * FROM table_name WHERE id = ?' 。 - EXECUTE: 执行预编译的 SQL 语句(配合 PREPARE)。如:
EXECUTE stmt USING @id 。 - DEALLOCATE: 释放预编译的 SQL 语句。如:
DEALLOCATE stmt 。 - SHOW COLUMNS: 查看表的列信息(MySQL 等,类似 DESCRIBE)。如:
SHOW COLUMNS FROM table_name 。 - EXPLAIN PLAN: 生成查询执行计划(Oracle等,仅分析不执行查询)。如:
EXPLAIN PLAN FOR SELECT * FROM table_name 。 - PRAGMA: 编译指示(Oracle 等)。如:
PRAGMA AUTONOMOUS_TRANSACTION 定义自治事务。 - EXTERNAL TABLE: 外部表,映射外部文件的数据结构(Oracle、Hive 等,如:
CREATE EXTERNAL TABLE t1 ... LOCATION 'path' )。如:CREATE EXTERNAL TABLE table_name (column1 datatype) LOCATION 'path' 。 - TEMPORARY TABLESPACE: 临时表空间(Oracle,指定临时数据存储位置)。如:
CREATE TEMPORARY TABLESPACE temp_ts 。 - DATABASE LINK: 数据库链接,访问远程数据库(Oracle)。如:
CREATE DATABASE LINK link_name CONNECT TO user IDENTIFIED BY pwd USING 'db' 。CONNECT BY:层级查询关键字(如:SELECT * FROM t START WITH id = 1 CONNECT BY PRIOR id = parent_id ),用于查询树形结构数据(如:部门层级),是 Oracle 处理层级数据的核心关键字。 - SYNONYM: 创建同义词(别名),简化对象引用(Oracle、SQL Server)。如:
CREATE SYNONYM syn_name FOR schema1.table1 。 - FLASHBACK: 闪回查询,访问过去某时间点的数据(Oracle)。如:
SELECT * FROM table_name AS OF TIMESTAMP TO_TIMESTAMP('2023-01-01', 'YYYY-MM-DD') 。 - SHOW WARNINGS: 显示最近 SQL 语句的警告信息(MySQL 扩展)。如:
SHOW WARNINGS 。 - SHOW CREATE TABLE:查看表的完整建表语句(如:
SHOW CREATE TABLE t ),用于获取表结构、索引、约束等详细信息,是调试和迁移的常用工具。 - SHOW INDEX FROM:查看表的索引信息(如:
SHOW INDEX FROM t ),用于分析索引是否生效,属于性能优化常用操作。 - DESCRIBE PROCEDURE: 在 SQL 中,
DESCRIBE PROCEDURE 用于查看存储过程的定义信息,包括参数、数据类型、返回值等。不同数据库语法略有差异,如 MySQL 用DESCRIBE 或SHOW CREATE PROCEDURE ,SQL Server 用sp_helptext ,可帮助我们了解存储过程结构,便于维护和调试。
有了关键字这个工具,接下来我们来简单理一下解决问题的思路。如:想 “找出每个部门工资最高的人”,我们先想到的是 “按部门分组”(GROUP BY ),再对每组 “取最高工资”(MAX() ),最后用SELECT 把结果提出来。这时候,GROUP BY 、MAX() 和SELECT 自然就成了我们要用的关键字。刚开始用的时候,我们可以先从简单查询练起,熟悉SELECT+FROM+WHERE 的组合;遇到复杂需求,再逐步加入JOIN (多表关联)、ORDER BY (排序)等等工具。这就像我们学开车,先会踩油门刹车,再练倒车入库,慢慢就熟练了。
阅读原文:原文链接
该文章在 2025/9/1 11:01:28 编辑过
|
|