目录
6.1.3.1 左外连接(left [outer] join)
6.1.3.2 右外连接(right [outer] join)
6.1 连接查询
数据库本着精简的设计原则,通常将数据存放于不同的表中,最大限度地减少数据冗余。在实际应用中,经常需要从多个数据表中查询满足一定条件的记录,这时就要用到连接查询。
连接查询分为交叉连接、内连接、外连接和自连接。
6.1.1 交叉连接(cross join)
交叉连接返回被连接表中所有数据行的笛卡尔积,
查询结果集的总行数=被连接表行数的乘积,总列数=被连接表列数的总和。
其基本语法格式如下:
SELECT * FROM 表名1 CROSS JOIN 表名2
在from子句中也可以省略cross join,使用逗号分隔被连接的表,
其基本语法格式如下:
SELECT * FROM 表名1 , 表名2
交叉连接产生的结果集一般没有实际应用的意义,所以这种连接很少使用。
6.1.2 内连接(inner join)
内连接是最常使用的连接查询方式,通过inner join或者join连接两个表,结果集中只包含满足连接条件的记录。连接条件通常采用“主键 = 外键”的形式。
内连接创建连接关系有以下两种方式:
①在WHERE子句中创建连接关系,两个表名出现在FROM子句中,其基本语法格式如下:
SELECT 列名列表
FROM 表名1 , 表名2 WHERE 表名1.列名 = 表名2.列名
② 在FROM子句中创建连接关系,其基本语法格式如下:
SELECT 列名列表
FROM 表名1 [ INNER ] JOIN 表名2 ON 表名1.列名 = 表名2.列名
【例3.102】查询所有选课学生的学号、所选课程的名称和成绩。
SELECT score.cno, cname, grade
FROM course, score
WHERE course.cno = score.cno; /*在WHERE子句中给出等值连接查询条件*/
【例3.103】查询男学生的选课情况。要求列出学号、姓名、性别、课程名、课程号和成绩。
-- 方法1
SELECT A.sno, A.sname, A. ssex, C.cname, C.cno, B.grade
FROM student A INNER JOIN score B ON A.sno = B. sno /*可省略INNER*/
INNER JOIN course C ON B.cno = C.cno
WHERE (A.ssex = '男') ;
-- 方法2
SELECT A.sno, A.sname, A. ssex, C.cname, C.cno, B.grade
FROM student A, score B, course C
WHERE A.sno = B. sno AND B.cno = C.cno AND A.ssex = '男';
6.1.3 外连接(outer join)
在内连接查询中,结果集中只包括满足连接条件的数据行,但有时用户也希望在结果集中能显示那些不满足连接条件的数据,这就需要使用外连接查询。
外连接操作的类型可分为左外连接和右外连接。
在创建外连接时,表在SQL语句中出现的顺序非常重要。
出现在JOIN左边的表是“左表”,出现在JOIN右边的表是“右表”。
6.1.3.1 左外连接(left [outer] join)
左外连接指定在结果集中除了包括由内连接返回的所有行之外,还包括左表中所有不满足连接条件的行,并将结果集中右表的输出列设置为NULL。
因此,左外连接可以使得左表中的所有记录都显示在结果集中。
左外连接是对连接条件中左边表不加限制,其基本语法格式如下:
SELECT 列名列表
FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 表名1.列名 = 表名2.列名
【例3.102】student表左外连接score表。
SELECT A.sno, A.sname, B.cno, B.grade
FROM student A LEFT OUTER JOIN score B ON A.sno = B.sno;
6.1.3.2 右外连接(right [outer] join)
右外连接指定结果集中除了包括由内连接返回的所有行之外,还包括右表中所有不满足连接条件的行,并将结果集中左表的输出列设置为NULL。
因此,右外连接可以使得右表中的所有记录都显示在结果集中。
右外连接是