十个有关Mysql连接查询的知识,你知道吗?---【Mysql】第四篇 SQL语法查询(SELECT)之连接查询

6 篇文章 0 订阅
6 篇文章 0 订阅

一、什么是连接查询?

         连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,然后通过连接进行查询。SQL中连接查询的主要类型有:

1. 广义笛卡尔积
2. 等值连接查询(含自然连接)
3. 非等值连接查询
4. 自身连接查询
5. 外连接查询
6. 复合条件连接查询

         简而言之,连接查询就是同时涉及多个表的查询;用来连接两个表的条件称为:连接条件或连接谓词。

二、连接查询的执行过程是怎样的?

         连接查询的执行过程是嵌套循环法(NESTED-LOOP)。实际上就是把两个表连接起来、合二为一生成一个新的表,新表中的元素包含原来的表中的所有元素。假设表1为下图中的表2.1,表2为下图中的表2.2,进行连接后生成结果表:表3下图中的表2.3如图:

在这里插入图片描述

表2.1    表1

在这里插入图片描述

表2.2    表2

在这里插入图片描述

表2.3    表3

三、什么是广义笛卡儿积?

         广义笛卡儿积即不带连接谓词的连接,几乎很少使用。例如:

Select  Student.* ,  SC.*
From    Student, SC;

三、等值连接查询怎样使用?

         等值连接查询是连接运算符为 “=” 的连接操作;任何子句中引用表1和表2中同名属性时,都必须加表名前缀。引用唯一属性名时可以加也可以省略表名前缀。例如:查询每个学生及其选修课程的情况

Select  Student.*,SC.*
From     Student,SC
Where  Student.Sno = SC.Sno;

结果表:
在这里插入图片描述
         可以发现结果表中的数据正如上述过程一样!

四、自然连接又是什么?

         自然连接等值连接的一种特殊情况,把目标列中重复的属性列去掉。例如:

Select 
Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
From     Student,SC
Where  Student.Sno = SC.Sno;

结果表:
在这里插入图片描述

         显然,我们对于重复列加上了前缀结果就会不含重复列。

五、非等值连接查询

         非等值连接查询就是连接运算符 不是“ = ”的连接操作包括以下两种:比较运算符和Between…and…

[<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>
比较运算符:>、<、>=、<=、!=

[<表名1>.]<列名1> 
BETWEEN[<表名2>.]<列名2>And[<表名2>.]<列名3> 

六、自身连接

         自身连接就是一个表与自己进行连接;但是,需要给表起别名以示区别,由于所有属性名都是同名属性,因此必须使用别名前缀。例如:
查询每一门课的间接先修课(即先修课的先修课)
在这里插入图片描述那语句就应该是:

Select  First.Cno,Second.Cpno
From  Course  First,Course Second
Where First.Cpno = Second.Cno;

查询结果:
在这里插入图片描述
当然,在SQL Server中,Null值也显示出来:
在这里插入图片描述

七、外连接(Outer Join)

         外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接方式。3种外连接:
1)左外连接(LEFTOUTER JOIN)
         如果在连接查询中,连接管子左端的表中所有的元组都列出来,并且能在右端的表中找到匹配的元组,那么连接成功。如果在右端的表中,没能找到匹配的元组,那么对应的元组是空值(NULL)。这时,查询语句使用关键字LEFT OUTERJOIN,也就是说,左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的数据是否满足连接条件,均输出左端表中的内容。例如:
查询每个学生及其选修课程的情况包括没有选修课程的学生 ----用外连接操作

Select  Student.Sno, Sname, Ssex,Sage, Sdept, Cno, Grade
From    Student 
Left Outer Join SC
On student.sno=sc.sno

结果表:
在这里插入图片描述
2)右外连接(RIGHTOUTERJOIN)
         右外连接与左外连接类似,只是右端表中的所有元组都列出,限制左端表的数据必须满足连接条件,而不管右端表中的数据是否满足连接条件,均输出表中的内容。例如:

Select  Student.Sno, Sname, Ssex,Sage, Sdept,Cno, Grade
From    Student 
Right Outer Join SC
On student.sno=sc.sno

注:不管第一个表中是否有匹配的数据,结果中都将包括第二个表中的所有行。第二个表中在第一表中没有匹配行的任何行,即与 Null 连接 。

3)全外连接(FULL OUTER JOIN)
全外连接查询的特点是左、右两端表中的元组都输出,如果没能找到匹配的元组,就使用NULL来代替。
上述例子:

Select  Student.Sno, Sname, Ssex,Sage, Sdept,Cno, Grade
From    Student 
Full Outer Join SC
On student.sno=sc.sno

注:全外连接查询中所有表中的元组信息都得到了保留。

外连接与普通连接的区别:

1.普通连接操作只输出满足连接条件的元组。
2.外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出。

八、内连接(Inner Join)

         内连接的连接查询结果集中仅包含满足条件的行,内连接是SQL Server缺省的连接方式,可以把INNERJOIN简写成JOIN,根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种;交叉连接的连接查询结果集中包含两个表中所有行的组合;外连接的连接查询结果集中既包含那些满足条件的行,还包含其中某个表的全部行,有3种形式的外连接:左外连接、右外连接、全外连接。
         内连接的数据记录中,不会存在字段为NULL的情况。可以简单地认为,内链接的结果就是在左连接或者右连接的结果中剔除存在字段为NULL的记录后所得到的结果。甚至可以认为,如果两个表中仅分别剩下内连接运算后所得的数据记录,如table1中只有Person A、Person B和Person C,table2中只有Person W、Person X和Person Y,那么这两个表的之间的左连接和右连接的返回的结果是一样的。
注意:
select * from table1 a inner join table2 b on a.city = b.city 和select * from table1 a join table2 b on a.city = b.city 的效果是一样的,即如果join的左边没有诸如left、right或者inner这样的关键字时,缺省的是内连接。另,MySQL不支持full join。
         根据比较方式分为:
         1)等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
         2)不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
         3)自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

九、复合条件连接

         复合条件连接就是Where子句中含多个连接条件的查询。例如:
查询选修2号课程且成绩在90分以上的所有学生的学号、姓名、成绩

Select   Student.Sno,Student.Sname,Sc.Grade
From    Student, SC
Where Student.Sno = SC.Sno /*连接谓词*/
And SC.Cno= '2'       /*其他限定条件*/
And SC.Grade > 90; /*其他限定条件*/

十、交叉连接

         交叉连接即笛卡儿乘积,是指两个关系中所有元组的任意组合。一般情况下,交叉查询是没有实际意义的。
例如:如果希望得到学生表和选课表两个关系模式的乘积,查询语句为:

SELECT*
FROM学生表CROSS JOIN选课表;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值