内连接、外连接[左连接、右连接、全连接]、交叉连接、自连接
记得有一次面试官问我sql有哪些连接,我比较常用左连接,内连接用的很少。只记得这两种连接。
其实那时侯就在实际运用中,写过一些业务逻辑较复杂的存储过程了。但是,毕竟是在被人刷掉的面试中,难免会有些介怀。
下面我们创建两个表做连接结果测试,来说明各种连接的特性![本篇内容只考虑等值连接]
连接操作的共性:第一步均为将所有参与操作的表进行了一个笛卡尔积,然后才依据各连接条件进行记录筛选。
CREATE TABLE table_1
(
id INT IDENTITY(1,1) PRIMARY KEY,
name VARCHAR(50),
classid INT
)
GO
INSERT INTO table_1(name,classid) SELECT '苹果',1
UNION ALL SELECT '香蕉',1
UNION ALL SELECT '草莓',1
UNION ALL SELECT '西瓜',1
UNION ALL SELECT '樱桃',1
UNION ALL SELECT '荔枝',1
UNION ALL SELECT '芒果',1
UNION ALL SELECT '木瓜',1 --table_2没有此项
UNION ALL SELECT '香梨',1 --table_2没有此项
GO
CREATE TABLE table_2
(
id INT IDENTITY(1,1) PRIMARY KEY,
name VARCHAR(50),
classid INT
)
GO
INSERT INTO table_2(name,classid) SELECT '苹果',1
UNION ALL SELECT '香蕉',1
UNION ALL SELECT '草莓',1
UNION ALL SELECT '西瓜',1
UNION ALL SELECT '樱桃',1
UNION ALL SELECT '荔枝',1
UNION ALL SELECT '芒果',1
UNION ALL SELECT '龙眼',1 --table_1没有此项
UNION ALL SELECT '芭乐',1 --table_1没有此项
UNION ALL SELECT '榴莲',1 --table_1没有此项
GO
SELECT a.*,b.* FROM table_1 a,table_2 b WHERE a.[name]=b.[name] --写法一
?SELECT a.*,b.* FROM table_1 a JOIN table_2 b ON a.[name]=b.[name] --写法二
SELECT a.*,b.* FROM table_1 a INNER JOIN table_2 b ON a.[name]=b.[name] --写法三
SELECT a.*,b.* FROM table_1 a LEFT JOIN table_2 b ON a.[name]=b.[name] --左连接写法一
SELECT a.*,b.* FROM table_1 a LEFT OUTER JOIN table_2 b ON a.[name]=b.[name] --左连接写法二
SELECT a.*,b.* FROM table_1 a RIGHT JOIN table_2 b ON a.[name]=b.[name] --右连接写法一
SELECT a.*,b.* FROM table_1 a RIGHT OUTER JOIN table_2 b ON a.[name]=b.[name] --右连接写法二
SELECT * FROM table_1 a RIGHT JOIN table_2 b ON a.[name]=b.[name] --全连接写法一
SELECT a.*,b.* FROM table_1 a RIGHT OUTER JOIN table_2 b ON a.[name]=b.[name] --全连接写法二
SELECT a.*,b.* FROM table_1 a CROSS JOIN table_2 b --交叉连接
SELECT a.*,b.* FROM table_1 a,table_2 b --内连接
--因为都是用笛卡尔积运算,所以结果一致。
SELECT a.*,b.* FROM table_1 a,table_1 b WHERE a.[name]=b.[name] --连接的两表是同一个表,别称不一样
SELECT a.*,b.* FROM table_1 a LEFT JOIN table_1 b ON a.[name]=b.[name] --左连接写法
--......
?