• SQL之连接表


    SQL最强大的功能之一就是能够使用联结(join)表。
    看个实际例子。假设我们有一个产品信息表,主要包括产品ID,供应商ID,价格等信息,还有一个供应商表,主要包括供应商ID,供应商地址,联系方式等。那么为啥要把供应商信息单独放一个表呢?

    优点如下:
    1.同一供应商生产的每个产品,其供应商信息是相同的,在产品信息表中重复记录这些信息浪费空间和时间;
    2. 假设供应商信息变动,比如电话等,只需要在供应商表中修改相应的一次就够了;
    3. 不重复使得数据一致性好,出错概率小。

    SELECT联结表如下:

    select vend_name,prod_name
    from vendors,products
    where vendors.vend_id=products.vend_id;
    
    • 1
    • 2
    • 3

    注意,vend_name,prod_name来自两个不同的表,所以from需要两个表。where子句很重要,使结果只包含给定条件的行。没有where条件,第一个表的每一行将与第二个表每一行配对,称为笛卡尔积,也就是说,表1有M行,表2有N行,最终结果为M*N行,这显然不符合我们的预期。
    而where条件是隐含在语义中的,我们要查询一件产品的名字及其供应商名字,而两个表公有的属性是供应商的ID,因此需要通过这个来配对,不需要别的供应商的名字。

    上面这种联结也叫内联结或等值联结。
    等同于下面的语法

    select vend_name,prod_name
    from vendors INNER JOIN products
    ON vendors.vend_id=products.vend_id;
    
    • 1
    • 2
    • 3

    当然可以联结多个表,表越多,性能越差。

    并且,表也可以使用别名,主要是为了缩短SQL语句,如下

    select vend_name,prod_name
    from vendors AS V INNER JOIN products AS P
    ON V.vend_id=P.vend_id;
    
    • 1
    • 2
    • 3

    但是,表别名只用于查询,不返回客户端,这和列别名有区别,
    并且,别名可以帮助同一个表逻辑上查询为两个表。用自联结代替子查询。

    自然连接(Natural join)是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。

    外连接分为三种:左外连接,右外连接,全外连接。对应SQL:LEFT/RIGHT/FULL OUTER JOIN。
    左连接LEFT JOIN的含义就是求两个表A表和B表的交集外加左表剩下的数据。依旧从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表A表中剩余的记录。
    其他的类似。

  • 相关阅读:
    山西电力市场日前价格预测【2023-11-11】
    iOS描述文件(.mobileprovision)一键申请
    正点原子LORA模块ATK-01固件升级与断电不丢失设置参数
    阿里P8大牛带你深入理解SpringCloud微服务构建文档
    互联网产品经理的月薪是多少?治好奇!
    SVN 服务器建立
    5G网络用户面时延测量
    iPhone开机密码什么时候会用到?忘记了怎么办?
    SCI论文高效写作:Citespace、vosviewer和R语言在文献调研与论文撰写中的应用
    vba 保存word里面的图片_1分钟批量处理100张图片,有Word在
  • 原文地址:https://blog.csdn.net/weixin_53344209/article/details/127439225