在关系型数据库中,查询数据最常用的命令就是 SELECT。查询本质上是在告诉数据库:我想从某张 Table 中取出哪些 Column,以及最终希望看到哪些 Row。后面的条件筛选、排序、分组统计和多表 JOIN,都是在 SELECT 的基础上继续增加规则。
继续使用 users 表。要查看全部数据,可以写 SELECT * FROM users;。SELECT 表示选择数据,FROM users 表示数据来源,而星号表示所有 Column。因此它可以读成“从 users 表查询所有列”。
| id | name | city | |
|---|---|---|---|
| 1 | Alice | alice@example.com | Tokyo |
| 2 | Bob | bob@example.com | Osaka |
| 3 | Chris | chris@example.com | Tokyo |
| 4 | Diana | diana@example.com | Kyoto |
SELECT * FROM users;查询指定的 Column
实际开发中并不总需要所有数据。页面只显示姓名和城市时,没有必要同时查询 email 和 id。直接在 SELECT 后列出所需 Column:
SELECT name, city
FROM users;| name | city |
|---|---|
| Alice | Tokyo |
| Bob | Osaka |
| Chris | Tokyo |
| Diana | Kyoto |
这比 SELECT 星号更明确,代码一眼就能看出真正需要哪些数据。刚接触一张新表时,星号适合快速查看;真实项目中,尤其当表有很多列时,只查询需要的字段通常更清晰。只查询一列也完全可以,例如 SELECT name FROM users;。
使用 Alias 改变结果的列名
数据库列名适合程序,却不一定适合展示。可以使用 别名(Alias) 和 AS 临时改变结果中的标题:
SELECT name AS user_name, city AS user_city
FROM users;AS 不会修改原表。数据库中的列仍叫 name 和 city,只是这次查询结果显示为 user_name 和 user_city。别名在计算和多表查询时也很常见,因为两张表可能都有 id 或 name。
SELECT 生成新的 Result Set
SELECT 不会修改原来的 Table,只会根据要求生成一份 查询结果(Result Set)。选择 name 和 city 不会从 users 删除 id 和 email。WHERE 和 ORDER BY 也只是继续塑造结果集。
遇到查询需求时,先问两个问题:数据来自哪张 Table?需要哪些 Column?“查看所有商品的名字和价格”就会自然变成 products、name 和 price。
亲手塑造查询结果
在 users 或 products 中选择任意列,也可以使用 AS。运行后直接对比原表和 Result Set。
| id | name | city | |
|---|---|---|---|
| 1 | Alice | [email protected] | Tokyo |
| 2 | Bob | [email protected] | Osaka |
| 3 | Chris | [email protected] | Tokyo |
| 4 | Diana | [email protected] | Kyoto |
沙盒已准备好,不会连接真实数据库。知识测验
为商品报表选择并命名字段
写一条 SELECT,从 products 查询 name、price 和 category,并把结果标题分别显示为 product_name、unit_price 和 product_category。不要查询 id。验收标准:来源表正确、只有三个字段、三个 Alias 都正确,并以分号结束。
可选:通用练习数据脚本
DROP TABLE IF EXISTS products;
CREATE TABLE products (
id INTEGER,
name VARCHAR(100),
price DECIMAL(10, 2),
category VARCHAR(50)
);
INSERT INTO products (id, name, price, category) VALUES
(1, 'Keyboard', 80.00, 'Electronics'),
(2, 'Mouse', 40.00, 'Electronics'),
(3, 'Coffee Mug', 15.00, 'Home'),
(4, 'Backpack', 60.00, 'Fashion');