人人都能学编程
English 开始学习
核心 · 数据库第 1 课 / 共 6 课免费阅读

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
逐步执行
  1. L1要这两列,按这个顺序。
  2. L2来自 products 表:一共 5 行。
  3. 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
逐步执行
  1. L2Bo、Chen、Dana 符合城市条件;然后 Bo 被去掉。Chen, Dana
  2. 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;
  1. A
    name
    Lamp
  2. B
    name
    Lamp
    Mug
  3. C
    name
    Backpack
    Lamp
查看答案

答案:A

home 类有两件商品,只有 Lamp(18.0)超过 10。

2. 哪条查询能找出城市缺失的顾客?

  1. AWHERE city = NULL
  2. BWHERE city IS NULL
  3. CWHERE city = ''
查看答案

答案:B

NULL 不是能用 = 比较的值。空字符串 '' 是一个真实存在的(空的)值,不是缺失。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出读出结果

    准确写出查询结果,第一行是表头。

  2. 改需求只要纸品

    这条查询列出了所有商品。改成只列出 paper 类商品的名称和价格。

  3. 从零写上海的顾客

    写一条查询,返回所有城市是 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.