《SQL CookBook 》笔记-第三章-多表查询-连接查询

news/2024/7/5 10:30:45

目录

  • 1 内连接(inner join)
    • 1.1 隐式的内连接
    • 1.2 显式的内连接
  • 2 外连接(outer join)
    • 2.1 左连接(left outer join)
    • 2.2 右连接(right outer join)
    • 2.3 全外连接(full outer join)
  • 3 自连接(self-join)
  • 4 自然连接(natural join)
  • 5 交叉连接
shanzm


1 内连接(inner join)

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

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

1.1 隐式的内连接

使用where子句

select e.ename,d.loc
from EMP as e,DEPT as d
where 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       DALLAS
7499        ALLEN      SALESMAN  7698        1981-02-20 00:00:00.000 1600        300         30          30          SALES          CHICAGO
7521        WARD       SALESMAN  7698        1981-02-22 00:00:00.000 1250        500         30          30          SALES          CHICAGO
7566        JONES      MANAGER   7839        1981-04-02 00:00:00.000 2975        NULL        20          20          RESEARCH       DALLAS
7654        MARTIN     SALESMAN  7698        1981-09-28 00:00:00.000 1250        1400        30          30          SALES          CHICAGO
7698        BLAKE      MANAGER   7839        1981-05-01 00:00:00.000 2850        NULL        30          30          SALES          CHICAGO
7782        CLARK      MANAGER   7839        1981-06-09 00:00:00.000 2450        NULL        10          10          ACCOUNTING     NEW YORK
7788        SCOTT      ANALYST   7566        1982-12-09 00:00:00.000 3000        NULL        20          20          RESEARCH       DALLAS
7839        KING       PRESIDENT NULL        1981-11-17 00:00:00.000 5000        NULL        10          10          ACCOUNTING     NEW YORK
7844        TURNER     SALESMAN  7698        1981-09-08 00:00:00.000 1500        0           30          30          SALES          CHICAGO
7876        ADAMS      CLERK     7788        1983-01-12 00:00:00.000 1100        NULL        20          20          RESEARCH       DALLAS
7900        JAMES      CLERK     7698        1981-12-03 00:00:00.000 950         NULL        30          30          SALES          CHICAGO
7902        FORD       ANALYST   7566        1981-12-03 00:00:00.000 3000        NULL        20          20          RESEARCH       DALLAS
7934        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.loc
from EMP as e inner join DEPT as d
on e.deptno=d.deptno 

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


2 外连接(outer join)

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

2.1 左连接(left outer join)

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

例如:

