1.什么是连接查询?
从一张表中单独查询称为单独查询,从多张表中联合起来跨表查询数据被称为连接查询
2.连接查询的分类?
根据语法的年代分类:SQL99(重点)、SQL92
根据表的连接方式分类:
内连接:等值连接、非等值连接、自连接
外连接:左外连接(左连接)、右外连接(右连接)
全连接
3.当两张表进行连接查询的时候,没有任何条件的限制会发生什么状况?
最终查询结果的条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象
4.怎么避免笛卡尔积现象?
连接时附加条件,满足这个条件的记录被筛选出来
案例:查询每个员工所在部门名称,显示部门名和员工名?
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的缺点:结构不清晰,表的连接条件和后期进一步进行筛选的条件都放在了where的后面
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;//SQL99语法
SQL99的优点:表连接的条件是相互独立的,连接之后如需要进一步筛选,再往后继续添加where
思考:最终查询结果的条数是14条,但是匹配的次数并没有减少,只不过进行了4选1
5.内连接(两张表没有主次关系,是平等的)
(1).内连接等值连接:
select e.ename,d.dname from emp e inner join dept d on e.deptno = d.deptno;//inner可以省略
(2).内连接非等值连接:
案例·:找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级?
select e.ename,e.sal,s.grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal order by grade desc;
(3).内连接自连接:
案例:查询员工的上级领导,要求显示对应的员工名和领导名?
select a.ename as'员工名',b.ename as '领导名' from emp a join emp b on b.empno = a.mgr;
技巧:两张表看称一张表
6.外连接(外连接中,两张表产生了主次关系)
select e.ename,d.dname from dept d left outer join emp e on e.deptno = d.deptno;//左外连接
select e.ename,d.dname from emp e right outer join dept d on e.deptno = d.deptno;//右外连接
right代表将关键字右边的数据看成主表,主要是为了将这张表的数据全部查询出来,捎带关联查询左边的表,outer表示外连接,可以省略
注意:外连接的查询结果条数一定>=外连接的查询结果条数
7.多张表怎么连接?
select ...from a join b on a和b的连接条件 join c on a和c的连接条件 join d on a和d连接条件;
案例:找出每个部门员工的工资等级和部门名称,要求显示部门名、薪资、员工名
select a.ename,b.dname,a.sal,leader.ename,c.grade from emp a join dept b on a.deptno = b.deptno join salgrade c on a.sal between c.losal and c.hisal left join emp leader on a.mgr = leader.empno;