《2022年数据库表的连接》由会员分享,可在线阅读,更多相关《2022年数据库表的连接(9页珍藏版)》请在金锄头文库上搜索。
1、Left Join, Inner Join 的相关内容,非常实用,对于理解原理和具体应用都很有帮助!一. 先看一些最简单的例子例子Table Aaid adate 1 a1 2 a2 3 a3TableBbid bdate 1 b1 2 b2 4 b4 两个表 a,b 相连接, 要取出 id 相同的字段select * from a inner join b on a.aid = b.bid这是仅取出匹配的数据 . 此时的取出的是 : 1 a1 b1 2 a2 b2 那么 left join 指: select * from a left join b on a.aid = b.bid 首先取
2、出 a 表中所有数据 , 然后再加上与 a,b 匹配的的数据此时的取出的是 : 1 a1 b1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - 2 a2 b2 3 a3 空字符同样的也有 right join 指的是首先取出 b 表中所有数据 , 然后再加上与 a,b 匹配的的数据此时的取出的是 : 1 a1 b1 2 a2 b2 4 空字符 b4LEFT JOIN 或 LEFT OUTER JOIN 。左向外联接的结果集包括
3、LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。 如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值二. left join/right join/inner join操作演示表 A记录如下:aID aNum1 a200501112 a200501123 a200501134 a200501145 a20050115表 B记录如下 :bID bName1 20060324012 2006032402名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
4、- - - - - 第 2 页,共 9 页 - - - - - - - - - 3 20060324034 20060324048 2006032408实验如下 :1. left joinsql 语句如下 : SELECT * FROM ALEFT JOIN B ON A.aID = B.bID结果如下 :aID aNum bID bName1 a20050111 1 20060324012 a20050112 2 20060324023 a20050113 3 20060324034 a20050114 4 20060324045 a20050115 NULL NULL(所影响的行数为 5
5、行)结果说明 : left join是以 A表的记录为基础的 ,A 可以看成左表 ,B 可以看成右表,left join是以左表为准的 .换句话说 , 左表(A) 的记录将会全部表示出来, 而右表(B) 只会显示符合搜索条件的记录 ( 例子中为 : A.aID = B.bID).B表记录不足的地方均为NULL.2. right join名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - sql 语句如下 : SELECT * FRO
6、M ARIGHT JOIN B ON A.aID = B.bID结果如下 :aID aNum bID bName1 a20050111 1 20060324012 a20050112 2 20060324023 a20050113 3 20060324034 a20050114 4 2006032404NULL NULL 8 2006032408(所影响的行数为 5 行)结果说明 :仔细观察一下 , 就会发现 , 和 left join的结果刚好相反 , 这次是以右表(B) 为基础的 ,A 表不足的地方用 NULL填充.3.inner joinsql 语句如下 : SELECT * FROM
7、AINNERJOIN B ON A.aID = B.bID结果如下 :aID aNum bID bName1 a20050111 1 20060324012 a20050112 2 2006032402名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - 3 a20050113 3 20060324034 a20050114 4 2006032404结果说明 :很明显 , 这里只显示出了 A.aID = B.bID 的记录 . 这说明
8、 inner join并不以谁为基础 , 它只显示符合条件的记录.以下为网上的一点资料 LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。 使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2 说明:table1, table2参数用于指定要将记录组合的表的名称。field1, field2参数指定被联接的字段的名称。且这些字段
9、必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。compopr参数指定关系比较运算符: = , , = 或 。如果在 INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。三. 相关的复杂的解释和实例简介: 外部连接和自联接 inner join(等值连接 ) 只返回两个表中联结字段相等的行 left join(左联接 ) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接 ) 返回包括右表中的所有记录和左表中联结字段相等的记录 on 指定表间联结字段及其关系的等号 = 表达式 , 返
10、回 true 或 false. 当表达式返回 true 时, 则查询中包含该记录 . ! 外部连接只能操作已存在于数据库中的数据update (ctarticle as a left join ctclass as c on a.classid = c.classid) left join cttag as b on a.articleid = b.articleid 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - set ta
11、g=tag+ , b.articleid=a.articleid, b.classid=a.classid, b.nclassid=a.nclassid where a.classid=23 and a.nclassid=0 and tagid is not null update (ctarticle as a left join (ctnclass as c left join ctclass as d on c.classid = d.classid) on a.nclassid = c.nclassid and a.classid = c.classid) left join ctta
12、g as b on a.articleid = b.articleid set tag=d.class+ +c.nclass, b.articleid=a.articleid, b.classid=a.classid, b.nclassid=a.nclassid where a.classid=23 and a.nclassid=197; 更新操作左连接中数据的筛选insert into cttag(articleid,classid,nclassid) select a.articleid,a.classid,a.nclassid from ctarticle a left join ctt
13、ag b on a.articleid=b.articleid where b.articleid is null / 本语句功能为 , 显示主表的全部内容 , 插入数据到副表中没有的数据/ 主要作用为 : 让数据减少冗余上例中的延续select a.*, b.*, c.*, d.* from cttag as d left join (ctarticle as a left join ctclass as b on a.classid=b.classid) left join ctnclass as c on a.nclassid=c.nclassid) on d.articleid=a.a
14、rticleid; 显示文章表中的全部 , 调用类别表中的栏目select a.*, b.*, c.* from (ctarticle a left join ctclass b on a.classid=b.classid) left join ctnclass c on a.nclassid=c.nclassid / 作用, 有时在文章表中包含了在个别类别表中没有的数据, 用这个语法可以读出文章表的全部数据/a 为 文章表, b 为主类别 , c 为子类别同上例 , 选择追加数据时加上空格insert into cttag(articleid,classid,nclassid,tag) s
15、elect a.articleid,a.classid,a.nclassid,d.class+ +c.nclass from (ctarticle as a left join (ctnclass c left join ctclass d on c.classid=d.classid) on a.classid=c.classid and a.nclassid=c.nclassid) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - -
16、 - left join cttag as b on a.articleid = b.articleid where a.classid=4 and a.nclassid=154; 连接 n 个表, 并追加数据到其中一个表 , n=4 insert into cttag(articleid,classid,nclassid,tag) select a.articleid,a.classid,a.nclassid,d.class+c.nclass from (ctarticle as a left join (ctnclass c left join ctclass d on c.classid
17、=d.classid) on a.classid=c.classid and a.nclassid=c.nclassid) left join cttag as b on a.articleid = b.articleid where a.classid=1 and a.nclassid=1; / 解读插入到 表 2(栏 1, 栏 2, 栏 3, 栏 4) 选择 别名 a. 栏 1, 别名 a. 栏 2, 别名 a. 栏 3, 别名 d. 栏 4 加上 别名 c. 栏5 从 ( 表 1 别名 a 左连接 ( 表 3 别名 c 左连接 表 4 别名 d 在 别名 c. 栏 2 等于 别名 d.
18、栏 2) 在 别名 a. 栏 2 等于 别名 c. 栏 2 和 别名 a. 栏 3=别名 c. 栏3) 左连接 表 2 别名 b 在 别名 a. 栏 1 等于 别名 b. 栏 1 在那里 别名 a. 栏 2=1 和 别名 a. 栏 3=1 连接两个表 , 并追加数据到其中一个表insert into cttag(articleid,classid,nclassid) select a.articleid,a.classid,a.nclassid from ctarticle as a left join cttag as b on a.articleid = b.articleid where
19、 a.classid=1 and a.nclassid=1; / 解读插入到 表 2(栏 1, 栏 2, 栏 3) 选择 别名 a. 栏 1, 别名 a. 栏 2, 别名 a. 栏 3 从 表 1 别名 a 左连接 表 2 别名 b 在 别名 a. 栏 1 等于 别名 b. 栏 1 在那里 别名 a. 栏 4=1 和 别名 a. 栏 5=1 左连接同步两表的数据名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - update cta
20、rticle a inner join cttag b on a.articleid = b.articleid set b.classid=a.classid, b.nclassid=a.nclassid; / 解读更新 表 1 别名 a 联接 表 2 别名 2 在 别名 a. 栏 1 等于 别名 b. 栏 1 设置别名 b. 栏 2 更新为 别名 a. 栏 2, 别名 b. 栏 3 更新为 别名 a. 栏 3 右外连接select a.*, b.* from bunclass a right join ctclass b on a.classid=b.classid where a.ncl
21、assid=20 查询别名 a,b 表, 只匹配 b 表中的内容 . 添加数据到连接表之一insert into cttag ( tag, articleid ) select top 1 b.tag, a.articleid from ctarticle as a left join cttag as b on a.articleid = b.articleid where a.articleid order by a.articleid desc; 变通中的用法二insert into bureply select b.*, a.classid, a.nclassid from artic
22、le as a inner join reply as b on a.articleid = b.articleid where classid=50; 实际应用中的变通insert into butag ( tag, articleid, classid, nclassid) select b.tag, a.articleid, a.classid, a.nclassid from article as a inner join tag as b on a.articleid = b.articleid where classid=24; 添加数据到其他表insert into butag
23、( tag, articleid ) select b.tag, a.articleid 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - from article as a inner join tag as b on a.articleid = b.articleid where a.articleidfalse; / 解读添加到 接收表( 列 1, 列 2) 选择 别名 b. 列 1, 别名 a. 列 2 从 表 1 表名
24、a 联接 表 2 表名 b 在 别名 a. 列 c 等于 别名 b. 列 c 在哪里 别名 a. 列 c 不等于 没有实际应用中的变通select b.tag, a.articleid, a.classid, a.nclassid from article as a inner join tag as b on a.articleid = b.articleid where a.classid=24; 查询select b.tag, a.articleid from article as a inner join tag as b on a.articleid = b.articleid where a.articleidfalse; / 解读选择 别名 b. 列, 别名 a. 列从 表 1 别名 a 联接 表 2 别名 b 在 别名 a. 列 c = 别名 b. 列 c 在哪里 别名 a. 列 c 不等于 没有注: as 不是必要名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -