#头条创作挑战赛#
联接查找:经过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 join 表2 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
交叉联接查找
|