sql数据库表连接,主要分为:内连接、外连接(左连接、右连接 、全连接)、交叉连接,整理了一下,看看他们的区别。

  首先建两张表:

  1.   学生表:student(id,姓名,年龄,性别 )
  2.   成绩表:score(id,学生id,成绩)
--学生表
CREATE TABLE student(
	id INT,
	姓名 NVARCHAR(20),
	年龄 INT,
	性别 NVARCHAR(4)
)
--成绩表		
CREATE TABLE score(
	id INT,
	学生id INT,
	成绩 INT
)


   插入数据部分

INSERT INTO student VALUES(1,N'黄顺发',25,N'男')
INSERT INTO student VALUES(2,N'黄小红',20,N'女')
INSERT INTO student VALUES(3,N'黄小明',24,N'男')

INSERT INTO score VALUES(1,1,100)
INSERT INTO score VALUES(2,2,99)
INSERT INTO score VALUES(3,3,95)

  一、内连接(INNER JOIN……ON)

SELECT 
	student.* ,Score.* 
FROM student 
INNER JOIN Score ON student.id = Score.学生id

  关系如下图:

  总结:INNER JOIN取两表的交集。



二、外连接
  外连接包括 左连接、右连接、全连接  (LEFT|RIGHT | FUNN OUTER JOIN ……ON),其中OUTER可以省略

 (1)左连接(left join ……on)

SELECT 
	student.* ,Score.* 
FROM student 
LEFT JOIN Score ON student.id = Score.学生id


  关系如下图:

  总结:LEFT JOIN 以左表为准,查询出左表的所有数据,右表中有对应的则显示出来,没有对应的则显示为null.

  注:A LEFT JOIN B ON与  A,B WHERE有相同效果,如下:


SELECT student.* ,Score.* FROM student INNER JOIN Score ON student.id = Score.学生id
SELECT student.* ,Score.* FROM student,Score WHERE student.id = Score.学生id

(2)右连接(RIGHT JOIN ……ON)


SELECT 
	student.* ,Score.* 
FROM student 
RIGHT JOIN Score ON student.id = Score.学生id


关系如下图:

  总结:RIGHT JOIN 以右表为准,查询出右表的所有数据,左表中有对应的则显示出来,没有对应的则显示为null.

(3)全连接(FULL JOIN ……ON)


SELECT 
	student.* ,Score.* 
FROM student 
FULL JOIN Score ON student.id = Score.学生id


总结:FULL JOIN 是为LEFT和RIGHT的集合,某表中某一行在另一表中无匹配行,则相应列的内容为NULL。

 三、交叉连接(CROSS JOIN),注意没有ON条件


SELECT 
	student.* ,Score.* 
FROM student 
CROSS  JOIN Score


叉联接也称作笛卡尔积。相当于两个表中的所有行进行排列组合。

若表a有X行,表b有Y行,则将返回XY行记录。