《2022年数据库表的连接终稿 .pdf》由会员分享,可在线阅读,更多相关《2022年数据库表的连接终稿 .pdf(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 首先取出 a 表中所有数据,然后再加上
2、与 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。左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值二.left join/right
3、 join/inner join操作演示表 A记录如下:aID aNum1 a200501112 a200501123 a200501134 a200501145 a20050115表 B记录如下:bID bName1 20060324012 2006032402名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 9 页 -3 20060324034 20060324048 2006032408实验如下:1.left joinsql 语句如下:SELECT*FROM ALEFT JOIN B ON A.aID=B.bID结果如下:aID aNum bID bName1 a200501
4、11 1 20060324012 a20050112 2 20060324023 a20050113 3 20060324034 a20050114 4 20060324045 a20050115 NULL NULL(所影响的行数为 5 行)结果说明:left join是以 A表的记录为基础的,A 可以看成左表,B 可以看成右表,left join是以左表为准的.换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为:A.aID=B.bID).B表记录不足的地方均为NULL.2.right join名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,
5、共 9 页 -sql 语句如下:SELECT*FROM 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 语句如下:SE
6、LECT*FROM 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 的记录.这说明 inner join并不以谁为基础,它只显示符合条件的记录.以下为网上的一点资料 LEFT JOIN操作用于在任何的 FROM 子句中,组合来
7、源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2 说明:table1,table2参数用于指定要将记录组合的表的名称。field1,field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。compopr参数指定关系比较运算符:=,=或。如果在 INNER JOIN操作中要联
8、接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。三.相关的复杂的解释和实例简介:外部连接和自联接 inner join(等值连接)只返回两个表中联结字段相等的行 left join(左联接)返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接)返回包括右表中的所有记录和左表中联结字段相等的记录 on 指定表间联结字段及其关系的等号=表达式,返回 true 或 false.当表达式返回 true 时,则查询中包含该记录.!外部连接只能操作已存在于数据库中的数据update(ctarticle as a left join ctcla
9、ss as c on a.classid=c.classid)left join cttag as b on a.articleid=b.articleid 名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 9 页 -set tag=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 le
10、ft join ctclass as d on c.classid=d.classid)on a.nclassid=c.nclassid and a.classid=c.classid)left join cttag 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
11、(articleid,classid,nclassid)select a.articleid,a.classid,a.nclassid from ctarticle a left join cttag 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.cla
12、ssid=b.classid)left join ctnclass as c on a.nclassid=c.nclassid)on d.articleid=a.articleid;显示文章表中的全部,调用类别表中的栏目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 为子类别同
13、上例,选择追加数据时加上空格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=d.classid)on a.classid=c.classid and a.nclassid=c.nclassid)名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 9 页 -left join c
14、ttag 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=d.classid)on a.classid
15、=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.栏 2)在 别名 a.栏 2 等于 别名 c.栏 2 和 别名 a.栏 3=别名 c.栏3)
16、左连接 表 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 a.classid=1 and a.nclassid=1;/解读插入到 表 2(栏 1,栏 2,栏 3)选择 别名 a.
17、栏 1,别名 a.栏 2,别名 a.栏 3 从 表 1 别名 a 左连接 表 2 别名 b 在 别名 a.栏 1 等于 别名 b.栏 1 在那里 别名 a.栏 4=1 和 别名 a.栏 5=1 左连接同步两表的数据名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 9 页 -update ctarticle 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.
18、栏 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.nclassid=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=
19、b.articleid where a.articleid order by a.articleid desc;变通中的用法二insert into bureply select b.*,a.classid,a.nclassid from article 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.nclassi
20、d from article as a inner join tag as b on a.articleid=b.articleid where classid=24;添加数据到其他表insert into butag(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.
21、列 1,别名 a.列 2 从 表 1 表名 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 页 -
限制150内