SQL(Structured Query Language)是与关系型数据库沟通的标准语言,而创建查询语句是其最核心、最频繁的操作,掌握如何构建查询语句,意味着你拥有了从海量数据中精准提取所需信息的能力,本文将系统地介绍SQL查询语句的创建方法,从基础结构到高级应用,助你循序渐进地成为数据查询高手。

理解查询语句的基本骨架
任何复杂的SQL查询都构建在一个简单而强大的基础结构之上,即 SELECT...FROM...WHERE,这三个关键字构成了查询语句的“骨架”,分别回答了“要什么?”、“从哪里要?”以及“要满足什么条件?”这三个基本问题。
SELECT:指定你希望检索的列(字段),你可以使用 来选择所有列,也可以明确列出列名,如SELECT name, age,明确列名是更好的实践,因为它能提高查询效率并增强代码可读性。FROM:指定数据来源的表(table),这是查询的起点,告诉数据库应该在哪张或多张表中进行查找。WHERE:设置过滤条件,用于筛选出符合条件的行(记录),只有满足WHERE子句条件的行才会被返回,你可以使用各种运算符,如 (等于)、>(大于)、<(小于)、<>或 (不等于)、LIKE(模糊匹配)、AND、OR等。
基础示例:
假设我们有一个名为 employees 的员工表,包含 id, name, department, salary 等列,要查询销售部('Sales')所有员工的姓名和薪水,语句如下:
SELECT name, salary FROM employees WHERE department = 'Sales';
排序与限制结果
获取数据后,我们通常需要对其进行排序或限制返回的数量,这时就需要用到 ORDER BY 和 LIMIT(或 TOP)子句。
ORDER BY:用于对结果集进行排序,可以指定一个或多个列,并使用ASC(升序,默认)或DESC(降序)关键字。LIMIT:用于限制返回的记录数量,这在分页查询或只查看前N条记录时非常有用,在SQL Server中,功能类似的子句是TOP N。
进阶示例: 查询所有员工,按薪水从高到低排序,并只显示前5名:
SELECT name, department, salary FROM employees ORDER BY salary DESC LIMIT 5;
数据聚合与分组
SQL的强大之处在于其数据聚合能力,这主要通过 GROUP BY 和聚合函数(如 COUNT(), SUM(), AVG(), MAX(), MIN())实现。
GROUP BY:将具有相同值的行组合成一个汇总行,通常与聚合函数配合使用,以便对每个分组进行计算。HAVING:用于过滤GROUP BY生成的分组,它与WHERE的区别在于,WHERE在分组前过滤行,而HAVING在分组后过滤分组。
聚合示例: 计算每个部门的员工人数和平均薪水:

SELECT
department,
COUNT(id) AS employee_count,
AVG(salary) AS average_salary
FROM employees
GROUP BY department;
如果只想查看员工人数超过10人的部门,可以添加 HAVING 子句:
SELECT
department,
COUNT(id) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(id) > 10;
连接多表查询
在实际应用中,数据通常被分散存储在多个表中以减少冗余。JOIN 子句允许我们将这些表中的数据关联起来进行查询。
INNER JOIN(内连接):只返回两个表中连接字段相匹配的行,这是最常用的连接类型。LEFT JOIN(左连接):返回左表的所有行,以及右表中与左表匹配的行,如果右表中没有匹配项,则结果为NULL。RIGHT JOIN(右连接):与LEFT JOIN相反,返回右表的所有行,以及左表中匹配的行。FULL OUTER JOIN(全外连接):返回两个表中的所有行,无论是否匹配。
连接示例:
假设还有一个 departments 表,包含 dept_id 和 dept_name,要查询每个员工的姓名及其所属部门的完整名称:
SELECT
e.name,
d.dept_name
FROM
employees AS e
INNER JOIN
departments AS d ON e.department = d.dept_id;
这里使用了 AS 为表设置别名,使语句更简洁。
SQL查询子句功能小编总结
为了更清晰地理解各个子句的执行顺序和功能,可以参考下表:
| 子句 | 功能 | 执行顺序 |
|---|---|---|
SELECT |
指定要返回的列 | 5 |
FROM |
指定查询的表 | 1 |
WHERE |
过滤行(分组前) | 2 |
GROUP BY |
将行分组 | 3 |
HAVING |
过滤分组(分组后) | 4 |
ORDER BY |
对结果集排序 | 6 |
LIMIT |
限制返回的行数 | 7 |
创建SQL查询语句是一个从简单到复杂、不断组合的过程,掌握了这些核心子句,你就能够应对绝大多数数据检索需求,关键在于理解每个子句的作用和它们之间的逻辑关系,并通过不断实践来巩固和提升技能。

相关问答FAQs
问题1:WHERE 和 HAVING 都用于过滤,它们之间有什么本质区别?
解答:是的,它们都用于过滤,但作用的对象和时机完全不同。WHERE 子句在数据分组之前对表中的原始行进行过滤,它不能使用聚合函数(如 COUNT(), SUM()),而 HAVING 子句在数据分组之后对分组结果进行过滤,它通常与 GROUP BY 一起使用,并且可以使用聚合函数。WHERE 筛选记录,HAVING 筛选分组。
问题2:INNER JOIN 和 LEFT JOIN 在查询结果上有什么不同?
解答:INNER JOIN(内连接)和 LEFT JOIN(左连接)在处理不匹配数据时有显著区别。INNER JOIN 只返回两个表中连接键值完全匹配的行,任何一方没有匹配的记录都会被排除在结果之外,而 LEFT JOIN 则会返回左表的所有行,即使在右表中没有找到匹配的行,对于右表中没有匹配的左表行,结果中右表的字段将显示为 NULL。INNER JOIN 得到的是交集,LEFT JOIN 得到的是左表全集及与右表的交集部分。