博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《SQL CookBook 》笔记-第三章-多表查询-连接查询
阅读量:5824 次
发布时间:2019-06-18

本文共 11291 字,大约阅读时间需要 37 分钟。

目录

shanzm


1 内连接(inner join)

内连接又称为等值连接(equal join),他是基于两个表之间的某列相等来做连接。

内连接有隐式的连接和显式的连接,二者是一样的,只不过写法不一样。

1.1 隐式的内连接

使用where子句

select e.ename,d.locfrom EMP as e,DEPT as dwhere e.deptno=d.deptno

结果:

EMPNO       ENAME      JOB       MGR         HIREDATE                SAL         COMM        DEPTNO      DEPTNO      DNAME          LOC----------- ---------- --------- ----------- ----------------------- ----------- ----------- ----------- ----------- -------------- -------------7369        SMITH      CLERK     7902        1980-12-17 00:00:00.000 800         NULL        20          20          RESEARCH       DALLAS7499        ALLEN      SALESMAN  7698        1981-02-20 00:00:00.000 1600        300         30          30          SALES          CHICAGO7521        WARD       SALESMAN  7698        1981-02-22 00:00:00.000 1250        500         30          30          SALES          CHICAGO7566        JONES      MANAGER   7839        1981-04-02 00:00:00.000 2975        NULL        20          20          RESEARCH       DALLAS7654        MARTIN     SALESMAN  7698        1981-09-28 00:00:00.000 1250        1400        30          30          SALES          CHICAGO7698        BLAKE      MANAGER   7839        1981-05-01 00:00:00.000 2850        NULL        30          30          SALES          CHICAGO7782        CLARK      MANAGER   7839        1981-06-09 00:00:00.000 2450        NULL        10          10          ACCOUNTING     NEW YORK7788        SCOTT      ANALYST   7566        1982-12-09 00:00:00.000 3000        NULL        20          20          RESEARCH       DALLAS7839        KING       PRESIDENT NULL        1981-11-17 00:00:00.000 5000        NULL        10          10          ACCOUNTING     NEW YORK7844        TURNER     SALESMAN  7698        1981-09-08 00:00:00.000 1500        0           30          30          SALES          CHICAGO7876        ADAMS      CLERK     7788        1983-01-12 00:00:00.000 1100        NULL        20          20          RESEARCH       DALLAS7900        JAMES      CLERK     7698        1981-12-03 00:00:00.000 950         NULL        30          30          SALES          CHICAGO7902        FORD       ANALYST   7566        1981-12-03 00:00:00.000 3000        NULL        20          20          RESEARCH       DALLAS7934        MILLER     CLERK     7782        1982-01-23 00:00:00.000 1300        NULL        10          10          ACCOUNTING     NEW YORK(14 行受影响)

1.2 显式的内连接

显示的内连接使用inner join连接两个表,使用on子句做连接条件。

select e.ename,d.locfrom EMP as e inner join DEPT as don e.deptno=d.deptno

结果如上,和隐式的内连接是一样的。


2 外连接(outer join)

外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。

2.1 左连接(left outer join)

左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

例如:

select d.*,e.*from dept d left outer join emp eon (d.deptno = e.deptno)

结果将返回左侧表dept的所有行

结果:

DEPTNO      DNAME          LOC           EMPNO       ENAME      JOB       MGR         HIREDATE                SAL         COMM        DEPTNO----------- -------------- ------------- ----------- ---------- --------- ----------- ----------------------- ----------- ----------- -----------10          ACCOUNTING     NEW YORK      7782        CLARK      MANAGER   7839        1981-06-09 00:00:00.000 2450        NULL        1010          ACCOUNTING     NEW YORK      7839        KING       PRESIDENT NULL        1981-11-17 00:00:00.000 5000        NULL        1010          ACCOUNTING     NEW YORK      7934        MILLER     CLERK     7782        1982-01-23 00:00:00.000 1300        NULL        1020          RESEARCH       DALLAS        7369        SMITH      CLERK     7902        1980-12-17 00:00:00.000 800         NULL        2020          RESEARCH       DALLAS        7566        JONES      MANAGER   7839        1981-04-02 00:00:00.000 2975        NULL        2020          RESEARCH       DALLAS        7788        SCOTT      ANALYST   7566        1982-12-09 00:00:00.000 3000        NULL        2020          RESEARCH       DALLAS        7876        ADAMS      CLERK     7788        1983-01-12 00:00:00.000 1100        NULL        2020          RESEARCH       DALLAS        7902        FORD       ANALYST   7566        1981-12-03 00:00:00.000 3000        NULL        2030          SALES          CHICAGO       7499        ALLEN      SALESMAN  7698        1981-02-20 00:00:00.000 1600        300         3030          SALES          CHICAGO       7521        WARD       SALESMAN  7698        1981-02-22 00:00:00.000 1250        500         3030          SALES          CHICAGO       7654        MARTIN     SALESMAN  7698        1981-09-28 00:00:00.000 1250        1400        3030          SALES          CHICAGO       7698        BLAKE      MANAGER   7839        1981-05-01 00:00:00.000 2850        NULL        3030          SALES          CHICAGO       7844        TURNER     SALESMAN  7698        1981-09-08 00:00:00.000 1500        0           3030          SALES          CHICAGO       7900        JAMES      CLERK     7698        1981-12-03 00:00:00.000 950         NULL        3040          OPERATIONS     BOSTON        NULL        NULL       NULL      NULL        NULL                    NULL        NULL        NULL(15 行受影响)

