SELECT 与 WHERE · SQL 与数据库
怎么向数据库提问?
课程目录为什么需要它
几乎每个应用都把数据存在数据库里:用户、订单、消息。SQL 就是向这些数据提问的语言,四十年来几乎没变过,所以这里学到的东西在 SQLite、MySQL、PostgreSQL 里都能用。
这门课用一个小商店的数据,有三张表:customers(顾客)、products(商品)和 orders(订单)。点开编辑器旁边的表格面板就能看到它们。
直觉理解
表就是规矩很严的电子表格:每一行是一样东西(一个顾客),每一列是关于它的一个事实(名字、城市)。
SELECT 就像一句话:给我这些列,从这张表里,只要满足这个条件的。
SELECT name, city FROM customers WHERE city = 'Shanghai';数据库逐行检查,留下条件为真的行,再只把你点名的列交回来。
定义
SELECT … FROM
Chooses columns from a table. `*` means every column. Each statement ends with a semicolon.从表里选列。`*` 表示所有列。每条语句以分号结束。
WHERE
Keeps only rows where the condition is true. Text goes in single quotes; combine conditions with AND, OR and NOT.只保留条件为真的行。文字要放在单引号里;多个条件用 AND、OR、NOT 组合。
NULL 空值
A missing value. Nothing is equal to NULL, not even NULL, so you test it with `IS NULL` or `IS NOT NULL`.缺失的值。任何东西都不等于 NULL,连 NULL 自己也不等于,所以要用 `IS NULL` 或 `IS NOT NULL` 来判断。
示例
列与行
在互动课里运行选两列,再只留下便宜的商品。
SELECT name, price
FROM products
WHERE price < 10;输出
name | price Notebook | 3.5 Pen | 1.5 Mug | 6.0
逐步执行
- L1要这两列,按这个顺序。
- L2来自 products 表:一共 5 行。
- L3Notebook、Pen 和 Mug 的价格小于 10。
3 rows
AND、OR 与 NULL
在互动课里运行加括号让意思更清楚。Eli 的城市未知,所以对 Eli 来说 city = 'Shanghai' 不成立,city != 'Shanghai' 也不成立。
SELECT name FROM customers
WHERE (city = 'Shanghai' OR city = 'Berlin') AND name != 'Bo';
SELECT name FROM customers WHERE city IS NULL;输出
name Chen Dana name Eli
逐步执行
- L2Bo、Chen、Dana 符合城市条件;然后 Bo 被去掉。
Chen, Dana - L4只有
IS NULL能找到缺失的值。Eli
常见错误
文字用了双引号
标准 SQL 里文字要用 '单引号'。"双引号" 表示列名,所以 WHERE city = "Berlin" 可能悄悄变成和一个列比较,而不是和这个词比较。
写成 = NULL
WHERE city = NULL 永远查不到任何行。要写 WHERE city IS NULL。
小测验
1. 这段代码会输出什么?
SELECT name FROM products WHERE category = 'home' AND price > 10;查看答案
答案:A
home 类有两件商品,只有 Lamp(18.0)超过 10。
2. 哪条查询能找出城市缺失的顾客?
查看答案
答案:B
NULL 不是能用 = 比较的值。空字符串 '' 是一个真实存在的(空的)值,不是缺失。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出读出结果
准确写出查询结果,第一行是表头。
- 改需求只要纸品
这条查询列出了所有商品。改成只列出
paper类商品的名称和价格。 - 从零写上海的顾客
写一条查询,返回所有城市是
Shanghai的顾客的name。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Table | 表 | Rows of the same kind of thing; each column holds one fact about it. |
| Query | 查询 | A question you ask a database, usually a SELECT statement. |
| NULL | 空值 | A missing value; test it with IS NULL. |