单表查询:在一张表当中查询数据,叫做单表查询。
连接查询,结合俩(多)张表,在俩张(多)表当中查询数据,在一张表当中查询一部分,在另一张表当中查询另一部分数据,这种跨表查询,连接多张表查询数据的方法叫做连接查询!
连接查询分为: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后的子查询返回的结果只能是返回一条,当多余一条的时候,就会报错!!!