表和 SELECT
数据库把数据放在表里。这门课用的是一家小网店的数据:客户、商品、订单。这一页的每条查询都能直接在浏览器里运行:点运行,改一改,再运行一次。
1SELECT * FROM products;| id | name | category | price | stock |
|---|---|---|---|---|
| 1 | 笔记本 | 文具 | 4.50 | 120 |
| 2 | 中性笔(10 支) | 文具 | 6.00 | 80 |
| 3 | 双肩包 | 箱包 | 39.90 | 15 |
| 4 | 水杯 | 厨房 | 12.00 | 40 |
| 5 | 耳机 | 数码 | 59.00 | 10 |
| 6 | 台灯 | 数码 | 25.00 | 0 |
| 7 | 数据线 | 数码 | 8.50 | 200 |
| 8 | 咖啡杯 | 厨房 | 9.90 | 60 |
| 9 | 手机壳 | 数码 | 15.00 | 35 |
| 10 | 帆布袋 | 箱包 | 11.00 | 25 |
这就是网店的商品表。每一行是一件商品,每一列是商品的一项信息:
| 列 | 存的是什么 |
|---|---|
id | 商品的编号,每件商品都不一样 |
name | 商品名 |
category | 分类 |
price | 价格 |
stock | 还有多少库存 |
SELECT 和 FROM
一条查询的意思是:从(FROM)哪张表里,选出(SELECT)哪些列。* 表示「所有列」。只想看商品名和价格,就把列名写出来,中间用逗号隔开:
1SELECT name, price FROM products;| name | price |
|---|---|
| 笔记本 | 4.50 |
| 中性笔(10 支) | 6.00 |
| 双肩包 | 39.90 |
| 水杯 | 12.00 |
| 耳机 | 59.00 |
| 台灯 | 25.00 |
| 数据线 | 8.50 |
| 咖啡杯 | 9.90 |
| 手机壳 | 15.00 |
| 帆布袋 | 11.00 |
结果也是一张表,只有你要的两列,行还是那些行。列的顺序照你写的顺序:
1SELECT price, name FROM products;| price | name |
|---|---|
| 4.50 | 笔记本 |
| 6.00 | 中性笔(10 支) |
| 39.90 | 双肩包 |
| 12.00 | 水杯 |
| 59.00 | 耳机 |
| 25.00 | 台灯 |
| 8.50 | 数据线 |
| 9.90 | 咖啡杯 |
| 15.00 | 手机壳 |
| 11.00 | 帆布袋 |
网店里的其他表
这家网店还有客户表 customers、订单表 orders、订单明细表 order_items,和员工表 employees。后面的课会一张一张用到。先看看客户:
1SELECT id, name, city FROM customers;| id | name | city |
|---|---|---|
| 1 | 林晓 | 上海 |
| 2 | 王磊 | 北京 |
| 3 | 陈静 | 上海 |
| 4 | 张伟 | 广州 |
| 5 | 刘洋 | 成都 |
| 6 | 赵敏 | 北京 |
| 7 | 孙强 | 广州 |
| 8 | 周婷 | 上海 |
| 9 | 吴昊 | 成都 |
| 10 | 郑雪 | 杭州 |
小技巧: 不知道一张表有哪些列,就先 SELECT * 看一眼。
一次跑好几条
一条查询以分号 ; 结尾。一次可以写好几条,每一条都会给出自己的结果:
1SELECT name FROM products;2SELECT name FROM customers;
| name |
|---|
| 笔记本 |
| 中性笔(10 支) |
| 双肩包 |
| 水杯 |
| 耳机 |
| 台灯 |
| 数据线 |
| 咖啡杯 |
| 手机壳 |
| 帆布袋 |
| name |
|---|
| 林晓 |
| 王磊 |
| 陈静 |
| 张伟 |
| 刘洋 |
| 赵敏 |
| 孙强 |
| 周婷 |
| 吴昊 |
| 郑雪 |
关键字大写,名字小写
SELECT、FROM 这样的词叫关键字,大小写都可以。习惯上关键字写大写,表名和列名写小写,一眼就能分清。换行和空格也随你,长的查询可以分几行写:
1select name,2 stock3from products;
| name | stock |
|---|---|
| 笔记本 | 120 |
| 中性笔(10 支) | 80 |
| 双肩包 | 15 |
| 水杯 | 40 |
| 耳机 | 10 |
| 台灯 | 0 |
| 数据线 | 200 |
| 咖啡杯 | 60 |
| 手机壳 | 35 |
| 帆布袋 | 25 |
这条和 SELECT name, stock FROM products; 完全一样。
结果有几列?
1SELECT name, city FROM customers; SELECT 后面写了两个列名:name 和 city,结果就只有这两列。customers 表本身有 5 列,可这里只选了 2 列。
第一个报错
列名拼错了,数据库会告诉你哪个名字不认识:
1SELECT name, prise FROM products;ERROR 1054 (42S22): Unknown column 'prise' in 'field list'
没有叫「prise」的列。检查一下列名有没有写错;如果它是一段文字,要加引号:'prise'。
ERROR 1054 是 MySQL 的错误编号,后面说「不认识 prise 这一列」。改成 price,再运行一次。
练一练
写好查询,点检查。提示随便看,实在想不出来再看答案。
商品和库存
✓从 products 表里查出每件商品的 name 和 stock 两列。
| name | stock |
|---|---|
| 笔记本 | 120 |
| 中性笔(10 支) | 80 |
| 双肩包 | 15 |
| 水杯 | 40 |
| 耳机 | 10 |
| 台灯 | 0 |
| 数据线 | 200 |
| 咖啡杯 | 60 |
| 手机壳 | 35 |
| 帆布袋 | 25 |
1SELECT * FROM products;员工
✓从 employees 表里查出 name 和 title 两列,title 在前。
| title | name |
|---|---|
| 经理 | 李华 |
| 销售主管 | 马超 |
| 仓库主管 | 杨帆 |
| 销售 | 黄磊 |
| 销售 | 何琳 |
| 打包员 | 高远 |
1SELECT name FROM employees;修好它:列名
✓这条查询报错了。改好它,查出客户的 name 和 email。
| name | |
|---|---|
| 林晓 | [email protected] |
| 王磊 | [email protected] |
| 陈静 | NULL |
| 张伟 | [email protected] |
| 刘洋 | [email protected] |
| 赵敏 | NULL |
| 孙强 | [email protected] |
| 周婷 | [email protected] |
| 吴昊 | NULL |
| 郑雪 | [email protected] |
1SELECT name, mail FROM customers;有的客户没留邮箱,那一格显示 NULL,意思是「没有值」。第 5 课专门讲它。
这一课学会了
- 数据放在表里:每一行是一条记录,每一列是一项信息。
SELECT 列, 列 FROM 表;查出想要的列;*是所有列。- 每条查询以分号结尾,一次可以跑好几条。
- 关键字习惯大写,名字小写;换行和空格随意。
- 列名写错会得到
ERROR 1054,先看它说哪个名字不认识。