sql标准
sql92标准中的连接条件和数据过滤条件都是混在where语句中,这样使人很同意混淆,如下面语句:
Select ename,dname From emp,dept Where dmp.deptno = dept.deptno;
为了解决这个问题,sql99标准改善了这个问题,用join语句表示连接条件,where中只剩下数据过滤
条件。新的语法定义比较清晰,语句更容易读,如以下语句:
Select ename,dname From emp Join dept on (emp.deptno = dept.deptno);
若是等值连接还有另一种简便的写法,如以上可写成:
Select ename,dname From emp Join dept using (deptno);
但是不推荐这一种写法,因为这种写法不易让人理解,也容易出错用join连接3个表,这种写法比用
where更容易理解,如下:
Select ename,dname,grade From emp e join dept d On(e.deptno = d.deptno) Join salgrade s on(e.sal between s.losal and s.hisal) Where ename not like ‘_a%’;
左外连接:会把左边那张表的多余的数据(不能和另外一张表产生连接的数据)显示出来
左向外联接的结果集包括left子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某
行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
Select e1.ename,e2.ename From emp e1 left join emp e2 On (e1.mgr = e2.emptno);
右内连接: 右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有
匹配行,则将为左表返回空值
Select ename,dname From emp e right join dept d on (e.deptno = d.deptno);
完整连接: 完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的
选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值
Select ename,dname From emp e full join dept d on (e.deptno = d.deptno);
select小结:select实例:
--求部门中哪些人的薪水最高
Select ename,sal From emp Join (select max(sal) max_sal ,deptno From emp Group by deptno) t On(emp.sal = t.max_sal and emp.deptno = t.deptno);
--求部门平均薪水的等级
Select deptno,avg_sal,grade From (select deptno,avg(sal) From emp Group by deptno) t Join salgrade s On (t.avg_sal between s.local and s.hisal)
--比普通员工的最高薪水还要高的经理人名称
select ename from emp where empno in ( select distinct mgr from emp where mgr is not null ) and sal > ( select max(sal) from emp where empno not in( select distinct mgr from emp where mgr is not null ) )
最后说一个面试题:比较下面两条语句的执行效率:
Select * from emp where deptno = 10 and ename like ‘%A%’; Select * from emp where ename like ‘%A%’ and deptno = 10;
两条语句在执行时理论上是第一条效率较高,因为匹配数字比匹配字符串更快,所以先过滤掉数字效率
会更高些但是在实际应用中,比如oracle数据库中,在使用第2条语句时,oracle会自动优化查询,它仍
然会像第1条语句那样执行,所以在具体的数据库中他们的效率还要看具体情况