SQL高级连接查询—内连接,外连接

通常我们不得不从两个或更多的表中选取数据使查询结果更完整。这时便需要使用连接查询(join)。

数据库中的表通过关键字相互关联。主键是所有列中拥有唯一值列。每一个主键值必须是表中唯一,
目的是为了把数跨不同表的数据,在不重复资源的情况下绑定在一起。

下面的”Employees”表中,”Employee_ID”是主键,意味着没有任何两条记录会有相同的Employee_ID值。
它能区别当两个人名字相同时的记录。

看以下实例注意:

  • “Employee_ID” 列是”Employees”表主键
  • “Prod_ID” 列是”Orders”表主键
  • 在”Orders”表中,”Employee_ID”列作为外键存在而省去”Employees”中使用名字表达某个人。
    Employee_ID    Name                          Name Product Hansen, Ola Printer Svendson, Stephen Table Svendson, Stephen Chair

    Example

    查询定购产品名为”Printer”的人名

    SELECT Employees.Name FROM Employees, Orders
    WHERE Employees.Employee_ID=Orders.Employee_ID
    AND Orders.Product='Printer'

    Result
    Name
    Hansen, Ola

    使用连接查询
    或者我们可以使用连接关键字从两张表中取数据,像这样:

    Example INNER JOIN(内连接)

    语法

    SELECT field1, field2, field3
    FROM first_table
    INNER JOIN second_table
    ON first_table.keyfield = second_table.foreign_keyfield

    查询所有拥有订单的人的姓名,以及订单所定的产品名

    SELECT Employees.Name, Orders.Product
    FROM Employees
    INNER JOIN Orders
    ON Employees.Employee_ID=Orders.Employee_ID

    内连接从两个表中返回所有满足条件的列。如果在Employees表中有记录不符合Orders表,
    则这些记录不会被列出。

    Result
    Name
    Product
    Hansen, Ola
    Printer
    Svendson, Stephen
    Table
    Svendson, Stephen
    Chair

    Example LEFT JOIN(左连接)

    语法

    SELECT field1, field2, field3
    FROM first_table
    LEFT JOIN second_table
    ON first_table.keyfield = second_table.foreign_keyfield

    列出所有Employees表中有订单的人的姓名,产品

    SELECT Employees.Name, Orders.Product
    FROM Employees
    LEFT JOIN Orders
    ON Employees.Employee_ID=Orders.Employee_ID

    左连接返回第一个表(Employees)中所有,即使在Orders表中没有符合条件的记录。
    如果Employees表中的记录在Orders表中没有符合条件的话,这些记录也会被列出。

    Result
    Name Product
    Hansen, Ola Printer
    Svendson, Tove Svendson, Stephen
    Table

    Svendson, Stephen Chair Pettersen, Kari

    Example RIGHT JOIN(右连接)

    语法

  • SELECT field1, field2, field3
    FROM first_table
    RIGHT JOIN second_table
    ON first_table.keyfield = second_table.foreign_keyfield

    列出所有订单及订单所属人的人名

  • SELECT Employees.Name, Orders.Product
    FROM Employees
    RIGHT JOIN Orders
    ON Employees.Employee_ID=Orders.Employee_ID

    右连接返回第二个表(Orders)中所有,即使在第一个表Employees中没有符合条件的记录。
    如果Orders表中存在不匹配Employees表的记录,这些记录也会被列出来。

    Result
    NameProduct
    Hansen, Ola Printer
    Svendson, Stephen Table
    Svendson, Stephen Chair

    Example

    查询定购产品名为”Printer”的人名

    SELECT Employees.Name
    FROM Employees
    INNER JOIN Orders
    ON Employees.Employee_ID=Orders.Employee_ID
    WHERE Orders.Product = ‘Printer’

    Result
    Name
    Hansen, Ola
    转自: http://blog.csdn.net/celine_q/archive/2007/08/13/1741279.aspx

  • 发表评论

    返回顶部