CodeGym /课程 /SQL SELF /选择特定列:按列名提取数据

选择特定列:按列名提取数据

SQL SELF
第 2 级 , 课程 0
可用

当我们从数据库里取数据时,基本上很少会对所有列都感兴趣。比如说,employees表里可能有15个字段:名字、姓氏、出生日期、职位、工资、入职日期等等。但你其实只想知道他们的名字和职位。全都查出来其实没啥用,还浪费资源。这时候,选取特定列的技巧就派上用场了。

打个比方,这就像你有一筐橙子、苹果和香蕉,但你只想拿苹果。是不是很酷?我们现在就来搞这个!

语法

提醒一下,SQL设计得超级user-friendly。

首先,SQL语句大小写无所谓。你可以写SELECTSelect,或者select,都能跑。其次,换行也没影响。数据库管理系统会把你的SQL拼成一行,怎么写都行,随你喜欢。

你应该已经猜到了,SELECTFROM只是个开始。要不然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_namegrade

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

这里我们:

  1. 把列名换成了更好懂的中文。
  2. 在SQL里用AS加了别名。

如果你老板或者客户要看用户数据,不想让他看表头就头大——别名就是你的好帮手。

现在我们把全名的SQL也优化一下。

SELECT first_name || ' ' || last_name  AS "全名", grade  AS "成绩"
FROM students;

执行结果:

全名 成绩
Alex Lin A
Anna Song B
Otto Art A

完美。就是我们想要的效果。

为什么只选部分列?

  1. 性能

想象一下你在操作一个有几百万行、上百列的大表。全查出来SELECT *可能要跑几分钟甚至更久,还吃掉一堆服务器资源。只查你要的,才高效。

  1. 可读性

只查需要的列,结果一目了然。要不然结果就像周五晚上刷新闻那样头大。

  1. 减少出错

查的数据越少,出错的概率越低。尤其是你后面还要用这些数据的时候。

要注意啥?

表别名

另一个对付长表名的办法,就是用表别名。别名最好能让人联想到原表名,或者和内容有点关系。

SELECT sa05.first_name, sa05.course_id
FROM students_archive_2005 AS sa05

这个方法特别适合那种表名超长的,比如university_students_enrollments_records,你可以用usr或者us

选特定列时常见的坑

  1. 列名拼错。如果你写错了列名,会报错,比如:ERROR: column "lastname" does not exist。检查下拼写。

  2. 名字冲突。查多个表时,记得指定字段属于哪个表,比如students.first_name

  3. SELECT *——新手大坑。虽然能用也方便,但大项目里这是坏习惯!只查你要的列才对。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION