集合运算&联结

1.集合运算

集合运算:对满足同一规则的记录进行的加减等运算,常用的有交、并、差

• 并集- – -UNION

    SELECT * FROM product
    UNION
    SELECT * FROM product2;

① 集合运算符会除去重复的记录;在集合运算符中使用 ALL 选项,可以保留重复行

• 交集- – -INTERSECT

    SELECT * FROM product
    INTERSECT
    SELECT * FROM product2;

① MySQL 暂时不支持 INTERSECT 运算符

• 差集- – -EXCEPT

    SELECT * FROM product
    INTERSECT
    SELECT * FROM product2;

① 只有 Oracle 不使用 EXCEPT,而是使用其特有的 MINUS 运算符. 此外,MySQL 还不支持 EXCEPT,因此也无法使用.

一定要使用不同数据类型的列时,可以使用类型转换函数 CAST

2.联结

联结(JOIN)就是将其他表中的列添加过来,进行“添加列”的集合运算。UNION 是以行(纵向)为单位进行操作,而联结则是以列(横向)为单位进行的。

内联结—INNER JOIN

内联结:对左表中的每一条记录, 与右表中所有记录进行匹配: 匹配必须是某条件在左表中与右表中相同最终才会保留结果, 否则不保留.

    -- INNER JOIN 可省略为JOIN
    SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name,
           P.sale_price
        FROM ShopProduct AS SP INNER JOIN Product AS P
          ON SP.product_id = P.product_id;
  • FROM 子句
    使用关键字 INNER JOIN 可以将两张表联结在一起.SP 和 P 分别是这两张表的别名,但别名并不是
    必需的. 在 SELECT 子句中直接使用 ShopProduct 和 product_id 这样的表的原名也没有关系,但由于
    表名太长会影响 SQL 语句的可读性,因此建议使用别名.
  • ON 子句
    可以在 ON 之后指定两张表联结所使用的列(联结键),本例中使用的是商品编号(product_id). 也
    就是说,ON 是专门用来指定联结条件的,它能起到与 WHERE 相同的作用. 需要指定多个键时,同
    样可以使用 AND、OR. 在进行内联结时 ON 子句是必不可少的(如果没有 ON 会发生错误),并且
    ON 必须书写在 FROM 和 WHERE 之间.
外联结- – -OUTER JOIN

外联结:返回主表中所有的行,当主表和另一个表中有匹配的行时,进行合并,否则另一个表中对应的
列用 NULL 填充.

    SELECT SP.shop_id,SP.shop_name,SP.product_id, P.product_name,
           P.sale_price
        FROM shopproduct AS SP RIGHT JOIN product AS P
          ON SP.product_id=P.product_id;

注:指定主表的关键字是 LEFT (左表为主表) 和 RIGHT(右表为主表).

交叉联结- – -CROSS JOIN

交叉联结是对两张表中的全部记录进行交叉组合,因此结果中的记录数通常是两张表中行数的乘积

    SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name
        FROM ShopProduct AS SP CROSS JOIN Product AS P;

① 交叉联结是所有联结的基础.
② 内联结是交叉联结的一部分,“内”也可以理解为“包含在交叉联结结果中的部分”. 相反,外联结
的“外”可以理解为“交叉联结结果之外的部分”.

其他联结
-- 等值联结
    SELECT SP.shop_id, SP.shop_name, SP.product_id,
           P.product_name,P.sale_price
        FROM ShopProduct SP, Product P
          WHERE SP.product_id = P.product_id
            AND SP.shop_id = ’000A’;

等值联结和内联结的效果一样,但是实际应用中建议使用内联结。这是因为等值联结在查询时会将
两个表先进行笛卡尔乘积运算,生成一个新表格,存储在电脑内存中,当数据量很大时,很耗内存,
效率较低;内联结在查询时会将两个表根据共同 ID(联结键/匹配条件) 进行逐条匹配,不会出现笛卡
尔乘积的现象,效率比较高.
此外,不同的 RDMBS 还有许多不同的联结,如自然联结 (NATURAL JOIN)、全联结 (FULL JOIN) 等.

参考文献:《SQL基础教程》等
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