SQL 快速参考(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在当今数据驱动的世界中,SQL(Structured Query Language)已成为开发者与数据库交互的核心工具。无论是构建小型项目还是管理复杂系统,掌握 SQL 的基本语法和高效查询技巧,都能显著提升开发效率。对于编程初学者和中级开发者而言,一份简洁清晰的 SQL 快速参考 手册,不仅能帮助快速回顾核心知识点,还能为实际开发提供即插即用的解决方案。本文将从基础语法到高级技巧,结合实例与比喻,系统性地梳理 SQL 的关键内容,让读者在阅读后能直接应用于实际场景。


SQL 的核心语法:构建查询的基石

SELECT:数据检索的起点

SELECT 是 SQL 中最基础且使用频率最高的命令,用于从数据库表中检索数据。其基本结构如下:

SELECT column1, column2, ...  
FROM table_name  
WHERE condition;  

比喻:可以将 SELECT 看作“数据库的搜索框”——通过指定列名(column)、数据来源(table)和筛选条件(WHERE),快速定位所需数据。

案例:假设有一个名为 employees 的员工表,包含 id, name, department, salary 等字段,要查询所有“销售部”员工的姓名和薪资:

SELECT name, salary  
FROM employees  
WHERE department = 'Sales';  

WHERE 子句:精准筛选数据的“过滤器”

WHERE 子句用于对查询结果施加条件限制,支持多种运算符(如 =, >, <, LIKE, IN 等)。例如:

  • 筛选薪资高于 10000 的员工:
    SELECT * FROM employees WHERE salary > 10000;  
    
  • 使用 LIKE 进行模糊匹配(如查找姓名以“Li”开头的员工):
    SELECT * FROM employees WHERE name LIKE 'Li%';  
    

技巧BETWEEN 可简化范围查询,例如:

SELECT * FROM employees WHERE salary BETWEEN 8000 AND 12000;  

数据操作:增删改查的完整流程

INSERT:向表中添加新数据

INSERT 用于插入新记录。基本语法为:

INSERT INTO table_name (column1, column2, ...)  
VALUES (value1, value2, ...);  

案例:向 employees 表中插入一条新员工记录:

INSERT INTO employees (name, department, salary)  
VALUES ('Alice', 'HR', 9500);  

UPDATE:修改现有数据

UPDATE 用于更新表中已有的数据,通常需要结合 WHERE 子句避免误操作。例如:

UPDATE employees  
SET salary = 10000  
WHERE name = 'Alice';  

DELETE:安全删除数据

DELETE 命令用于删除表中的记录,同样需要谨慎使用 WHERE 条件:

DELETE FROM employees  
WHERE department = 'IT' AND salary < 8000;  

警告:若省略 WHERE 子句,将删除表中所有数据!


数据关系与联表查询:JOIN 的魔法

JOIN 的基本概念

当多个表之间存在关联时(例如员工表与部门表通过 department_id 关联),需使用 JOIN 操作将数据合并。常见的 JOIN 类型包括:

  • INNER JOIN:返回两个表中满足条件的匹配行。
  • LEFT JOIN:返回左表所有行,右表无匹配则返回 NULL。
  • RIGHT JOINFULL OUTER JOIN 与 LEFT JOIN 对称。

比喻:JOIN 类似于“拼图游戏”——将两张表通过共同字段拼接,形成更完整的数据视图。

实战案例:多表查询

假设有一个 departments 表(包含 department_id, department_name 字段),要查询每个员工所属的部门名称:

SELECT employees.name, departments.department_name, employees.salary  
FROM employees  
INNER JOIN departments  
ON employees.department_id = departments.department_id;  

高级查询技巧:提升效率与灵活性

聚合函数与 GROUP BY

聚合函数(如 COUNT, SUM, AVG, MAX, MIN)常与 GROUP BY 结合,对数据进行分组统计。例如:

  • 统计各部门员工数量:
    SELECT department, COUNT(*) AS employee_count  
    FROM employees  
    GROUP BY department;  
    
  • 过滤分组后的结果(如只显示员工数超过 5 的部门):
    SELECT department, COUNT(*)  
    FROM employees  
    GROUP BY department  
    HAVING COUNT(*) > 5;  
    

子查询:嵌套查询的威力

子查询允许在另一个查询内部执行查询,用于复杂条件的筛选。例如:

-- 查询薪资高于公司平均薪资的员工  
SELECT name, salary  
FROM employees  
WHERE salary > (SELECT AVG(salary) FROM employees);  

窗口函数:按行计算的“动态统计”

窗口函数(如 ROW_NUMBER(), RANK(), SUM() OVER())能在不丢失原始行数据的情况下,对数据进行分组计算。例如:

-- 为每个部门的员工按薪资排序并添加序号  
SELECT  
  name,  
  department,  
  salary,  
  ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank  
FROM employees;  

性能优化:让 SQL 查询跑得更快

索引:数据库的“书签”

索引能显著加速数据检索,但需谨慎使用。为高频查询的字段(如主键、外键、WHERE 条件列)创建索引:

CREATE INDEX idx_employee_salary ON employees(salary);  

注意:索引会增加写入操作的开销,需平衡读写需求。

避免 SELECT *

只选择必要字段,减少数据传输量:

-- 低效写法:  
SELECT * FROM employees WHERE department = 'Sales';  
-- 更优写法:  
SELECT name, salary FROM employees WHERE department = 'Sales';  

优化 JOIN 条件

确保 JOIN 的列上有索引,并尽量使用等值条件(=)而非范围条件(>)。


常见问题与解决方案

1. 语法错误:Missing FROM clause

原因:在 SELECT 语句中未指定数据来源表。
示例错误

SELECT name WHERE salary > 10000; -- 缺少 FROM  

解决:添加 FROM 子句:

SELECT name FROM employees WHERE salary > 10000;  

2. 性能瓶颈:慢查询优化

步骤

  1. 使用 EXPLAIN 分析查询执行计划(不同数据库语法略有差异);
  2. 添加缺失的索引;
  3. 重构复杂子查询为临时表或 CTE(公共表表达式)。

3. 空值(NULL)的陷阱

比较 NULL 时需使用 IS NULLIS NOT NULL,而非 = NULL

-- 错误写法:  
SELECT * FROM employees WHERE department = NULL;  
-- 正确写法:  
SELECT * FROM employees WHERE department IS NULL;  

实战案例:电商订单系统分析

场景描述

假设有一个电商数据库,包含以下表:

  • orders(订单表):order_id, customer_id, order_date, total_amount
  • customers(客户表):customer_id, name, email, country

案例 1:统计各国总销售额

SELECT  
  c.country,  
  SUM(o.total_amount) AS total_sales  
FROM orders o  
INNER JOIN customers c  
ON o.customer_id = c.customer_id  
GROUP BY c.country  
ORDER BY total_sales DESC;  

案例 2:查找最近 30 天内未下单的客户

SELECT *  
FROM customers  
WHERE customer_id NOT IN (  
  SELECT customer_id  
  FROM orders  
  WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)  
);  

结论

通过本文的 SQL 快速参考 指南,读者已掌握了从基础语法到高级技巧的核心内容。无论是构建查询、操作数据,还是优化性能,SQL 都提供了灵活且强大的工具集。对于编程初学者,建议通过实际项目反复练习基础语句;中级开发者则可深入探索窗口函数、索引优化等进阶主题。记住,SQL 的学习如同搭建乐高积木——掌握基础模块后,就能组合出无限可能的解决方案。

行动建议:选择一个实际项目(如个人博客或电商系统),尝试用 SQL 管理数据,并逐步应用文中提到的优化技巧,亲身体验 SQL 的强大功能!

最新发布