zoukankan      html  css  js  c++  java
  • SQL中的连接

    Join 连接 (SQL Join)

    SQL Join (连接) 是利用不同数据表之间字段的关连性来结合多数据表之检索。

    SQL Join是结合多个数据表而组成一抽象的暂时性数据表以供数据查询,在原各数据表中之纪录及结构皆不会因此连接查询而改变。


    这是一个客户数据表「customers」:

    C_Id

    Name

    City

    Address

    Phone

    1

    张一

    台北市

    XX100

    02-12345678

    2

    王二

    新竹县

    YY200

    03-12345678

    3

    李三

    高雄县

    ZZ300

    07-12345678


    而这是产品订单的数据表「orders」:

    O_Id

    OrderNo

    C_Id

    1

    2572

    3

    2

    7375

    3

    3

    7520

    1

    4

    1054

    1

    5

    1257

    5


    其中,C_Id 是客户数据表中的主键 (Primary Key) 字段,我们怎么将这两张不同的数据表依相关字段来作个连接结合以便查询呢?这就是接下来的主题 Join

    SQL Join 查询有哪几种类型哩?

    • Inner Join : 内部连接
    • LEFT (OUTER) JOIN : 左外部连接
    • RIGHT (OUTER) JOIN : 右外部连接
    • FULL (OUTER) JOIN : 全部外部连接
    • CROSS JOIN : 交叉连接
    • NATURAL JOIN : 自然连接

     

    INNER JOIN 内部连接

    INNER JOIN (内部连接) 为等值连接,必需指定等值连接的条件,而查询结果只会返回符合连接条件的数据。

    INNER JOIN 语法 (SQL INNER JOIN Syntax)

    SELECT table_column1, table_column2···
    FROM table_name1
    INNER JOIN table_name2
    ON table_name1.column_name=table_name2.column_name;

    SELECT table_column1, table_column2···
    FROM table_name1
    INNER JOIN table_name2
    USING (column_name);

    INNER JOIN 查询实例 (Example)

    现在我们想列出所有客户的订单编号数据,我们可以作一个 INNER JOIN 查询:

    SELECT customers.Name, orders.Order_No
    FROM customers
    INNER JOIN orders
    ON customers.C_Id=orders.C_Id;

    其中用点号连接之「XXX.YYY」表示XXX数据表中的YYY字段。


    查询结果如下:

    Name

    Order_No

    李三

    2572

    李三

    7375

    张一

    7520

    张一

    1054

     

    查询结果只会返回符合连接条件的数据!

     

     

    LEFT JOIN 左外部连接

    LEFT JOIN 可以用来建立左外部连接,查询的 SQL 叙述句 LEFT JOIN 左侧数据表 (table_name1) 的所有记录都会加入到查询结果中,即使右侧数据表 (table_name2) 中的连接字段没有符合的值也一样

    LEFT JOIN 语法 (SQL LEFT JOIN Syntax)

    SELECT table_column1, table_column2···
    FROM table_name1
    LEFT JOIN table_name2
    ON table_name1.column_name=table_name2.column_name;

    有些数据库的语法会是LEFT OUTER JOIN。

    LEFT JOIN 查询实例 (Example)

    现在我们想查询所有客户与其订单状况的数据,我们可以作一个 LEFT JOIN 查询:

    SELECT customers.Name, orders.Order_No
    FROM customers
    LEFT JOIN orders
    ON customers.C_Id=orders.C_Id;


    查询结果如下:

    Name

    Order_No

    张一

    7520

    张一

    1054

    王二

     

    李三

    2572

    李三

    7375

     

    LEFT JOIN会返回左侧数据表中所有数据列,就算没有符合连接条件,而右侧数据表中如果没有匹配的数据值就会显示为「NULL」。

     

     

    RIGHT JOIN 右外部连接

    相对于LEFT JOINRIGHT JOIN 可以用来建立右外部连接,查询的 SQL 叙述句 RIGHT JOIN 右侧数据表 (table_name2) 的所有记录都会加入到查询结果中,即使左侧数据表 (table_name2) 中的连接字段没有符合的值也一样

    RIGHT JOIN 语法 (SQL RIGHT JOIN Syntax)

    SELECT table_column1, table_column2···
    FROM table_name1
    RIGHT JOIN table_name2
    ON table_name1.column_name=table_name2.column_name;

    有些数据库的语法会是RIGHT OUTER JOIN。

    RIGHT JOIN 查询实例 (Example)

    现在我们想查询所有订单与相应的客户之资料,我们可以作一个 RIGHT JOIN 查询:

    SELECT customers.Name, orders.Order_No
    FROM customers
    RIGHT JOIN orders
    ON customers.C_Id=orders.C_Id;


    查询结果如下:

    Name

    Order_No

    李三

    2572

    李三

    7375

    张一

    7520

    张一

    1054

     

    1257

     

    RIGHT JOIN会返回右侧数据表中所有数据列,就算是没有符合连接条件,而左侧数据表中如果没有匹配的数据值就会显示为「NULL」。

     

     

    FULL JOIN 全部外部连接

    FULL JOIN 即为 LEFT JOIN  RIGHT JOIN 的联集,它会返回左右数据表中所有的纪录,不论是否符合连接条件。

    FULL JOIN 语法 (SQL FULL JOIN Syntax)

    SELECT table_column1, table_column2···
    FROM table_name1
    FULL JOIN table_name2
    ON table_name1.column_name=table_name2.column_name;

    FULL JOIN 查询实例 (Example)

    我们来作一个 FULL JOIN 查询:

    SELECT customers.Name, orders.Order_No
    FROM customers
    FULL JOIN orders
    ON customers.C_Id=orders.C_Id;


    查询结果如下:

    Name

    Order_No

    李三

    2572

    李三

    7375

    张一

    7520

    张一

    1054

     

    1257

    王二

     

     

    MySQL数据库中没有FULL JOIN,但是您可以用UNION来模拟。

     

     

    CROSS JOIN 交叉连接

    交叉连接为两个数据表间的笛卡儿乘积 (Cartesian product),两个数据表在结合时,不指定任何条件,即将两个数据表中所有的可能排列组合出来,以下例而言 CROSS JOIN 出来的结果资料列数为 3×5=15 笔,因此,当有WHEREONUSING条件时不建议使用。

    CROSS JOIN 语法 (SQL CROSS JOIN Syntax)

    SELECT table_column1, table_column2···
    FROM table_name1
    CROSS JOIN table_name2;

    SELECT table_column1, table_column2···
    FROM table_name1, table_name2;

    SELECT table_column1, table_column2···
    FROM table_name1
    JOIN table_name2;

    FULL JOIN 查询实例 (Example)

    这是一个客户数据表「customers」:

    C_Id

    Name

    City

    Address

    Phone

    1

    张一

    台北市

    XX100

    02-12345678

    2

    王二

    新竹县

    YY200

    03-12345678

    3

    李三

    高雄县

    ZZ300

    07-12345678


    而这是产品订单的数据表「orders」:

    O_Id

    Order_No

    C_Id

    1

    2572

    3

    2

    7375

    3

    3

    7520

    1

    4

    1054

    1

    5

    1257

    5


    我们来作一个 CROSS JOIN 查询:

    SELECT customers.Name, orders.Order_No
    FROM customers
    CROSS JOIN orders;


    查询结果如下:

    Name

    Order_No

    张一

    2572

    王二

    2572

    李三

    2572

    张一

    7375

    王二

    7375

    李三

    7375

    张一

    7520

    王二

    7520

    李三

    7520

    张一

    1054

    王二

    1054

    李三

    1054

    张一

    1257

    王二

    1257

    李三

    1257

     

     

    NATURAL JOIN 自然连接

    自然连接有 NATURAL JOINNATURAL LEFT JOINNATURAL RIGHT JOIN,两个表格在进行 JOIN 时,加上 NATURAL 这个关键词之后,两数据表之间同名的字段会被自动结合在一起

    NATURAL JOIN 语法 (SQL NATURAL JOIN Syntax)

    SELECT table_column1, table_column2···
    FROM table_name1
    NATURAL JOIN table_name2;

    NATURAL JOIN 查询实例 (Example)

    这是一个客户数据表「customers」:

    C_Id

    Name

    City

    Address

    Phone

    1

    张一

    台北市

    XX100

    02-12345678

    2

    王二

    新竹县

    YY200

    03-12345678

    3

    李三

    高雄县

    ZZ300

    07-12345678


    而这是产品订单的数据表「orders」:

    O_Id

    Order_No

    C_Id

    1

    2572

    3

    2

    7375

    3

    3

    7520

    1

    4

    1054

    1

    5

    1257

    5


    现在我们想列出所有客户的订单编号数据,我们可以作一个 NATURAL JOIN 查询:

    SELECT customers.Name, orders.Order_No
    FROM customers
    NATURAL JOIN orders;


    查询结果如下:

    Name

    Order_No

    李三

    2572

    李三

    7375

    张一

    7520

    张一

    1054

     

    注意到了吗?返回结果同等于下面这个INNER JOIN查询:

    SELECT customers.Name, orders.Order_No
    FROM customers
    INNER JOIN orders
    ON customers.C_Id=orders.C_Id;

     

    原文地址:http://webdesign.kerthis.com/sql/sql_join

  • 相关阅读:
    1.2 文本域(含可编辑表格实现)
    JS手册目录
    1.1 文本框
    JS传中文到后台需要的处理
    java基础和面向对象面试题_01
    try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
    java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
    java基础学习_IO流04_用户登录注册案例(IO版)、数据操作流(操作基本数据类型的流)、内存操作流、打印流、标准输入输出流、随机访问流、合并流、序列化流(对象操作流)、Properties属性集合类、NIO(新IO)_day22总结
    思想:java中,父类的方法中传入的形参的数据类型是泛型,子类的方法的形参想只要一种确定的数据类型,子类该如何做呢?
    几种后端开发技术的选型调研
  • 原文地址:https://www.cnblogs.com/TianFang/p/2730111.html
Copyright © 2011-2022 走看看