ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:143.17KB ,
资源ID:24675004      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24675004.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(SQL内连接与外连接.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

SQL内连接与外连接.docx

1、SQL内连接与外连接1.概述1、联接(典型的联接运算,使用像 = 或 之类的比较运算符)。包括相等联接和自然联接。 联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。 2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。 在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定: 1)LEFT JOIN或LEFT OUTER JOIN 左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有

2、选择列表列均为空值。 2)RIGHT JOIN 或 RIGHT OUTER JOIN 右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。 3)FULL JOIN 或 FULL OUTER JOIN完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 例子: -a表 id name b表 id job parent_id 1 3 1 23 1 2 四 2 34 2 3 王武 3 34 4 a.id同parent_id 存在关系 - 1)

3、连接 select a.*,b.* from a inner join b on a.id=b.parent_id 结果是 1 3 1 23 1 2 四 2 34 2 2)左连接 select a.*,b.* from a left join b on a.id=b.parent_id 结果是 1 3 1 23 1 2 四 2 34 2 3 王武 null 3) 右连接 select a.*,b.* from a right join b on a.id=b.parent_id 结果是 1 3 1 23 1 2 四 2 34 2 null 3 34 4 4) 完全连接 (不做过多概述)sele

4、ct a.*,b.* from a full join b on a.id=b.parent_id 结果是 1 3 1 23 1 2 四 2 34 2 null 3 34 4 3 王武 null2.连接(INNER JOIN)连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的表就是数据库在做查询形成的中间表)。例如:下面的语句3和语句4的结果是相同的。语句1:隐式的连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM CUSTOMERS C,O

5、RDERS OWHERE C.ID=O.CUSTOMER_ID;语句2:显示的连接,一般称为连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM CUSTOMERS C INNER JOIN ORDERS O ON C.ID=O.CUSTOMER_ID;3.外连接(OUTER JOIN):外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTE

6、R JOIN)。三者的共同点是都返回符合连接条件和查询条件(即:连接)的数据行。不同点如下:左外连接还返回左表中不符合连接条件单符合查询条件的数据行。右外连接还返回右表中不符合连接条件单符合查询条件的数据行。全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,OUTER 关键字是可省略的。下面举例说明:语句3:左外连接(LEFT

7、OUTER JOIN)SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;语句4:右外连接(RIGHT OUTER JOIN)SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;注意:WHERE条件放在ON后面查询的结果是不一样的。例如:

8、语句5:WHERE条件独立。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_IDWHERE O.ORDER_NUMBERMIKE_ORDER001;语句6:将语句5中的WHERE条件放到ON后面。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_

9、ID AND O.ORDER_NUMBERMIKE_ORDER001;从语句5和语句6查询的结果来看,显然是不相同的,语句6显示的结果是难以理解的。因此,推荐在写连接查询的时候,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中。语句7:全外连接(FULL OUTER JOIN)。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;注意:MySQL是不支持全外的连接的,这里给出的写法适合Oracle和D

10、B2。但是可以通过左外和右外求合集来获取全外连接的查询结果。语句8:左外和右外的合集,实际上查询结果和语句7是相同的。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_IDUNIONSELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;4.SQ

11、L查询的基本原理:两种情况介绍。第一、单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。第二、两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。第三、多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。理解SQL查

12、询的过程是进行SQL优化的理论依据。ON后面的条件(ON条件)和WHERE条件的区别:ON条件:是过滤两个表笛卡尔积形成中间表的约束条件。WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。从这里可以看出,将WHERE条件移入ON后面是不恰当的。推荐的做法是:ON只进行连接操作,WHERE只过滤中间表的记录。总结连接查询是SQL查询的核心,连接查询的连接类型选择依据实际需求。如果选择不当,非但不能提高查询效率,反而会带来一些逻辑错误或者性能低下。下

13、面总结一下两表连接查询选择方式的依据:1、 查两表关联列相等的数据用连接。2、 Col_L是Col_R的子集时用右外连接。3、 Col_R是Col_L的子集时用左外连接。4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。多个表查询的时候,这些不同的连接类型可以写到一块。例如:SELECT T1.C1,T2.CX,T3.CYFROM TAB1 T1INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);WHERE T1.X

14、T3.Y;上面这个SQL查询是多表连接的一个示。5.操作符下的左右连接对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项: 1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。 2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符 3.(+)操作符只适用于列,而不能用在表达式上。 4.(+)操作符不能与or和in操作符一起使用。 5.(+)操作符只能用于实现左外连接和右外连接左连接用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以

