上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)