网摘自:https://www.bilibili.com/read/cv11976343 1.区分笛卡儿积,自然连接,等值连接,内连接,外连接(左连接,右连接和全连接) 假设存在两张表R和S,这里使用的是MySQL数据库。 下面这张表是R 下面这张是S 为了测试左连接和右连接,现在增加一张表T,字段和S表的字段一样,只是数据不一样。 1)笛卡儿积 那么R和S的笛卡儿积 SQL语句如下: select * from R,S;或select * from R cross join S; 结果如下: 笛卡儿积cross join 象征着返回所有的情况。 2)自然连接 连接是由笛卡儿积和选择操作组合而成,进行连接操作的表必须要有相同的字段,否则进行连接操作就没有意义了。(这里并不是要求两张表里都有相同名称的字段,而是要求两个表单都有一个字段表达的是一个意思,如学生表S有一个S#字段,用来唯一标识一个学生,而成绩表SC里有一个字段SC#,它是用来标识指定学生的成绩的)。”natrual join 自然连接”的处理方式:先进行笛卡儿积操作,然后重复的属性只保留一份。如R和S进行自然连接,R和S都存在属性B,所以进行自然连接后结果只包和属性A,B,C。 自然连接的步骤是将第一张表的第一条记录和第二张表的每一条记录匹配,如果符合条件就组成一条记录,然后第一张表的第二条记录再和第二张表的每一条记录匹配,这步骤一直循环到第一张表的最后一条记录。 R和S的自然连接 SQL语句如下: select R.A,R.B,S.C from R,S where R.B = S.B;或select * from R natural join S; 结果如下: 3)等值连接 其实等值连接就是内连接。 4)内连接 “inner join 内连接”的处理方式:虽然重复,但两份都保留。如R和S进行内连接,R和S都存在属性B,进行内连接后结果包含属性A,R.B,S.B,C。内连接的结果和自然连接的结果是一样的,只不过是显示的属性不一样而已。内连接会将两张表的重复属性都分别列出来。 R和S的内连接 SQL语句如下: select * from R,S where R.B=S.B;或select * from R inner join S on R.B=S.B; 结果如下: 5)左连接 left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。左(外)连接,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。其实就是将右边的表的第一项根据条件分别和左边的每一行数据进行对比,如果符合条件,就拼成一条记录。 SQL语句如下: select * from R left join S on R.B=S.B; 结果如下: 这个或许不太能体现,下面再看一下表R和T的左连接结果, SQL语句如下: select * from R left join T on R.B=T.B; 条件不想等就补null。 结果如下: 6)右连接 right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。与左(外)连接相反,右(外)连接,左表只会显示符合搜索条件的记录,而右表的记录将会全部表示出来。左表记录不足的地方均为NULL。 右连接的匹配步骤是先将左边的表的第一项根据条件分别和右边的每一行数据进行对比,如果符合条件,就拼成一条记录。 SQL语句如下: select * from R right join S on R.B=S.B; 结果如下: 下面再看一下表R和T的右连接结果, SQL语句如下: select * from R right join T on R.B=T.B; 结果如下: 7)全连接 全连接也是属于外连接的一种。但是MySQL里没有全连接的关键字。但是可以通过union来实现。 注意: UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。 UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。 下面看一下表R和T的右连接结果, SQL语句如下: (select * from R left join T on R.B=T.B) union (select * from R right join T on R.B=T.B); 结果如下: ![]() |
|
来自: 新用户2585iHOb > 《Java》