【Oracle】2.92与99语法差异化比较

时间:2021-08-30 06:07:39

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的演变,对于新事物怀一颗接纳的心,我们会很快乐的。