点击上方蓝色字体,选取“标星公众号”
优秀文案,第1时间送达
源自:blog.csdn.net/qq_44756792
/article/details/95503303
多表查找经常用到连接,各样连接之间的区别应该重视总结。
首要大概认识各样连接的关系和由来:
表之间的连接常有以下两种: 在SELECT语句的WHERE子句中运用比较运算符给出连接要求,对表进行连接,将这种暗示形式叫作为连接谓词暗示形式。连接谓词中的比较符能够是<、<=、=、>、>=、!=、<>、!< 和 !>,当比较符为“=”时,便是等值连接,等值连接的结果中有重复列,在目的列中去除相同的字段名便是自然连接。以JOIN关键字指定的连接,T-SQL扩展了以JOIN关键字指定连接的暗示方式,使表的连接运算能力有所加强,以JOIN关键字指定的连接有三种类型:内连接、外连接、交叉连接(笛卡尔积)。下面仔细分析各样连接方式的特点:
1.等值连接(相等连接):SELECT
XSB.* , CJB.* FROM
XSB , CJB WHERE
XSB.学号 = CJB.学号
运用”=”关系将表连接起来的查找,其查找结果中列出被连接表中的所有列,包含其中的重复列。
2.自然连接:
数据库应用中最常用的是“自然连接”,它在目的列中去除相同的字段名。 SELECT
XSB.* , CJB.课程号, CJB.成绩 FROM
XSB , CJB WHERE
XSB.学号= CJB.学号
进行自然连接运算需求两个表有一起属性(列),自然连接运算的结果表是在参与操作的两个表的一起属性上进行等值连接后,再去除重复的属性后所得的新表。 等值连接和自然连接的区别:1)等值连接中不需求相等属性值的属性名相同,而自然连接需求相等属性值的属性名必要相同,即两关系仅有在同名属性才可进行自然连接。
2)等值连接不将重复属性去掉,而自然连接去掉重复属性,亦能够说,自然连接是去掉重复列的等值连接。
3.内连接
指定了INNER关键字的连接是内连接,内连接根据ON所指定的连接要求合并两个表,返回满足要求的行。内连接是系统默认的,能够省略INNER关键字。运用内连接后仍可运用WHERE子句指定要求。扩展:超全的数据库建表/SQL/索引规范,适合贴在工位上!
例1 SELECT
* FROM XSB INNER JOIN
CJB ON
XSB.学号 =CJB.学号
例2 SELECT
姓名, 成绩 FROM XSB JOIN
CJB ON
XSB.学号 = CJB.学号 WHERE 课程号 = 206 AND 成绩>=80
4.自连接
自连接做为一种特例,能够将一个表与它自己进行连接,叫作为自连接。若要在一个表中查询拥有相同列值的行,则能够运用自连接。运用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。 SELECT
a.学号, a.课程号, b.课程号, a.成绩 FROM CJB a JOIN
CJB b ON a.成绩=b.成绩 ANDa.学号=b.学号AND
a.课程号!=b.课程号 结果5.外连接(左外连接,右外连接、全外连接)
指定了OUTER关键字的为外连接,外连接的结果表不仅包括满足连接要求的行,还包含相应表中的所有行。外连接包含以下三种:
左外连接(LEFT OUTER JOIN):结果表中除了包含满足连接要求的行外,还包含左表的所有行。
【例】 查询所有学生状况,以及她们选修的课程号,若学生未选修任何课,亦要包含其状况 SELECT
XSB.* , 课程号 FROM XSB LEFT OUTER JOIN
CJB ON
XSB.学号 = CJB.学号
本例执行时,若有学生未选任何课程,则结果表中相应行的课程号字段值为NULL。
右外连接(RIGHT OUTER JOIN):结果表中除了包含满足连接要求的行外,还包含右表的所有行。
完全外连接(FULL OUTER JOIN):结果表中除了包含满足连接要求的行外,还包含两个表的所有行。
其中的OUTER关键字均可省略**
6.交叉连接(又名笛卡尔积)
首要,先简单解释一下笛卡尔积。
有两个集合A和B,A = {0,1} B = {2,3,4}
集合 A×B 和 B×A的结果集就能够分别暗示为以下这种形式:
A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};
以上A×B和B×A的结果就能够叫做两个集合相乘的‘笛卡尔积’。
从以上的数据分析咱们能够得出以下两点结论: 两个集合相乘,不满足交换率,既 A×B ≠ B×A;A集合和B集合相乘,包括了集合A中元素和集合B中元素相结合的所有的可能性,即两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数。交叉连接: SELECT*from 表1 JOIN 表2
;
交叉连接实质上是将两个表进行笛卡尔积运算,结果表是由于第1个表的每一行与第二个表的每一行拼接后形成的表,叫作为‘笛卡尔积表’,结果表的行数等于两个表的行数之积。
倘若两张表的数据量都比很强的话,那样就会占用很大的内存空间这显然是不恰当的。因此,咱们在进行表连接查找的时候通常都会使用JOIN xxx ON xxx的语法,ON语句的执行是在JOIN语句之前的,亦便是说两张表数据行之间进行匹配的时候,会先判断数据行是不是符合ON语句后面的要求,再决定是不是JOIN。
因此呢,有一个显而易见的SQL优化的方法是,当两张表的数据量比很强,又必须连接查找时,应该运用 FROM table1 JOIN table2 ON xxx的语法,避免运用 FROM table1,table2 WHERE xxx 的语法,由于后者会在内存中先生成一张数据量比很强的笛卡尔积表,增多了内存的开销。
爱好的伴侣欢迎关注,订阅更加多精彩内容
|