天涯论坛

 找回密码
 立即注册
搜索
查看: 57|回复: 2

SQL - 联表查询(Join)内联接,外联接,交叉联接 161

[复制链接]

2999

主题

220

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99099144
发表于 2024-8-4 15:13:33 | 显示全部楼层 |阅读模式

#头条创作挑战赛#

联接查找:经过join关键字将多个表基于某些要求进行连接,从而得到满足要求的数据

内联结(Inner join)仅返回两个联接表中都拥有匹配项的行

示例1:查找所有学生的姓名,学生班级编号,班级编号与班级名叫作

--前两项在student表中,班级名叫作在class表中 --内联接后要表示的数据基于两表的主外键都对应的数据才会表示 --简单来讲只会查找出两表中学生班级编号等于班级编号的学生数据 --倘若学生表中的 班级编号=66 而班级表中 班级编号=66 --就不会表示班级编号=66 的学生数据 SELECT stu.SName N学生姓名, stu.SCId N学生比较编号, cls.CId N班级编号, cls.CName N班级名叫作 FROM dbo.Student AS stu --学生表 INNER JOIN dbo.Class AS cls --以内联接的方式,连接班级表 ON Cls.CId = stu.SCId --相当于where要求如where SCId in(所有的班级编号) --ON Cls.CId = stu.SCId AND stu.SId<6 两个要求:不仅主外键一致还要学生编号<6的学生数据 表1 inner join2 on要求 固定格式 两表中的别名:可省略 列名前缀(stu/cls):倘若两表中的列名同样的可省略 倘若两表中有相同的列名(假设都是 SName)必须加前缀,以示区别是哪个表的列名

通常状况下在效率上Where可能拥有和Inner join同样的效率,然则在多表连接时,不举荐运用where语句

内联接查找

外联结(Outer join)

外联接是内部联接的扩展,即使外联接在联接表中关联行,外联接会返回这些行

外联接共有三种类型:左联接(left join)右联接(right join)和完全联接(full join)

1 左联接(left [outer] join)返回左表(即from语句中的表)中的所有行,同期返回右表(left join语句中的表)中匹配的行,倘若右表中匹配的行,则返回 NULL 值

--创建示例表 成绩表 CREATE TABLE Score ( SId INT IDENTITY(1,1) PRIMARY KEY,--自动编号 SSId INT,--学生编号 SChinese INT,--语文 SMath INT,--数学 SHistory INT,--历史 SCredit INT --学分)--插进数据 INSERT INTO dbo.Score(SSId,SChinese,SMath,SHistory,SCredit) SELECT 1,90,88,95,5 UNION SELECT 2,70,58,55,4 UNION SELECT 3,30,81,36,3 UNION SELECT 5,90,79,67,3 UNION SELECT 7,60,28,75,1 UNION SELECT 8,53,58,85,2 UNION SELECT 9,50,87,29,5 --以学生表为主的左联接 --表示最后行数 以学生表中的行数为准 --假设符合要求的 学生表行数为 20 就会表示20条数据 --简单来讲:首要筛选出学生表中符合要求的数据 --成绩表中的数据去匹配学生表中的数据即stu.SId=sco.SSId --匹配上的表示其成绩,匹配不上的表示为 NULL SELECT stu.SName N学生姓名, sco.SSId N学生编号, sco.SChinese N语文成绩, sco.SMath N数学成绩, sco.SHistory N历史成绩 FROM dbo.Student AS stu LEFT OUTER JOIN dbo.Score sco ON stu.SId=sco.SSId --以成绩表为主的左联接 --表示最后行数 以成绩表中的行数为准 --假设符合要求的 成绩表行数为 10 就会表示10条数据 SELECT stu.SName N学生姓名, sco.SSId N学生编号, sco.SChinese N语文成绩, sco.SMath N数学成绩, sco.SHistory N历史成绩 FROM dbo.Score sco LEFT OUTER JOINdbo.StudentAS stu ON sco.SSId=stu.SId --LEFT OUTER JOIN 语句中的 OUTER 可省略 重视:左联接时以哪个表为主会影响最后表示数据的行号

左联接查找

2 右联接(right [outer] join)返回右表(即right join语句中的表)中的所有行,同期返回右表(from语句中的表)中匹配的行,倘若右表中匹配的行,则返回 NULL 值

示例将左联接的 left 替换为 right 结果与上图中的正好相反(自动测试)

重视:不论左联接还是右联接最后表示的行数以为主的表中行数为准

3 完全联接(full join)返回左表和右表中的所有行,倘若某个表中匹配的行,则返回 NULL 值

SELECT * --表示两个表中的所有列名 FROM dbo.Student AS stu FULL OUTER JOIN dbo.Score sco ON sco.SSId=stu.SId

完全联接查找

交叉联接(cross join)

表的联接要求,一个表的每一行与另一表的每一行合并,这种类型的结果集叫作为笛卡尔乘积或叉积(认识就可)

--学生表 24条数据 --班级表 8条数据 --表示总数据行数 192 SELECT * FROM dbo.Student CROSS JOIN dbo.Class

交叉联接查找





上一篇:VBA数据库之工作表内连接查询
下一篇:数据库|基于T-SQL添加默认约束、外键约束、内连接查询
回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-9-5 16:13:13 | 显示全部楼层
期待楼主的下一次分享!”
回复

使用道具 举报

3070

主题

3万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99138950
发表于 2024-10-10 04:23:57 | 显示全部楼层
楼主听话,多发外链好处多,快到碗里来!外链论坛 http://www.fok120.com/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 16:53 , Processed in 0.115411 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.