SQL(Structured Query Language)是用于管理和操作关系型数据库的标准语言,其核心功能之一便是查询数据,而查询操作主要通过 SELECT 语句来实现,掌握 SELECT 语句是与数据库对话、从中提取有价值信息的基础,本文将系统性地介绍如何使用SQL查询表格中的数据,从最基础的语法到常见的组合应用。

基础查询:SELECT 与 FROM
任何SQL查询都始于 SELECT 和 FROM 这两个关键字。SELECT 用于指定你想要检索的列(字段),而 FROM 用于指定这些列所在的表格(数据源)。
-
查询特定列:如果你只需要表格中的某几列数据,可以直接在
SELECT后面列出列名,列名之间用逗号隔开,从一个名为employees的员工表中查询所有员工的姓名和职位:SELECT name, position FROM employees;
这条语句会返回一个结果集,其中只包含
name和position两列的数据。 -
查询所有列:当你需要获取表格中的所有列时,可以使用星号()作为通配符,这在快速浏览表结构或数据时非常方便:
SELECT * FROM employees;
这将返回
employees表中每一行、每一列的完整数据。
筛选数据:WHERE 子句
在实际应用中,我们通常不需要表中的全部数据,而是需要满足特定条件的数据子集,这时,WHERE 子句就派上了用场,它位于 FROM 子句之后,用于设置过滤条件,只有满足条件的行才会被返回。
WHERE 子句支持多种运算符,如等于()、不等于(<> 或 )、大于(>)、小于(<)、以及 LIKE(用于模糊匹配)等,可以使用 AND 和 OR 来组合多个条件。
查询 employees 表中所有属于“销售部”且薪资大于5000的员工:

SELECT name, department, salary FROM employees WHERE department = '销售部' AND salary > 5000;
若想查找姓名中包含“张”字的员工,可以使用 LIKE 和通配符 :
SELECT * FROM employees WHERE name LIKE '%张%';
排序结果:ORDER BY 子句
查询返回的结果集默认是按照数据在表中存储的顺序(或数据库引擎认为最优的顺序)排列的,为了使数据更具可读性或便于分析,我们可以使用 ORDER BY 子句对结果进行排序。
ORDER BY 可以指定一个或多个列进行排序,并支持两种排序方式:
ASC(升序,Ascending):默认选项,从小到大排列。DESC(降序,Descending):从大到小排列。
将所有员工按薪资从高到低排序:
SELECT name, salary FROM employees ORDER BY salary DESC;
也可以先按部门升序,再按薪资降序进行多级排序:
SELECT name, department, salary FROM employees ORDER BY department ASC, salary DESC;
限制数量:LIMIT 子句
当查询结果可能非常庞大时(一个拥有数百万条记录的日志表),一次性返回所有数据不仅消耗资源,也没有实际意义。LIMIT 子句用于限制返回结果的最大行数,这在分页显示或只查看前N条记录时非常有用。
查询入职时间最早的5名员工:
SELECT name, hire_date FROM employees ORDER BY hire_date ASC LIMIT 5;
综合应用示例
将以上子句组合起来,我们就可以构建出功能强大的查询语句,假设我们需要找出“技术部”中薪资最高的3名员工,并按薪资降序排列,同时只显示他们的姓名、职位和薪资信息,完整的SQL语句如下:

SELECT
name,
position,
salary
FROM
employees
WHERE
department = '技术部'
ORDER BY
salary DESC
LIMIT 3;
这个查询清晰地展示了SQL的逻辑执行顺序:首先通过 FROM 确定数据源,然后用 WHERE 筛选出行,接着用 SELECT 选出需要的列,再用 ORDER BY 排序,最后用 LIMIT 限制返回的数量。
除了这些基础查询,SQL还提供了 GROUP BY(数据分组)、HAVING(分组后筛选)、JOIN(多表连接)以及 COUNT()、SUM()、AVG() 等聚合函数,以支持更复杂的数据分析任务,但无论如何,熟练掌握 SELECT、FROM、WHERE、ORDER BY 和 LIMIT 是高效查询数据库数据的基石。
相关问答FAQs
*问题1:在SQL查询中,使用 `SELECT 和明确指定列名(如SELECT name, age`)有什么区别?**
解答: 主要区别在于性能、可读性和可维护性。
- 性能:
SELECT *会返回所有列,包括那些你实际不需要的大数据类型列(如TEXT、BLOB),这会增加数据库的I/O和网络传输负担,降低查询效率,明确指定列名只检索必要的数据,性能更优。 - 可读性:明确指定列名能让代码的意图更清晰,其他开发者一眼就能看出查询需要哪些字段。
- 可维护性:当表结构发生变化(如增加、删除或重命名列)时,
SELECT *的行为可能会改变,导致依赖此查询的应用程序出错,而指定列名的查询则更加稳定,不受表结构变化的影响,除非被指定的列本身被修改。
问题2:如何在一个文本字段中搜索包含某个关键词的数据?
解答: 在SQL中,可以使用 WHERE 子句结合 LIKE 运算符来进行模糊搜索。LIKE 运算符通常与通配符一起使用,最常用的通配符是百分号(),它表示任意数量的任意字符(包括零个字符)。
要在一个 products 表的 description 字段中搜索包含“高性能”关键词的所有产品,可以使用以下查询:
SELECT product_name, description FROM products WHERE description LIKE '%高性能%';
这里的 %高性能% 表示匹配任何前面有任意字符、后面也有任意字符的“高性能”字符串,如果只想查找以“高性能”开头的产品描述,则可以使用 '高性能%'。