Mysql第八章


多表关系:

项目开发中,在进行数据库结构设计时,我们会根据实际情况分析模块之间的关系,分析设计表结构,由于表之间的关系,我们可以划分为三种表:

1.一对多:1:n

2.多对多的关系:n:m

3.一对一的关系:1:1

这样还是有点抽象那我们举个例子:

一对多的例子:

1648549388555

1648549418222

这里就是典型的一对多的关系,多的一方关联着那边的主键。

多对多的例子:

案例:学生与课程的关系

关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择

实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

1648551965534

1648551973774

1648552177542

一对一的例子:

关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。

学生都有身份证和学号,每一个身份证都对应着一个学号。

这个比较简单我就不演示了

多表查询

前面我们使用的查询,只是对单表进行查询,在具体的应用中,经常需要实现在一个查询语句中显示多张数据表的数据,这就是所谓的多表联合查询。

在具体实现连接操作时,首先将两个或两个以上的表按照某个条件连接起来,然后再查询到所要求的数据记录。

连接查询分为交叉连接内连接外连接查询三种方式。

交叉连接

交叉连接不带WHERE子句,它返回被连接的两个表所有数据行的笛卡尔积

  • 查询员工及员工所在的部门信息
SELECT * FROM emp,dept; 
SELECT * FROM emp CROSS JOIN dept; 

如果不加条件直接进行查询,则数据条数是两个表记录条数的乘积,这种结果我们称之为 笛卡尔乘积

笛卡尔乘积公式 : A表中数据条数 * B表中数据条数 = 笛卡尔乘积

如果两张表的数据量都很大,那么这种庞大时很可怕的,所以现在必须想办法消除掉笛卡尔积的无效记录。

想要消除笛卡尔积的无效记录,需要使用关联字段。

范例:利用等值条件来处理笛卡尔积

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;

1648554630380

1648554679951

内连接

在表关系的笛卡尔积数据记录中,保留表关系中所有匹配的数据记录,舍弃不匹配的数据记录。按匹配的条件可以分成等值连接和不等值连接。

有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

  • 隐式内连接
SELECT * FROM 表1,表2 WHERE 条件;
  • 1648556745899

  • 显示内连接(使用关键字INNER JOIN)

SELECT * FROM 表1 [INNER] JOIN 表2 ON 条件; 

1648556820703

等值连接

在连接条件中使用等于号(=)运算符比较被连接列的列值,

  • 查询员工及员工部门信息
#隐式连接
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);

1648557283972

非等值连接

在连接条件使用除等于运算符以外的其它比较运算符比较被连接的 列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>等。

  • 查询员工工资级别
#隐式连接
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;

1648557559978

1648557710362


文章作者: hehe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hehe !
  目录
​ ​