sql数据库表连接,主要分为:内连接、外连接(左连接、右连接 、全连接)、交叉连接,整理了一下,看看他们的区别。
首先建两张表:
- 学生表:student(id,姓名,年龄,性别 )
- 成绩表: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行记录。