SQL语法一览表

SQL语法一览表

SQL(结构化查询语言)按功能可分为DDL(数据定义语言)、DML(数据操作语言)、DQL(数据查询语言)、DCL(数据控制语言)、TCL(事务控制语言) 五大类,以下是核心语法的汇总,兼顾通用性与主流数据库(MySQL/Oracle/SQL Server)的差异说明。

一、数据定义语言(DDL)

用于创建、修改、删除数据库对象(库、表、索引、视图等),操作不可逆。

语法用途示例
CREATE DATABASE创建数据库CREATE DATABASE IF NOT EXISTS test_db;(MySQL)
CREATE TABLE创建数据表CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT DEFAULT 0);
CREATE INDEX创建索引(提升查询效率)CREATE INDEX idx_user_name ON user(name);
CREATE VIEW创建视图(虚拟表)CREATE VIEW v_user_age AS SELECT name, age FROM user WHERE age > 18;
ALTER DATABASE修改数据库属性ALTER DATABASE test_db CHARACTER SET utf8mb4;(MySQL)
ALTER TABLE修改表结构(增/删/改列)ALTER TABLE user ADD phone VARCHAR(20);(新增列)
ALTER TABLE user MODIFY age TINYINT;(修改列类型)
ALTER TABLE user DROP COLUMN phone;(删除列)
DROP DATABASE删除数据库DROP DATABASE IF EXISTS test_db;
DROP TABLE删除数据表DROP TABLE IF EXISTS user;
DROP INDEX删除索引DROP INDEX idx_user_name ON user;(MySQL)
DROP INDEX idx_user_name;(Oracle)
DROP VIEW删除视图DROP VIEW IF EXISTS v_user_age;
TRUNCATE TABLE清空表数据(保留结构)TRUNCATE TABLE user;(不可回滚,比DELETE高效)

二、数据操作语言(DML)

用于增、删、改数据表中的数据,可通过事务回滚。

语法用途示例
INSERT INTO插入数据INSERT INTO user(name, age) VALUES ('张三', 20);(单行)
INSERT INTO user(name, age) VALUES ('李四', 22), ('王五', 25);(多行,MySQL)
INSERT INTO … SELECT从其他表插入数据INSERT INTO user_bak SELECT id, name FROM user WHERE age > 20;
UPDATE更新数据UPDATE user SET age = 21 WHERE name = '张三';(带条件更新,必加WHERE!)
DELETE FROM删除数据DELETE FROM user WHERE id = 1;(带条件删除,必加WHERE!)
DELETE FROM user;(清空所有数据,可回滚)

三、数据查询语言(DQL)

核心为SELECT,用于查询数据,是SQL最常用的语法。

语法/子句用途示例
SELECT … FROM基础查询SELECT id, name FROM user;(查询指定列)
SELECT * FROM user;(查询所有列)
DISTINCT去重查询SELECT DISTINCT age FROM user;(去重年龄)
WHERE条件筛选SELECT * FROM user WHERE age > 18 AND name LIKE '张%';(多条件+模糊查询)
GROUP BY分组统计SELECT age, COUNT(*) AS num FROM user GROUP BY age;(按年龄分组统计人数)
HAVING分组后筛选SELECT age, COUNT(*) AS num FROM user GROUP BY age HAVING num > 2;(筛选分组后人数>2的年龄)
ORDER BY排序SELECT * FROM user ORDER BY age DESC, id ASC;(按年龄降序、ID升序)
LIMIT/OFFSET分页查询(MySQL)SELECT * FROM user LIMIT 10 OFFSET 20;(第21-30条)
SELECT * FROM user LIMIT 20,10;(简写)
TOP分页查询(SQL Server)SELECT TOP 10 * FROM user;(前10条)
ROWNUM分页查询(Oracle)SELECT * FROM (SELECT *, ROWNUM rn FROM user) WHERE rn BETWEEN 21 AND 30;
聚合函数统计计算COUNT(*)(总数)、SUM(age)(年龄和)、AVG(age)(平均年龄)、MAX(age)(最大年龄)、MIN(age)(最小年龄)
INNER JOIN内连接(交集)SELECT u.name, o.order_no FROM user u INNER JOIN order o ON u.id = o.user_id;
LEFT JOIN左连接(左表全量)SELECT u.name, o.order_no FROM user u LEFT JOIN order o ON u.id = o.user_id;
RIGHT JOIN右连接(右表全量)SELECT u.name, o.order_no FROM user u RIGHT JOIN order o ON u.id = o.user_id;
FULL JOIN全连接(并集,Oracle/SQL Server)SELECT u.name, o.order_no FROM user u FULL JOIN order o ON u.id = o.user_id;
UNION联合查询(去重)SELECT name FROM user WHERE age < 20 UNION SELECT name FROM user_bak WHERE age < 20;
UNION ALL联合查询(不去重,更高效)SELECT name FROM user WHERE age < 20 UNION ALL SELECT name FROM user_bak WHERE age < 20;
子查询嵌套查询单行子查询:SELECT name FROM user WHERE id = (SELECT MAX(id) FROM user);
多行子查询:SELECT name FROM user WHERE age IN (SELECT age FROM user_bak);

