少壮不努力,老大徒伤悲sql
工做大半辈子了,来到个陌生的过分,从零开始,像个应届毕业生同样投入茫茫人才市场,碰的满头包。数据库
凡是涉及到sql server的都会问,join的问题,不烦记录下:ui
SQL的join有五种方式:3d
1.INNER JOIN or JOINserver
2.OUTER JOINblog
2.1 LEFT OUTER JOIN or LEFT JOINget
2.2 RIGHT OUTER JOIN or RIGHT JOINit
2.3 FULL OUTER JOIN or FULL JOINtable
3.NATURAL JOINclass
4.CROSS JOIN
5.SELF JOIN
两种链接条件:
1.Equi JOIN
1.1 NATURAL
1.2 USING(a,b)
1.3= ...
2.Theta JOIN
2.1>=
2.2<=
2.3> ...
PS:USING(...)指定须要哪些列相等。ON则能够指定任意的链接条件(=,>=,<=,!=,>,<...)123456789101112
3. JOIN or INNER JOIN
返回两个表中同时知足条件的元组对,不知足的将被丢弃。
4. OUTER JOIN
4.1. LEFT OUTER JOIN
返回左表全部行以及右表知足条件的行,左表有值右表无值填充为null
4.2 RIGHT OUTER JOIN
返回右表全部行以及左表知足条件的行,右表有值左表无值填充为null
4.3 FULL OUTER JOIN
返回全部表的全部行,在知足条件的行以外,左表知足右表不知足或者相反,均填充null
5. NATURAL JOIN
一、来自两个关系的元组对在共同属性上的值相同。(不限于一个共同属性,也能够是多个共同属性) 二、去掉重复的属性(列)。 三、列出属性的顺序:先是共同属性,而后是第一个关系的属性,最后是第二个关系的属性。
为了防止两个表有多个共同属性时natural join 会忽略部分须要的元组对,应使用join…using(…),以指定须要哪些列相等 join…using(…)链接只能局限在指定的属性上
6. CROSS JOIN
返回笛卡儿积
7. SELF JOIN
至关于A JOIN A
附录:
SQL中的链接能够分为内链接,外链接,以及交叉链接 。
1. 交叉链接CROSS JOIN
若是不带WHERE条件子句,它将会返回被链接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;
举例,下列A、B、C 执行结果相同,可是效率不同:
A:SELECT * FROM table1 CROSS JOIN table2
B:SELECT * FROM table1,table2
C:select * from table1 a inner join table2 b
A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 a cross join table2 b where a.id=b.id (注:cross join后加条件只能用where,不能用on)
C:select * from table1 a inner join table2 b on a.id=b.id
通常不建议使用方法A和B,由于若是有WHERE子句的话,每每会先生成两个表行数乘积的行的数据表而后才根据WHERE条件从中选择。
所以,若是两个须要求交际的表太大,将会很是很是慢,不建议使用。
2. 内链接INNER JOIN
两边表同时符合条件的组合
若是仅仅使用
SELECT * FROM table1 INNER JOIN table2
内链接若是没有指定链接条件的话,和笛卡尔积的交叉链接结果同样,可是不一样于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内链接的效率要高于笛卡尔积的交叉链接。
可是一般状况下,使用INNER JOIN须要指定链接条件。
***************关于等值链接和天然链接
等值链接(=号应用于链接条件, 不会去除重复的列)
天然链接(会去除重复的列)
数据库的链接运算都是天然链接,由于不容许有重复的行(元组)存在。
例如:
SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column
3. 外链接OUTER JOIN
指定条件的内链接,仅仅返回符合链接条件的条目。
外链接则不一样,返回的结果不只包含符合链接条件的行,并且包括左表(左外链接时), 右表(右链接时)或者两边链接(全外链接时)的全部数据行。
1)左外链接LEFT [OUTER] JOIN
显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL
例如
SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column
2)右外链接RIGHT [OUTER] JOIN
显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL
例如
SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column
3)全外链接full [outer] join
显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左链接、右链接和内链接的并集