2.2 右连接(right outer join)

右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

例如:

select e.*,d.*from emp e right outer join dept don e.deptno= d.deptno

结果将返回右侧表dept的所有行

结果:

EMPNO       ENAME      JOB       MGR         HIREDATE                SAL         COMM        DEPTNO      DEPTNO      DNAME          LOC----------- ---------- --------- ----------- ----------------------- ----------- ----------- ----------- ----------- -------------- -------------7782        CLARK      MANAGER   7839        1981-06-09 00:00:00.000 2450        NULL        10          10          ACCOUNTING     NEW YORK7839        KING       PRESIDENT NULL        1981-11-17 00:00:00.000 5000        NULL        10          10          ACCOUNTING     NEW YORK7934        MILLER     CLERK     7782        1982-01-23 00:00:00.000 1300        NULL        10          10          ACCOUNTING     NEW YORK7369        SMITH      CLERK     7902        1980-12-17 00:00:00.000 800         NULL        20          20          RESEARCH       DALLAS7566        JONES      MANAGER   7839        1981-04-02 00:00:00.000 2975        NULL        20          20          RESEARCH       DALLAS7788        SCOTT      ANALYST   7566        1982-12-09 00:00:00.000 3000        NULL        20          20          RESEARCH       DALLAS7876        ADAMS      CLERK     7788        1983-01-12 00:00:00.000 1100        NULL        20          20          RESEARCH       DALLAS7902        FORD       ANALYST   7566        1981-12-03 00:00:00.000 3000        NULL        20          20          RESEARCH       DALLAS7499        ALLEN      SALESMAN  7698        1981-02-20 00:00:00.000 1600        300         30          30          SALES          CHICAGO7521        WARD       SALESMAN  7698        1981-02-22 00:00:00.000 1250        500         30          30          SALES          CHICAGO7654        MARTIN     SALESMAN  7698        1981-09-28 00:00:00.000 1250        1400        30          30          SALES          CHICAGO7698        BLAKE      MANAGER   7839        1981-05-01 00:00:00.000 2850        NULL        30          30          SALES          CHICAGO7844        TURNER     SALESMAN  7698        1981-09-08 00:00:00.000 1500        0           30          30          SALES          CHICAGO7900        JAMES      CLERK     7698        1981-12-03 00:00:00.000 950         NULL        30          30          SALES          CHICAGONULL        NULL       NULL      NULL        NULL                    NULL        NULL        NULL        40          OPERATIONS     BOSTON

2.3 全外连接(full outer join)

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

例如:

select d.* ,e.*from emp e full outer join dept don e.deptno= d.deptno

结果:

