SQL语句的应用,远比想象中强大,这是现在对于SQL的理解。而随着时间的更替,新的事物不断代替旧的事物,这是亘古不变的道理。当然,总有一些经典,永留作经典,但后世对于此的而理解和解析也是不断的更新,衍生出新的含义。
从SQL的92语法和99语法来看,发生改变,但只是一些。下面采用demo的形式对两者做一差异化比较:
92语法
--笛卡尔积
<span style="font-size:18px;"><span style="font-size:18px;">SELECT * FROM EMP;
SELECT * FROM DEPT;
SELECT * FROM SALGRADE;
SELECT * FROM EMP,DEPT,SALGRADE;</span></span>
--等值连接
<span style="font-size:18px;"><span style="font-size:18px;">SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO =DEPT.DEPTNO;
SELECT EMP.ENAME,DEPT.DNAME FROM EMP,DEPTWHERE EMP.DEPTNO = DEPT.DEPTNO;
SELECT ENAME,DNAME FROM EMP,DEPT WHERE DEPTNO= DEPTNO;
SELECT E.ENAME,D.DNAME FROM EMP E,DEPT DWHERE E.DEPTNO = D.DEPTNO;</span></span>
--非等值连接
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,E.SAL,S.GRADE FROM EMPE,SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;</span></span>
--统计10部门所有员工的工作地址
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,D.DNAME,D.LOC FROM EMPE,DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10;</span></span>
--统计每个员工所在的部门名称和薪资等级
<span style="font-size:18px;"><span style="font-size:18px;">SELECTE.ENAME,D.DNAME,D.DEPTNO,E.SAL,S.GRADE FROM EMP E,SALGRADE S,DEPT D
WHERE
E.DEPTNO= D.DEPTNO AND
E.SALBETWEEN S.LOSAL AND S.HISAL;</span></span>
--外连接(+号在哪就显示对方全部的)
--必须保证sql语句编程规范
----右外连接
<span style="font-size:18px;"><span style="font-size:18px;">SELECTE.ENAME,D.DNAME FROM EMP E,DEPT D
WHERE
E.DEPTNO(+)= D.DEPTNO;</span></span>
----左外连接
<span style="font-size:18px;"><span style="font-size:18px;"> SELECTE.ENAME,D.DNAME FROM EMP E,DEPT D
WHERE
E.DEPTNO= D.DEPTNO(+); </span></span>
----在92语法中,不能包含全外连接
<span style="font-size:18px;"><span style="font-size:18px;"> SELECTE.ENAME,D.DNAME FROM EMP E,DEPT D
WHERE
E.DEPTNO(+)= D.DEPTNO(+); </span></span>
<span style="font-size:18px;"><span style="font-size:18px;">UPDATE EMP SET DEPTNO = NULL WHERE EMPNO =7369; COMMIT; </span></span>
--自连接
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,E.MGR,M.ENAME,M.EMPNO FROMEMP E, EMP M;
SELECT E.ENAME,E.MGR,M.ENAME,M.EMPNO
FROMEMP E, EMP M
WHEREE.MGR = M.EMPNO(+);</span></span>
提醒:为了连接n个表,至少需要n-1个连接条件
99语法
-------表连接条件和查询条件混合到一起--交叉连接==笛卡尔积
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,D.DNAME FROM EMP E,DEPT D;
SELECT E.ENAME,D.DNAME FROM EMP E CROSSJOIN DEPT D;</span></span>
--自然连接(会自动选择要关联的列,但是要保证列的名字和类型一致,在显示的时候,关联列不能指定表的别名)
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,D.DNAME,D.DEPTNO FROM EMPE,DEPT D WHERE E.DEPTNO = D.DEPTNO;
SELECT E.ENAME,D.DNAME,DEPTNO FROM EMP E NATURAL JOIN DEPT D;</span></span>
--USING
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,D.DNAME,D.DEPTNO FROM EMPE,DEPT D WHERE E.DEPTNO = D.DEPTNO;
SELECT E.ENAME,D.DNAME,DEPTNO FROM EMP E JOIN DEPT D USING(DEPTNO);</span></span>
--ON
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,S.GRADE FROM EMP E,SALGRADES WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
SELECT E.ENAME,S.GRADE FROM EMP E JOINSALGRADE S ON(E.SAL BETWEEN S.LOSAL AND S.HISAL);</span></span>
--左外连接
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,D.DNAME FROM EMP E,DEPT DWHERE E.DEPTNO = D.DEPTNO(+);
SELECT E.ENAME,D.DNAME FROM EMP E LEFT OUTERJOIN DEPT D USING(DEPTNO);</span></span>
--右外连接
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,D.DNAME FROM EMP E,DEPT DWHERE E.DEPTNO(+) = D.DEPTNO;
SELECT E.ENAME,D.DNAME FROM EMP E RIGHTOUTER JOIN DEPT D USING(DEPTNO);</span></span>
--全外连接
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,D.DNAME FROM EMP E FULLOUTER JOIN DEPT D USING(DEPTNO);</span></span>
--自连接
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,E.MGR,M.ENAME,M.EMPNO FROMEMP E, EMP M WHERE E.MGR = M.EMPNO(+);
SELECT E.ENAME,E.MGR,M.ENAME,M.EMPNO FROMEMP E LEFT OUTER JOIN EMP M ON(E.MGR = M.EMPNO);</span></span>
--检索雇员名字、所在单位、薪水等级
<span style="font-size:18px;"><span style="font-size:18px;">SELECT E.ENAME,D.DNAME,S.GRADE
FROMEMP E,DEPT D,SALGRADE S
WHERE
E.DEPTNO= D.DEPTNO(+) AND
E.SALBETWEEN S.LOSAL AND S.HISAL AND
E.SAL>=800;
SELECT E.ENAME,D.DNAME,S.GRADE
FROMEMP E
LEFTOUTER JOIN DEPT D USING(DEPTNO)
JOINSALGRADE S ON(E.SAL BETWEEN S.LOSAL AND S.HISAL)
WHERE E.SAL >=800;</span></span>
如未明了,请参照多表连接详情。
差异化
99语法的出现,是为了实现表连接条件和一般过滤条件的分离。相对92简洁的语法,99语法显得比较复杂。
--自然连接
92:
<span style="font-size:18px;"><span style="font-size:18px;">select * from emp e, dept d where e.deptno = d.deptno;</span></span>
99:
<span style="font-size:18px;"><span style="font-size:18px;">select * from emp enatural join dept d ;</span></span>
--左外连接
92:
<span style="font-size:18px;"><span style="font-size:18px;">select * from emp e,dept d where e.deptno = d.deptno(+);</span></span>
99:
<span style="font-size:18px;"><span style="font-size:18px;">select * from emp eleft (outer可省) join dept d on e.deptno = d.deptno;</span></span>
--全连接(99独有)
<span style="font-size:18px;"><span style="font-size:18px;">select * from emp e full join dept d one.deptno = d.deptno;</span></span>
另外,99语法还有交叉连接、using连接等连接,有各自的语法和使用限制。
业务思想
新事物的出现必有其历史原因和未来独特的作用,曾了解过一些熟悉92语法的朋友,对于99语法的出现,有些过于复杂,倒不如92语法的简单清晰。
是的,对待新事物的我们通常这样,不愿改变,但工作中需要,我们又不得不学,总是这样哭笑不得。
个人并不觉得99语法较复杂,而是把SQL语句解释的更加透彻,更好的从直观上了解SQL的独到之处(个人体会)。
无论工作中用哪种,多了解SQL的演变,对于新事物怀一颗接纳的心,我们会很快乐的。