Oracle多表查询
Oracle中的多表连接就是通过查询表之间的关联字段,一次查询多表数据,要有关联的表才可以哦。
多表查询呢,有几种的方式来查的,就是写的格式有点不一样,但是查询出来的结果呢都是一样的!
以下就是多表连接的几种方式。
(谨记,多表连接查询一定要在where字句中加入有效的连接条件,要不然就会产生可怕的笛卡尔值。 这就有人问了,什么情况下会产生笛卡尔值呢?
笛卡尔值会在下面的条件下产生:
– 省略连接条件
– 连接条件无效
– 所有表中的所有行互相连接)
如:select * from 表1,表2; 如果直接执行的话,得到的数据就是表1的数据x表2的数据,也就是笛卡尔值。
还有一种也是笛卡尔值的表达方式:select * from table1 cross join table2;
这个笛卡尔值要慎用,一定要慎用
下面就用一个学生表和成绩表来举栗子:
第一种:等值连接
select *
from student1 s1,score s
where student1.sno = score1.sno;
得到的结果就是以student1.sno = score1.sno为条件查出这两个表有关系的数据,不包含一个表与另一个表不匹配的行
由于sno列对于两个表都是常见的,所以它必须按表名称前缀,以避免歧义,当然你也可以用别名来代替
使用别名可以简化查询,使用表名前缀可以提高执行效率。
,如果是两个表以上的呢,那就有一条公式:连接n个表就至少需要n-1个连接条件啦,就是说如果连接5张表,那至少就需要4个连接条件才可以。
第二种:外连接,外连接就是两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接,也就是可以查询不满足连接条件的数。符号(+)
左连接:select * from student1, score1
Where student1.sno= score1.sno(+)
右连接:select * from student1, score1
Where student1.sno(+)= score1.sno
还有就是SQL1999的语法,格式不同,结果相同:左(右)连接左(右)边的表为主表
左连接:select * from student1 left join score1 on student1.sno= score1.sno
右连接:select * from student1 rightjoin score1 on student1.sno= score1.sno
第三种:自然连接:natural join会以两个表中具有相同名字的列为条件创建等值连接,注意如果只是列名相同而数据类型不同,则会产生错误。
还有个using:select * from student1 join score1 using(sno)
跟natural join是差不多的,就是如果有两张表,里面有两个关联的字段,当你用natural join 时,它会自动把有关联的列作为连接条件来进行查询,当你用using时,你可以自己来选择那个任意一个或多个有关系的列来做为连接条件。