join 连接运算详细:
连接运算包括外连接、内连接、交叉连接。其中
1.外连接包括左向-外联接(left outer join或 left join)、右向-外联接(right outer join或right join)、完整-外联接 (full outer join或 full join)
2.内连接即内部连接(inner join 或 join)
3.交叉连接(cross join )
准备测试数据:
按以下结构创建一个用户表: b_users
SQL> desc b_users;
Name Type Nullable Default Comments
----- ----------- -------- ------- --------
UNO NUMBER 用户编号
UNAME VARCHAR2(8) Y 用户名
USEX CHAR(4) Y 性别
数据如下:
SQL> select * from b_users;
UNO UNAME USEX
---------- -------- ----
20050002 王静 女
20050004 雁南飞 女
20050006 上官燕 女
200215122 刘晨晨 女
200215124 张立立 男
200215121 李勇勇 男
按以下结构创建一个学生表: a_students
SQL> desc a_students;
Name Type Nullable Default Comments
----- ------------ -------- ------- --------
SNO NUMBER 学号
SNAME VARCHAR2(8) Y 姓名
SEX CHAR(4) Y 性别
SAGE NUMBER Y 年龄
SDEPT VARCHAR2(10) Y 所在系
数据数据如下:
SQL> select * from a_students;
SNO SNAME SEX SAGE SDEPT
---------- -------- ---- ---------- ----------
200215121 李勇 男 20 CS
200215122 刘晨 女 19 CS
200215123 王敏 女 18 MA
200215124 张立 男 19 IS
1.1我们来说说外连接------
要求以左向外连接的方式查询两表中具有相同编号的元组,执行结果如下:
SQL> select * from b_users bu left join a_students stu on bu.uno=stu.sno;
UNO UNAME USEX SNO SNAME SEX SAGE SDEPT
---------- -------- ---- ---------- -------- ---- ---------- ----------
200215121 李勇勇 男 200215121 李勇 男 20 CS
200215122 刘晨晨 女 200215122 刘晨 女 19 CS
200215124 张立立 男 200215124 张立 男 19 IS
20050002 王静 女
20050006 上官燕 女
20050004 雁南飞 女
6 rows selected
调换两个表的位置,执行结果如下;
SQL> select * from a_students stu left join b_users bu on bu.uno=stu.sno;
SNO SNAME SEX SAGE SDEPT UNO UNAME USEX
---------- -------- ---- ---------- ---------- ---------- -------- ----
200215121 李勇 男 20 CS 200215121 李勇勇 男
200215122 刘晨 女 19 CS 200215122 刘晨晨 女
200215123 王敏 女 18 MA
200215124 张立 男 19 IS 200215124 张立立 男
可见,left join 的结果集包括在left join 左边的表的所有行,与连接表联接列所匹配的行。如果左边表的某行在右边表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。right join 则与之相反,以出现在right join 右边的表为基础表。
这样一来,就不难理解 full join了。完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含两个基础表的数据值
SQL> select * from b_users bu full join a_students stu on bu.uno=stu.sno;
UNO UNAME USEX SNO SNAME SEX SAGE SDEPT
---------- -------- ---- ---------- -------- ---- ---------- ----------
20050002 王静 女
20050004 雁南飞 女
20050006 上官燕 女
200215122 刘晨晨 女 200215122 刘晨 女 19 CS
200215124 张立立 男 200215124 张立 男 19 IS
200215121 李勇勇 男 200215121 李勇 男 20 CS
200215123 王敏 女 18 MA
7 rows selected
2.1我们来说说内连接------
内连接 join:结果集只包括基表中符合条件的匹配行,如:
SQL> select * from b_users bu join a_students stu on bu.uno=stu.sno;
UNO UNAME USEX SNO SNAME SEX SAGE SDEPT
---------- -------- ---- ---------- -------- ---- ---------- ----------
200215121 李勇勇 男 200215121 李勇 男 20 CS
200215122 刘晨晨 女 200215122 刘晨 女 19 CS
200215124 张立立 男 200215124 张立 男 19 IS
3.1最后我们来说说交叉连接------
cross join :无匹配条件,相当于求该连接关键字左右的两个表的笛卡尔积,如下
SQL> select * from a_students stu cross join b_users bu;
SNO SNAME SEX SAGE SDEPT UNO UNAME USEX
---------- -------- ---- ---------- ---------- ---------- -------- ----
200215121 李勇 男 20 CS 20050002 王静 女
200215121 李勇 男 20 CS 20050004 雁南飞 女
200215121 李勇 男 20 CS 20050006 上官燕 女
200215121 李勇 男 20 CS 200215122 刘晨晨 女
200215121 李勇 男 20 CS 200215124 张立立 男
200215121 李勇 男 20 CS 200215121 李勇勇 男
200215122 刘晨 女 19 CS 20050002 王静 女
200215122 刘晨 女 19 CS 20050004 雁南飞 女
200215122 刘晨 女 19 CS 20050006 上官燕 女
200215122 刘晨 女 19 CS 200215122 刘晨晨 女
200215122 刘晨 女 19 CS 200215124 张立立 男
200215122 刘晨 女 19 CS 200215121 李勇勇 男
200215123 王敏 女 18 MA 20050002 王静 女
200215123 王敏 女 18 MA 20050004 雁南飞 女
200215123 王敏 女 18 MA 20050006 上官燕 女
200215123 王敏 女 18 MA 200215122 刘晨晨 女
200215123 王敏 女 18 MA 200215124 张立立 男
200215123 王敏 女 18 MA 200215121 李勇勇 男
200215124 张立 男 19 IS 20050002 王静 女
200215124 张立 男 19 IS 20050004 雁南飞 女
SNO SNAME SEX SAGE SDEPT UNO UNAME USEX
---------- -------- ---- ---------- ---------- ---------- -------- ----
200215124 张立 男 19 IS 20050006 上官燕 女
200215124 张立 男 19 IS 200215122 刘晨晨 女
200215124 张立 男 19 IS 200215124 张立立 男
200215124 张立 男 19 IS 200215121 李勇勇 男
24 rows selected
注释:(b_users X a_students)返回的行数6*4=24.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22350698/viewspace-624098/ ,如需转载,请注明出处,否则将追究法律责任。