美文网首页
【MySQL笔记】4 子查询与创建联结

【MySQL笔记】4 子查询与创建联结

作者: shawn233 | 来源:发表于2018-02-24 14:31 被阅读0次

    MySQL笔记基于教材,笔记中用到的数据库可以点击该链接下载

    子查询 Subquery

    • 在多张表间查询相关的信息时,可以将SELECT语句嵌套起来用;
    • 子查询经常与WHERE子句里的IN一起使用;
    • 列必须匹配:在WHERE子句中使用子查询,应保证SELECT语句和WHERE语句有相同数目的列。通常WHERE使用单个列,而SELECT也返回单个列。
    查询购买了产品号(prod_id)为TNT2的产品的顾客信息
    
    SELECT cust_name, cust_contact
    FROM customers
    WHERE cust_id IN (SELECT cust_id
                      FROM orders
                      WHERE order_num IN (SELECT order_num
                                          FROM orderitems
                                          WHERE prod_id = 'TNT2'));
    

    也可以将子查询用在计算字段里,则每一行都会执行一次子查询

    查询每个客户的订单数
    
    SELECT cust_name, cust_state, 
           (SELECT COUNT(*)
            FROM orders
            WHERE orders.cust_id = customers.cust_id) AS orders
    FROM customers
    ORDER BY cust_name;
    

    联结 Join

    Terminology

    • 外键 (foreign key):外键为某个表中一列,它包含另外一个表的主键值,定义了两个表之间的关系。
    • 可伸缩性 (scale):能够适应不断增加的工作量而不失效。设计良好的数据库或应用程序称之为可伸缩型好 (scale well)。
    • 关系数据库将相关的数据分多个表存储,用各表的主键联系。这样的数据库维护方便,处理灵活。因此关系数据库的可伸缩性要远优于非关系数据库。

    Application

    在MySQL中可以通过WHERE子句联结两个或更多表。在FROM子句中给出要联结的所有表,在WHERE子句中建立联结的关系。

    查找所有供应商生产的所有产品
    
    SELECT vend_name, prod_name, prod_price #列vend_name来自vendors, 后两列来自products
    FROM vendors, products #联结了表vendors和表products
    WHERE vendors.vend_id = products.vend_id #关系是两个表中行的vend_id相同
    ORDER BY vend_name, prod_name;
    

    上述联结由特定列的相等关系来联结行。这种联结被称为"等值联结" (equijoin)。它基于两个表之间的相等测试。这种联结也称为"内部联结"。

    实际上,这种联结有专门的语法。

    SELECT vend_name, prod_name, prod_price
    FROM vendors INNER JOIN products #在FROM子句中用INNER JOIN指明联结类型
    ON vendors.vend_id = products.vend_id #在下一行用ON建立联结
    

    也可以多个表联结。只要把关系在WHERE子句中写清楚就可以。


    MySQL系列笔记


    相关文章

      网友评论

          本文标题:【MySQL笔记】4 子查询与创建联结

          本文链接:https://www.haomeiwen.com/subject/aopqxftx.html