1.
a.并集UNIONSELECTcolumn1,column2FROMtable1UNIONSELECTcolumn1,column2FROMtable2
b.交集JOINSELECT*FROMtable1ASaJOINtable2bONa.name=b.name
c.差集NOTINSELECT*FROMtable1WHEREnameNOTIN(SELECTnameFROMtable2)
d.笛卡尔积SELECT*FROMtable1CROSSJOINtable2与SELECT*FROMtable1,table2相同
2.
SQL中的UNION与UNIONALL的区别是,前者会去除重复的条目,后者会仍旧保留。
a.UNIONSQLStatement1UNIONSQLStatement2
b.UNIONALLSQLStatement1UNIONALLSQLStatement2
3.
SQL中的各种JOINSQL中的连接可以分为内连接,外连接,以及交叉连接(即是笛卡尔积)
a.交叉连接CROSSJOIN如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;举例SELECT*FROMtable1CROSSJOINtable2等同于SELECT*FROMtable1,table2一般不建议使用该方法,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。因此,如果两个需要求交际的表太大,将会非常非常慢,不建议使用。
b.内连接INNERJOIN如果仅仅使用SELECT*FROMtable1INNERJOINtable2没有指定连接条件的话,和交叉连接的结果一样。但是通常情况下,使用INNERJOIN需要指定连接条件。--等值连接(=号应用于连接条件,不会去除重复的列)
SELECT*FROMtable1ASaINNERJOINtable2ASbona.column=b.column--不等连接(>,>=,<,<=,!>,!<,<>)
例如SELECT*FROMtable1ASaINNERJOINtable2ASbona.column<>b.column--自然连接(会去除重复的列)
c.外连接OUTERJOIN首先内连接和外连接的不同之处:内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。指定条件的内连接,仅仅返回符合连接条件的条目。外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时),右表(右连接时)或者两边连接(全外连接时)的所有数据行。
1)左外连接LEFT[OUTER]JOIN显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL
例如SELECT*FROMtable1ASaLEFT[OUTER]JOINONa.column=b.column
2)右外连接RIGHT[OUTER]JOIN显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL
例如SELECT*FROMtable1ASaRIGHT[OUTER]JOINONa.column=b.column
3)全外连接显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL