在数据驱动的时代,与数据库进行高效交互是获取信息的关键,而实现这一交互的核心工具,便是结构化查询语言(SQL),用于从数据库中检索数据的查询语句,是SQL最基础也最重要的功能,掌握其编写方法,意味着你拥有了从海量数据中精准提取所需信息的能力。

基础查询结构:SELECT-FROM-WHERE
任何复杂的查询都始于一个简单的核心结构:SELECT-FROM-WHERE,这三个子句构成了查询语句的骨架。
-
SELECT子句:这是查询的起点,用于指定你希望从数据库中检索哪些列(字段),你可以选择特定的列,用逗号隔开,如SELECT name, email;也可以使用通配符 来选择所有列,如SELECT *,虽然 很方便,但在生产环境中,明确指定列名是更好的实践,因为它能提高查询效率并使代码更清晰。 -
FROM子句:紧跟在SELECT之后,FROM子句用于指定数据来源的表(table),你需要告诉数据库从哪个“文件柜”里取数据。FROM users表示查询将从名为users的表中进行。 -
WHERE子句:这是查询的过滤器,它允许你设置一个或多个条件,只有满足这些条件的记录(行)才会被返回。WHERE子句极大地增强了查询的精确性,你可以使用各种运算符,如等于()、不等于(<>或 )、大于(>)、小于(<),以及逻辑运算符AND、OR、NOT来构建复杂的过滤条件。- 示例:
WHERE age > 18 AND city = '北京'会筛选出年龄大于18岁且城市为北京的所有用户。
- 示例:
进阶查询:排序、限制与聚合
掌握了基础结构后,我们可以通过更多子句来丰富查询功能,对数据进行排序、限制和聚合分析。

-
ORDER BY子句:用于对查询结果进行排序,默认是升序(ASC),你也可以指定降序(DESC)。- 示例:
ORDER BY registration_date DESC会将结果按照注册日期从新到旧排列。
- 示例:
-
LIMIT子句:用于限制返回的记录数量,这在分页或只需要查看前几条结果时非常有用。- 示例:
LIMIT 10只返回前10条记录。(注意:在SQL Server中使用TOP 10)。
- 示例:
-
聚合函数与
GROUP BY:当你需要对数据进行统计分析时,聚合函数是必不可少的,它们通常与GROUP BY子句配合使用,将数据分组后进行计算。
| 函数 | 功能 | 示例 |
|---|---|---|
COUNT() |
计数 | COUNT(id) (计算总行数) |
SUM() |
求和 | SUM(price) (计算价格总和) |
AVG() |
平均值 | AVG(score) (计算平均分数) |
MAX() |
最大值 | MAX(salary) (找出最高薪资) |
MIN() |
最小值 | MIN(salary) (找出最低薪资) |
GROUP BY 子句会将具有相同值的行分为一组,然后聚合函数对每个组进行计算。GROUP BY department 会按部门对所有员工进行分组。
综合示例
假设我们有一个 employees 表(包含 id, name, department, salary 列),我们想查询“销售部”中薪资最高的前3名员工的姓名和薪资,并按薪资从高到低排列。

查询语句如下:
SELECT name, salary FROM employees WHERE department = '销售部' ORDER BY salary DESC LIMIT 3;
这个查询清晰地展示了各个子句的协同工作:FROM 指定表,WHERE 筛选部门,SELECT 选定要显示的列,ORDER BY 进行排序,LIMIT 限定结果数量。
相关问答 (FAQs)
问题1:WHERE 和 HAVING 有什么区别?
解答:WHERE 和 HAVING 都用于过滤,但作用阶段不同。WHERE 子句在数据分组之前对原始表中的行进行过滤,它不能使用聚合函数,而 HAVING 子句在数据分组之后对聚合结果进行过滤,它通常与 GROUP BY 一起使用,并且可以使用 COUNT(), SUM() 等聚合函数。WHERE 过滤行,HAVING 过滤组。
问题2:INNER JOIN 和 LEFT JOIN 有什么不同?
解答:INNER JOIN(内连接)和 LEFT JOIN(左连接)都用于合并多个表的数据。INNER JOIN 只返回两个表中连接键(如 id)相匹配的行,如果某一行在其中一个表中没有匹配项,则该行不会出现在结果中,而 LEFT JOIN 会返回左表(FROM子句中第一个指定的表)的所有行,即使在右表中没有找到匹配的行;对于右表中没有匹配的部分,结果会显示为 NULL。LEFT JOIN 常用于查询“某个主体及其可能拥有的关联信息”。