ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle数据库笔记三(连接查询:自连接、外连接、)

2022-03-29 18:02:06  阅读:183  来源: 互联网

标签:数据库 查询 id fruits Oracle where 连接 select


连接查询

连接是关系数据库模型的主要特点。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。

因为fruits表和suppliers表中有相同的字段s_id,因此在比较的时候需要完全限定表名(格式为“ 表名.列名”  【中间是点号】),如果只给出s_id,Oracle将不知道指的是哪一个。并返回错误信息

select suppliers.id,s_name,f_name,f_price from fruits,suppliers where fruits.id=suppliers.id;

(两个表含有相同的s_id,所以s_id需要使用 表名.列名 的形式,如果为一个表中独有的字段,如s_name,f_name,f_price字段,则不需要,直接写字段名就行)

自连接查询

如果在一个连接查询中,涉及的两个表都是同一个表,这种查询称为自连接查询。自连接查询是一种特殊的内连接。

--查询f_id=a1的水果供应商提供的其它水果

select f1.f_id,f1.f_name from fruits f1,fruits f2 where f1.sid=f2.s_id and f2.f_id='a1';   --where f1.sid=f2.s_id and f2.f_id='a1'可以得出s_id=101

下面语句与自连接效果相同

select f_id,f_name from fruits where s_id=(select s_id from fruits where f_id='a1');

或者

select f_id,f_name from fruits where s_id in (select s_id from fruits where f_id='a1');

外连接(左(外)连接、右(外)连接、全(外)连接)

1、左连接 LEFT JOIN

左连接的结果包括 left outer join (其中outer可以省略不写)子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在表中没有匹配行,则在相关的结果行中,右表的所有选择列均为空值。

--在customers表和orders表中,查询所有客户,包括没有订单的客户(left outer join中outer可以省略不写,)
select customers.c_id,orders.o_num from customers left outer join orders on customers.c_id=orders.c_id; --其中customers.c_id=10002没有对应的订单,所以为null
                        (左表)            (右表)

2、右连接 RIGHT JOIN

右连接是左连接的反向连接,将返回右表的所有行,如果右表的某行在左表中没有匹配的行,左表将返回空值。

--在customers表和orders表中,查询所有订单,包括没有客户的订单

select order.c_id,customers.c_name from customers right outer join orders on customers.c_id=orders.c_id;   --其中orders表中c_id=10005没有对应的客户,所以为null

带ANY、SOME、all、exists、in关键字的子查询

1、any、some关键字是同义词,表示满足其中任意条件

2、all关键字与any和some不同,使用all时需要同时满足所有内层查询的条件。

--tbl1中num1列的某个值比tbl2中num2列的任意一个数大就行

select num1 from tbl1 where num1>any(select num2 from tabl2);

--tbl1中num1的某个值比num2列的所有值都大

select num1 from tbl1 where num1>all(select num2 from tabl2);

3、exists关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么exists的结果为true,此时外层查询语句将进行查询;

如果子查询没有返回任何行,那么exists返回的结果是false,此时外层语句将不进行查询

--查询suppliers表中是否存在s_id=107的供应商,如果存在,则查询fruits表中的记录

select * from fruits where exists (select s_name from suppliers where s_id=107);

--查询suppliers表中是否存在s_id=107的供应商,如果存在,则查询fruits表中f_price>10.2的记录

select * from fruits where f_price>10.2 and exists (select s_name from suppliers where s_id=107);

not exists与exists使用方法相同,返回的结果相反

exists和not exists的结果只取决于是否会返回行,而不取决于这些行的内容,所以这个子查询输入列表通常是无关紧要的

执行子查询时,Oracle实际上执行了两个操作过程,即先执行内层子查询,再执行外层查询,内层子查询的结果作为外部查询的比较条件

4、IN

--在orderitems表中查询f_id为c0的订单号,并根据订单号查询orders表具有订单号的客户c_id

select c_id from orders where o_num in (select o_num from orderitems where f_id='c0');

 

标签:数据库,查询,id,fruits,Oracle,where,连接,select
来源: https://www.cnblogs.com/wy5132/p/16073104.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有