0%

SQL基本语法

SQL 核心操作语法详解:查询、插入、删除与修改

SQL(Structured Query Language)是操作关系型数据库的标准语言,核心操作包括数据查询(SELECT)、插入(INSERT)、删除(DELETE/TRUNCATE)和修改(UPDATE)。本文详细解析这些操作的语法规则、使用场景及注意事项,帮助你快速掌握 SQL 基础操作。

查询操作(SELECT)

SELECT 是 SQL 中最常用的操作,用于从表中检索数据,语法灵活且功能强大。

基本语法

1
2
3
4
5
6
SELECT <字段列表>
FROM <表名>
[WHERE <查询条件>]
[GROUP BY <分组字段>]
[HAVING <分组过滤条件>]
[ORDER BY <排序字段> [ASC|DESC]];
各子句说明:
  • SELECT <字段列表>:指定要查询的字段,* 表示查询所有字段(不推荐,效率低且依赖表结构)。
    示例:SELECT id, name FROM users;(查询 users 表的 idname 字段)。
  • 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 用于向表中添加新数据,支持单行插入、批量插入及从其他表复制数据。

插入单行数据

1
2
INSERT INTO <表名> (列1, 列2, ..., 列n)
VALUES (值1, 值2, ..., 值n);
  • 若省略列名,则需按表中所有列的顺序提供值(包括自增主键可省略,由数据库自动生成)。
  • 示例:INSERT INTO users (name, age, email) VALUES ('张三', 25, 'zhangsan@example.com');

插入多行数据

1
2
3
4
5
INSERT INTO <表名> (列1, 列2, ...)
VALUES
(值1, 值2, ...),
(值3, 值4, ...),
...;
  • 示例:INSERT INTO products (name, price) VALUES ('手机', 3999), ('电脑', 5999);

从现有表复制数据到已有表

1
2
3
4
INSERT INTO <目标表> (列1, 列2, ...)
SELECT <源表列1>, <源表列2>, ...
FROM <源表>
[WHERE <条件>];
  • 要求目标表已存在,且源表与目标表的列数和数据类型匹配。
  • 示例:INSERT INTO users_backup (id, name) SELECT id, name FROM users WHERE age > 30;(复制 30 岁以上用户到备份表)。

用现有表数据创建新表并填充

1
2
3
4
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)

1
2
DELETE FROM <表名>
[WHERE <条件>];
  • 若省略 WHERE,则删除表中所有行(保留表结构)。
  • 支持事务回滚(删除后可通过 ROLLBACK 恢复,适合需要确认的删除)。
  • 示例:DELETE FROM users WHERE status = 'inactive';(删除状态为 “未激活” 的用户)。

删除表中所有数据(TRUNCATE)

1
TRUNCATE TABLE <表名>;
  • 快速删除表中所有数据(不记录日志,无法回滚),保留表结构。
  • DELETE 相比:TRUNCATE 效率更高(适合清空大表),但无法撤销,且会重置自增主键(如 id 从 1 重新开始)。
  • 示例:TRUNCATE TABLE test_data;(清空测试数据表)。

注意事项:

  • 执行删除前,务必备份数据或用 SELECT 验证 WHERE 条件(如 SELECT * FROM users WHERE ... 确认要删除的行)。
  • 生产环境中,避免直接删除数据,可采用 “逻辑删除”(添加 is_deleted 字段标记,而非物理删除)。

修改操作(UPDATE)

UPDATE 用于修改表中已存在的数据,支持批量更新符合条件的行。

基本语法

1
2
3
UPDATE <表名>
SET1 = 值1, 列2 = 值2, ...
[WHERE <条件>];
  • 若省略 WHERE,则更新表中所有行(极度危险,务必确认)。
  • 支持用子查询作为更新值(基于其他表的数据更新当前表)。

示例:

  1. 简单更新:UPDATE products SET price = price * 1.1 WHERE category = 'electronics';(电子产品涨价 10%)。
  2. 基于其他表更新: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 或范围条件)

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10