select d.*,e.*
from dept d left outer join emp e
on (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        10
10          ACCOUNTING     NEW YORK      7839        KING       PRESIDENT NULL        1981-11-17 00:00:00.000 5000        NULL        10
10          ACCOUNTING     NEW YORK      7934        MILLER     CLERK     7782        1982-01-23 00:00:00.000 1300        NULL        10
20          RESEARCH       DALLAS        7369        SMITH      CLERK     7902        1980-12-17 00:00:00.000 800         NULL        20
20          RESEARCH       DALLAS        7566        JONES      MANAGER   7839        1981-04-02 00:00:00.000 2975        NULL        20
20          RESEARCH       DALLAS        7788        SCOTT      ANALYST   7566        1982-12-09 00:00:00.000 3000        NULL        20
20          RESEARCH       DALLAS        7876        ADAMS      CLERK     7788        1983-01-12 00:00:00.000 1100        NULL        20
20          RESEARCH       DALLAS        7902        FORD       ANALYST   7566        1981-12-03 00:00:00.000 3000        NULL        20
30          SALES          CHICAGO       7499        ALLEN      SALESMAN  7698        1981-02-20 00:00:00.000 1600        300         30
30          SALES          CHICAGO       7521        WARD       SALESMAN  7698        1981-02-22 00:00:00.000 1250        500         30
30          SALES          CHICAGO       7654        MARTIN     SALESMAN  7698        1981-09-28 00:00:00.000 1250        1400        30
30          SALES          CHICAGO       7698        BLAKE      MANAGER   7839        1981-05-01 00:00:00.000 2850        NULL        30
30          SALES          CHICAGO       7844        TURNER     SALESMAN  7698        1981-09-08 00:00:00.000 1500        0           30
30          SALES          CHICAGO       7900        JAMES      CLERK     7698        1981-12-03 00:00:00.000 950         NULL        30
40          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 d
on 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 YORK
7839        KING       PRESIDENT NULL        1981-11-17 00:00:00.000 5000        NULL        10          10          ACCOUNTING     NEW YORK
7934        MILLER     CLERK     7782        1982-01-23 00:00:00.000 1300        NULL        10          10          ACCOUNTING     NEW YORK
7369        SMITH      CLERK     7902        1980-12-17 00:00:00.000 800         NULL        20          20          RESEARCH       DALLAS
7566        JONES      MANAGER   7839        1981-04-02 00:00:00.000 2975        NULL        20          20          RESEARCH       DALLAS
7788        SCOTT      ANALYST   7566        1982-12-09 00:00:00.000 3000        NULL        20          20          RESEARCH       DALLAS
7876        ADAMS      CLERK     7788        1983-01-12 00:00:00.000 1100        NULL        20          20          RESEARCH       DALLAS
7902        FORD       ANALYST   7566        1981-12-03 00:00:00.000 3000        NULL        20          20          RESEARCH       DALLAS
7499        ALLEN      SALESMAN  7698        1981-02-20 00:00:00.000 1600        300         30          30          SALES          CHICAGO
7521        WARD       SALESMAN  7698        1981-02-22 00:00:00.000 1250        500         30          30          SALES          CHICAGO
7654        MARTIN     SALESMAN  7698        1981-09-28 00:00:00.000 1250        1400        30          30          SALES          CHICAGO
7698        BLAKE      MANAGER   7839        1981-05-01 00:00:00.000 2850        NULL        30          30          SALES          CHICAGO
7844        TURNER     SALESMAN  7698        1981-09-08 00:00:00.000 1500        0           30          30          SALES          CHICAGO
7900        JAMES      CLERK     7698        1981-12-03 00:00:00.000 950         NULL        30          30          SALES          CHICAGO
NULL        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 d
on 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        20
30          SALES          CHICAGO       7499        ALLEN      SALESMAN  7698        1981-02-20 00:00:00.000 1600        300         30
30          SALES          CHICAGO       7521        WARD       SALESMAN  7698        1981-02-22 00:00:00.000 1250        500         30
20          RESEARCH       DALLAS        7566        JONES      MANAGER   7839        1981-04-02 00:00:00.000 2975        NULL        20
30          SALES          CHICAGO       7654        MARTIN     SALESMAN  7698        1981-09-28 00:00:00.000 1250        1400        30
30          SALES          CHICAGO       7698        BLAKE      MANAGER   7839        1981-05-01 00:00:00.000 2850        NULL        30
10          ACCOUNTING     NEW YORK      7782        CLARK      MANAGER   7839        1981-06-09 00:00:00.000 2450        NULL        10
20          RESEARCH       DALLAS        7788        SCOTT      ANALYST   7566        1982-12-09 00:00:00.000 3000        NULL        20
10          ACCOUNTING     NEW YORK      7839        KING       PRESIDENT NULL        1981-11-17 00:00:00.000 5000        NULL        10
30          SALES          CHICAGO       7844        TURNER     SALESMAN  7698        1981-09-08 00:00:00.000 1500        0           30
20          RESEARCH       DALLAS        7876        ADAMS      CLERK     7788        1983-01-12 00:00:00.000 1100        NULL        20
30          SALES          CHICAGO       7900        JAMES      CLERK     7698        1981-12-03 00:00:00.000 950         NULL        30
20          RESEARCH       DALLAS        7902        FORD       ANALYST   7566        1981-12-03 00:00:00.000 3000        NULL        20
10          ACCOUNTING     NEW YORK      7934        MILLER     CLERK     7782        1982-01-23 00:00:00.000 1300        NULL        10
40          OPERATIONS     BOSTON        NULL        NULL       NULL      NULL        NULL                    NULL        NULL        NULL

(15 行受影响)


3 自连接(self-join)

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

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

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

举一个简单的例子:

有一张顾客表Customers,三列,分别是订货公司的标号,名字,和联系人
其中有一个订货公司3有两个联系人,分别是小红和小亮

Customers表

cust_nocust_namecust_contact
001公司1小明
002公司2小亮
003公司3小红
004公司3小军

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

select cust_contact 
from Cumstomers
where cust_name=
(
select cust_name
from Customers
where cust_contact='小红'
)

结果:

cust_name
小红
小亮

我们其实可以使用自查询

select c1.cust_contact
from Cumstomers c1,Cumstomers c2
where c1.cust_name=c2.cust_name
and c2.cust_contact='小红'

结果:

cust_name
小红
小亮

注意上面的SQL语句是查询的c1表中的列
注意c1和c2在中表的顺序(和直觉是不一样的)
其中中间表是

cust_nocust_namecust_contactcust_nocust_namecust_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


http://www.niftyadmin.cn/n/2867149.html

相关文章

大数据打假 平台已经逐步建立

12月16日晚,淘宝公布,联手上海、福建、浙江、湖南等地公安机关,运用大数据查获一起网售假冒运动鞋案件,涉案总价值2150余万元。各地警方共立案5起,破案5起,抓获犯罪嫌疑人8名(其中刑事拘留8名&a…

联合多部门尝试大数据打假

23日在杭州召开的“阿里巴巴网络交易平台打假工作汇报会”披露的最新进展显示,在原有的打假手段之外,阿里巴巴正在尝试联合政府相关部门、品牌商等,利用大数据保护知识产权,并计划在时机成熟时定期公布基于…

阿里巴巴公开大数据打假模式

100元的“耐克鞋”、1000元的“爱马仕包”你敢不敢买?去年“双11”,阿里巴巴集团创造了一天571亿元的销售奇迹,让人们意识到了电子商务带来的巨大财富。但阿里巴巴集团掌门人马云担心的是:“假货是阿里巴巴未来30年的最大挑战&…

华为云携手秒拍,云+AI助力短视频加速发展

华为云携手秒拍,云AI助力短视频加速发展 作为行业领先的移动视频矩阵平台,炫一下(北京)科技有限公司(以下简称“一下科技”)一直走在行业发展前沿,旗下秒拍、小咖秀、波波等多款火爆产品&#x…

用大数据勾勒“打假地图”

近一周来,阿里巴巴罕见地披露了一批打假举措、案例或报告:12月15日,与浙江省知识产权局签署知识产权保护合作备忘录,打击电子商务领域的专利侵权;17日,淘宝与警方联合披露多起打假大案;18日&…

蚂蚁金服分布式链路跟踪组件 SOFATracer 总览 | 剖析

2019新春支付宝红包技术大揭秘在线峰会将于03-07日开始,点击这里报名届时即可参与大牛互动。 SOFA Scalable Open Financial Architecture是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤…

大数据有望终结假货时代

继发布《2014淘宝联合警方打假报告》后,12月23日,阿里巴巴集团公开阿里的大数据打假模式,并发布线上线下联动打假的未来趋势预测报告。这是阿里巴巴成立15年来,首次向社会全方位揭秘其打假的工作机制。同时,阿里正在考…

hdoj1260 Tickets (简单DP)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1260 思路&#xff1a; 很简单的DP题&#xff0c;状态方程也比较容易想到&#xff0c;用f[i]表示到第i个人所耗的最短时间&#xff0c;详见代码。 1 #include<bits/stdc.h>2 using namespace std;3 4 int…