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) 等.