mysql操作入门(八)-----多表连接查询(重点)

从一张表中单独查询,称为单表查询,多个表联合起来查询数据,被称为连接查询。

笛卡尔积现象:当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象(重要)。例如:表1有m行,表2有n行,结果有m*n行。

具体使用:

已知表一:dept表的dname字段为

 表二:emp表的ename字段为

将两个表的这两个字段dname,ename连接查询:

语法:select 表一的字段,表二的字段 from 表一,表二;

当两张表的字段进行连接查询的时候,sql语句不加任何的限制时,最终得到的数据条数就是两个字段条数的乘积4*14=56(笛卡尔积)。


但是这种笛卡尔积的现象会导致查找处理的结果很冗余,如果要连接查询指定的数据,怎么避免笛卡尔积现象?

在多表连接时加条件,满足这个条件的数据会被筛选出来。当两张表有相同的数据时,就可以用相同字段的数据来配对,例如:

已知两个表中都有部门编号deptno,那就可以用这两个表中的部门编号deptno来配对。

以下为sql92写法:缺点:结构不清晰,若还需再筛选,就只能在where 条件 后再加 and 筛选条件 

多表连接时sql99的写法:join是连接的意思,用来连接表;on后面跟连接条件

sql99的优点:多表连接的条件是独立的,如果后面还需要筛选就使用where进行筛选。

语法:select 表一的字段,表二的字段 from  表一 join 表二  on 表一表二连接条件 where 筛选条件;

 注意:虽然最后的结果是14条,但是匹配的次数仍然是56次,只是筛选了数据。

补充知识:在多张表连接查询的时候我们可以使用重命名来对查询的表进行简化表名,这样可以更加一目了然。

把上面的sql语句中的表名简化:


上面这个解决方法被称为等值连接,或者叫内连接(inner join):只返回两表相连相等的行。

内连接和外连接:

  • 内连接:等值连接,非等值连接,自连接
  • 外连接:左外连接,右外连接,全外连接

分别得到的结果:

内连接:A表的所有行交上B表的所有行得出的结果集

外连接:

  • 左外连接:A表的所有行匹配上B表得出的结果集;
  • 右外连接:B表的所有行匹配上A表得出的结果集;

全外连接:A表的所有行并上B表的所有行得出的结果集

具体实践:(等值连接在上面已经实践过了)

1.1内连接:非等值连接

非等值连接表示筛选条件不是一个等值,可能是个范围,比如求的值在一个范围内。

已知员工薪资等级表salgrade为:

 员工信息表emp为:

 要求:找出每个员工的薪资等级,要求显示员工名,薪资,薪资等级

1.2自连接
把一张表当做两张表使用

举例:查询员工的上级领导,要求显示员工名和对应的领导名?

表的理解:smith的员工编号empno为7369,老板编号为mgr为7902。编号7902的名字为ford(即simth老板的名字是ford)

2.1外连接

内连接:A和B连接,AB两张表没有主次关系。而外连接,两张表连接,产生了主次关系。

左外连接:

将join改为left join 或者left outer join,left join左边的表作为主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询右边的表。左边表的字段内容不变,右边的表内容随着左边的内容变化。

右外连接:

将join改为right join 或者right outer join,right join右边的表作为主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。右边表的字段内容不变,左边的表内容随着右边的内容变化。

猜你喜欢

转载自blog.csdn.net/qq_44728587/article/details/123478330