zoukankan      html  css  js  c++  java
  • SQL内连接-外连接join,left join,right join,full join

    1、创建测试表test1及test2

    SQL> CREATE TABLE TEST1(ID NUMBER,NAME VARCHAR2(20));
    表已创建。
    
    SQL> create table test2(id number, country varchar2(10));
    表已创建。
    INSERT INTO TEST1 VALUES(1,'name1');
    INSERT INTO TEST1 VALUES(2,'name2');
    INSERT INTO TEST1 VALUES(3,'name3');
    INSERT INTO TEST1 VALUES(4,'name4');
    INSERT INTO TEST1 VALUES(5,'name5');
    
    SQL> select * from test1;
            ID NAME
    ---------- --------------------
             1 name1
             2 name2
             3 name3
             4 name4
             5 name5
    
    INSERT INTO TEST2 VALUES(1,'China');
    INSERT INTO TEST2 VALUES(2,'Japan');
    INSERT INTO TEST2 VALUES(3,'USA');
    
    SQL> SELECT * FROM TEST2;
            ID COUNTRY
    ---------- ----------
             1 China
             2 Japan
             3 USA

    2、笛卡尔积,即交叉连接cross join列出两张表中所有组合的值。

    SQL> insert into test2 values(10,'Hongkong');
    SQL> select * from test1 right join test2 on test1.id=test2.id;
    
            ID NAME                         ID COUNTRY
    ---------- -------------------- ---------- ----------
             1 name1                         1 China
             2 name2                         2 Japan
             3 name3                         3 USA
                                            10 Hongkong
    SQL> select * from test1, test2;--不加连接条件时,默认使用交叉连接。
    
            ID NAME                         ID COUNTRY
    ---------- -------------------- ---------- ----------
             1 name1                         1 China
             2 name2                         1 China
             3 name3                         1 China
             4 name4                         1 China
             5 name5                         1 China
             1 name1                         2 Japan
             2 name2                         2 Japan
             3 name3                         2 Japan
             4 name4                         2 Japan
             5 name5                         2 Japan
             1 name1                         3 USA
             2 name2                         3 USA
             3 name3                         3 USA
             4 name4                         3 USA
             5 name5                         3 USA
             1 name1                        10 Hongkong
             2 name2                        10 Hongkong
             3 name3                        10 Hongkong
             4 name4                        10 Hongkong
             5 name5                        10 Hongkong
    
    已选择20行。
    
    SQL> select * from test1 cross join test2;---跟上面语句执行结果一样。
    
            ID NAME                         ID COUNTRY
    ---------- -------------------- ---------- ----------
             1 name1                         1 China
             2 name2                         1 China
             3 name3                         1 China
             4 name4                         1 China
             5 name5                         1 China
             1 name1                         2 Japan
             2 name2                         2 Japan
             3 name3                         2 Japan
             4 name4                         2 Japan
             5 name5                         2 Japan
             1 name1                         3 USA
             2 name2                         3 USA
             3 name3                         3 USA
             4 name4                         3 USA
             5 name5                         3 USA
             1 name1                        10 Hongkong
             2 name2                        10 Hongkong
             3 name3                        10 Hongkong
             4 name4                        10 Hongkong
             5 name5                        10 Hongkong
    
    已选择20行。
    SQL> select * from test1, test2 where test1.id=test2.id;
    
            ID NAME                         ID COUNTRY
    ---------- -------------------- ---------- ----------
             1 name1                         1 China
             2 name2                         2 Japan
             3 name3                         3 USA
    SQL> select * from test1 cross join test2 on test1.id=test2.id; --当使用关键字corss join时,不能使用on 来加条件。只能使用where.....
    select * from test1 cross join test2 on test1.id=test2.id
                                         *1 行出现错误:
    ORA-00933: SQL 命令未正确结束
    SQL> select * from test1 cross join test2 where test1.id=test2.id;
    
            ID NAME                         ID COUNTRY
    ---------- -------------------- ---------- ----------
             1 name1                         1 China
             2 name2                         2 Japan
             3 name3                         3 USA

    3、内连接join即inner join. 

    SQL> select * from test1 join test2 on test1.id= test2.id;
    
            ID NAME                         ID COUNTRY
    ---------- -------------------- ---------- ----------
             1 name1                         1 China
             2 name2                         2 Japan
             3 name3                         3 USA
    
    SQL> select * from test1 inner join test2 on test1.id=test2.id;
    
            ID NAME                         ID COUNTRY
    ---------- -------------------- ---------- ----------
             1 name1                         1 China
             2 name2                         2 Japan
             3 name3                         3 USA

    4、左连接(外连接包括左外连接、右外连接及全连接,而左外连接及右外连接简称左连接和右连接,即outer可省略不与

    SQL> select * from test1 left outer join test2 on test1.id=test2.id;
    
            ID NAME                         ID COUNTRY
    ---------- -------------------- ---------- ----------
             1 name1                         1 China
             2 name2                         2 Japan
             3 name3                         3 USA
             5 name5
             4 name4
    
    SQL> select * from test1 left join test2 on test1.id=test2.id;
    
            ID NAME                         ID COUNTRY
    ---------- -------------------- ---------- ----------
             1 name1                         1 China
             2 name2                         2 Japan
             3 name3                         3 USA
             5 name5
             4 name4

    5、右连接

    SQL> select * from test1 right join test2 on test1.id=test2.id;
    
            ID NAME                         ID COUNTRY
    ---------- -------------------- ---------- ----------
             1 name1                         1 China
             2 name2                         2 Japan
             3 name3                         3 USA
                                            10 Hongkong
    
    SQL>

    6、全连接

    SQL> select * from test1 full join test2 on test1.id=test2.id;
    
            ID NAME                         ID COUNTRY
    ---------- -------------------- ---------- ----------
             1 name1                         1 China
             2 name2                         2 Japan
             3 name3                         3 USA
             4 name4
             5 name5
                                            10 Hongkong
    
    已选择6行。
    
    SQL>

    总结:

    其实总的连接查询也就6种:交叉连接、内连接、外连接(左连接,右连接,全连接)、自连接
    交叉连接:
    SELECT * FROM TEST1,TEST2;取迪卡尔积。
    SELECT * FROM TEST1,TEST2 WHERE TEST1.ID=TEST2.ID; //默认就是交叉连接
    SELECT * FROM TEST1 CROSS JOIN TEST2 WHERE TEST1.ID=TEST2.ID; // WHERE不能换成ON

    内连接:
    内连接取的是两个表的公共部分。INNER JOIN 跟JOIN一样,必须要有关键字ON加上条件。而不能像交叉连接一样取迪卡尔积。
    SELECT * FROM TEST1 JOIN TEST2 ON TEST1.ID=TEST2.ID;
    SELECT * FROM TEST1 INNER JOIN TEST2 ON TEST1.ID=TEST2.ID; //两个语句执行结果一致。INNER可省略。
    SELECT * FROM TEST1,TEST2 WHERE TEST1.ID=TEST2.ID;//交叉连接,取出满足条件的迪卡尔积。跟上面两个语句执行结果一样。

    外连接:
    外连接可省略outer:
    LEFT JOIN: 以左表为主,即使右表中没有匹配,也从左表返回所有的行。相当于左表显示全部,右表没有的显示为空。
    RIGHT JOIN:以右表为主, 即使左表中没有匹配,也从右表返回所有的行。右表显示全部,左表没有的显示为空。
    FULL JOIN: 只要其中一个表中存在匹配,就返回行。相当于两张表都显示全部值,哪一个表没有对应的值则显示为空。

    自连接:
    自连接就是同一个表自己与自己进行连接。可以简单理解为两张表内容完全一样,表名不一样进行连接。
    SQL> select * from dept,dept;
    select * from dept,dept
    ORA-00918: column ambiguously defined

    SQL> select * from dept d1,dept d2;

    http://www.nowamagic.net/librarys/veda/detail/936

  • 相关阅读:
    SIP头域说明
    android.os.NetworkOnMainThreadException异常
    "Only the original thread that created a view hierarchy can touch its views"引发的思考_Handler的使用
    sip命令与音视频rtp通话完整流程分析
    在Windows下搭建Android开发环境(摘自百度经验)
    jquery dialog 打开的时候自动聚焦解决方法
    对于数组(字符串)slice方法的总结
    SWIFT语言中的泛型编程 【GENERIC】【PART 2】
    手动调用playground的XCPCaptureValue展示Swift过程数据
    Swift语言相关资源贴
  • 原文地址:https://www.cnblogs.com/rusking/p/4052450.html
Copyright © 2011-2022 走看看