sql必知必会学习记录(十二)- 联结表

青旅半醒 2022-03-10 17:29 296阅读 0赞

sql必知必会学习记录(十二)- 联结表

  1. 联结

    • 等值联结(内部联结)

    SELECT

    1. vend_name,
    2. prod_name,
    3. prod_price

    FROM

    1. vendors,
    2. products

    WHERE

    1. vendors.vend_id = products.vend_id

    ORDER BY

    1. vend_name,
    2. prod_name

笛卡儿积(cartesian product):由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。又称为叉联结。

  • 内部联结

    SELECT

    1. vend_name,
    2. prod_name,
    3. prod_price

    FROM

    1. vendors

    INNER JOIN products ON vendors.vend_id = products.vend_id

SQL规范首选INNER JOIN语法。

  • 联结多个表

    SELECT

    1. prod_name,
    2. vend_name,
    3. prod_price,
    4. quantity

    FROM

    1. orderitems,
    2. products,
    3. vendors

    WHERE

    1. products.vend_id = vendors.vend_id

    AND orderitems.prod_id = products.prod_id
    AND order_num = 20005

性能考虑 MySQL在运行时关联指定的每个表以处理联结。这种处理可能是非常耗费资源的,因此应该仔细,不要联结不必要的表。联结的表越多,性能下降越厉害。

  1. 创建高级联结

    • 自联结

    //使用子查询来完成查询
    SELECT prod_id,prod_name FROM products WHERE vend_id=(SELECT vend_id FROM products WHERE prod_id=’DTNTR’);

    //使用自联结查询
    SELECT p1. prod_id, pl. prod_name FROM products AS p1, products AS p2 WHERE p1. vend_id=p2. vend_id AND p2. prod_id=’ DTNTR’;

用自联结而不用子查询.自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句.虽然最终的结果是相同的,但有时候处理联结远比处理子查询快得多.应该试一下两种方法,以确定哪一种的性能更好.

  • 使用表别名

    SELECT

    1. CONCAT(
    2. RTRIM(vend_name),
    3. ' (',
    4. RTRIM(vend_country),
    5. ')'
    6. ) AS vend_title

    FROM

    1. vendors

    ORDER BY

    1. vend_name;
  • 使用不同类型的联结

    内联结

    SELECT

    1. customers.cust_id,
    2. orders.order_num

    FROM

    1. customers

    INNER JOIN orders ON customers.cust_id = orders.cust_id

外联结

  1. SELECT
  2. customers.cust_id,
  3. orders.order_num
  4. FROM
  5. customers
  6. LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id

上面这条条SELECT语句使用了关键字OUTER JOIN来指定联结的类型(而不是在WHERE子句中指定)。但是,与内部联结关联两个表中的行不同的是,外部联结还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。上面的例子使用LEFT OUTER JOIN从FROM子句的左边表(customers表)中选择所有行。为了从右边的表中选择所有行,应该使用RIGHT OUTER JOIN。

外部联结的类型存在两种基本的外部联结形式:左外部联结和右外部联结。它们之间的唯一差别是所关联的表的顺序不同。换句话说,左外部联结可通过颠倒FROM或WHERE子句中表的顺序转换为右外部联结。因此,两种类型的外部联结可互换使用,而究竟使用哪一种纯粹是根据方便而定。

带聚集函数的联结

  1. SELECT
  2. customers.cust_name,
  3. customers.cust_id,
  4. COUNT(orders.order_num) AS num_ord
  5. FROM
  6. customers
  7. INNER JOIN orders ON customers.cust_id = orders.cust_id
  8. GROUP BY
  9. customers.cust_id;
  10. SELECT
  11. customers.cust_name,
  12. customers.cust_id,
  13. COUNT(orders.order_num) AS num_ord
  14. FROM
  15. customers
  16. LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id
  17. GROUP BY
  18. customers.cust_id

发表评论

表情:
评论列表 (有 0 条评论,296人围观)

还没有评论,来说两句吧...

相关阅读