zoukankan      html  css  js  c++  java
  • sql多表连接查询

    表连接就是通过关联多张表,从而检索出须要的数据的方法,以下我们通过代码演示样例来学习一下sql的表连接用法

    实际的项目。存在多张表的关联关系。

    不可能在一张表里面就能检索出全部数据。

    假设没有表连接的话,那么我们就须要许多的操作。比方须要从A表找出限制性的条件来从B表中检索数据。不但须要分多表来操作,并且效率也不高。

    比方书中的样例:

    复制代码代码例如以下:

    SELECT FId
    FROM T_Customer
    WHERE FName='MIKE'

    这个SQL语句返回2,也就是姓名为MIKE 的客户的FId值为2,这样就能够到T_Order中检索FCustomerId等于2 的记录:

    复制代码代码例如以下:

    SELECT FNumber,FPrice
    FROM T_Order
    WHERE FCustomerId=2

    以下我们具体来看看表连接。表连接有多种不同的类型,有交叉连接(CROSS JOIN)、内连接(INNER JOIN)、外连接(OUTTER JOIN)。

    (1)内连接(INNER JOIN):内连接组合两张表,而且仅仅获取满足两表连接条件的数据。

    复制代码代码例如以下:

    SELECT o.FId,o.FNumber,o.FPrice,
    c.FId,c.FName,c .FAge
    FROM T_Order o JOIN T_Customer c
    ON o.FCustomerId= c.FId

    注:在大多数数据库系统中,INNER JOIN中的INNER是可选的。INNER JOIN 是默认的连接方式。

    在使用表连接的时候能够不局限于仅仅连接两张表,由于有非常多情况下须要联系很多表。

    比如,T_Order表同一时候还须要连接T_Customer和T_OrderType两张表才干检索到所须要的信息,编写例如以下SQL语句就可以:

    复制代码代码例如以下:

    SELECT o.FId,o.FNumber,o.FPrice,
    c.FId,c.FName,c .FAge
    FROM T_Order o JOIN T_Customer c
    ON o.FCustomerId= c.FId
    INNER JOIN T_OrderType
    ON T_Order.FTypeId= T_OrderType.FId

    (2)交叉连接(CROSS JOIN):交叉连接全部涉及的表中的全部记录都包括在结果集中。能够採用两种方式来定义交叉连接,各自是隐式和显式的连接。

    以下看看隐式的样例:

    复制代码代码例如以下:

    SELECT T_Customer.FId, T_Customer.FName, T_Customer.FAge,
    T_Order.FId, T_Order.FNumber, T_Order.FPrice
    FROM T_Customer, T_Order

    使用显式的连接则须要使用CROSS JOIN。样例例如以下:

    复制代码代码例如以下:

    SELECT T_Customer.FId, T_Customer.FName, T_Customer.FAge,
    T_Order.FId, T_Order.FNumber, T_Order.FPrice
    FROM T_Customer
    CROSS JOIN T_Order

    (3)外连接(OUTTER JOIN):内部连接仅仅获取满足连接条件的数据。而对于外部连接来说,主要是解决这种一种场景。

    满足条件的数据检索出来。这个没有疑问,外部连接还会检索还有一部分数据,那就是将不满足条件的数据以NULL来填充。先来看一下外连接的分类:左外部连接(LEFT OUTER JOIN)、右外部连接(RIGHT OUTER JOIN)和全外部连接(FULLOUTER JOIN)。

    I、左外部连接(LEFT OUTER JOIN):前头也说了,将不满足条件的数据以NULL来填充。那么详细是哪些须要以NULL来填充呢,对于左外连接来说的话,连接条件其中,假设出现满足条件的左表的数据在右表中没有对应匹配时,须要把对应的右表字段填充NULL值。也就是说左外部连接的主体是左表,右表来配合。

    复制代码代码例如以下:

    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    LEFT OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId

    注:假设使用左外部连接的话,通过where语句能过滤当中不符合的数据

    复制代码代码例如以下:

    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    LEFT OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId
    WHERE o.FPrice>=150

    II、右外部连接(RIGHT OUTER JOIN):右外部连接与左外连部接相反,将会被填充NULL值的是左表的字段。也就是说右外部连接的主体是右表,左表来配合。

    复制代码代码例如以下:

    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    RIGHT OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId

    注:同左外连接一样,能够使用where语句进行过滤

    III、全外部连接(FULLOUTER JOIN):全外部连接是左外部连接和右外部连接的合集。也就是既包含左外部连接的结果集,也包含右外部连接的结果集。

    复制代码代码例如以下:

    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    FULL OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId

    其结果相当于:

    复制代码代码例如以下:

    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    LEFT OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId
    UNION
    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    RIGHT OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId
    =======================================================================================

    多表查询的多种sql写法:(以下是从两个表里查询<也能够看成从三个表里查询>,显示表v_goods里的全部字段,显示admin2表里的name字段作为加入人。显示表admin2表的name字段作为操作人)  多个表的查询都可依照以下三个例句进行编写sql
                            
    SELECT v.*,(SELECT a.name FROM admin2 a WHERE a.adminId=v.loadInId) AS aname,(SELECT a.name FROM admin2 a WHERE a.adminId=v.operatorId) AS uname FROM v_goods v  where 1=1;
     
    SELECT v.*,a.name  aname,b.name uname FROM v_goods v,admin2 a,admin2 b WHERE a.adminId=v.loadInId AND b.adminId=v.operatorId ;

    SELECT v.*,a.name  aname,b.name uname FROM v_goods v LEFT JOIN admin2 a ON a.adminId=v.loadInId LEFT JOIN admin2 b ON b.adminId=v.operatorId ;

  • 相关阅读:
    HDU1106 排序
    HDU2050 折线分割平面
    HDU2048 神、上帝以及老天爷
    POJ1836 Alignment
    POJ1182 食物链
    HDU2067 小兔的棋盘
    HTML中的ID不能以数字开头
    automake,autoconf使用详解
    How to install Samba server on Ubuntu 12.04
    Netbeans使用UTF-8编码
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6978457.html
Copyright © 2011-2022 走看看