oracle - 表连接方式

内连接:INNER JOIN中的INNER是可选的,(INNER JOIN 与 JOIN 是相同的),INNER JOIN 是默认的连接方式。
     内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:
   1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
   2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
   3、自然连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
 
 
等值连接:select a.id,b.id,a.name,a.city from z_student a join z_score b on a.city=b.city;

等值连接:select a.id,b.id,a.name,a.city from z_student a, z_score b where a.city = b.city;--我们平常一直用的其实是内连接里面的等值连接,然后如果有相同的列名的话,其实我们也会用别名,所以其实最终用的还是等价于自然连接

自然连接:select id,a.name,city from z_student a NATURAL JOIN z_score b; (两个表中的列ID默认自然而然关联起来了)
 
 
select a.id from warning a
INNER JOIN monitor c ON a.id = c.warnigId
LEFT JOIN person_type b ON b.mornitorId = c.id
LEFT JOIN detail_type d ON b.id = d.personTypeId
where a.type='0'
and a.id = c.warnigId;

select a.id from warning a ,monitor c
LEFT JOIN person_type b ON b.mornitorId = c.id
LEFT JOIN detail_type d ON b.id = d.personTypeId
where a.type='0'
and a.id = c.warnigId;

 

外连接:

有两下表,sc_sid外键关联到sid
z_student z_score
sid sname scid sc_sid scores
1 张三 1 1 100
2 李四 2 2 99
3 王五 3 3 90
4 rr 4 7 88
5 赵六 5 8 77

查询学生表的sname 和 成绩表的scores
左外连接:(LEFT JOIN 称为 LEFT OUTER JOIN )(:内部连接只获取满足连接条件的数据,而对于外部连接来说,主要是解决这样的一种场景。满足条件的数据检索出来,这个没有疑问,
外部连接还会检索另一部分数据,那就是将不满足条件的数据以NULL来填充。所以左外连接,就是右边表的不满足条件的数据以NULL填充)
SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT JOIN departments d ON (e.department_id = d.department_id); 等价于 SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.department_id=d.department_id(+);
右外连接:(RIGHT JOIN 称为 RIGHT OUTER JOIN )
SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHT JOIN departments d ON (e.department_id = d.department_id); 等价于 SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.department_id(+)=d.department_id; 全外连接:(在某些数据库中, FULL JOIN 称为 FULL OUTER JOINSELECT e.last_name, e.department_id, d.department_name FROM employees e FULL JOIN departments d ON (e.department_id = d.department_id); 等价于 SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.department_id(+)=d.department_id(+);

 

交叉连接(CROSS JOIN):交叉连接所有涉及的表中的所有记录都包含在结果集中。可以采用两种方式来定义交叉连接,分别是隐式和显式的连接。
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48行。


SELECT type,pub_name 
FROM titles CROSS JOIN publishers 
ORDER BY type 


隐式的例子:
SELECT T_Customer.FId, T_Customer.FName, T_Customer.FAge, T_Order.FId, T_Order.FNumber, T_Order.FPrice FROM T_Customer, T_Order 使用显式的连接则需要使用CROSS JOIN,例子如下: SELECT T_Customer.FId, T_Customer.FName, T_Customer.FAge, T_Order.FId, T_Order.FNumber, T_Order.FPrice FROM T_Customer CROSS JOIN T_Order

 

posted on 2012-08-16 09:55  lovebeauty  阅读(283)  评论(0编辑  收藏  举报

导航