zoukankan      html  css  js  c++  java
  • MySQL ------ 高级联结 (自联结,自然联结,外联结,带聚合函数的联结)(十五)

    One、表别名

    好处:

      1、别名除了可以用于列名和计算字段也可以用于给表起别名。

      2、使用表别名可以缩短SQL语句,可以在单条select 语句中多次使用相同的表,就是表别名的作用范围在此条语句中

    select cust_name,cust_contact from customers as c,orders as o,orderitems as oi  
      where c.cust_id = o.cust_id and oi.order_num = o.order_num and prod_id = 'TNT2';

     注意:表别名不仅可以用于where 子句,还可以用于select 的表、order by 子句以及其他部分,但是,表别名只是在查询中使用,与列别名不一样,表别名不能返回到客户机。

    Two、不同类型的联结

    主要有四种联结: 内部联结(也叫等值联结)、自联结、自然联结、和外部联结

    1、自联结 

    自联结通常作为外部语句用来替代从相同表检索数据时使用的子查询语句,虽然最终结果时相同的,但是有时候处理联结远比处理子查询快的多。

    -- 根据产品id 找这个产品的供应商后将这个供应商下的所有产品列出
    select p1.prod_id,p1.prod_name,p1.vend_id from products as p1,products as p2
      where p1.vend_id = p2.vend_id and p2.prod_id = 'fb';

    使用表别名可以在单条select 语句中不只一次的引用相同的表

     在此查询中使用的表是相同的,如果不起个别名,对表 products的引用就会具有二义性,导致mysql 知道引用他们中哪一个,然后懵逼出错,

    主要的过程就是 where通过匹配p1 中的vend_id 和匹配p2 中的vend_id将两个表联结起来,按照第二表中的条件过滤数据,返回需要的数据,

    当然使用子查询也可以

    -- 根据产品id 找这个产品的供应商后将这个供应商下的所有产品列出
     select prod_id,prod_name,vend_id from products where vend_id =(select vend_id from products where prod_id ='fb');

    2、自然联结:排除多次出现,使每个列值返回一次。

    无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列),标准的联结(内部联结)返回所有的数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。

    --  内部联结   由重复列出现
    select c.*,o.*,oi.prod_id,oi.item_price from   customers as c,orders as o,orderitems as oi where c.cust_id = o.cust_id  and oi.order_num = o.order_num and prod_id ='fb'; 
    
    
    -- 自然联结  
     select c.*,o.order_num,o.order_date,oi.prod_id,oi.item_price from
     customers as c,orders as o,orderitems as oi where
      c.cust_id = o.cust_id  and oi.order_num = o.order_num and prod_id ='fb';

     内部联结包含自然联结,检索出来的所有列中没有重复的内部联结就是自然联结,不过内部联结关键字 inner join 常用于两个表中

     3、外部联结

     外部联结:联结中包含了那些在相关表中没有关联的行,主要分为左外联结和右外联结两种形式,

    -- 左外联结
    select c.cust_id,o.order_num from customers as c left outer join orders as o on c.cust_id = o.cust_id;
    
    -- 右外联结
    select c.cust_id,o.order_num from customers as c right outer join orders as o on c.cust_id = o.cust_id;

    用到的两个表

     内部联结是只把符合  c.cust_id = o.cust_id  的列出来

     注意:

      1、外部联结只有两种基本的形式,左外和右外,二者之前的唯一区别就是所关联表的顺序不同,所以也可以通过颠倒from 或where 子句中表的顺序将左外部联结转换右外部联结。

      2、Mysql 不支持简化字符 *= 和 =* 的使用,但是这两种操作符在其他的 DBMS 中很流行

    Three、使用带聚集函数的联结

     虽然聚合函数一般都是在单表中用来汇总数据,但是可以和联结结合使用

    简单实验一下

    -- 与内部联结和使用   计算cust_num 出现的次数
    select c.cust_id,o.order_date,count(o.order_num) as count_num  from customers as c inner join orders as o on c.cust_id = o.cust_id    group by c.cust_id order by o.order_date;

     

    -- 与左外联结结合使用
    select c.cust_id,o.order_date,count(o.order_num) as count_num  from   
        customers as c left outer join orders as o on c.cust_id = o.cust_id
            group by c.cust_id order by o.order_date;

    使用联结和联结条件的注意事项

    1、注意所使用的联结类型,一般使用内部联结,但使用外部联结也是有效的

    2、保证使用正确的联结条件,否则返回不正确的数据

    3、应该总是提供联结条件,否则会得出笛卡尔积

    4、在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型.虽然是合法的,一般也很有用,但应该在一起测试他们前,分别测试每个联结,这样使故障排除更为简单。

  • 相关阅读:
    04:求整数的和与均值
    03:均值
    02:财务管理
    C8-3 三角形还是长方形? (100/100 分数)
    C8-2 圆的周长和面积 (100/100 分数)
    C8-1 复数加减乘除 (100/100 分数)
    C7-3 用类实现a+b (100/100 分数)
    C7-2 多继承 (100/100 分数)
    C7-1 账户类(100/100)
    数组第k小数
  • 原文地址:https://www.cnblogs.com/obge/p/12990266.html
Copyright © 2011-2022 走看看