检索数据

SQL
学习 SQL 中最核心的 SELECT 语句,掌握从表中检索单个/多个列、所有列、去重结果、限制行数及注释的使用方法。
作者

Davon

发布于

2020年7月30日

修改于

2026年4月12日

2.1 SELECT 语句

SELECT 是 SQL 的核心语句,专用于从数据库表中检索数据;语句由关键字构成,执行前必须切换至目标数据库。

关键字(keyword)
作为 SQL 语句的组成部分,不能用作表名或列名(附录 D 列出常用保留字)。

用 SELECT 检索表数据,至少要两条信息:

  1. 想选择什么(要检索的列)

  2. 从什么地方选择(要检索的表)

基本结构如下:

SELECT <列名>
FROM <表名>;

通用书写规范

  • 多条 SQL 语句必须以分号 ; 分隔,单条语句建议始终加上,保证兼容性。

  • 语句不区分大小写:SELECT 与 select、Select 一致。建议关键字大写,列、表名小写。

  • 空格/换行不影响执行,建议拆分多行

SELECT 核心用法

基础检索

2.1.1 检索单列

SELECT 列名 FROM 表;
-- 从 Products 表中检索 ProductName 列的数据
SELECT Prod_Name
FROM Products;

2.1.2 检索多列

多个列名,用逗号,分隔,最后一列不加。

-- 从 Products 表中检索 prod_id、prod_name、prod_price 三列
SELECT prod_id, prod_name, prod_price
FROM Products;

2.1.3 检索所有列

使用星号 * 作为通配符,表示检索表中的所有列,优点是无需知道表结构,可检索出未知列名的列,缺点是会检索无用列,降低性能,非必要不使用。

-- 检索 Products 表中所有列
SELECT *
FROM Products;

列的返回顺序一般与表中物理列顺序一致,但并非绝对(SQL 标准无强制要求)。

实际开发中很少直接显示原始数据,通常由应用程序格式化后展示,因此列顺序不影响核心使用。

去重检索

SELECT 默认返回匹配的所有行:

-- 检索 Products 表的 vend_id 列(未去重)
SELECT vend_id
FROM Products;

想检索 唯一(不重复) 的值,需使用 DISTINCT 关键字:

-- 检索 Products 表的 vend_id 列(去重)
SELECT DISTINCT vend_id
FROM Products;

关键字必须写在列名前

DISTINCT 作用于所有列,而非仅紧跟的那一列,多列查询时会对列的组合去重。例如:SELECT DISTINCT vend_id, prod_price 会检索两列组合的唯一结果,而非仅去重 vend_id。

SELECT DISTINCT vend_id, prod_price FROM Products;
SELECT vend_id, prod_price FROM Products;

限制结果

SELECT 默认返回表中所有匹配的行,若只想返回第一行或指定数量的行,不同 DBMS 有不同实现方式。查询返回原始数据,格式化展示需在应用程序中实现;

-- 取前5行
SELECT prod_name
FROM Products
LIMIT 5;
-- 从第5行开始,取5行
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
-- 取前5行
SELECT TOP 5 prod_name
FROM Products;
SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;
SELECT prod_name
FROM Products
WHERE ROWNUM <= 5;
注意注意:第 0 行

起始被检索行从 0 开始。

因此,LIMIT 1 OFFSET 1 实际上是从第 1 行开始,取 1 行,即返回第 2 行的数据。

2.2 注释

  1. 行内注释:使用 -- 开始,直到行末都是注释内容。
-- 这是一个行内注释
SELECT prod_name
FROM Products;
  1. 整行注释,使用 # 开始,直到行末都是注释内容(仅 MySQL 支持)。
# 这是一个整行注释
SELECT prod_name
FROM Products;
  1. 块注释:使用 /* 开始,*/ 结束,注释内容可以跨多行。
/* 这是一个块注释
可以跨多行 */
SELECT prod_name
FROM Products;

练习挑战

  1. 编写 SQL 语句,从 Customers 表中检索所有的 ID(cust_id)。

  2. OrderItems 表包含了所有已订购的产品(有些已被订购多次)。编写SQL语句,检索并列出已订购产品(prod_id)的清单(不用列每个订单,只列出不同产品的清单)。提示:最终应该显示 7行。

  3. 编写SQL语句,检索Customers表中所有的列,再编写另外的SELECT语句,仅检索顾客的 ID。使用注释,注释掉一条 SELECT 语句,以便运行另一条 SELECT 语句。(当然,要测试这两个语句。)