[TOC] 前面我们学习了sql语句的操作,但是我们大部分都是操作的单张表,大部分问题只有一张表是不能解决的。我们需要从多张表中获得数据,或者通过其他表的数据删除某个表的记录等操作,这个时候就需要多表操作。在了解多表操作前我们先了解下表关系。 ## 表关系 ### 一对一关系 一个城市只能有一个区号这种关系是最简单的一对一关系 一个人只能对应一个身份证号,这也是一对一关系 如果两张表,一张存储学生的基本信息,一张存学生的扩展信息,这种关系也是一对一。 ![](https://box.kancloud.cn/b62f69018fb1183fba15b7559bc14098_788x234.jpg) ### 一对多关系 在学校中,咱们一个班级有很多学生,但一个学生不会有多少班级,如果一个学生表,另外一张是班级表,那他们之间的关系就是一对多 ![](https://box.kancloud.cn/28e9d3449959654373dbee7074c31c13_561x176.jpg) ### 多对多关系 在学校中,咱们一个班级有多个任课老师,同时一个老师可以去多个班任课,这种就是多对多关系,那么如果记录这种关系呢, ![](https://box.kancloud.cn/2665947249f5db154b4ce21e961b24e3_780x321.jpg) ## 笛卡尔积原理 在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。 假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。 ![](https://box.kancloud.cn/7bf09987bad71cbdc14c29b278ca5590_554x557.jpg) ~~~ mysql>select * from class,stu ~~~ 但是单纯的对两个表的数据进行通过笛卡尔积获得的所有数据,显然这个结果是没有意义的,所以我们要对以上查询增加条件以产生有价值的数据集合。通过关联字段来实现 ~~~ mysql>select * from class,stu where class.cid=stu.cid; mysql>select * from class as c ,stu as s where s.cid = c.id; ~~~ ## INNER JOIN(内连接,或等值连接) 获取两个表中字段匹配关系的记录。 ![](https://box.kancloud.cn/ac4e75e16439e204179aca9f3e87b091_200x145.gif) ~~~ mysql>select * from class c inner join stu s on c.id=s.cid; ~~~ ## LEFT JOIN(左连接,外连接) 获取左表所有记录,即使右表没有对应匹配的记录。 ![](https://box.kancloud.cn/35125df03a8eb791aa1284473190b983_200x145.gif) ~~~ mysql>select * from class c left join stu s on c.id=s.cid; ~~~ ## RIGHT JOIN(右连接,外连接) 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。 ![](https://box.kancloud.cn/02187c9d9300093234b96c129286bea4_200x145.gif) ~~~ mysql>select * from class c right join stu s on c.id=s.cid; ~~~ ## 自连接 表和表自身进行检索操作的方式为自连接 ~~~ mysql>select s2.name from stu as s1 inner join stu as s2 on s1.cid=s2.cid where s1.name="李四"; ~~~ >[danger]练习:检索出李四都的所有老师 检索出和李四同一班的学生 检索出每个班级的学生数量 检索出女生最多的班级