精华内容
下载资源
问答
  • 阅读目录 1、准备工作2、连接(LEFT OUTER JOIN/ LEFT JOIN)3、右外连接(RIGHT OUTER JOIN/RIGHT JOIN)4、全外...Oracle 外连接(OUTER JOIN)包括以下连接(左边的表不加限制)右外连接(右边的表不

    1、准备工作

    Oracle  外连接(OUTER JOIN)包括以下:

    • 左外连接(左边的表不加限制)
    • 右外连接(右边的表不加限制)
    • 全外连接(左右两表都不加限制)

    对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常省略OUTER关键字, 写成:LEFT/RIGHT/FULL JOIN。

    在左连接和右连接时都会以一张A表为基础表,该表的内容会全部显示,然后加上A表和B表匹配的内容。 如果A表的数据在B表中没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。

    对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:

    1. (+)操作符只能出现在WHERE子句中,并且不能与OUTER JOIN语法同时使用。
    2.  当使用(+)操作符执行外连接时,如果在WHERE子句中包含有多个条件,则必须在所有条件中都包含(+)操作符。
    3. (+)操作符只适用于列,而不能用在表达式上。
    4. (+)操作符不能与OR和IN操作符一起使用。
    5. (+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

    创建两张表,插入数据用于学习测试:

    复制代码
    CREATE TABLE t_A (
    id   number,
    name  VARCHAR2(10)
    );
    
    CREATE TABLE t_B (
    id   number,
    name  VARCHAR2(10)
    );
    
    INSERT INTO t_A VALUES(1,'A');
    INSERT INTO t_A VALUES(2,'B');
    INSERT INTO t_A VALUES(3,'C');
    INSERT INTO t_A VALUES(4,'D');
    INSERT INTO t_A VALUES(5,'E');
    
    INSERT INTO t_B VALUES(1,'AA');
    INSERT INTO t_B VALUES(1,'BB');
    INSERT INTO t_B VALUES(2,'CC');
    INSERT INTO t_B VALUES(1,'DD');
    复制代码

      

    2、左外连接(LEFT OUTER JOIN/ LEFT JOIN)

      LEFT JOIN是以左表的记录为基础的,示例中t_A可以看成左表,t_B可以看成右表,它的结果集是t_A表中的全部数据,再加上t_A表和t_B表匹配后的数据。换句话说,左表(t_A)的记录将会全部表示出来,而右表(t_B)只会显示符合搜索条件的记录。t_B表记录不足的地方均为NULL。

    select * from t_A a left join t_B b on a.id = b.id;
    或
    select * from t_A a left outer join t_B b on a.id = b.id;

      

      用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在右表,左表就是全部显示,所以是左连接。

    Select * from t_A a,t_B b where a.id=b.id(+);

      

    3、右外连接(RIGHT OUTER JOIN/RIGHT JOIN)

      和LEFT JOIN的结果刚好相反,是以右表(t_B)为基础的。它的结果集是t_B表所有记录,再加上t_A和t_B匹配后的数据。 t_A表记录不足的地方均为NULL。

    select * from t_A a right join t_B b on a.id = b.id;
    或
    select * from t_A a right outer join t_B b on a.id = b.id;

      

      用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在左表,右表就是全部显示,所以是右连接。

    Select * from t_A a,t_B b where a.id(+)=b.id;

      

    4、全外连接(FULL OUTER JOIN/FULL JOIN)

         左表和右表都不做限制,所有的记录都显示,两表不足的地方均为NULL。 全外连接不支持(+)写法。

    select * from t_A a full join t_B b on a.id = b.id;
    或
    select * from t_A a full outer join t_B b on a.id = b.id;    

      

    补充

    select * from t_A a,t_B b where a.id = b.id;
    select * from t_A a join t_B b on a.id = b.id;

      

    select * from t_A a where a.id in (select b.id from t_B b);
    select * from t_A a where exists (select 1 from t_B b where a.id = b.id);

      

    本博客内容主要以学习、研究和分享为主,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
    展开全文
  • 连接JOIN,USING子句的使用

    万次阅读 2014-05-13 13:43:38
    CROSS JOIN连接用于生成两张表的笛卡尔集。 1、返回的记录数为两个表的记录数乘积。比如,A表有n条记录,B表有m条记录,则返回n*m条记录。 2、将A表的所有行分别与B表的所有行进行连接。 准备测试数据: SQL> ...


           表连接分为:CROSS JOIN、INNERT JOIN、OUTER JOIN、SELF JOIN。

    一、CROSS JOIN 交叉连接

     

    CROSS JOIN连接用于生成两张表的笛卡尔集。
    1、返回的记录数为两个表的记录数乘积。比如,A表有n条记录,B表有m条记录,则返回n*m条记录。
    2、将A表的所有行分别与B表的所有行进行连接。

    准备测试数据:

    
    SQL> conn scott/tiger
    Connected.
    SQL> create table emp2 as select * from emp;
    
    Table created.
    
    SQL> create table dept2 as select * from dept;
    
    Table created.
    
    SQL> insert into dept2 values(60,'HR','A City');
    
    1 row created.
    
    SQL> insert into emp2(empno,ename,sal) values(1234,'test',4000);
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select * from emp2;
    
         EMPNO ENAME                JOB                       MGR HIREDATE            SAL       COMM     DEPTNO
    ---------- -------------------- ------------------ ---------- ------------ ---------- ---------- ----------
          7369 SMITH                CLERK                    7902 17-DEC-80           800                    20
          7499 ALLEN                SALESMAN                 7698 20-FEB-81          1600        300         30
          7521 WARD                 SALESMAN                 7698 22-FEB-81          1250        500         30
          7566 JONES                MANAGER                  7839 02-APR-81          2975                    20
          7654 MARTIN               SALESMAN                 7698 28-SEP-81          1250       1400         30
          7698 BLAKE                MANAGER                  7839 01-MAY-81          2850                    30
          7782 CLARK                MANAGER                  7839 09-JUN-81          2450                    10
          7788 SCOTT                ANALYST                  7566 19-APR-87          3000                    20
          7839 KING                 PRESIDENT                     17-NOV-81          5000                    10
          7844 TURNER               SALESMAN                 7698 08-SEP-81          1500          0         30
          7876 ADAMS                CLERK                    7788 23-MAY-87          1100                    20
          7900 JAMES                CLERK                    7698 03-DEC-81           950                    30
          7902 FORD                 ANALYST                  7566 03-DEC-81          3000                    20
          7934 MILLER               CLERK                    7782 23-JAN-82          1300                    10
          1234 test                                                                  4000
    
    15 rows selected.
    
    SQL> select * from dept2;
    
        DEPTNO DNAME                        LOC
    ---------- ---------------------------- -------------
            10 ACCOUNTING                   NEW YORK
            20 RESEARCH                     DALLAS
            30 SALES                        CHICAGO
            40 OPERATIONS                   BOSTON
            60 HR                           A City
    
    5 rows selected.
    
    -- cross join,返回 15 * 5行记录。
    SQL> SELECT ename,dname
      2  FROM emp2 CROSS JOIN dept2;
    
    ENAME                DNAME
    -------------------- ----------------------------
    SMITH                ACCOUNTING
    ALLEN                ACCOUNTING
    WARD                 ACCOUNTING
    JONES                ACCOUNTING
    MARTIN               ACCOUNTING
    BLAKE                ACCOUNTING
    ...
    CLARK                HR
    SCOTT                HR
    KING                 HR
    TURNER               HR
    ADAMS                HR
    JAMES                HR
    FORD                 HR
    MILLER               HR
    test                 HR
    
    75 rows selected.
    
    


    二、INNER JOIN 内连接
            内连接就是关联的两张或多张表中,根据关联条件,显示所有匹配的记录,匹配不上的,不显示。
           
           以下两种是标准写法:


     

    SQL>  SELECT ename,sal
      2   FROM emp2 e INNER JOIN dept2 d
      3   ON e.deptno=d.deptno;
    
    ENAME                       SAL
    -------------------- ----------
    SMITH                       800
    ALLEN                      1600
    WARD                       1250
    JONES                      2975
    MARTIN                     1250
    BLAKE                      2850
    CLARK                      2450
    SCOTT                      3000
    KING                       5000
    TURNER                     1500
    ADAMS                      1100
    JAMES                       950
    FORD                       3000
    MILLER                     1300
    
    14 rows selected.
    
    --也可以省略inner关键字,直接写join
    SQL>  SELECT ename,sal
      2   FROM emp2 e JOIN dept2 d
      3   ON e.deptno=d.deptno;
    
    ENAME                       SAL
    -------------------- ----------
    SMITH                       800
    ALLEN                      1600
    WARD                       1250
    JONES                      2975
    MARTIN                     1250
    BLAKE                      2850
    CLARK                      2450
    SCOTT                      3000
    KING                       5000
    TURNER                     1500
    ADAMS                      1100
    JAMES                       950
    FORD                       3000
    MILLER                     1300
    
    14 rows selected.
    
    --如果两张表的关联字段名相同,也可以使用USING子句。
    SQL> SELECT ename,sal
      2  FROM emp2 e JOIN dept2 d
      3  USING(deptno);
    ENAME                       SAL
    -------------------- ----------
    SMITH                       800
    ALLEN                      1600
    WARD                       1250
    JONES                      2975
    MARTIN                     1250
    BLAKE                      2850
    CLARK                      2450
    SCOTT                      3000
    KING                       5000
    TURNER                     1500
    ADAMS                      1100
    JAMES                       950
    FORD                       3000
    MILLER                     1300
    
    
    14 rows selected.
    
    --oracle的写法
    SQL>  SELECT ename,sal
      2   FROM emp2 e,dept2 d
      3   WHERE e.deptno=d.deptno;
    
    ENAME                       SAL
    -------------------- ----------
    SMITH                       800
    ALLEN                      1600
    WARD                       1250
    JONES                      2975
    MARTIN                     1250
    BLAKE                      2850
    CLARK                      2450
    SCOTT                      3000
    KING                       5000
    TURNER                     1500
    ADAMS                      1100
    JAMES                       950
    FORD                       3000
    MILLER                     1300
    
    14 rows selected.
    
    


    三、OUTER JOIN 外连接
    外连接,又分为:
            1.LEFT OUTER JOIN/LEFT JOIN(左外连接)
            2.RIGHT OUTER JOIN/RIGHT JOIN(右外连接)
            3.FULL OUTER JOIN/FULL JOIN(全外连接)

    1.LEFT OUTER JOIN/LEFT JOIN(左外连接)
            左外连接就是关联的两张或多张表中,根据关联条件,显示匹配的记录,左表中有的记录,但是右表中没有匹配上的,以空(null)显示。
            LEFT OUTER JOIN也可以简写成LEFT JOIN,效果是一样的。
           左外连接有SQL标准写法,也有oracle特有的写法。

     


     

    SQL> SELECT ename,sal,dname
      2  FROM emp2 e LEFT OUTER JOIN dept2 d
      3  ON e.deptno=d.deptno;
    
    ENAME                       SAL DNAME
    -------------------- ---------- -------------
    MILLER                     1300 ACCOUNTING
    KING                       5000 ACCOUNTING
    CLARK                      2450 ACCOUNTING
    FORD                       3000 RESEARCH
    ADAMS                      1100 RESEARCH
    SCOTT                      3000 RESEARCH
    JONES                      2975 RESEARCH
    SMITH                       800 RESEARCH
    JAMES                       950 SALES
    TURNER                     1500 SALES
    BLAKE                      2850 SALES
    MARTIN                     1250 SALES
    WARD                       1250 SALES
    ALLEN                      1600 SALES
    test                       4000
    
    15 rows selected.
    
    --也可以去掉OUTER关键字,写成LEFT JOIN
    SQL> SELECT ename,sal,dname
      2  FROM emp2 e LEFT JOIN dept2 d
      3  ON e.deptno=d.deptno;
    
    ENAME                       SAL DNAME
    -------------------- ---------- -------------
    MILLER                     1300 ACCOUNTING
    KING                       5000 ACCOUNTING
    CLARK                      2450 ACCOUNTING
    FORD                       3000 RESEARCH
    ADAMS                      1100 RESEARCH
    SCOTT                      3000 RESEARCH
    JONES                      2975 RESEARCH
    SMITH                       800 RESEARCH
    JAMES                       950 SALES
    TURNER                     1500 SALES
    BLAKE                      2850 SALES
    MARTIN                     1250 SALES
    WARD                       1250 SALES
    ALLEN                      1600 SALES
    test                       4000
    
    15 rows selected.
    
    --如果两张表的关联字段名相同,也可以使用USING子句
    SQL> SELECT ename,sal
      2  FROM emp2 e LEFT JOIN dept2 d
      3  USING(deptno);
    
    ENAME                       SAL DNAME
    -------------------- ---------- -----------
    MILLER                     1300 ACCOUNTING
    KING                       5000 ACCOUNTING
    CLARK                      2450 ACCOUNTING
    FORD                       3000 RESEARCH
    ADAMS                      1100 RESEARCH
    SCOTT                      3000 RESEARCH
    JONES                      2975 RESEARCH
    SMITH                       800 RESEARCH
    JAMES                       950 SALES
    TURNER                     1500 SALES
    BLAKE                      2850 SALES
    MARTIN                     1250 SALES
    WARD                       1250 SALES
    ALLEN                      1600 SALES
    test                       4000
    
    15 rows selected.
    
    -oracle的写法
    SQL> SELECT ename,sal,dname
      2  FROM emp2 e,dept2 d
      3  WHERE e.deptno=d.deptno(+);
    
    ENAME                       SAL DNAME
    -------------------- ---------- -----------
    MILLER                     1300 ACCOUNTING
    KING                       5000 ACCOUNTING
    CLARK                      2450 ACCOUNTING
    FORD                       3000 RESEARCH
    ADAMS                      1100 RESEARCH
    SCOTT                      3000 RESEARCH
    JONES                      2975 RESEARCH
    SMITH                       800 RESEARCH
    JAMES                       950 SALES
    TURNER                     1500 SALES
    BLAKE                      2850 SALES
    MARTIN                     1250 SALES
    WARD                       1250 SALES
    ALLEN                      1600 SALES
    test                       4000
    
    15 rows selected.


    2.RIGHT OUTER JOIN/RIGHT JOIN(右外连接)
            右外连接就是关联的两张或多张表中,根据关联条件,显示匹配的记录。右表中有的记录,但是左表中没有匹配上的,以空(null)显示。
            RIGHT OUTER JOIN也可以简写成RIGHT JOIN,效果是一样的。
           右外连接有SQL标准写法,也有oracle特有的写法。

     

    
    SQL> SELECT ename,sal,dname
      2  FROM emp2 e RIGHT OUTER JOIN dept2 d
      3  ON e.deptno=d.deptno;
    E
    NAME                       SAL DNAME
    -------------------- ---------- ---------------
    SMITH                       800 RESEARCH
    ALLEN                      1600 SALES
    WARD                       1250 SALES
    JONES                      2975 RESEARCH
    MARTIN                     1250 SALES
    BLAKE                      2850 SALES
    CLARK                      2450 ACCOUNTING
    SCOTT                      3000 RESEARCH
    KING                       5000 ACCOUNTING
    TURNER                     1500 SALES
    ADAMS                      1100 RESEARCH
    JAMES                       950 SALES
    FORD                       3000 RESEARCH
    MILLER                     1300 ACCOUNTING
                                    OPERATIONS
                                    HR
    
    16 rows selected.
    
    --去掉OUTER关键字
    SQL> SELECT ename,sal,dname
      2  FROM emp2 e RIGHT JOIN dept2 d
      3  ON e.deptno=d.deptno;
    
    ENAME                       SAL DNAME
    -------------------- ---------- ------------
    SMITH                       800 RESEARCH
    ALLEN                      1600 SALES
    WARD                       1250 SALES
    JONES                      2975 RESEARCH
    MARTIN                     1250 SALES
    BLAKE                      2850 SALES
    CLARK                      2450 ACCOUNTING
    SCOTT                      3000 RESEARCH
    KING                       5000 ACCOUNTING
    TURNER                     1500 SALES
    ADAMS                      1100 RESEARCH
    JAMES                       950 SALES
    FORD                       3000 RESEARCH
    MILLER                     1300 ACCOUNTING
                                    OPERATIONS
                                    HR
    
    16 rows selected.
    
    --如果两张表的关联字段名相同,也可以使用USING子句
    ENAME                       SAL DNAME
    -------------------- ---------- -------------
    SMITH                       800 RESEARCH
    ALLEN                      1600 SALES
    WARD                       1250 SALES
    JONES                      2975 RESEARCH
    MARTIN                     1250 SALES
    BLAKE                      2850 SALES
    CLARK                      2450 ACCOUNTING
    SCOTT                      3000 RESEARCH
    KING                       5000 ACCOUNTING
    TURNER                     1500 SALES
    ADAMS                      1100 RESEARCH
    JAMES                       950 SALES
    FORD                       3000 RESEARCH
    MILLER                     1300 ACCOUNTING
                                    OPERATIONS
                                    HR
    
    16 rows selected.
    
    --oracle的写法
    SQL> SELECT ename,sal,dname
      2  FROM emp2 e,dept2 d
      3  WHERE e.deptno(+)=d.deptno;
    
    ENAME                       SAL DNAME
    -------------------- ---------- ------------
    SMITH                       800 RESEARCH
    ALLEN                      1600 SALES
    WARD                       1250 SALES
    JONES                      2975 RESEARCH
    MARTIN                     1250 SALES
    BLAKE                      2850 SALES
    CLARK                      2450 ACCOUNTING
    SCOTT                      3000 RESEARCH
    KING                       5000 ACCOUNTING
    TURNER                     1500 SALES
    ADAMS                      1100 RESEARCH
    JAMES                       950 SALES
    FORD                       3000 RESEARCH
    MILLER                     1300 ACCOUNTING
                                    OPERATIONS
                                    HR
    
    16 rows selected.
    
    


    3.FULL OUTER JOIN/FULL JOIN(全外连接)
            全外连接就是关联的两张或多张表中,根据关联条件,显示所有匹配和不匹配的记录。
            左表中有的记录,但是右表中没有匹配上的,以空(null)显示。右表中有的记录,但是左表中没有匹配上的,也以空(null)显示。
            FULL OUTER JOIN也可以简写成FULL JOIN,效果是一样的。

            全外连接只有SQL标准写法,没有oracle特有的写法。

     

    
    SQL> SELECT ename,sal,dname
      2  FROM emp2 e FULL OUTER JOIN dept2 d
      3  ON e.deptno=d.deptno;
    
    ENAME                       SAL DNAME
    -------------------- ---------- -------------
    MILLER                     1300 ACCOUNTING
    KING                       5000 ACCOUNTING
    CLARK                      2450 ACCOUNTING
    FORD                       3000 RESEARCH
    ADAMS                      1100 RESEARCH
    SCOTT                      3000 RESEARCH
    JONES                      2975 RESEARCH
    SMITH                       800 RESEARCH
    JAMES                       950 SALES
    TURNER                     1500 SALES
    BLAKE                      2850 SALES
    MARTIN                     1250 SALES
    WARD                       1250 SALES
    ALLEN                      1600 SALES
    test                       4000
                                    OPERATIONS
                                    HR
    
    17 rows selected.
    
    SQL> SELECT ename,sal,dname
      2  FROM emp2 e FULL JOIN dept2 d
      3  ON e.deptno=d.deptno;
    
    ENAME                       SAL DNAME
    -------------------- ---------- ----------------
    MILLER                     1300 ACCOUNTING
    KING                       5000 ACCOUNTING
    CLARK                      2450 ACCOUNTING
    FORD                       3000 RESEARCH
    ADAMS                      1100 RESEARCH
    SCOTT                      3000 RESEARCH
    JONES                      2975 RESEARCH
    SMITH                       800 RESEARCH
    JAMES                       950 SALES
    TURNER                     1500 SALES
    BLAKE                      2850 SALES
    MARTIN                     1250 SALES
    WARD                       1250 SALES
    ALLEN                      1600 SALES
    test                       4000
                                    OPERATIONS
                                    HR
    
    17 rows selected.
    
    --如果两张表的关联字段名相同,也可以使用USING子句
    SQL>  SELECT ename,sal,dname
      2   FROM emp2 e FULL JOIN dept2 d
      3   USING(deptno);
    
    ENAME                       SAL DNAME
    -------------------- ---------- -------------
    MILLER                     1300 ACCOUNTING
    KING                       5000 ACCOUNTING
    CLARK                      2450 ACCOUNTING
    FORD                       3000 RESEARCH
    ADAMS                      1100 RESEARCH
    SCOTT                      3000 RESEARCH
    JONES                      2975 RESEARCH
    SMITH                       800 RESEARCH
    JAMES                       950 SALES
    TURNER                     1500 SALES
    BLAKE                      2850 SALES
    MARTIN                     1250 SALES
    WARD                       1250 SALES
    ALLEN                      1600 SALES
    test                       4000
                                    OPERATIONS
                                    HR
    
    17 rows selected.
    
    --没有oracle写法,下面这样是错误的。
    SQL> SELECT ename,sal,dname
      2  FROM emp2 e,dept2 d
      3  WHERE e.deptno(+)=d.deptno(+);
    WHERE e.deptno(+)=d.deptno(+)
                     *
    ERROR at line 3:
    ORA-01468: a predicate may reference only one outer-joined table



    四、SELF JOIN 自连接

     

          在上面的emp2表中,每一个员工都有自己的mgr(经理),并且每一个经理自身也是公司的员工,自身也有自己的经理。现在需要将每一个员工自己的名字和经理的名字都找出来,应该怎么显示呢?
    如果我们有两张这样的表分别教worker和mgr,那么我们就很好写SQL语句。
    SELECT worker.name,Mgr.name
       FROM worker,mgr
    WHERE worker.id = mgr.id;

          但现在我们只有一张表。你也许说我们现在在建一张表,把同样的数据拷贝过去不就可以了吗?是的,这样可以,但我们不会采用,因为这样就会很麻烦,而且数据严重冗余等等很多弊端。
          这里有更好的方法,那就是自连接。
         自连接,就是把一张表取两个别名,当做两张表来使用,自己和自己关联。

     

    
    SQL> SELECT e.ename,e.sal,e2.ename manager_name
      2  FROM emp2 e inner join emp2 e2
      3  ON e.empno=e2.mgr;
    
    ENAME                       SAL MANAGER_NAME
    -------------------- ---------- -------------------
    FORD                       3000 SMITH
    BLAKE                      2850 ALLEN
    BLAKE                      2850 WARD
    KING                       5000 JONES
    BLAKE                      2850 MARTIN
    KING                       5000 BLAKE
    KING                       5000 CLARK
    JONES                      2975 SCOTT
    BLAKE                      2850 TURNER
    SCOTT                      3000 ADAMS
    BLAKE                      2850 JAMES
    JONES                      2975 FORD
    CLARK                      2450 MILLER
    
    13 rows selected.
    
    SQL> SELECT e.ename,e.sal,e2.ename manager_name
      2  FROM emp2 e, emp2 e2
      3  WHERE e.empno=e2.mgr;
    
    ENAME                       SAL MANAGER_NAME
    -------------------- ---------- -------------------
    FORD                       3000 SMITH
    BLAKE                      2850 ALLEN
    BLAKE                      2850 WARD
    KING                       5000 JONES
    BLAKE                      2850 MARTIN
    KING                       5000 BLAKE
    KING                       5000 CLARK
    JONES                      2975 SCOTT
    BLAKE                      2850 TURNER
    SCOTT                      3000 ADAMS
    BLAKE                      2850 JAMES
    JONES                      2975 FORD
    CLARK                      2450 MILLER
    
    13 rows selected.
    
    SQL>  SELECT e.ename,e.sal,e2.ename manager_name
      2   FROM emp2 e, emp2 e2
      3   WHERE e.empno=e2.mgr(+);
    
    ENAME                       SAL MANAGER_NAME
    -------------------- ---------- -------------------
    FORD                       3000 SMITH
    BLAKE                      2850 ALLEN
    BLAKE                      2850 WARD
    KING                       5000 JONES
    BLAKE                      2850 MARTIN
    KING                       5000 BLAKE
    KING                       5000 CLARK
    JONES                      2975 SCOTT
    BLAKE                      2850 TURNER
    SCOTT                      3000 ADAMS
    BLAKE                      2850 JAMES
    JONES                      2975 FORD
    CLARK                      2450 MILLER
    TURNER                     1500
    WARD                       1250
    test                       4000
    MARTIN                     1250
    ALLEN                      1600
    MILLER                     1300
    SMITH                       800
    ADAMS                      1100
    JAMES                       950
    
    22 rows selected.
    
    SQL>  SELECT e.ename,e.sal,e2.ename manager_name
      2   FROM emp2 e, emp2 e2
      3   WHERE e.empno(+)=e2.mgr;
    
    ENAME                       SAL MANAGER_NAME
    -------------------- ---------- -----------------
    JONES                      2975 FORD
    JONES                      2975 SCOTT
    BLAKE                      2850 JAMES
    BLAKE                      2850 TURNER
    BLAKE                      2850 MARTIN
    BLAKE                      2850 WARD
    BLAKE                      2850 ALLEN
    CLARK                      2450 MILLER
    SCOTT                      3000 ADAMS
    KING                       5000 CLARK
    KING                       5000 BLAKE
    KING                       5000 JONES
    FORD                       3000 SMITH
                                    test
                                    KING
    
    15 rows selected.
    
    SQL>  SELECT e.ename,e.sal,e2.ename manager_name
      2   FROM emp2 e FULL JOIN emp2 e2
      3   ON e.empno=e2.mgr;
    
    ENAME                       SAL MANAGER_NAME
    -------------------- ---------- --------------------
    FORD                       3000 SMITH
    BLAKE                      2850 ALLEN
    BLAKE                      2850 WARD
    KING                       5000 JONES
    BLAKE                      2850 MARTIN
    KING                       5000 BLAKE
    KING                       5000 CLARK
    JONES                      2975 SCOTT
    BLAKE                      2850 TURNER
    SCOTT                      3000 ADAMS
    BLAKE                      2850 JAMES
    JONES                      2975 FORD
    CLARK                      2450 MILLER
    TURNER                     1500
    WARD                       1250
    test                       4000
    MARTIN                     1250
    ALLEN                      1600
    MILLER                     1300
    SMITH                       800
    ADAMS                      1100
    JAMES                       950
                                    test
                                    KING
    
    24 rows selected.


    五、总结

     

    表连接分为:
    1.CROSS JOIN:显示迪卡尔积。
    2.INNERT JOIN:显示所有匹配的项。
    3.OUTER JOIN
       外连接又分为:
         1) LEFT OUTER JOIN/LEFT JOIN:显示左表的所有项,右表没有匹配的项,则以null显示。
         2) RIGHT OUTER JOIN/RIGHT JOIN:显示右表的所有项,左表没有匹配的项,则以null显示。
         3) FULL OUTER JOIN/FULL JOIN:显示所有匹配和不匹配的项,左右两张表没有匹配的,都以null显示。
    4.SELF JOIN:把一张表取两个别名,当做两张表来使用,自己和自己关联。

                

     

    展开全文
  • (整理) SQL中几种连接的相互区别

    千次阅读 2012-05-08 21:51:29
    连接 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行 右外连接 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行 全外连接

    left join left outer join  inner JOIN的区别

    连接类型        定义
    内连接        只连接匹配的行
    左外连接        包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
    右外连接        包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
    全外连接        包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
    (H)(theta)
    连接        使用等值以外的条件来匹配左、右两个表中的行
    交叉连接        生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配


    举个例子:  
      假设a表和b表的数据是这样的。  
      a                         b    
      id     name  id     stock   
      1  a             1         15  
      2
             b             2         50  
      3
             c                  
       
      select   *   from   a   inner   join   b   on   a.id=b.id  
      这个语法是连接查询中的内连接,它产生的结果是  
      两个表相匹配的记录出现在结果列表中。  
      根据上面的表,出现的结果是这样的  
      a.id     name     b.id     stock  
      1       a             1         15  
      2
                 b             2         50  
      ----------------------------  
      select   *   from   a,b   where   a.id=b.id  
      这个语法是内连接的另外一种写法,其执行结果与inner   join   一样  
       
      --------------------------------    
       
      select   *   from   a   left/right   join   b   on   a.id=b.id  
      这个是外连接语法中的左外连接或右外连接  
      如果是左外连接的话,它将显示a表的所有记录,  
      select   a.*,b.*   from   a   left   join   b   on   a.id=b.id  
      查询的结果是这样的:  
      a.id     name     b.id     stock  
      1         a         1             15  
      2
                   b         2             50  
      3
                   c       null         null   
      --------------------------------------------  
      如果是右外连接的话,它将显示b表的所有记录,  
      select   a.*,b.*   from   a   right   join   b   on   a.id=b.id  
      查询的结果是这样的:  
      a.id     name     b.id     stock  
      1         a         1             15  
      2
                   b         2             50   


    --

    select   a.*,b.*   from   a   left   join   b   on   a.k   =   b.k    
      select   a.*,b.*   from   a   left   outer   join   b   on   a.k   =b.k  
      ----------上面两种一样left   joinleft   outer   join的简写  
      select   a.*,b.*   from   a   left   inner   join   b   on   a.k   =   b.k    
      没有这种写法,错误的语句.


    --

    在你要使用多个left   join的时候  
      比如说10个  
      我们把10个全都写成left   join的形式  
      然后再SQL让他自动运行一下,它会把最后一次出现的left   join变成left   outer   join  
      所以依此推理,最后一个left   join会以left   outer   join的形式存在  
      当然,不管变不变对结果的显示没有任何影响  
      希望我的实验能对你有所帮助   


    --

    使用关系代数合并数据

    1 关系代数


    合并数据集合的理论基础是关系代数,它是由E.F.Codd于1970年提出的。
    在关系代数的形式化语言中:
            用表、或者数据集合表示关系或者实体。r
            用行表示元组。r
            用列表示属性。r
    关系代数包含以下8个关系运算符
            选取――返回满足指定条件的行。r
            投影――从数据集合中返回指定的列。r
            笛卡尔积――是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式进行组合。r
            并――关系的加法和减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样。r
            交――返回两个数据集合所共有的行。r
            差――返回只属于一个数据集合的行。r
            连接――在水平方向上合并两个表,其方法是:将两个表中在共同数据项上相互匹配的那些行合并起来。r
            除――返回两个数据集之间的精确匹配。r
    此外,作为一种实现现代关系代数运算的方法,SQL还提供了:
            子查询――类似于连接,但更灵活;在外部查询中,方式可以使用表达式、列表或者数据集合的地方都可以使用子查询的结果。r
    本章将主要讲述多种类型的连接、简单的和相关的子查询、几种类型的并、关系除以及其他的内容。

    2 使用连接


    2.1 连接类型
    在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。
    SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。
    连接类型        定义
    内连接        只连接匹配的行
    左外连接        包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
    右外连接        包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
    全外连接        包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
    (H)(theta)
    连接        使用等值以外的条件来匹配左、右两个表中的行
    交叉连接        生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配

    在INFORMIX中连接表的查询
    如果FROM子句指定了多于一个表引用,则查询会连接来自多个表的行。连接条件指定各列之间(每个表至少一列)进行连接的关系。因为正在比较连接条件中的列,所以它们必须具有一致的数据类型。


    SELECT语句的FROM子句可以指定以下几种类型的连接
    FROM子句关键字        相应的结果集
    CROSS JOIN        笛卡尔乘积(所有可能的行对)
    INNER JOIN        仅对满足连接条件的CROSS中的列
    LEFT OUTER JOIN        一个表满足条件的行,和另一个表的所有行
    RIGHT OUTER JOIN        与LEFT相同,但两个表的角色互换
    FULL OUTER JOIN        LEFT OUTER 和 RIGHT OUTER中所有行的超集

    2.2 内连接(Inner Join

    内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接。
    下面是ANSI SQL-92标准
    select *
    from  t_institution i
    inner join t_teller t
    on i.inst_no = t.inst_no
    where i.inst_no = "5801"
    其中inner可以省略。
    等价于早期的连接语法
    select *
    from t_institution i, t_teller t
    where i.inst_no = t.inst_no
    and i.inst_no = "5801"

    2.3 外连接

    2.3.1        左外连接(Left Outer Jion)


    select *
    from  t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    其中outer可以省略。

    2.3.2        右外连接(Rigt Outer Jion)


    select *
    from  t_institution i
    right outer join t_teller t
    on i.inst_no = t.inst_no

    2.3.3        全外连接(Full Outer)


    全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。
    在现实生活中,参照完整性约束可以减少对于全外连接的使用,一般情况下左外连接就足够了。在数据库中没有利用清晰、规范的约束来防范错误数据情况下,全外连接就变得非常有用了,你可以使用它来清理数据库中的数据。
    select *
    from  t_institution i
    full outer join t_teller t
    on i.inst_no = t.inst_no

    2.3.4        外连接与条件配合使用

    当在内连接查询中加入条件是,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了。当把条件加入到 join子句时,SQL Server、Informix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到where子句中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响:
    条件在join子句
    select *
    from  t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    and i.inst_no = “5801
    结果是:
    inst_no    inst_name            inst_no    teller_no  teller_name
    5801       天河区               5801       0001       tom
    5801       天河区               5801       0002       david
    5802       越秀区
    5803       白云区
    条件在where子句
    select *
    from  t_institution i
    left outer join t_teller t
    on i.inst_no = t.inst_no
    where i.inst_no = “5801
    结果是:
    inst_no    inst_name            inst_no    teller_no  teller_name
    5801       天河区               5801       0001       tom
    5801       天河区               5801       0002       david

    2.4 自身连接


    自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称作递归关系)中抽取数据。例如人力资源数据库中雇员与老板的关系。
    下面例子是在机构表中查找本机构和上级机构的信息。
    select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
    from t_institution i
    join t_institution s
    on i.superior_inst = s.inst_no

    结果是:
    superior_inst sup_inst_name        inst_no    inst_name
    800           广州市               5801       天河区
    800           广州市               5802       越秀区
    800           广州市               5803       白云区


    2.5 交叉(无限制) 连接


    交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中一的每个行都要与数据集合二中的每一个行分别组成一个新的行。例如,如果第一个数据源中有5个行,而第二个数据源中有4个行,那么在它们之间进行交叉连接就会产生20个行。人们将这种类型的结果集称为笛卡尔乘积。
    大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。
    select *
    from  t_institution i
    cross join t_teller t
    在交叉连接中没有on条件子句

    3 APPENDIX


    3.1 A 参考资料与资源
            《Microsoft SQL Server r2000 Bile》Paul Nielsen
            Paul Nielsen的Web站点r
    [url]www.isnotnull.com[/url]
    3.2 注文章所有SQL在IBM Informix Dynamic Server Version 9.40.TC2E1测试通过


    --

    表A记录如下:
    aID        aNum
    1           a20050111
    2           a20050112
    3           a20050113
    4           a20050114
    5           a20050115

    表B记录如下:
    bID        bName
    1            2006032401
    2           2006032402
    3           2006032403
    4           2006032404
    8           2006032408



    实验如下:
    1.left join

    sql语句如下:
    select * from A
    left join B
    on A.aID = B.bID

    结果如下:
    aID        aNum                   bID           bName
    1            a20050111         1               2006032401
    2
                a20050112         2              2006032402
    3
                a20050113         3              2006032403
    4
                a20050114         4              2006032404
    5
                a20050115         NULL       NULL
    (所影响的行数为 5 行)

    结果说明:
            left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
    换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
    B表记录不足的地方均为NULL.

    2.right join

    sql语句如下:
    select * from A
    right join B
    on A.aID = B.bID

    结果如下:
    aID        aNum                   bID           bName
    1            a20050111         1               2006032401
    2
                a20050112         2              2006032402
    3
                a20050113         3              2006032403
    4
                a20050114         4              2006032404
    NULL    NULL                   8              2006032408
    (所影响的行数为 5 行)

    结果说明:
            仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

    3.inner join

    sql语句如下:
    select * from A
    innerjoin B
    on A.aID = B.bID

    结果如下:
    aID        aNum                   bID           bName
    1            a20050111         1               2006032401
    2
                a20050112         2              2006032402
    3
                a20050113         3              2006032403
    4
                a20050114         4              2006032404

    结果说明:
            很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.


    -----------------[以下为网上的一点资料]------------------
    LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。

    语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2

    说明:table1, table2参数用于指定要将记录组合的表的名称。
    field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
    compopr参数指定关系比较运算符:"=", "<", ">", "<=", ">=" 或 "<>"。
    如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。

     

    展开全文
  • MYSQL 的几种join连接方式

    万次阅读 2016-04-27 15:30:40
    MySQL支持以下JOIN语法。这些语法用于SELECT语句的 table_references 部分和多表DELETE和UPDATE语句: table_references: table_reference [, table_reference] … table_reference: table_factor | join_table

    一、关于JOIN语法【内容来自于mysql手册】

    MySQL支持以下JOIN语法。这些语法用于SELECT语句的 table_references 部分和多表DELETE和UPDATE语句:
    table_references:
    table_reference [, table_reference] …
    table_reference:
    table_factor
    | join_table
    table_factor:
    tbl_name [[AS] alias]
    [{USE|IGNORE|FORCE} INDEX (key_list)]
    | ( table_references )
    | { OJ table_reference LEFT OUTER JOIN table_reference
    ON conditional_expr }
    join_table:
    table_reference [INNER | CROSS] JOIN table_factor [join_condition]
    | table_reference STRAIGHT_JOIN table_factor
    | table_reference STRAIGHT_JOIN table_factor ON condition
    | table_reference LEFT [OUTER] JOIN table_reference join_condition
    | table_reference NATURAL [LEFT [OUTER]] JOIN table_factor
    | table_reference RIGHT [OUTER] JOIN table_reference join_condition
    | table_reference NATURAL [RIGHT [OUTER]] JOIN table_factor
    join_condition:
    ON conditional_expr
    | USING (column_list)


    一个表引用还被称为一个联合表达式。
    与SQL标准相比, table_factor 的语法被扩展了。SQL标准只接受 table_reference ,而不是圆括号内的一系列条
    目。

    在MySQL中,CROSS JOIN从语法上说与INNER JOIN等同(两者可以互相替换。在标准SQL中,两者是不等同的。

    INNER JOIN与ON子句同时使用,CROSS JOIN以其它方式使用。
      USING( column_list )子句用于为一系列的列进行命名。这些列必须同时在两个表中存在。如果表a和表b都包含列

    c1, c2和c3,则以下联合会对比来自两个表的对应的列:
      a LEFT JOIN b USING (c1,c2,c3)
      两个表的NATURAL [LEFT] JOIN被定义为与INNER JOIN语义相同,或与使用USING子句的LEFT JOIN语义相同。

    USING子句用于为同时存在于两个表中的所有列进行命名。
      INNER JOIN和,(逗号)在无联合条件下是语义相同的:两者都可以对指定的表计算出笛卡儿乘积也就是说,第

    一个表中的每一行被联合到第二个表中的每一行)。
      RIGHT JOIN的作用与LEFT JOIN的作用类似。要使代码可以在数据库内移植,建议您使用LEFT JOIN代替RIGHT JOIN。
      STRAIGHT_JOIN与JOIN相同。除了有一点不一样,左表会在右表之前被读取。STRAIGH_JOIN可以被用于这样的

    情况,即联合优化符以错误的顺序排列表。MySQL优化的奇技淫巧之STRAIGHT_JOIN
      您可以提供提示,当从一个表中恢复信息时,MySQL应使用哪个索引。通过指定USE INDEX(key_list),您可以告知

    MySQL只使用一个索引来查找表中的行。另一种语法IGNORE INDEX(key_list)可以被用于告知MySQL不要使用某些

    特定的索引。如果EXPLAIN显示MySQL正在使用来自索引清单中的错误索引时,这些提示会有用处。
      您也可以使用FORCE INDEX,其作用接近USE INDEX(key_list),不过增加了一项作用,一次表扫描被假设为代价

    很高。换句话说,只有当无法使用一个给定的索引来查找表中的行时,才使用表扫描。
      USE KEY、IGNORE KEY和FORCE KEY是USE INDEX、IGNORE INDEX和FORCE INDEX的同义词。
      注释:当MySQL决定如何在表中查找行并决定如何进行联合时,使用USE INDEX、IGNORE INDEX和FORCEINDEX

    只会影响使用哪些索引。当分解一个ORDER BY或GROUP BY时,这些语句不会影响某个索引是否被使用。

    以上,我们从内连接、外连接、自然连接 三个方向来具体学习join的格式和特点。

    二、内连接

    在第一部分,我们了解到在mysql中,inner join...on , join...on , 逗号...where ,cross join...on是一样的含义。但是在

    标准SQL中,它们并不等价。

    三、外链接

    外链接包括left [outer] join 和right [outer] join ,左连接和右连接。

    左连接从左表产生一套完整的记录,与匹配的记录(右表) .如果没有匹配,右侧将包含null。右连接反之。

    在手册中提到RIGHT JOIN的作用与LEFT JOIN的作用类似。要使代码可以在数据库内移植,建议您使用LEFT JOIN

    代替RIGHT JOIN

    四、自然连接

    NATURAL JOIN

    NATURAL [LEFT] JOIN:这个句子的作用相当于INNER JOIN,或者是在USING子句中包含了联结的表中所有公共字段

    的Left JOIN(左联结)。

    五、全连接

    full join

    因为在mysql中并不支持full join ,所以我们用union实现。MySQL Full Join的实现


    CREATE TABLE `pa` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(100) NOT NULL DEFAULT '',
      `price` decimal(10,2) NOT NULL DEFAULT 0.00,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='产品基础信息';


    insert into pa(id,name,price) value(1,'产品A1',12.00),(2,'产品A2',66.55),(3,'产品A3',100);


    CREATE TABLE `pb` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `paid` int(11) NOT NULL ,
      `color` varchar(100) NOT NULL DEFAULT '',
      `size` float(10,2) NOT NULL DEFAULT 0.00,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='产品扩展信息';


    insert into pb(id,paid,color,size) value(1,1,'red',2),(2,1,'green',3),(3,1,'blue',4),(4,2,'red',2),(5,2,'green',3),(6,2,'blue',4);



    内连接:

    select a.id,a.name,a.price,b.color,b.size from pa a inner join pb b on a.id=b.paid;

    select a.id,a.name,a.price,b.color,b.size from pa a cross join pb b on a.id=b.paid;

    select a.id,a.name,a.price,b.color,b.size from pa a join pb b on a.id=b.paid;

    select a.id,a.name,a.price,b.color,b.size from pa a,pb b where a.id=b.paid;

    查询结果

    +----+----------+-------+-------+------+
    | id | name     | price | color | size |
    +----+----------+-------+-------+------+
    |  1 | 产品A1   | 12.00 | red   | 2.00 |
    |  1 | 产品A1   | 12.00 | green | 3.00 |
    |  1 | 产品A1   | 12.00 | blue  | 4.00 |
    |  2 | 产品A2   | 66.55 | red   | 2.00 |
    |  2 | 产品A2   | 66.55 | green | 3.00 |
    |  2 | 产品A2   | 66.55 | blue  | 4.00 |
    +----+----------+-------+-------+------+


    左连接:

    select a.id,a.name,a.price,b.color,b.size from pa a left join pb b on a.id=b.paid;

    +----+----------+--------+-------+------+
    | id | name     | price  | color | size |
    +----+----------+--------+-------+------+
    |  1 | 产品A1   |  12.00 | red   | 2.00 |
    |  1 | 产品A1   |  12.00 | green | 3.00 |
    |  1 | 产品A1   |  12.00 | blue  | 4.00 |
    |  2 | 产品A2   |  66.55 | red   | 2.00 |
    |  2 | 产品A2   |  66.55 | green | 3.00 |
    |  2 | 产品A2   |  66.55 | blue  | 4.00 |
    |  3 | 产品A3   | 100.00 | NULL  | NULL |
    +----+----------+--------+-------+------+

    右连接:

    select a.id,a.name,a.price,b.color,b.size from pa a right join pb b on a.id=b.paid;

    +------+----------+-------+-------+------+
    | id   | name     | price | color | size |
    +------+----------+-------+-------+------+
    |    1 | 产品A1   | 12.00 | red   | 2.00 |
    |    1 | 产品A1   | 12.00 | green | 3.00 |
    |    1 | 产品A1   | 12.00 | blue  | 4.00 |
    |    2 | 产品A2   | 66.55 | red   | 2.00 |
    |    2 | 产品A2   | 66.55 | green | 3.00 |
    |    2 | 产品A2   | 66.55 | blue  | 4.00 |
    +------+----------+-------+-------+------+

    自然连接:

    select a.id,a.name,a.price,b.color,b.size from pa a natural join pb b;

    +----+----------+--------+-------+------+
    | id | name     | price  | color | size |
    +----+----------+--------+-------+------+
    |  1 | 产品A1   |  12.00 | red   | 2.00 |
    |  2 | 产品A2   |  66.55 | green | 3.00 |
    |  3 | 产品A3   | 100.00 | blue  | 4.00 |
    +----+----------+--------+-------+------+


    以上几个例子,我们会有两个疑问:

    1.为什么做链接会有null项?

    2.自然连接怎么和其他几个出来的行数不一致?


    第一个疑问:因为左连接的含义是以左表为基准,根据左表中的信息去查右表,右表没有,记为null,有则写入,当右表在左表的条件下有多个数据时,分别列出。

    第二个疑问:使用 NATURAL JOIN 时,MySQL 将表中具有相同名称的字段自动进行记录匹配,而这些同名字段类型可以不同。因此,NATURAL JOIN 不用指定匹配条件,不能指定匹配条件,加‘on’会报错。




    强烈推荐阅读:

    MySQL STRAIGHT_JOIN 与 NATURAL JOIN

    mysql的join使用

    Mysql Join语法解析与性能分析

    展开全文
  • Java语言主流数据库连接池对比与开发配置实战

    万次阅读 多人点赞 2017-03-27 16:08:59
    Java主流开源数据库连接池Druid 、TomcatJDBC 、DBCP 、C3P0、BoneCP性能,功能比较分析,Spring集成配置和JNDI配置方式
  • 怎么建立socket长连接???

    千次阅读 2012-03-15 22:34:34
    http://bbs.chinaunix.net/thread-709365-1-1.html     ... 通俗的说连接后不关就是长连接,呵呵.  给你举个例子,作上网的代理:proxy  client proxy server  比如c要访问sohu的server  p把s所有的
  • 无论连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:    Select p1.pub_id,p2.pub_id,p1.pr_info  FROM pub_info AS p1 INNER JOIN pub_info AS p2  ON ...
  • SQL表连接的几种方式

    千次阅读 2012-10-05 19:13:40
    一、关系代数 合并数据集合的理论基础是...关系代数包含以下8个关系运算符 1. 选取:返回满足指定条件的行。 2. 投影:从数据集合中返回指定的列。 3. 笛卡尔积:是关系的乘法,它将分别来自两个数据集合中的行
  • AVL树 红黑树 size balance tree 伸展树 Treap 最简单的旋转 带子树旋转 代码实现 AVL Tree 前言 二叉搜索树 AVL Tree 旋转 旋转总结 单向右旋平衡处理LL: 单向左旋平衡处理RR: 双向旋转(先后右)平衡处理LR: ...
  • MySQL索引——最前端

    千次阅读 2019-01-29 14:45:12
    由上可见,因为phone未提供,所以查询只用到了索引的第一列,而后面的create_date虽然也在索引中,但是由于phone不存在而无法和前缀连接,因此需要对结果进行扫描过滤create_date。 如果想让create_date也使用...
  • Hololens作为新一代全息移动设备,你在使用Hololens时,旁边的那些吃瓜...HoloLens上的有一个Web Server,通过PC的浏览器来连接到它,在设备控制台页面进行拍照、录像,显示第一视角、安装卸载APP、查看系统性能等 。
  • 网络是怎样连接的学习笔记(一)

    千次阅读 2017-09-11 15:56:03
    除此之外还需要完成另一工作,那就是将根域的DNS服务器信息保存在互联网中所有的DNS服务器中。这样一来,任何DNS服务器就都可以找到并访问根域DNS服务器了。 因此,客户端只要能够找到任意一台DNS服务器,就可以...
  • 一、连接MySQL  格式: mysql -h 主机地址 -u 用户名 -p 用户密码  1、例1:连接到本机上的MYSQL。  首先在打开DOS窗口,然后进入目录 mysql bin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装...
  • 嵌套,合并,哈希 连接原理

    千次阅读 2009-05-19 13:43:00
    在刚建立好测试环境的时候,是没有任何匹配的,这时候, TOP 1 会扫描两个表的所有数据,运行“ 速度测试脚本 ”可以看到此时有无 TOP 1 的效率差异: TOP 1 明显比不加 TOP 慢 2.   修改“ 测试数据的变更...
  • 超硬核!数据结构学霸笔记,考试面试吹牛就靠它

    万次阅读 多人点赞 2021-03-26 11:11:21
    注意事项: 声明一个引用,同时必须初始化,及声明它代表一个变量。(作为函数参数时不需要初始化) 在声明一个引用后,不能再作为另一变量的引用。 3。不能建立引用数组。 1.2函数调用: 其实还是通过函数来理解...
  • 一篇讲偏树的好文章~

    千次阅读 2016-08-07 21:43:34
    传送门:... 二、偏树的定义和性质.......................................................................................... 2 2.1 优先队列,可并堆.....................
  • 偏树的特点及其应用(转)

    千次阅读 2011-09-04 22:06:48
    二、偏树的定义和性质.......................................................................................... 2 2.1 优先队列,可并堆.......................
  • 牛逼!Java 从入门到精通,超全汇总版

    万次阅读 多人点赞 2021-05-06 19:40:33
    另外,每当面试的时候简历上填个精通 offer 的家伙我就觉得很搞笑,没有几个熬得过开出门拐的命运。但是我认为,如果市面上这些资料、书籍你都啃的差不多,你能在所有的 Java 程序员中跻身前 0.1% 的话,你就可以...
  • 此外,本文还提出了一种验证PLC逻辑执行、性能和SCADA连接的方法,并将OpenPLC在Modbus注入攻击下的行为与其他四种流行的商用PLC进行了比较,以支持OpenPLC是PLC网络安全研究的有效平台的说法。 一.介绍 封闭的工业...
  • 深入理解“用于中文闲聊的GPT2模型”项目论文部分提炼DIALOGPT : Large-Scale Generative Pre-trainingfor Conversational Response Generation摘要介绍数据集方法模型结构 本文为对于GPT2 for Chinese chitchat...
  • 代理对象执行目标方法,得到目标方法的拦截器链,利用拦截器的链式机制,依次进入每一个拦截器进行执行 AOP应用场景 日志记录 事务管理 线程池关闭等 AOP使用种动态代理? 当bean的是实现中存在接口或者是Proxy的...
  • C++项目添加依赖

    千次阅读 2017-03-28 10:54:04
     项目类型确定将显示以下哪一组: “程序集”组,包含“框架”和“扩展”子组。 “解决方案”组,包含“项目”子组。 “Windows”组,包含“核心”和“扩展”子组。 可以使用 对象浏览器 ...
  • 这可能是关于 TCP 和 UDP 最好的一篇文章!!

    千次阅读 多人点赞 2021-04-26 09:43:57
    文章目录前言运输层概述TCP 和 UDP 前置知识套接字套接字类型套接字处理过程聊聊 IP端口号确定端口号多路复用和多路分解无连接的多路复用和多路分解面向连接的多路复用与多路分解UDPUDP 特点UDP 报文结构TCPTCP 报文...
  • Altium Designer -- 精心总结

    万次阅读 多人点赞 2016-08-13 15:28:46
    首先打开一个PCB文档,之后依次选择DXP >> Customize,在Command中修改以下几个命令的快捷方式: Next Layer:切换到下一层。默认快捷方式是小键盘的+号(Plus) Next Signal Layer:切换到下一可布线的层。默认快捷...
  • 写给 python 程序员的 OpenGL 教程

    万次阅读 多人点赞 2019-01-26 08:47:24
    OpenGL 是 Open Graphics Library 的简写,意为“开放式图形库”,是用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口(API)。OpenGL 不是一个独立的平台,因此,它需要借助于一种编程语言才能被使用。...
  • 手把手教你写专利申请书/如何申请专利

    万次阅读 多人点赞 2008-12-10 10:46:00
    根据侵权判定中的“全面覆盖原则”,如该权利要求中写了五,人家只侵犯你其中四,不算侵权,所以,要写得越精越好,而不是越多越好。   7、除外观专利外,发明和实用新型专利中的附图必须为黑色,不能为灰度...
  • 对不起,学会这些 Linux 知识后,我有点飘

    万次阅读 多人点赞 2020-10-10 07:18:49
    UNIX 是一个交互式系统,用于同时处理多进程和多用户同时在线。为什么要说 UNIX,那是因为 Linux 是由 UNIX 发展而来的,UNIX 是由程序员设计,它的主要服务对象也是程序员。Linux 继承了 UNIX 的设计目标。从智能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,236
精华内容 16,094
关键字:

以下哪项用于左连接