在数据驱动的时代,SQL(Structured Query Language)作为操作数据库的标准语言,是每个数据从业者和开发者的必备技能。无论是数据查询、报表生成还是业务系统开发,SQL 都扮演着至关重要的角色。本文将从基础语法入手,结合实际场景案例,带你快速掌握 SQL 查询的核心技巧。
一、SQL 基础:从 “查什么” 到 “怎么查”
1. 最基础的查询:SELECT 语句
SQL 的核心功能是 “查询数据”,而 SELECT 语句是实现这一功能的基础。最简单的查询语法如下:
sql
-- 查询表中所有字段和数据
SELECT * FROM 表名;
-- 示例:查询员工表(employees)的所有数据
SELECT * FROM employees;
但实际场景中,我们很少需要 “所有字段”,更常用的是指定字段查询,避免不必要的数据传输:
sql
-- 查询指定字段
SELECT 字段1, 字段2 FROM 表名;
-- 示例:查询员工的姓名和薪资
SELECT name, salary FROM employees;
2. 条件筛选:WHERE 子句
当数据量庞大时,我们需要通过条件筛选目标数据,WHERE 子句就是用来指定查询条件的:
sql
-- 带条件的查询
SELECT 字段1, 字段2
FROM 表名
WHERE 条件;
-- 示例:查询薪资大于 5000 的员工姓名和薪资
SELECT name, salary
FROM employees
WHERE salary > 5000;
常见的条件运算符包括:
- 比较运算符:
=(等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、!=或<>(不等于) - 逻辑运算符:
AND(并且)、OR(或者)、NOT(非) - 范围查询:
BETWEEN...AND...(在某个范围)、IN(在指定集合中) - 模糊查询:
LIKE(配合通配符%任意字符、_单个字符)
示例:查询 “技术部” 中薪资在 6000-10000 之间的员工:
sql
SELECT name, department, salary
FROM employees
WHERE department = '技术部'
AND salary BETWEEN 6000 AND 10000;
二、数据排序与分页:让结果更易读
1. 排序:ORDER BY
查询结果默认是无序的,使用 ORDER BY 可以按指定字段排序,支持升序(ASC,默认)和降序(DESC):
sql
-- 按字段排序
SELECT 字段1, 字段2
FROM 表名
ORDER BY 排序字段1 [ASC/DESC], 排序字段2 [ASC/DESC];
-- 示例:按薪资降序排列员工,薪资相同则按入职时间升序
SELECT name, salary, hire_date
FROM employees
ORDER BY salary DESC, hire_date ASC;
2. 分页查询:LIMIT 与 OFFSET
当数据量过大时,分页展示是必备功能。不同数据库的分页语法略有差异:
- MySQL/SQLite 使用
LIMIT和OFFSET:sql
-- 分页查询(从第 0 条开始,取 10 条数据,即第 1 页) SELECT * FROM employees ORDER BY hire_date DESC LIMIT 10 OFFSET 0; -- 第 2 页(从第 10 条开始,取 10 条) SELECT * FROM employees ORDER BY hire_date DESC LIMIT 10 OFFSET 10; - SQL Server 使用
TOP和OFFSET...FETCH:sql
-- SQL Server 2012+ 分页语法 SELECT * FROM employees ORDER BY hire_date DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY; - Oracle 使用
ROWNUM或FETCH:sql
-- Oracle 分页示例 SELECT * FROM ( SELECT e.*, ROWNUM rn FROM employees e ORDER BY hire_date DESC ) WHERE rn BETWEEN 11 AND 20;
三、聚合与分组:数据分析的核心
1. 聚合函数:对数据做 “统计”
聚合函数用于对一组数据进行计算并返回单一结果,常见的有:
COUNT():统计行数SUM():求和AVG():求平均值MAX():求最大值MIN():求最小值
示例:
sql
-- 统计员工总数
SELECT COUNT(*) AS total_employees FROM employees;
-- 计算技术部员工的平均薪资
SELECT AVG(salary) AS avg_tech_salary
FROM employees
WHERE department = '技术部';
-- 统计各部门的最高薪资
SELECT department, MAX(salary) AS max_salary
FROM employees
GROUP BY department; -- 按部门分组
2. 分组筛选:HAVING 子句
WHERE 子句无法筛选聚合后的结果,此时需要用 HAVING 子句配合 GROUP BY 使用:
sql
-- 筛选平均薪资大于 8000 的部门
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 8000;
注意:WHERE 用于分组前筛选行,HAVING 用于分组后筛选组。
四、多表关联:解锁复杂查询
实际业务中,数据往往分散在多个表中(如员工表、部门表、订单表),此时需要通过 “关联查询” 合并数据。
1. 内连接(INNER JOIN):取两表的交集
只返回两表中匹配关联条件的数据:
sql
-- 内连接查询:员工姓名 + 所属部门名称
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id; -- 关联条件:员工表的部门ID = 部门表的ID
2. 外连接:保留未匹配的数据
- 左外连接(LEFT JOIN):保留左表所有数据,右表无匹配则显示
NULL - 右外连接(RIGHT JOIN):保留右表所有数据,左表无匹配则显示
NULL
示例:查询所有员工的姓名及部门名称(包括未分配部门的员工):
sql
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id;
五、SQL 进阶:子查询与常用技巧
1. 子查询:查询中的 “嵌套查询”
子查询是嵌套在其他查询中的查询,可用于复杂条件筛选:
sql
-- 示例:查询薪资高于公司平均薪资的员工
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary) FROM employees -- 子查询:计算平均薪资
);
2. 去重查询:DISTINCT
去除结果集中的重复数据:
sql
-- 查询公司所有的部门名称(去重)
SELECT DISTINCT department FROM employees;
3. 实用函数:字符串与日期处理
- 字符串拼接(MySQL 用
CONCAT,SQL Server 用+):sql
-- MySQL:拼接姓名和部门 SELECT CONCAT(name, ' - ', department) AS employee_info FROM employees; - 日期处理(查询本月入职的员工):
sql
-- MySQL:查询本月入职的员工 SELECT name, hire_date FROM employees WHERE DATE_FORMAT(hire_date, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m');
六、写在最后:SQL 学习的核心建议
- 多练多查:SQL 语法不难,但场景多变,遇到问题可参考 W3Schools SQL 教程 或官方文档。
- 注重性能:复杂查询需注意索引优化,避免
SELECT *和全表扫描。 - 逻辑先行:写查询前先理清 “要查什么数据”“来自哪些表”“条件是什么”,再动手写代码。
掌握 SQL 不仅能提升数据处理效率,更能帮你从数据中挖掘价值。从今天开始,试着用 SQL 解决实际问题吧!
欢迎在评论区分享你的 SQL 学习心得或遇到的问题,我们一起交流进步~
387

被折叠的 条评论
为什么被折叠?