15、加号写在右表,左表就是全部显示,故是左连接。SQL Select * from dave a,bl b where a.id=b.id(+); - 注意: 用(+) 就要用关键字where右连接用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在左表,右表就是全部显示,故是右连接。SQL Select * from dave a,bl b where a.id(+)=b.id;6.On与where的区别数据库在通过连接两或多表来返回记录时,都会生成一中间的临时表,然后再将这临时表返回给用户。 在使用left jion时,on和where条件的

16、区别如下:1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。 假设有两表:表1:tab2 id size1 102 203 30表2:tab2 size name10 AAA20 BBB20 CCC两条SQL:1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=AAA2、select * for

17、m tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=AAA)第一条SQL的过程:1、中间表on条件:tab1.size = tab2.size tab1.id tab1.size tab2.size tab2.name1 10 10 AAA2 20 20 BBB2 20 20 CCC3 30 (null) (null)| |2、再对中间表过滤where 条件:tab2.name=AAAtab1.id tab1.size tab2.size tab2.name1 10 10 AAA第二条SQL的过程:1、中间表on条件:ta

18、b1.size = tab2.size and tab2.name=AAA(条件不为真也会返回左表中的记录) tab1.id tab1.size tab2.size tab2.name1 10 10 AAA2 20 (null) (null)3 30 (null) (null) 其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。心得:外匹配,连接过

19、滤,外即匹配又过滤用on和where 搭配7.图解SQL的连接与外连接 外连接就相当于多个业务表的一次合体,连接的条件必须是关键性的! 连接成功就可看成一表!在oracle的SQL语句常用的连接有连接(inner join),外连接(outer join)等,连接又包括等值连接,非等值连接,自连接;而外连接又分为左连接和右连接。其中默认的是连接的等值连接。 为了方便我们创建两最简易的表A、B,具体的表结构参看下面,来分析连接与外连接的区别一对多关系,A一(主表),B多(子表),主表的一条记录对应子表的多条记录 图1 图2两个表要做连接,必须要有连接字段,而在表A和表B中连接字段是Aid和Bna

20、mid,下图说明了连接之间关系图3图3(1) 连接:利用连接(等值)就可获取蓝色的公共部分C,即图3中的数据集C,结果集为如下:只显示主表与子表有关联的记录,一个主表记录可能有多个子表记录(即在生成的中间表中,主表数据一般重复出现,所以查询出来的记录数根据每个主表记录有多少个子表记录而定,下同)图4其实select * from A join B on A.Aid=B.Bnamid;等价于select * from A,B where A.Aid=B.Bnamid;注:非等值连接主要的话是针对一个围来查询数据,自连接主要就是把1表堪称两表来用 (2)外连接:分为左外连接(left join)与

21、右外连接(right join)左外连接即公共显示的蓝色部分C1+显示黄色的记录集A1,显示语句等价于select * from A,B where A.Aid=B.Bnamid(+); 不但显示主表与子表有关联的记录,还显示主表与子表没有关联的主表记录图 5右外连接即公共显示的蓝色部分C1+显示绿色的B1,显示语句等价于select * from A,B where A.Aid(+)=B.Bnamid;显示子表在主表有关联的记录,还显示子表与主表没有关联的子表记录图6表A和表B情况是相对的,以上实验都是A在左边的情况,其实A left join B与B right join A的情况的结果集

22、是一样的。自己的总结:两表之间,只要有关联,不管以什么关系存在,都可能有对方关联或被关联不到的数据,这就是区分外连接的关键,数据的展示以关联的一方为准,被关联的可能重复被关联以哪个表为准,就显示这个表的全部信息,抛去另一个表独有的部分这是仅仅的技术层面,至于要以哪个表为准,要看业务逻辑的需要,哪个表的独有部分是我们更想要的,这时候,表之间的对应关系才更重要点,这是业务问题利用关键性的数据库字段连接,才能更好地关联8.SQL何时使用外连接所谓外连接,就是表与表有条件的拼接,连接是连接条件所列字段,(比如a.recorder = b.userid中的recorder与userid)有值且满足表达式