四、数据控制语言(DCL)

用于管理数据库权限(用户、角色、权限分配)。

语法用途示例
CREATE USER创建数据库用户CREATE USER 'test_user'@'%' IDENTIFIED BY '123456';(MySQL)
CREATE USER test_user IDENTIFIED BY '123456';(Oracle)
ALTER USER修改用户属性ALTER USER 'test_user'@'%' IDENTIFIED BY '654321';(修改密码)
DROP USER删除用户DROP USER IF EXISTS 'test_user'@'%';(MySQL)
GRANT授予权限GRANT SELECT, INSERT ON test_db.user TO 'test_user'@'%';(授予查询/插入权限)
GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'%';(授予所有权限)
REVOKE撤销权限REVOKE INSERT ON test_db.user FROM 'test_user'@'%';

五、事务控制语言(TCL)

用于管理事务(保证数据一致性),仅支持InnoDB等事务型存储引擎。

语法用途示例
START TRANSACTION开启事务(MySQL)START TRANSACTION;
BEGIN开启事务(通用)BEGIN;
COMMIT提交事务(永久生效)COMMIT;
ROLLBACK回滚事务(撤销操作)ROLLBACK;
SAVEPOINT设置保存点(部分回滚)SAVEPOINT sp1;(设置保存点)
ROLLBACK TO sp1;(回滚到保存点)
SET TRANSACTION设置事务属性SET TRANSACTION ISOLATION LEVEL READ COMMITTED;(设置隔离级别)

六、常用约束

用于保证数据完整性,可在CREATE TABLE/ALTER TABLE中定义。

约束类型用途示例
PRIMARY KEY主键(唯一+非空)id INT PRIMARY KEY(单字段主键)
PRIMARY KEY (id, name)(复合主键)
FOREIGN KEY外键(关联其他表)order_id INT, FOREIGN KEY (order_id) REFERENCES order(id) ON DELETE CASCADE;(级联删除)
UNIQUE唯一约束(允许空值)phone VARCHAR(20) UNIQUE
NOT NULL非空约束name VARCHAR(50) NOT NULL
CHECK检查约束(值范围)age INT CHECK (age >= 0 AND age <= 150)(MySQL 8.0+支持,Oracle/SQL Server原生支持)
DEFAULT默认值约束create_time DATETIME DEFAULT CURRENT_TIMESTAMP

七、常用函数

1. 字符串函数

函数用途示例
CONCAT拼接字符串CONCAT(name, '-', age)
SUBSTRING截取字符串SUBSTRING(name, 1, 2)(从第1位取2个字符)
LENGTH/LEN字符串长度LENGTH(name)(MySQL)/LEN(name)(SQL Server)
TRIM去除首尾空格TRIM(name)
UPPER/LOWER大小写转换UPPER(name)/LOWER(name)

2. 数值函数

函数用途示例
ROUND四舍五入ROUND(3.1415, 2)(保留2位小数)
CEIL/FLOOR向上/向下取整CEIL(3.1)=4 / FLOOR(3.9)=3
ABS绝对值ABS(-10)=10
MOD取模MOD(10, 3)=1

3. 日期函数

函数用途示例
NOW/CURDATE当前时间/日期NOW()(含时分秒)/CURDATE()(仅日期)
DATE_ADD日期加DATE_ADD(NOW(), INTERVAL 7 DAY)(加7天)
DATE_SUB日期减DATE_SUB(NOW(), INTERVAL 1 MONTH)(减1个月)
DATEDIFF日期差DATEDIFF(CURDATE(), '2025-01-01')(天数差)
YEAR/MONTH/DAY提取年/月/日YEAR(NOW())/MONTH(NOW())/DAY(NOW())

4. 转换函数

函数用途示例
CAST类型转换CAST(age AS CHAR)(数值转字符串)
CONVERT类型转换(通用)CONVERT('2025-01-01', DATETIME)(字符串转日期)

注意事项

  1. 语法大小写:SQL关键字不区分大小写(推荐大写),表名/列名在Linux系统下可能区分大小写;
  2. 条件筛选:UPDATE/DELETE操作必须加WHERE子句,否则会修改/删除全表数据;
  3. 数据库差异:不同数据库的语法细节有差异(如分页、函数、约束支持度),需针对性适配;
  4. 性能优化:避免SELECT *、合理创建索引、减少子查询嵌套层级。

快速记忆SQL语法的核心是**“分类归总+找规律+场景实操+简化口诀”**,拒绝死记硬背,结合逻辑和实用场景记忆,效率会大幅提升。以下是可落地的记忆方法,结合之前的语法表拆解:

记忆

一、第一步:先记“大类核心”,抓主干(5分钟搞定框架)

SQL的核心是5大类,先记住每类的核心功能+标志性关键字,相当于先搭骨架,再填细节:

类别核心功能核心关键字(记1-3个即可)记忆联想
DDL改“结构”(库/表/索引)CREATE/ALTER/DROP“建/改/删”结构,不可逆
DML改“数据”(增删改)INSERT/UPDATE/DELETE“增/改/删”数据,可回滚
DQL查数据SELECT所有查询都绕不开SELECT
DCL管权限GRANT/REVOKE“授/撤”权限,管用户
TCL管事务COMMIT/ROLLBACK“提交/回滚”,保一致性

✅ 记忆技巧:用“结构、数据、查询、权限、事务”5个词对应5类,再记每类1个核心关键字,比如“DDL建、DML增、DQL查、DCL授、TCL提(提交)”。

二、第二步:按“使用频率”记细节,先记高频(80%场景够用)

不用全记,先抓日常80%会用到的语法,冷门语法(如FULL JOIN、SAVEPOINT)等用到时再查。

1. 高频DQL(查询,最常用):记“固定顺序+口诀”

SELECT的子句有严格顺序,记口诀就能避免写错,推荐2个易记口诀:

  • 极简口诀:选(S) - 从(F) - 条(W) - 分(G) - 筛(H) - 排(O) - 限(L)
  • 完整对应:SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT

✅ 记忆逻辑:

  • 先确定“查什么(SELECT)”“从哪查(FROM)”,再“筛条件(WHERE)”;
  • 分组(GROUP BY)必须在筛选后,分组后再筛用HAVING(区别WHERE);
  • 最后排序(ORDER BY)、分页(LIMIT),符合“先筛选、再统计、最后展示”的业务逻辑。

👉 举个例子套口诀:
要查“年龄>18的用户,按年龄分组统计人数,只保留人数>2的组,最后按人数降序取前10”:
SELECT age, COUNT(*) 👉 选FROM user 👉 从WHERE age>18 👉 条GROUP BY age 👉 分HAVING COUNT(*)>2 👉 筛ORDER BY COUNT(*) DESC 👉 排LIMIT 10 👉 限

2. 高频DML(增删改):记“格式+避坑点”
  • INSERT:记“表名+列名+VALUES”,多行加逗号(MySQL):
    INSERT INTO 表(列1,列2) VALUES (值1,值2), (值3,值4);
  • UPDATE:死记“SET+WHERE”,缺WHERE必翻车:
    UPDATE 表 SET 列1=值1 WHERE 条件;
  • DELETE:死记“FROM+WHERE”,同理缺WHERE删全表:
    DELETE FROM 表 WHERE 条件;

✅ 记忆技巧:DML都和“数据修改”相关,UPDATE/DELETE必加WHERE,用“改数据=改指定行”提醒自己。

3. 高频DDL(建表/改表):记“核心操作+固定格式”
  • 建表:CREATE TABLE 表(列名 类型 约束, ...);(约束记PRIMARY KEY/NOT NULL/DEFAULT);
  • 改表:ALTER TABLE 表 ADD/MODIFY/DROP 列名 类型;(增/改/删列,记ADD/MODIFY/DROP三个动词);
  • 删表:DROP TABLE 表;(不可逆,联想“删结构=彻底删”)。

三、第三步:用“对比/联想”记易混点,减少记忆量

很多语法是“成对/成组”的,对比记比单独记快10倍:

易混点对比记忆法
WHERE vs HAVINGWHERE“分组前筛行”,HAVING“分组后筛组”;HAVING必须跟GROUP BY,能接聚合函数(如COUNT)
JOIN类型内连接=交集,左连接=左表全要,右连接=右表全要;记“左连保左、右连保右”
UNION vs UNION ALLUNION去重(慢),UNION ALL不去重(快);ALL=“全保留”
分页语法(不同数据库)MySQL=LIMIT,SQL Server=TOP,Oracle=ROWNUM;记“MY限、SQL顶、O行号”
TRUNCATE vs DELETETRUNCATE清结构(不可逆),DELETE清数据(可回滚);TRUNCATE=“砍表”,DELETE=“删行”

四、第四步:场景化实操,用“输出”强化记忆(最关键)

光背不练等于白记,找1个简单场景(比如“用户表+订单表”),把高频语法全走一遍,边敲边记:

  1. 用DDL建表:CREATE TABLE user(id INT PRIMARY KEY, name VARCHAR(50), age INT);
  2. 用DML插数据:INSERT INTO user VALUES (1,'张三',20), (2,'李四',25);
  3. 用DQL查数据:
    • 基础查:SELECT name, age FROM user WHERE age>20;
    • 分组查:SELECT age, COUNT(*) FROM user GROUP BY age;
    • 联表查:SELECT u.name, o.order_no FROM user u LEFT JOIN order o ON u.id=o.user_id;
  4. 用DML改/删数据:UPDATE user SET age=21 WHERE id=1; / DELETE FROM user WHERE id=2;

✅ 技巧:每敲一句,嘴里念出“这句是查用户表中年龄>20的姓名和年龄”,把“语法+语义”绑定,记忆更牢。

五、第五步:编极简口诀,浓缩核心(碎片化记忆)

把最难记的点编成口诀,走路/等车时默念:

  1. DQL子句顺序:选从条,分筛排限(SELECT-FROM-WHERE,GROUP BY-HAVING-ORDER BY-LIMIT);
  2. 聚合函数:计总、求和、平均、最大、最小(COUNT/SUM/AVG/MAX/MIN);
  3. 约束:主键唯一非空,外键关联,默认检查(PRIMARY KEY/UNIQUE/NOT NULL,FOREIGN KEY,DEFAULT/CHECK);
  4. 事务:开始-提交-回滚(BEGIN-COMMIT-ROLLBACK)。

六、最后:每天5分钟复盘,强化记忆

  1. 早上:花5分钟默写“5大类核心关键字+DQL子句顺序”;
  2. 晚上:花10分钟,用之前的场景表,随机想一个需求(比如“查年龄最大的3个用户”),手写/敲出SQL;
  3. 遇到忘的点,只查“对应大类”(比如忘分页语法,只查DQL的分页部分),不从头翻表,强化“分类记忆”的逻辑。

总结:SQL记忆的核心是“先搭框架(5大类),再填高频细节(口诀+对比),最后用实操落地”。不用追求一次记全,先掌握80%高频语法,剩下的20%用到时结合场景查,记一次就再也忘不掉了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值