MySQL——连接查询与子查询

一、连接查询

单表查询:在一张表当中查询数据,叫做单表查询。

连接查询,结合俩(多)张表,在俩张(多)表当中查询数据,在一张表当中查询一部分,在另一张表当中查询另一部分数据,这种跨表查询,连接多张表查询数据的方法叫做连接查询!

连接查询分为:SQL92语法,SQL99语法。目前主流使用SQL99语法。

SQL92 的语法 结构更加的粗糙,语法结构不清晰 表连接的判断和其他条件都放在了where 后面,非常的混乱。select.....from .....where....

SQL99的语法结构清晰,某一个表和另一个表连接用 join, 然后判断条件放在on 的后面。select.....from......inner join.....on.....inner join....on....where.....(inner 可以省略,但加上语法结构更清晰)

笛卡尔积现象:

当连接俩张表进行查询的时候,如果没有任何限制的情况下,查询的次数为两张表所有记录的乘积!

这个时候内外连接的限制条件的作用就体现出来了!

1、内连接:

等值连接:查询结果是由where 条件的等号来 决定的

上面虽然查询出来想要的结果,但是查询次数依旧没有减少,只是筛选出来了而已。同时我们也知道在今后连接的表的数量越少越好,否则会使效率降低!

非等值连接:

自连接:一张表当做两张表来解决。

2、外连接(right/left + outer[outer可以省略]):

内连接与外连接的区别:内连接没有主次关系,两(多)张表是平级的,而外连接有主次关系,主要是查什么,其次是查什么!

左外连接(left): 表示join关键字左边的表是主表,主要是查出左边表的数据,顺带将右边的表的数据也查出来。

右外连接(right):表示join关键字右边的表是主表,主要是查出右边表的数据,顺带将左边的表的数据也查出来。

总结:外连接的查询次数 >= 内连接的查询次数。

多表连查:

使用select .....from ......join....on......join....on.....where.....group by .......having........order by .......

例如查:找出每个员工的部门名称和工资等级,上级领导,显示出员工名字,领导名,部门名,工资,工资等级。

select e.ename,d.dname,n.ename as '上级',e.sal,s.grade from emp e join dept d on e.deptno = d.deptno left join emp n on e.mgr = n.empno join salgrade s on e.sal between s.losal and s.hisal;

三、全连接(用的很少)


二、子查询

子查询:select 语句当中嵌套select语句,被嵌套的select语句被称为子查询。

子查询语句可以放在select ,from ,where 后面。

where子句中出现子查询:

例如:查询员工当中大于800元的员工姓名和工资

from 子句当中出现子查询:

注意:from 当中的子查询,可以把子查询当中查出来的东西当中一张临时表。

例如:找出每个岗位的平均工资的薪资等级?

select t.*,s.grade from (select job,avg(sal) as avgsal from emp group by job) t join salgrade s on t.avgsal between s.losal and s.hisal;

select t.*,s.grade from (select ename,avg(sal) as avgsal from emp) t join salgrade s on t.avgsal between s.losal and s.hisal;

select 子句当中的出现的子查询:

查询每个员工的部门名称,要求显示部门名和员工名?

select e.ename,e.deptno,(select dname from dept join emp on emp.deptno = dept.deptno) from emp e;

注意:select后的子查询返回的结果只能是返回一条,当多余一条的时候,就会报错!!!

猜你喜欢

转载自blog.csdn.net/m0_73968621/article/details/132678288