SQL基本语法
SQL 核心操作语法详解:查询、插入、删除与修改
SQL(Structured Query Language)是操作关系型数据库的标准语言,核心操作包括数据查询(SELECT)、插入(INSERT)、删除(DELETE/TRUNCATE)和修改(UPDATE)。本文详细解析这些操作的语法规则、使用场景及注意事项,帮助你快速掌握 SQL 基础操作。
查询操作(SELECT)
SELECT 是 SQL 中最常用的操作,用于从表中检索数据,语法灵活且功能强大。
基本语法
SELECT <字段列表>
FROM <表名>
[WHERE <查询条件>]
[GROUP BY <分组字段>]
[HAVING <分组过滤条件>]
[ORDER BY <排序字段> [ASC|DESC]];
各子句说明:
SELECT <字段列表>:指定要查询的字段,*表示查询所有字段(不推荐,效率低且依赖表结构)。
示例:SELECT id, name FROM users;(查询users表的id和name字段)。FROM <表名>:指定数据来源的表(可多表联合查询,用JOIN连接)。WHERE <查询条件>:过滤行数据,支持比较运算符(=, >, <, >=, <=, !=)、逻辑运算符(AND, OR, NOT)、模糊查询(LIKE)等。
示例:SELECT * FROM orders WHERE amount > 1000 AND status = 'paid';(查询金额 > 1000 且已支付的订单)。GROUP BY <分组字段>:按指定字段分组,通常与聚合函数(COUNT, SUM, AVG, MAX, MIN)配合使用。
示例:SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id;(按用户 ID 分组,统计每个用户的订单数)。HAVING <分组过滤条件>:对分组后的结果进行过滤(WHERE用于分组前过滤,HAVING用于分组后过滤)。
示例:SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id HAVING order_count >= 5;(筛选出订单数≥5 的用户)。ORDER BY <排序字段>:按指定字段排序,ASC升序(默认),DESC降序。
示例:SELECT * FROM products ORDER BY price DESC;(按价格降序排列商品)。
常用查询技巧
- 去重查询:用
DISTINCT去除重复行。
示例:SELECT DISTINCT category FROM products;(查询所有不重复的商品分类)。 - 限制结果数量:用
LIMIT(MySQL)或TOP(SQL Server)限制返回行数。
示例:SELECT * FROM articles LIMIT 10;(查询前 10 篇文章)。 - 模糊查询:用
LIKE匹配字符串,%表示任意字符(包括空),_表示单个字符。
示例:SELECT * FROM users WHERE name LIKE '张%';(查询姓张的用户)。
插入操作(INSERT)
INSERT 用于向表中添加新数据,支持单行插入、批量插入及从其他表复制数据。
插入单行数据
INSERT INTO <表名> (列1, 列2, ..., 列n)
VALUES (值1, 值2, ..., 值n);
- 若省略列名,则需按表中所有列的顺序提供值(包括自增主键可省略,由数据库自动生成)。
- 示例:
INSERT INTO users (name, age, email) VALUES ('张三', 25, 'zhangsan@example.com');
插入多行数据
INSERT INTO <表名> (列1, 列2, ...)
VALUES
(值1, 值2, ...),
(值3, 值4, ...),
...;
- 示例:
INSERT INTO products (name, price) VALUES ('手机', 3999), ('电脑', 5999);
从现有表复制数据到已有表
INSERT INTO <目标表> (列1, 列2, ...)
SELECT <源表列1>, <源表列2>, ...
FROM <源表>
[WHERE <条件>];
- 要求目标表已存在,且源表与目标表的列数和数据类型匹配。
- 示例:
INSERT INTO users_backup (id, name) SELECT id, name FROM users WHERE age > 30;(复制 30 岁以上用户到备份表)。
用现有表数据创建新表并填充
SELECT <列1>, <列2>, ...
INTO <新表名>
FROM <源表>
[WHERE <条件>];
- 自动创建新表(结构与查询结果一致),并填充数据(SQL Server 支持,MySQL 需用
CREATE TABLE ... AS SELECT)。 - 示例:
SELECT * INTO orders_2023 FROM orders WHERE YEAR(create_time) = 2023;(创建 2023 年订单的新表)。
删除操作(DELETE / TRUNCATE)
删除表中的数据,需谨慎操作(尤其是无 WHERE 条件时),避免误删数据。
删除满足条件的行(DELETE)
DELETE FROM <表名>
[WHERE <条件>];
- 若省略
WHERE,则删除表中所有行(保留表结构)。 - 支持事务回滚(删除后可通过
ROLLBACK恢复,适合需要确认的删除)。 - 示例:
DELETE FROM users WHERE status = 'inactive';(删除状态为 “未激活” 的用户)。
删除表中所有数据(TRUNCATE)
TRUNCATE TABLE <表名>;
- 快速删除表中所有数据(不记录日志,无法回滚),保留表结构。
- 与
DELETE相比:TRUNCATE效率更高(适合清空大表),但无法撤销,且会重置自增主键(如id从 1 重新开始)。 - 示例:
TRUNCATE TABLE test_data;(清空测试数据表)。
注意事项:
- 执行删除前,务必备份数据或用
SELECT验证WHERE条件(如SELECT * FROM users WHERE ...确认要删除的行)。 - 生产环境中,避免直接删除数据,可采用 “逻辑删除”(添加
is_deleted字段标记,而非物理删除)。
修改操作(UPDATE)
UPDATE 用于修改表中已存在的数据,支持批量更新符合条件的行。
基本语法
UPDATE <表名>
SET 列1 = 值1, 列2 = 值2, ...
[WHERE <条件>];
- 若省略
WHERE,则更新表中所有行(极度危险,务必确认)。 - 支持用子查询作为更新值(基于其他表的数据更新当前表)。
示例:
- 简单更新:
UPDATE products SET price = price * 1.1 WHERE category = 'electronics';(电子产品涨价 10%)。 - 基于其他表更新:
UPDATE orders o SET o.total = o.total * 1.05 FROM users u WHERE o.user_id = u.id AND u.vip = 1;(VIP 用户的订单加价 5%)。
注意事项:
- 更新前用
SELECT验证WHERE条件(如SELECT * FROM products WHERE category = 'electronics')。 - 避免一次更新大量行(可能锁表影响性能),可分批更新(用
LIMIT或范围条件)