要更好地理解连接查询,需了解笛卡尔积的概念。
提高查询效率的关键在于消除笛卡尔积。
两个表(或连接)中某一数据项相等的连接称为内连接。连接的结果是形成一个新的数据表。可以理解为取左连接与右连接的交集,即两边都满足匹配条件时取出数据。
select *from Student INNER JOIN Score ON Score.s_id=Student.s_id
(where子句中使用=等号为限定条件)
在连接条件中使用‘’=‘’运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。连接条件是一个表中的一个字段必须等于另一个表中的一个字段。
select * from stu t1 INNER JOIN stu_depart t2 ON t1.deptno= t2.deptno WHERE t2.deptno =t2.deptno;
select * from stu t1,t_depart t2 WHERE t2.deptno =t2.deptno;
自然连接也是一种等值连接,在开发中使用较少,可以理解为去掉重复列的等值连接。不需要写on条件。自然连接一定是等值连接,但等值连接不一定是自然连接。
需要两个关系表中进行比较的属性列名字与属性(类型)相同,不需要写连接条件,并结果中不会出现重复的属性列,从而自然连接以进行多表查询。如果两个关系中有多组这样的属性,默认是全部比较的。
//创建表A,插入两行数据,包含姓名信息
create table A(
aid number(9) primary key,
aname varchar2(90)
);
insert into A values(1,'John');
insert into A values(2,'Mary');
//创建表B,插入两行数据,包含性别信息
create table B(
aid number(9) primary key,
asex varchar2(90)
);
insert into B values(1,'male');
insert into B values(2,'female');
//将表A与表B自然连接,得到查询结果为姓名、性别,
select aname,asex from A NATURAL JOIN B;
在连接的条件中可以使用小于(<)、大于(>)、不等于(<>)等运算符,而且还可以使用LIKE、BETWEEN AND等运算符,甚至还可以使用函数。
以下为一个示例,表名为emp,包含name,job,grade;
根据salgrade表中最高工资与最低工资之间的范围进行查询
select name,job,grade from emp e,salgrade grade where e.sal between grade.losal and grade.hisal;
student(左表)
id | name | sex | college_id |
---|---|---|---|
1 | a | m | 1 |
2 | b | f | 1 |
3 | c | m | 2 |
4 | d | null |
college(右表)
college_id | college_name |
---|---|
1 | AU |
2 | BU |
3 | CU |
等值连接时:
id | name | sex | college_id | college_name |
---|---|---|---|---|
1 | a | m | 1 | AU |
2 | b | f | 1 | AU |
3 | c | m | 2 | BU |
左外连接时:
id | name | sex | college_id | college_name |
---|---|---|---|---|
1 | a | m | 1 | AU |
2 | b | f | 1 | AU |
3 | c | m | 2 | BU |
4 | d | null |
A不改变,B表匹配A表。
以左表为主表列出所有数据,右表如匹配无数据为null。
将返回右表的所有行。如果左表的某行在右表中没有匹配行,则将为右表返回空值左连接:
select *from Student LEFT JOIN college ON Student.s_id=Score.s_id
select *from Student LEFT OUTER JOIN college ON Student.s_id=Score.s_id
B不改变,A表匹配B表。返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值;
以右表为主表,左表中没数据的为null
select *from Student RIGHT JOIN college ON Student.s_id=Score.s_id
select *from Student RIGHT OUTER JOIN college ON Student.s_id=Score.s_id
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
select *from Student FULL JOIN Score ON Student.s_id=Score.s_id
select *from Student FULL OUTER JOIN Score ON Student.s_id=Score.s_id