若一个查询同时涉及两个表及以上的表,则称之为连接查询。
连接查询是关系数据库中最主要的查询,包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件查询等
1.等值于非等值连接查询
连接查询的where子句中用来连接两个表的条件成为连接条件或连接谓词,一般格式为
表名1.列名1 {比较运算符} 表名2.列名2
当连接运算符为“=”时,称之为等值连接。使用其他运算符称之为非等值连接。
连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但是名字不必相同
示例:
学生表:student
课程表:course
学生课程关系表:SC
例1.查询每个学生及其选修课程的情况
select student.*, sc.*
from student,sc
where student.sno = sc.sno;
关系数据库管理系统执行连接操作的可能是:首先在student表中找到第一个元祖,然后从头开始扫描SC表,找到他们共同的属性Sno相同的元祖,然后拼接起来,然后从student表的第二个元祖开始,以此类推,直到扫完整个student表
如果我们在SC表Sno上建立了索引的话,就不用每次都对SC表进行全表扫描了,而是根据Sno值通过索引找到对应的SC元祖,用索引查询SC中满足条件的元组一般会比全表扫描快
若在等值连接中把目标中重复的属性列去掉则为自然连接
例2:对例1用自然连接完成
select student.Sno, Sname,Ssex, Sage,Sdept,Cno,Grade
from student,sc
where student.sno = sc.sno;
去掉Student表和SC表共同的属性列Sno,其中一个,等值连接就变成了自然连接,上述SQL保留了student的Sno
自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与自己进行连接,称为表的自身连接。
例3:查询每一门课的间接先修课
Cno:课程号 Cname:课程名 Cpno:先行课 Ccredit:学分
分析: 比如说课程号Cno为1的课程的先行课的课程号为5,课程号为5的课程为C#,所以mysql对应的先行课为C#,以此类推
select c.Cno 课程号,c.Cname 课程名, c.Cpno 先行课程号 , s.Cname 先行课程名, s.Cpno 间接先行课程号
from Course c,course s
where c.Cpno = s.Cno;
自身连接相当于将自身的表再拷贝一份,重命名然后将要求的查询条件添加到where子句中,即可查出结果
上述就是MySQL自身连接的简单介绍!!!