23、的记录才拼接成功并显示,外的左外,连接条件是给右表说的,连接表达式成立的记录与左表拼接,不成立的行不显示,不管拼接表达式是否成立,左表照常显示,连接条件不受限制,并不是必须有主表,也可以是和主表连接的其他表组成连接条件需要查找两表同时存在的数据,使用连接,需要查找两表中一表存在,另一表不存在的时候使用外连接。SELECT T1.C1,T2.CX,T3.* -如果没有要求特别显示哪个字段,则所有表的字段都显示FROM TAB1 T1INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)LEFT JOIN TAB3 T3 ON (T1.C1=T2.C3)-不管和哪个表组成连接条件,

24、只要表达式成立的记录,才能和主表拼接并显示。LEFT JOIN TAB4 T4 ON(T3.C2=T4.C3);比如有tableA ,tableB,tableA和tableB是一对多需求:根据tableB的某写字段,查询出tableA 分析:如果此时使用 则相应的语句是:select a.* from tableA a ,tableB b where a.id =tableB.aid and b.code=4401此时返回的结果是tableA在tableB有子数据的部分数据,而如果表tableA中的某条数据,在表tableB中不存在子数据,此时是查询不出来!如果使用的是外连接,则相应的语句如下

25、:select a.* from tableA a left join tableB b on a.id=b.aid and b.code=4401; 此时返回的结果是tableA中的全部数据,而且有重复数出现,则应该用distinct过滤,语句如下:select distinct a.* from tableA a left join tableB b on a.id=b.aid and b.code=4401; 联接查询可以连接两个或两个以上的表,参与联接的表的地位是平等的,而外联接中参与联接的表有主从之分.以主表的每行数据去匹配从表的数据列,符合条件的数据将直接返回到结果集中,不符合的用

26、NULL(空值)填充后再返回到结果集中. 介绍2 连接的查询结果都是满足连接条件的元组。但有时我们也希望输出那些不满足连接条件的元组信息。比如,有学生表与选课表我们想知道每个学生的选课情况(每个学生有唯一的学号),包括已经选课的学生(这部分学生的学号在学生表中有,在选课表中也有,是满足连接条件的),也包括没有选课的学生(这部分学生的学号在学生表中有,但在选课表中没有,不满足连接条件),这时就需要使用外连接。外连接是只限制一表中的数据必须满足连接条件,而另一表中的数据可以不满足连接条件的连接方式。3种外连接: 1)左外连接(LEFTOUTER JOIN)如果在连接查询中,连接管子左端的表中所有的

27、元组都列出来,并且能在右端的表中找到匹配的元组,那么连接成功。如果在右端的表中,没能找到匹配的元组,那么对应的元组是空值(NULL)。这时,查询语句使用关键字LEFT OUTERJOIN,也就是说,左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的数据是否满足连接条件,均输出左端表中的容。例如:要查询所有学生的选课情况,包括已经选课的和还没有选课的学生,查询语句为SELECT学生表.学号,班级,课程号,成绩FROM学生表LEFT OUTER JOIN选课表ON学生表.学号=选课表.学号左外连接查询中左端表中的所有元组的信息都得到了保留。2)右外连接(RIGHTO

28、UTERJOIN)右外连接与左外连接类似,只是右端表中的所有元组都列出,限制左端表的数据必须满足连接条件,而不管右端表中的数据是否满足连接条件,均输出表中的容。例如:同上例容,查询语句为SELECT学生表.学号,班级,课程号,成绩FROM学生表RIGHTOUTERJOIN选课表ON学生表.学号=选课表.学号右外连接查询中右端表中的所有元组的信息都得到了保留。3)全外连接(FULL OUTER JOIN)全外连接查询的特点是左、右两端表中的元组都输出,如果没能找到匹配的元组,就使用NULL来代替。例如:同左外连接例子容,查询语句为SELECT学生表.学号,班级,课程号,成绩FROM学生表FULL

29、 OUTER JOIN选课表ON学生表.学号=选课表.学号全外连接查询中所有表中的元组信息都得到了保留。答案你首先是要搞清楚外连接和连接的概念之后就很容易进行判断了,你要将两个表匹配的记录都选取出来 那么就是连接, 你要将除了两表匹配之外还需要其中某一个表不匹配的记录,那么就用外连接,是左还是右 取决于那个表是放在左边还是右边。 简单说就是以谁为准就用谁!以左数据为准去找满足条件的右数据,就用左外连;以右数据为准去找满足条件的左数据,就用右外连;连接:取的两个表的(有能连接的字段),的交集,即字段相同的。利用连接可获取两表的公共部分的记录左外连接 就是以A表学生数据为准,去找B表容或合并出另一个容。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1