[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]练习:检索出李四都的所有老师
检索出和李四同一班的学生
检索出每个班级的学生数量
检索出女生最多的班级
- 序言
- 第一章:准备工作
- 写在学习之前的话
- web应用开发结构
- 开发工具/环境
- 第二章:展现层面(HTML/CSS)
- HTML简介
- HTML基础
- HTML编码
- HTML链接
- HTML图像
- HTML列表
- HTML表单
- HTML表格(分水岭)
- HTML 实体
- HTML框架
- CSS层叠样式表
- CSS选择器
- CSS文本/字体
- CSS继承和叠加
- CSS框模型
- CSS浮动(分水岭)
- CSS定位
- CSS背景
- CSS图标字体
- CSS补充
- 开发技巧
- 第三章:展现层面(Javascript)
- JS简介
- JS实现
- JS输出交互
- JS变量
- JS数据类型
- JS运算符
- JS流程控制(分水岭)
- JS函数
- JS数组
- JS对象(分水岭)
- JS数组对象
- JS字符串对象
- JS数学对象
- JS日期对象
- JS BOM对象(分水岭)
- JS DOM对象
- JS事件对象
- JS元素对象
- JS DOM节点
- 第四章:展现层面(Jquery)
- JQ简介
- JQ使用
- JQ选择器
- JQ筛选
- JQ属性
- JQ-CSS
- JQ事件
- JQ文档处理
- JQ效果
- JQ-ajax
- 第五章:逻辑/业务层面(PHP)
- PHP简介
- PHP变量
- PHP数据类型
- PHP常量
- PHP运算符
- PHP流程控制
- PHP函数(分水岭)
- PHP日期
- PHP数学
- PHP数组
- PHP字符串
- PHP正则表达式(分水岭)
- PHP目录操作
- PHP文件
- PHP上传/下载
- PHP面向对象(分水岭)
- PHP图像处理
- PHP会话控制
- Ajax异步处理
- PHPMysql扩展
- PHPMysqli扩展
- PHPPdo扩展
- PHP接口
- PHP命名空间
- 第六章:逻辑/业务层面(框架设计)
- 第七章:存储层面(mysql)
- Mysql基础
- Mysql Sql简介
- Mysql数据库
- Mysql数据类型
- Mysql数据表
- Mysql操作记录
- Mysql查询
- Mysql修改表结构
- Mysql日期与时间
- Mysql分组统计
- Mysql多表查询
- Mysql安全
- Mysql存储引擎
- Mysql事务
- Mysql视图
- Mysql触发器
- Mysql存储过程
- Mysql存储函数
- Mysql优化
- 第八章:服务器(Linux)
- Linux介绍与安装
- Shell
- 目录与文件操作
- VIM编辑器使用
- 帐号管理
- SUDO
- 权限控制
- 压缩与打包
- 软件安装
- 计划任务
- 进程管理
- 宝塔Linux面板