SQL 语法全景图:从增删改查到高级查询实战指南

SQL(Structured Query Language)是操作关系型数据库的标准语言。无论你使用的是 MySQL、PostgreSQL、Oracle 还是 SQL Server,掌握核心 SQL 语法都是后端开发、数据分析甚至运维工程师的必备技能。

本文将带你系统梳理 SQL 的常用语法,从基础 CRUD 到高级查询技巧,助你写出高效、可维护的数据库操作语句。

一、DDL:定义数据库结构
DDL(Data Definition Language)用于定义或修改数据库对象(表、索引、视图等)。

-- 创建表
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 修改表(添加字段)
ALTER TABLE users ADD COLUMN age INT;

-- 删除表
DROP TABLE users;

建议:生产环境避免直接 DROP,可先 RENAME 备份。

二、DML:操作数据记录
DML(Data Manipulation Language)用于对表中数据进行增、删、改。

  1. 插入数据(INSERT)

-- 插入指定字段
INSERT INTO users (name, email, age) VALUES ('张三', 'zhangsan@example.com', 25);

-- 批量插入
INSERT INTO users (name, email) VALUES
('李四', 'lisi@example.com'),
('王五', 'wangwu@example.com');

  1. 更新数据(UPDATE)
    -- 注意加 WHERE,否则全表更新!
    UPDATE users SET age = 26 WHERE name = '张三';

  2. 删除数据(DELETE)
    -- 软删除更安全(推荐用 status 字段标记)
    DELETE FROM users WHERE id = 1;

-- 清空表(保留结构)
TRUNCATE TABLE users; -- 比 DELETE 快,但不可回滚

三、DQL:查询数据(最常用!)
DQL(Data Query Language)以 SELECT 为核心,支持复杂条件筛选与聚合分析。

  1. 基础查询
    -- 查询所有字段
    SELECT * FROM users;

-- 查询指定字段 + 别名
SELECT id, name AS username FROM users;

  1. 条件过滤(WHERE)
    SELECT * FROM users
    WHERE age > 18 AND email LIKE '%@example.com';

  2. 排序与分页
    -- 排序(DESC 降序)
    SELECT * FROM users ORDER BY created_at DESC;

-- 分页(MySQL 语法)
SELECT * FROM users LIMIT 10 OFFSET 20; -- 第3页,每页10条

  1. 聚合函数
    SELECT
    COUNT(*) AS total_users,
    AVG(age) AS avg_age,
    MAX(created_at) AS latest_user
    FROM users;

  2. 分组统计(GROUP BY)
    -- 统计各年龄段人数
    SELECT age, COUNT(*) AS count
    FROM users
    GROUP BY age
    HAVING count > 1; -- HAVING 过滤分组结果
    注意:WHERE 过滤原始行,HAVING 过滤分组后的结果。

四、多表关联查询
当数据分散在多个表中时,需通过 JOIN 关联查询。

示例:用户表(users) + 订单表(orders)
-- 内连接:只返回匹配的记录
SELECT u.name, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- 左连接:保留左表所有记录
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id; -- 即使无订单也显示用户

-- 子查询:查询有订单的用户
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders);
建议:优先使用 JOIN 而非子查询,性能通常更好。

五、高级技巧:提升查询效率

  1. 索引优化
    -- 为高频查询字段建索引
    CREATE INDEX idx_email ON users(email);
    CREATE INDEX idx_name_age ON users(name, age); -- 联合索引
    遵循最左前缀原则:(name, age) 索引支持 WHERE name=... 或 WHERE name=... AND age=...,但不支持 WHERE age=...。

  2. 避免 SELECT *
    只查需要的字段,减少网络传输和内存占用。

  3. 使用 EXPLAIN 分析执行计划
    EXPLAIN SELECT * FROM users WHERE email = 'xxx';
    查看是否命中索引(type=ref 或 range 为佳),避免 ALL(全表扫描)。

六、事务控制(ACID 保障)
确保一组操作要么全部成功,要么全部失败。

START TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;

-- 若中间出错,执行 ROLLBACK
-- 否则提交
COMMIT;
默认情况下,MySQL 的 InnoDB 引擎支持事务;MyISAM 不支持。

结语
SQL 看似简单,但写好并不容易。

一条低效的查询可能拖垮整个系统,而一个合理的索引或 JOIN 策略却能让性能提升十倍。

建议:

开发时开启慢查询日志;
复杂查询先用 EXPLAIN 分析;
避免在代码中拼接 SQL(防注入),优先使用预编译(如 MyBatis 的 #{})。
掌握这些核心语法,你不仅能完成日常 CRUD,更能写出高性能、可维护的数据库操作逻辑。

posted @ 2025-12-16 17:30  萌新求职记录  阅读(29)  评论(0)    收藏  举报