在数据驱动的时代,SQL(结构化查询语言)是与数据库沟通的核心桥梁,掌握如何创建SQL查询,意味着您能从海量数据中精准地提取所需信息,这不仅是数据分析师的必备技能,对于开发者和产品经理同样至关重要,创建一个SQL查询,本质上是向数据库发出一条清晰的指令,告诉它“做什么”、“从哪里做”以及“如何做”。

基础查询:SELECT与FROM
所有查询的起点都是SELECT和FROM子句。SELECT用于指定您希望检索的列(字段),而FROM则用于指定这些数据所在的表(数据源)。
SELECT *表示选择所有列。SELECT column1, column2表示选择特定的列。
要从名为employees的表中获取所有员工的名字和职位,查询语句如下:
SELECT name, position FROM employees;
筛选数据:WHERE子句
当您需要获取满足特定条件的数据时,WHERE子句就派上了用场,它就像一个过滤器,只让符合条件的行(记录)通过,您可以使用各种运算符来构建条件,如(等于)、>(大于)、<(小于)、<>或(不等于)、LIKE(模糊匹配)以及AND、OR(逻辑组合)。
查找employees表中所有部门为“销售部”且薪资大于5000的员工:
SELECT name, salary, department FROM employees WHERE department = '销售部' AND salary > 5000;
排序结果:ORDER BY子句
获取的数据往往是按默认顺序排列的,为了让结果更具可读性,可以使用ORDER BY子句对结果进行排序,默认是升序(ASC),您也可以指定降序(DESC)。

将所有员工按薪资从高到低排序:
SELECT name, salary FROM employees ORDER BY salary DESC;
限制返回行数:LIMIT子句
在处理大型数据表时,您可能只想查看前几条记录,或者在实现分页功能时,LIMIT子句非常有用,它指定查询返回的最大行数。
只查看薪资最高的前3名员工:
SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 3;
查询核心子句小结
为了更直观地理解,下表小编总结了这几个核心子句的功能:
| 子句 | 功能 | 示例 |
|---|---|---|
SELECT |
指定要查询的列 | SELECT name, age |
FROM |
指定数据来源的表 | FROM users |
WHERE |
设置筛选条件 | WHERE age > 18 |
ORDER BY |
对结果进行排序 | ORDER BY name ASC |
LIMIT |
限制返回的行数 | LIMIT 10 |
综合示例:创建一个复杂查询
将以上知识结合起来,我们可以创建一个功能强大的查询,假设我们要查找“技术部”中薪资排名前五的员工姓名、入职日期和薪资,并按薪资降序排列。

SELECT name, hire_date, salary FROM employees WHERE department = '技术部' ORDER BY salary DESC LIMIT 5;
这条语句清晰地表达了我们的意图:从employees表中,筛选出部门为“技术部”的员工,然后按薪资降序排列,最后只取前5条记录的姓名、入职日期和薪资信息。
相关问答 (FAQs)
问1:WHERE子句和HAVING子句有什么区别?
答: WHERE和HAVING都用于筛选,但作用阶段不同。WHERE在数据分组前对表中的原始行进行过滤,它不能使用聚合函数(如COUNT(), SUM()),而HAVING在数据分组后对聚合结果进行过滤,通常与GROUP BY子句一起使用。WHERE过滤行,HAVING过滤组。
问2:如何从多个表中查询数据?
答: 当需要的数据分散在不同的表中时,可以使用JOIN(连接)操作,最常用的是INNER JOIN(内连接),它返回两个表中连接字段相匹配的行,要查询员工姓名及其所在部门名称(假设员工信息在employees表,部门信息在departments表),可以这样写:
SELECT e.name, d.department_name FROM employees AS e INNER JOIN departments AS d ON e.department_id = d.id;
这里AS用于给表设置别名,使查询更简洁。ON子句则指定了两个表之间的连接条件。