PostgreSQL修炼之道:从小工到专家(第2版)
上QQ阅读APP看书,第一时间看更新

3.4.5 多表关联查询

多表关联查询也称表join。假设有一张班级表“class”,建表语句如下:


CREATE TABLE class(no int primary key, class_name varchar(40));

表中的“no”表示班级编号,“class_name”表示班级名称。

现插入一些测试数据:


osdba=# INSERT INTO class VALUES(1,'初二(1)班');
INSERT 0 1
osdba=# INSERT INTO class VALUES(2,'初二(2)班');
INSERT 0 1
osdba=# INSERT INTO class VALUES(3,'初二(3)班');
INSERT 0 1
osdba=# INSERT INTO class VALUES(4,'初二(4)班');
INSERT 0 1
osdba=# SELECT * FROM class;
 no | class_name 
----+------------
  1 | 初二(1)班
  2 | 初二(2)班
  3 | 初二(3)班
  4 | 初二(4)班
(4 rows)

还有一张学生表“student”,建表语句如下:


CREATE TABLE student(no int primary key, student_name varchar(40), age int, class_no int);

同样插入一些测试数据:


osdba=# INSERT INTO student VALUES(1, '张三', 14, 1);
INSERT 0 1
osdba=# INSERT INTO student VALUES(2, '吴二', 15, 1);
INSERT 0 1
osdba=# INSERT INTO student VALUES(3, '李四', 13, 2);
INSERT 0 1
osdba=# INSERT INTO student VALUES(4, '吴三', 15, 2);
INSERT 0 1
osdba=# INSERT INTO student VALUES(5, '王二', 15, 3);
INSERT 0 1
osdba=# INSERT INTO student VALUES(6, '李三', 14, 3);
INSERT 0 1
osdba=# INSERT INTO student VALUES(7, '吴二', 15, 4);
INSERT 0 1
osdba=# INSERT INTO student VALUES(8, '张四', 14, 4);
INSERT 0 1
osdba=# SELECT * FROM student;
 no | student_name | age | class_no 
----+--------------+-----+----------
  1 | 张三         |  14 |        1
  2 | 吴二         |  15 |        1
  3 | 李四         |  13 |        2
  4 | 吴三         |  15 |        2
  5 | 王二         |  15 |        3
  6 | 李三         |  14 |        3
  7 | 吴二         |  15 |        4
  8 | 张四         |  14 |        4

假设想查询每个学生的名字与班级名称的关系,那么就需要关联查询两张表:


SELECT student_name, class_name FROM student, class 
  WHERE student.class_no = class.no;

查询结果如下:


osdba=# SELECT student_name, class_name FROM student, class 
 WHERE student.class_no = class.no;
 student_name | class_name 
--------------+------------
 张三         | 初二(1)班
 吴二         | 初二(1)班
 李四         | 初二(2)班
 吴三         | 初二(2)班
 王二         | 初二(3)班
 李三         | 初二(3)班
 吴二         | 初二(4)班
 张四         | 初二(4)班
(8 rows)

表关联查询就是在WHERE子句中加上需要关联的条件(两张表关联):


WHERE student.class_no = class.no;

由于两张表中有些列的名称相同,如在表“student”中“no”表示学生号,而在表“class”中表示班级号,所以在关键条件中要明确使用“表名”加“列名”来唯一定位某一列。如果输入的表名比较长,可以给表起个别名,SQL语句如下:


SELECT student_name, class_name FROM student a, class b
  WHERE a.class_no = b.no;

在上面的语句中,表“student”的别名为“a”,表“class”的别名为“b”,此时条件表达式中“b.no”就代表表“class”中的“no”列。

还可以在关联查询的WHERE子句中加上其他过滤条件,如下所示:


osdba=# SELECT student_name, class_name FROM student a, class b
  WHERE a.class_no = b.no AND a.age > 14;
  student_name | class_name 
 --------------+------------
  吴二         | 初二(1)班
  吴三         | 初二(2)班
  王二         | 初二(3)班
  吴二         | 初二(4)班
(4 rows)