好了,我们已经开始了解SELECT了,这个SQL命令就是用来从数据库里的表(或者多个表)里取数据的。可以说它就像数据库里的F5刷新键:“给我看看你都有什么”。最简单的查询结构长这样:
SELECT 列1, 列2, … 列N
FROM 表
这里:
SELECT— 这是查询的关键字,所有查询都从它开始。列1, 列2, ...— 这是你想要获取数据的列的列表。FROM 表— 指定你要从哪个表里取数据。
我们直接用例子来拆解一下吧!
SELECT命令的基本结构
查询所有列。如果你想看表里的所有数据,可以用星号*。比如说,我们有个表叫students:
| id | name | age | grade |
|---|---|---|---|
| 1 | Alex | 17 | A |
| 2 | Maria | 19 | B |
| 3 | Otto | 21 | C |
要把这个表里的所有数据都查出来,用这个查询:
SELECT * FROM students
结果就是下面这样的列和行:
| id | name | age | grade |
|---|---|---|---|
| 1 | Alex | 17 | A |
| 2 | Maria | 19 | B |
| 3 | Otto | 21 | C |
也就是说——整个表都查出来了,没毛病。
只查指定的列
当然,大多数时候你只想查你需要的那些列,没必要把没用的数据都带出来。比如你只想知道名字和年龄。那你就写这样的查询:
SELECT name, age FROM students
查询结果会是这样:
| name | age |
|---|---|
| Alex | 17 |
| Maria | 19 |
| Otto | 21 |
明白区别了吗?只查你需要的列,查询又快又清爽。
查询的执行顺序
SQL查询其实有点小坑:虽然我们写SELECT在最前面,但实际上数据库先处理FROM部分,然后才返回结果。底层流程大概是这样的:
- 先处理
FROM里的表:服务器先找到你指定的表。 - 对行应用条件(如果有的话):只选出符合条件的行。
- 选出指定的列:从剩下的行里提取你要的数据。
比如这个命令:
SELECT name FROM students
数据库会先找到students表,然后读name列,最后才把结果返回给你。
实战例子
例子1:学生名单。
假设你是大学管理员,需要所有学生的名字。查询如下:
SELECT name
FROM students;
结果:
| name |
|---|
| Alex |
| Maria |
| Otto |
例子2:加上年龄和id。
现在你还想要id、名字和年龄。只要多写几个列就行:
SELECT name, age, id
FROM students;
结果:
| name | age | id |
|---|---|---|
| Alex | 17 | 1 |
| Maria | 19 | 2 |
| Otto | 21 | 3 |
例子3:加上表达式。
假如你想知道你的学生距离成年还差几岁。
那你可以把age换成21-age。这里我们假设21岁算成年:
SELECT name, 21-age
FROM students;
结果如下:
| name | 21-age |
|---|---|
| Alex | 4 |
| Maria | 2 |
| Otto | 0 |
关于表达式的更多内容,后面几节课会详细讲。现在我们来看看你们可能已经遇到过的常见错误。
用SELECT时常见的错误
表名和列名拼错了。
最常见的错误之一——表名或者列名写错了。
如果数据库里没有studentsz这个表,你会报错:
SELECT name
FROM studentsz; -- 错误:没有这个表!
或者列名其实叫name,你写成了student_name,也会报错:
SELECT student_name -- 错误:没有这个列!
FROM students;
解决办法很简单:随时检查你的表名和列名。
查询语法写错了。
还有一个常见错误——写列名的时候忘了加逗号:
SELECT name age id -- 错误:少了逗号!
FROM students;
不过别担心。SELECT查询只是查数据,哪怕写错了也不会把你的数据库数据搞坏。但等我们学到那些能改数据的命令时,错误就会很严重了。
用*而不是指定列。
你用*的时候,会把所有数据都查出来,包括你不需要的。这会让查询变慢,表大了还容易出问题。记住,只查你真正需要的列就行。
GO TO FULL VERSION