sql知识——07联结

案例学生成绩表(图1)和学生表(图2)
在这里插入图片描述
在这里插入图片描述

联结表

sql最强大的功能就是在数据检索查询中执行联结表。
联结表就是把几个表进行联结,利用主键和外键。

关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。主键:为了标识数据的唯一性,不能为空。
外键是某个表中的一列,包含另一个表的主键值,定义两个表的关系,保证数据的准确跟一致性,可以为空。

外键取值规则:空值或参照的主键值。
1.插入非空值时,如果主键表中没有这个值,则不能插入。
2.更新时,不能改为主键表中没有的值。
3.删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。
4.更新主键记录时,同样有级联更新和拒绝执行的选择。

where建立联结

如果数据存储在多个表里,怎么样用单条select语句检索出来呢?
使用联结。简单来说联结就是一个机制,用一条select语句关联起多个表,可以联结多个表的数据返回为一组数据进行输出。
关联机制就是对所选到的多个表里的列做笛卡尔积,然后根据检索条件筛选出符合的列,进而提出重复的列,返回最后结果。

SELECT sNo, grade,`sName(姓名)`,`dept(系别)`
FROM `score(成绩)`,`student(学生表)`
WHERE `score(成绩)`.sNo=`student(学生表)`.`sNo(学号)`
order BY grade;

内部联结

left join(左联接) 返回包括A表中的所有记录和B表中联结字段相等的记录 。
right join(右联接) 返回包括A表中的所有记录和B表中联结字段相等的记录。
inner join(等值连接) 只返回两个表A、B中联结字段相等的行,也成为内部联结。

1.left join例子

SELECT *
FROM `score(成绩)`
LEFT JOIN `student(学生表)`
on `score(成绩)`.sNo=`student(学生表)`.`sNo(学号)`

在这里插入图片描述
2.right left例子

SELECT *
FROM `score(成绩)`
RIGHT JOIN `student(学生表)`
on `score(成绩)`.sNo=`student(学生表)`.`sNo(学号)`

在这里插入图片描述
3.inner join例子

SELECT *
FROM `score(成绩)`
INNER JOIN `student(学生表)`
on `score(成绩)`.sNo=`student(学生表)`.`sNo(学号)`

在这里插入图片描述

外部联结

Outer Join产生A表和B表的并集。对于没有匹配的记录,则以null做为值。

SELECT  *  FROM   A FULL OUTER JOIN B ON A.name = B.name   

Left Outer Join产生表A的完全集,而B表中匹配的则有值,没匹配的以null值取代。

SELECT  *  FROM   A LEFT  OUTER JOIN B ON A.name = B.name   

Right Outer Join产生在A表中有而在B表中没有的集合。

SELECT  *  FROM  A REGHT OUTER JOIN B ON A.name = B.name   

WHERE的多表联结

MySQL在进行夺标连接的时候很耗费资源,联结的表越多,性能下滑越厉害。因此需要仔细思考,不需要联结的表则不联。

SELECT `sNo(学号)`,grade,cNo,`sex(性别)`,`dept(系别)`
FROM `score(成绩)`,`course(课程表)`,`student(学生表)`
WHERE `score(成绩)`.sNo=`student(学生表)`.`sNo(学号)`
AND `course(课程表)`.`cNo(课程号)`=`score(成绩)`.cNo;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/matthewchen123/article/details/107817986