当我们从数据库里取数据时,基本上很少会对所有列都感兴趣。比如说,employees表里可能有15个字段:名字、姓氏、出生日期、职位、工资、入职日期等等。但你其实只想知道他们的名字和职位。全都查出来其实没啥用,还浪费资源。这时候,选取特定列的技巧就派上用场了。
打个比方,这就像你有一筐橙子、苹果和香蕉,但你只想拿苹果。是不是很酷?我们现在就来搞这个!
语法
提醒一下,SQL设计得超级user-friendly。
首先,SQL语句大小写无所谓。你可以写SELECT,Select,或者select,都能跑。其次,换行也没影响。数据库管理系统会把你的SQL拼成一行,怎么写都行,随你喜欢。
你应该已经猜到了,SELECT和FROM只是个开始。要不然SQL也不会有那么多话题。完整点的SQL语句长这样:
SELECT 列名
FROM 表名
WHERE 条件
GROUP BY 列名
HAVING 列名
ORDER BY 排序
这里:
列名— 你想要查出来的字段名。表名— 你要查的表的名字。条件— 用来筛选行的条件。排序— 排序的字段和顺序。
是不是很简单?我们来举个实际的例子。不过先从简单点的开始。
基础查询示例
假设我们有个students表,里面存着学生的信息。表结构大概是这样的:
| id | first_name | last_name | age | grade |
|---|---|---|---|---|
| 1 | Alex | Lin | 20 | A |
| 2 | Anna | Song | 22 | B |
| 3 | Otto | Art | 19 | A |
现在我们只想知道所有学生的last_name和grade。
SQL语句如下:
SELECT last_name, grade
FROM students;
执行结果:
| last_name | grade |
|---|---|
| Lin | A |
| Song | B |
| Art | A |
恭喜你,这样就省了数据库资源,结果也更清爽!
字符串拼接
你已经会查数据了,来点有意思的。在我们的表里,名字和姓氏是分开的。我们来写个SQL,把全名拼成一列。
在PostgreSQL里,拼接字符串用||。我们的SELECT语句长这样:
SELECT first_name || last_name, grade
FROM students;
执行结果:
| first_name || last_name | grade |
|---|---|
| AlexLin | A |
| AnnaSong | B |
| OttoArt | A |
嗯,好像少了点啥。比如说名字和姓之间的空格!来修一下。
SELECT first_name || ' ' || last_name, grade
FROM students;
执行结果:
| first_name || ' ' || last_name | grade |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
舒服。结果表内容我喜欢,但表头有点丑。最好能显示full name或者name,而不是first_name || ' ' || last_name。这样不美观也不实用。其实也有办法搞定。
用别名(alias)选取
SQL语句可以用别名让结果更好看。就是给列临时起个新名字。别名用AS关键字(其实可以省略,但建议写上,清晰)。
来看个例子:
SELECT first_name AS "名字", last_name AS "姓氏", grade AS "成绩"
FROM students;
执行结果:
| 名字 | 姓氏 | 成绩 |
|---|---|---|
| Alex | Lin | A |
| Anna | Song | B |
| Otto | Art | A |
这里我们:
- 把列名换成了更好懂的中文。
- 在SQL里用
AS加了别名。
如果你老板或者客户要看用户数据,不想让他看表头就头大——别名就是你的好帮手。
现在我们把全名的SQL也优化一下。
SELECT first_name || ' ' || last_name AS "全名", grade AS "成绩"
FROM students;
执行结果:
| 全名 | 成绩 |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
完美。就是我们想要的效果。
为什么只选部分列?
- 性能
想象一下你在操作一个有几百万行、上百列的大表。全查出来SELECT *可能要跑几分钟甚至更久,还吃掉一堆服务器资源。只查你要的,才高效。
- 可读性
只查需要的列,结果一目了然。要不然结果就像周五晚上刷新闻那样头大。
- 减少出错
查的数据越少,出错的概率越低。尤其是你后面还要用这些数据的时候。
要注意啥?
表别名
另一个对付长表名的办法,就是用表别名。别名最好能让人联想到原表名,或者和内容有点关系。
SELECT sa05.first_name, sa05.course_id
FROM students_archive_2005 AS sa05
这个方法特别适合那种表名超长的,比如university_students_enrollments_records,你可以用usr或者us。
选特定列时常见的坑
列名拼错。如果你写错了列名,会报错,比如:
ERROR: column "lastname" does not exist。检查下拼写。名字冲突。查多个表时,记得指定字段属于哪个表,比如
students.first_name。用
SELECT *——新手大坑。虽然能用也方便,但大项目里这是坏习惯!只查你要的列才对。
GO TO FULL VERSION