DEPTNO      DNAME          LOC           EMPNO       ENAME      JOB       MGR         HIREDATE                SAL         COMM        DEPTNO----------- -------------- ------------- ----------- ---------- --------- ----------- ----------------------- ----------- ----------- -----------20          RESEARCH       DALLAS        7369        SMITH      CLERK     7902        1980-12-17 00:00:00.000 800         NULL        2030          SALES          CHICAGO       7499        ALLEN      SALESMAN  7698        1981-02-20 00:00:00.000 1600        300         3030          SALES          CHICAGO       7521        WARD       SALESMAN  7698        1981-02-22 00:00:00.000 1250        500         3020          RESEARCH       DALLAS        7566        JONES      MANAGER   7839        1981-04-02 00:00:00.000 2975        NULL        2030          SALES          CHICAGO       7654        MARTIN     SALESMAN  7698        1981-09-28 00:00:00.000 1250        1400        3030          SALES          CHICAGO       7698        BLAKE      MANAGER   7839        1981-05-01 00:00:00.000 2850        NULL        3010          ACCOUNTING     NEW YORK      7782        CLARK      MANAGER   7839        1981-06-09 00:00:00.000 2450        NULL        1020          RESEARCH       DALLAS        7788        SCOTT      ANALYST   7566        1982-12-09 00:00:00.000 3000        NULL        2010          ACCOUNTING     NEW YORK      7839        KING       PRESIDENT NULL        1981-11-17 00:00:00.000 5000        NULL        1030          SALES          CHICAGO       7844        TURNER     SALESMAN  7698        1981-09-08 00:00:00.000 1500        0           3020          RESEARCH       DALLAS        7876        ADAMS      CLERK     7788        1983-01-12 00:00:00.000 1100        NULL        2030          SALES          CHICAGO       7900        JAMES      CLERK     7698        1981-12-03 00:00:00.000 950         NULL        3020          RESEARCH       DALLAS        7902        FORD       ANALYST   7566        1981-12-03 00:00:00.000 3000        NULL        2010          ACCOUNTING     NEW YORK      7934        MILLER     CLERK     7782        1982-01-23 00:00:00.000 1300        NULL        1040          OPERATIONS     BOSTON        NULL        NULL       NULL      NULL        NULL                    NULL        NULL        NULL(15 行受影响)


3 自连接(self-join)

自连接是连接的一种用法,但并不是连接的一种类型,因为他的本质是把一张表当成两张表来使用。

使用自连接就伴随着使用表的别名,可以给同一张表起不同的别名,所以一张表可以当作几张表来用。

自连接的一个重要作用就是可以代替对一张表的多次查询(嵌套子查询)。

举一个简单的例子:

有一张顾客表Customers,三列,分别是订货公司的标号,名字,和联系人

其中有一个订货公司3有两个联系人,分别是小红和小亮

Customers表

cust_no cust_name cust_contact
001 公司1 小明
002 公司2 小亮
003 公司3 小红
004 公司3 小军

先在要找到小红公司的所有联系人

select cust_contact from Cumstomerswhere cust_name=(select cust_namefrom Customerswhere cust_contact='小红')

结果:

cust_name
小红
小亮

我们其实可以使用自查询

select c1.cust_contactfrom Cumstomers c1,Cumstomers c2where c1.cust_name=c2.cust_nameand c2.cust_contact='小红'

结果:

cust_name
小红
小亮

注意上面的SQL语句是查询的c1表中的列

注意c1和c2在中表的顺序(和直觉是不一样的)
其中中间表是

cust_no cust_name cust_contact cust_no cust_name cust_contact
001 公司1 小明 001 公司1 小明
002 公司2 小亮 002 公司2 小亮
003 公司3 小红 003 公司3 小红
004 公司3 小军 003 公司3 小红
003 公司3 小红 004 公司3 小军
004 公司3 小军 004 公司3 小军


4 自然连接(natural join)

无论何时对表进行联结,应该至少有一列不止出现在一个表中(被联结的列)。标准的联结(内联结)返回所有数据,相同的列甚至多次出现。自然联结排除相同列的多次出现,使每一列只返回一次。


5 交叉连接

交叉连接是不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积


转载于:https://www.cnblogs.com/shanzhiming/p/10389561.html

你可能感兴趣的文章
独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!
查看>>
java的继承性
查看>>
tomcat 实例
查看>>
MyBatis使用DEMO及cache的使用心得
查看>>
网站文章如何能自动判定是抄袭?一种算法和实践架构剖析
查看>>
34个漂亮的应用程序后台管理系统界面(系列二)
查看>>
【OpenCV学习】滚动条
查看>>
js模版引擎handlebars.js实用教程——循环中使用索引
查看>>
mysql基础:mysql与C结合实例
查看>>
不区分大小写的in_array实现 thinkphp框架
查看>>
解决nginx反向代理缓存不起作用的问题
查看>>
select默认选择的实现方法
查看>>
eclipse加入git工具
查看>>
推荐!手把手教你使用Git
查看>>
杭电3790最短路径问题
查看>>
使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图...
查看>>
[置顶] 正则表达式应用:匹配IP地址
查看>>
ActivityManager: Warning: Activity not started, its current task has been brought to the front
查看>>
GopherChina 2018
查看>>
基于C API的SQLite3基本数据库操作
查看>>