多表关系:
项目开发中,在进行数据库结构设计时,我们会根据实际情况分析模块之间的关系,分析设计表结构,由于表之间的关系,我们可以划分为三种表:
1.一对多:1:n
2.多对多的关系:n:m
3.一对一的关系:1:1
这样还是有点抽象那我们举个例子:
一对多的例子:
这里就是典型的一对多的关系,多的一方关联着那边的主键。
多对多的例子:
案例:学生与课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
一对一的例子:
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。
学生都有身份证和学号,每一个身份证都对应着一个学号。
这个比较简单我就不演示了
多表查询
前面我们使用的查询,只是对单表进行查询,在具体的应用中,经常需要实现在一个查询语句中显示多张数据表的数据,这就是所谓的多表联合查询。
在具体实现连接操作时,首先将两个或两个以上的表按照某个条件连接起来,然后再查询到所要求的数据记录。
连接查询分为交叉连接、内连接、外连接查询三种方式。
交叉连接
交叉连接不带WHERE子句,它返回被连接的两个表所有数据行的笛卡尔积
- 查询员工及员工所在的部门信息
SELECT * FROM emp,dept;
SELECT * FROM emp CROSS JOIN dept;
如果不加条件直接进行查询,则数据条数是两个表记录条数的乘积,这种结果我们称之为 笛卡尔乘积。
笛卡尔乘积公式 : A表中数据条数 * B表中数据条数 = 笛卡尔乘积
如果两张表的数据量都很大,那么这种庞大时很可怕的,所以现在必须想办法消除掉笛卡尔积的无效记录。
想要消除笛卡尔积的无效记录,需要使用关联字段。
范例:利用等值条件来处理笛卡尔积
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;
内连接
在表关系的笛卡尔积数据记录中,保留表关系中所有匹配的数据记录,舍弃不匹配的数据记录。按匹配的条件可以分成等值连接和不等值连接。
有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。
- 隐式内连接
SELECT * FROM 表1,表2 WHERE 条件;
显示内连接(使用关键字INNER JOIN)
SELECT * FROM 表1 [INNER] JOIN 表2 ON 条件;
等值连接
在连接条件中使用等于号(=)运算符比较被连接列的列值,
- 查询员工及员工部门信息
#隐式连接
SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno;
#显示连接
SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno;
- 等值连接可以使用USING来自动关联两表中相同的列
SELECT * FROM emp INNER JOIN dept USING(deptno);
非等值连接
在连接条件使用除等于运算符以外的其它比较运算符比较被连接的 列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>等。
- 查询员工工资级别
#隐式连接
SELECT * FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;
#显示连接
SELECT * FROM emp e INNER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;