检索数据
2.1 SELECT 语句
SELECT 是 SQL 的核心语句,专用于从数据库表中检索数据;语句由关键字构成,执行前必须切换至目标数据库。
- 关键字(keyword)
- 作为 SQL 语句的组成部分,不能用作表名或列名(附录 D 列出常用保留字)。
用 SELECT 检索表数据,至少要两条信息:
想选择什么(要检索的列)
从什么地方选择(要检索的表)
基本结构如下:
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 开始。
因此,LIMIT 1 OFFSET 1 实际上是从第 1 行开始,取 1 行,即返回第 2 行的数据。
2.2 注释
- 行内注释:使用
--开始,直到行末都是注释内容。
-- 这是一个行内注释
SELECT prod_name
FROM Products;- 整行注释,使用
#开始,直到行末都是注释内容(仅 MySQL 支持)。
# 这是一个整行注释
SELECT prod_name
FROM Products;- 块注释:使用
/*开始,*/结束,注释内容可以跨多行。
/* 这是一个块注释
可以跨多行 */
SELECT prod_name
FROM Products;练习挑战
编写 SQL 语句,从 Customers 表中检索所有的 ID(cust_id)。
OrderItems 表包含了所有已订购的产品(有些已被订购多次)。编写SQL语句,检索并列出已订购产品(prod_id)的清单(不用列每个订单,只列出不同产品的清单)。提示:最终应该显示 7行。
编写SQL语句,检索Customers表中所有的列,再编写另外的SELECT语句,仅检索顾客的 ID。使用注释,注释掉一条 SELECT 语句,以便运行另一条 SELECT 语句。(当然,要测试这两个语句。)