MySQL之senior(四)——连接查询

MySQL之senior(四)——连接查询

distinct:原表数据不会被修改,只是查询结果去重 distinct只能出现在所有字段的最前方。 distinct出现在两个字段之前,表示两个字段联合起来去重。

表连接的方式分类:

 内连接:
     等值连接
     非等值连接
     自连接
 ​
 外连接:
     左外连接(左连接)
     右外连接(右连接)

当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象。(笛卡尔发现的,这是一个数学现象。) 怎么避免笛卡尔积现象?:加条件限制 (加个条件是为了达到4选1,也是为了数据的有效性)

 #加条件只是为了避免笛卡尔积现象,只是为了查询出有效的组合记录。匹配的次数一次都没有少,还是56次。 (以下三种写法都会被淘汰)
 select 
     ename,dname 
 from 
     emp, dept
 where
     emp.deptno = dept.deptno;
 #更好
 select 
     emp.ename,dept.dname 
 from 
     emp, dept
 where
     emp.deptno = dept.deptno;
 #更佳
 select 
     e.ename,d.dname 
 from 
     emp e, dept d
 where
     e.deptno = d.deptno; (#SQL92语法)

 

内连接之等值连接。

 #sql92语法
 select 
     e.ename,d.dname
 from
     emp e, dept d
 where
     e.deptno = d.deptno;
 #sql92缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。
 #SQL99语法:  select ...from a join b on a和b的连接条件 where 筛选条件
 select 
     e.ename,d.dname
 from
     emp e
 (//inner) join (#inner可以省略 带着inner可读性更好!!!一眼就能看出来是内连接)
     dept d
 on
     e.deptno = d.deptno;
 #sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where

内连接之非等值连接

 # 找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级
 select 
     e.ename, e.sal, s.grade
 from
     emp e
 join
     salgrade s
 on
     e.sal between s.losal and s.hisal; #条件不是一个等量关系,称为非等值连接。

内连接之自连接 ( 技巧:一张表看成两张表 )

 #查询员工的上级领导,要求显示员工名和对应的领导名
 select 
     a.ename as '员工名', b.ename as '领导名' #as 可省略
 from
     emp a
 join
     emp b
 on
     a.mgr = b.empno; #员工的领导编号 = 领导的员工编号

外连接

内连接: A和B连接,AB两张表没有主次关系。平等的。 特点:完成能够匹配上这个条件的数据查询出来。

一条SQL中内连接和外连接可以混合。都可以出现

外连接: 带有right的是右外连接,又叫做右连接。 带有left的是左外连接,又叫做左连接。 任何一个右连接都有左连接的写法。 任何一个左连接都有右连接的写法。

select 
	e.ename,d.dname
from
	emp e 
right (//outer) join # outer是可以省略的,带着可读性强,right右边,join左边
	dept d
on
	e.deptno = d.deptno;
# right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。在外连接当中,两张表连接,产生了主次关系。
posted @ 2021-10-21 21:44  doughtier  阅读(67)  评论(0)    收藏  举报