0


SQL的1999语法

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645

对于数据表的连接操作,从实际使用来说,各个数据库都是支持的,但是外连接使 用“ (+) ”是 Oracle 自带的,其他数据库是不支持的。所以对所有的数据库,进行表连接最好的做法是利用以下的语法完成

select [distinct] * | 列 [ 别名 ] , 列 [ 别名 ] , ...
from 表 1 [ 别名 ] 
  [cross join 表 2 [ 别名 ]] 
  [natural join 表 2 [ 别名 ]] 
  [join 表 2 [ 别名 ] on ( 条件 ) | using( 关联字段 )] 
  [left | right | full outer join 表 2  [ 别名 ] on( 条件 )] ;

在进行表连接的时候,如果是内连接,则使用等值判断;

如果是外连接,则使用 left、outer、full等操作。

而上面语法中的 cross join、natural join、join很少使用。

不过我们也简单看 一下如何操作它们

交叉连接

目的是产生笛卡尔积

语法如下

select [distinct] * | 列 [ 别名 ] , 列 [ 别名 ] , ...
from 表 1 [ 别名 ] cross join 表 2 [ 别名 ] ;

实现交叉连接

select *
from emp cross join dept;

执行有很多行,这里我就不示范了,等同于

select *
from emp,dept;

大家可以试试

自然连接

利用关联字段,自己进行笛卡尔积的消除(只要字段名称相同即可,系统会自动匹配)

select [distinct] * | 列 [ 别名 ] , 列 [ 别名 ] , ...
from 表 1 [ 别名 ] natural join 表 2 [ 别名 ] ;

实现自然连接(实际上就是内连接)

select *
from emp natural join dept;

上面代码等同于前面所介绍的查询语句

select *
from emp,dept
where emp.deptno=dept.deptno;

大家可以自己试试

ON和USING

使用自然连接时要求两张表的字段名称相同,但是如果不相同或者两张表中有两组字段是重名,这时就要利用 ON 子句指定关联条件,利用 USING 子句设置关联字段

利用 USiNG 子句设置关联字段实现自然连接

SQL> select *
  2  from emp join dept using(deptno);

    DEPTNO      EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM DNAME
           LOC
---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------------------------- --------------------------
        10       7839 KING                 PRESIDENT                     17-11月-81           5000            ACCOUNTING
           NEW YORK
        10       7782 CLARK                MANAGER                  7839 09-6月 -81           2450            ACCOUNTING
           NEW YORK
        10       7934 MILLER               CLERK                    7782 23-1月 -82           1300            ACCOUNTING
           NEW YORK
        20       7902 FORD                 ANALYST                  7566 03-12月-81           3000            RESEARCH
           DALLAS
        20       7369 SMITH                CLERK                    7902 17-12月-80            800            RESEARCH
           DALLAS
        20       7566 JONES                MANAGER                  7839 02-4月 -81           2975            RESEARCH
           DALLAS
        30       7900 JAMES                CLERK                    7698 03-12月-81            950            SALES
           CHICAGO
        30       7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0 SALES
           CHICAGO
        30       7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400 SALES
           CHICAGO
        30       7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500 SALES
           CHICAGO
        30       7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300 SALES
           CHICAGO

    DEPTNO      EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM DNAME
           LOC
---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------------------------- --------------------------
        30       7698 BLAKE                MANAGER                  7839 01-5月 -81           2850            SALES
           CHICAGO

已选择 12 行。

利用 ON 子句设置关联条件

SQL> select *
  2  from emp e join dept d on(e.deptno=d.deptno);

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO     DEPTNO DNAME
                      LOC
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------
      7839 KING                 PRESIDENT                     17-11月-81           5000                    10         10 ACCOUNTING
                      NEW YORK
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                    10         10 ACCOUNTING
                      NEW YORK
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                    10         10 ACCOUNTING
                      NEW YORK
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                    20         20 RESEARCH
                      DALLAS
      7369 SMITH                CLERK                    7902 17-12月-80            800                    20         20 RESEARCH
                      DALLAS
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                    20         20 RESEARCH
                      DALLAS
      7900 JAMES                CLERK                    7698 03-12月-81            950                    30         30 SALES
                      CHICAGO
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         30         30 SALES
                      CHICAGO
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400         30         30 SALES
                      CHICAGO
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         30         30 SALES
                      CHICAGO
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300         30         30 SALES
                      CHICAGO

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO     DEPTNO DNAME
                      LOC
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                    30         30 SALES
                      CHICAGO

已选择 12 行。

同样,上面代码效果等同于前面所介绍的查询语句

select *
from emp,dept
where emp.deptno=dept.deptno;

不过显示结果的时候,deptno 字段只显示一次,而前面介绍的方法会显示两次

外连接

select [distinct] * | 列 [ 别名 ] , 列 [ 别名 ] , ...
from 表 1 [ 别名 ] left | right | full outer join 表 2 ;

左外连接

select *
from emp e left outer join dept d on(e.deptno=d.deptno);

上面代码等同于前面所介绍的查询语句

select *
from emp e,dept d
where e.deptno=d.deptno(+);

全外连接

SQL> select *
  2  from emp e full outer join dept d on(e.deptno=d.deptno);

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO     DEPTNO DNAME
                      LOC
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------
      7369 SMITH                CLERK                    7902 17-12月-80            800                    20         20 RESEARCH
                      DALLAS
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300         30         30 SALES
                      CHICAGO
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         30         30 SALES
                      CHICAGO
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                    20         20 RESEARCH
                      DALLAS
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400         30         30 SALES
                      CHICAGO
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                    30         30 SALES
                      CHICAGO
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                    10         10 ACCOUNTING
                      NEW YORK
      7839 KING                 PRESIDENT                     17-11月-81           5000                    10         10 ACCOUNTING
                      NEW YORK
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         30         30 SALES
                      CHICAGO
      7900 JAMES                CLERK                    7698 03-12月-81            950                    30         30 SALES
                      CHICAGO
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                    20         20 RESEARCH
                      DALLAS

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO     DEPTNO DNAME
                      LOC
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                    10         10 ACCOUNTING
                      NEW YORK
      8989 HELLO
                                                                                                                      40 OPERATIONS
                      BOSTON

已选择 14 行。

此时把没有员工的部门和没有部门的员工的信息都显示出来了

标签: sql 数据库 oracle

本文转载自: https://blog.csdn.net/weixin_67859959/article/details/136132901
版权归原作者 橙子味冰可乐 所有, 如有侵权,请联系我们删除。

“SQL的1999语法”的评论:

还没有评论