多表连接

一、什么是连接

连接是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获得数据。

语法:

SELECT  table1.column, table2.column 
FROM  table1, table2 
WHERE  table1.column1 = table2.column2;
  • 在WHERE子句中书写连接条件。
  • 如果在多个表中出现相同的列名,则需要使用表名作为来自该表的列名的前缀。
  • N个表相连时,至少需要N-1个连接条件
二、连接的类型
  • 按照连接条件分:

等值连接
非等值连接

  • 按其他连接方法分:

外部连接
内部连接

三、多表连接写法

多表连接包含多种写法,在这里主要介绍:

  • Oracle写法:oracle公司提供的写法,绝大多数符合SQL标准,其他关系型数据也适用。
  • ANNSI 99写法:ANSI标准提供的写法,所有关系型数据必须支持。
四、笛卡尔积
  • 笛卡尔积是:
    第一个表中的所有行和第二个表中的所有行都发生连接
  • 笛卡尔积在下列情况卡产生
    1.连接条件被省略
    2.连接条件是无效的
  • 为了避免笛卡尔积的产生,通常需要在WHERE子句中包含一个有效的连接条件。
  • 笛卡尔积结果
    简单描述:
    表1中有14行数据,表2中有4行数据,笛卡尔积结果为56行数据
五、使用AND 运算符增加其他的查询条件
  • 在WHERE子句的连接条件后添加AND条件
六、限制歧义列名
  • 在用到多个表时可以使用表名作为前缀来限定列。
  • 通过使用表前缀可以提高性能。
  • 通过使用列的别名可以区分来自不同表但是名字相同的列。
七、使用表的别名
  • 通过使用表的别名来简化查询语句
2019-02-14_163746.png
八、多余两个表的连接
  • 多个表连接和两个表的连接一样,在构造SQL语句时,需要多考虑一个表之间的关联条件。
九、多表连接的写法
  • 分析要查询的列都来自哪个表,构成FROM子句
  • 分析这些表之间的关联关系,如果表之间没有直接的关联关系,而是通过另一个中间表关联,则也要在FROM子句中补充中间关联表。
  • 接下来在WHERE子句中补充表之间的关联关系,通常N个表,至少要有N-1个关联关系。
  • 分析是否还有其他限制条件,补充到WHERE子句的表关联关系之后,作为限定条件。
  • 根据用户想要显示的信息,补充SELECT子句。
  • 分析是否有排序要求,如果排序要求中还涉及到其他表,则也要进行第2步补充排序字段所需要的表,并且添加表之间的关联关系。
十、外部连接
  • 在多表连接时,可以使用外部连接来查看哪些行,按照连接条件没有被匹配上。
  • 外部连接的符号是(+),语法包括:

左外连接:

SELECT  table1.column, table2.column 
FROM   table1, table2 
WHERE  table1.column(+) = table2.column;

右外连接:

SELECT  table1.column, table2.column 
FROM   table1, table2 
WHERE  table1.column = table2.column(+);
  • 外部连接就好像是为符号(+)所在边的表增加一个“万能”的行,这个行全部由NULL组成。他可以和另一边的表中所有不满足连接条件的进行连接。由于这个“万能”行的各列全是空值,因此在连接结果中,来自“万能”行属性值全部为空值。
十一、自身连接
  • 自身连接,也叫自连接,是一个表通过某种条件和本身进行连接的一种方式,就如同多个表连接一样。
  • 例如:
SELECT  worker.ename || ' leader is ' || manager.ename 
FROM   emp  worker,  emp  manager 
WHERE  worker.mgr  =  manager.empno; 
十二、SQL:1999语法的连接
  • ANSI SQL:1999标准的连接语法
    oracle除了上述自己的连接语法外,同时支持美国国家标准协会(ANSI)的SQL:1999标准的连接语法。
SELECT  table1.column, table2.column 
FROM  table1 
[CROSS JOIN table2] | 
[NATURAL JOIN table2] | 
[JOIN table2 USING (column_name)] | 
[JOIN table2  
ON(table1.column_name = table2.column_name)] | 
[LEFT|RIGHT|FULL OUTER JOIN table2  
ON (table1.column_name = table2.column_name)];
  • 交叉连接
    交叉连接会产生两个表的交叉乘积,和两个表之间的笛卡尔积是一样的。
    使用CROSS JOIN 子句完成。
SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.loc  
FROM emp  
CROSS JOIN dept;
  • 自然连接
    自然连接是对两个表之间相同名字和数据类型的列进行等值的连接。
    如果两个表之间相同名称的列的数据类型不同,则会产生错误。
    使用NATURAL JOIN子句完成。
SELECT  empno,ename,sal,deptno,loc  
FROM    emp  
NATURAL JOIN   dept;
  • USING子句
    自然连接是使用所有名称和数据类型相匹配的列作为连接条件,而USING子句可以指定用某个或者某几个相同名称和数据类型的列作为连接条件。
SELECT e.ename,e.ename,e.sal,deptno,d.loc  
FROM emp e JOIN dept d USING (deptno)  
WHERE deptno = 20;

使用USING子句创建连接时,应注意以下几点:

  • 如果有若干个列名称相同但数据类型不同,自然连接子句可以使用USING子句来替换,以指定产生等值连接的列。
  • 如果有多于一个列都匹配的情况,使用USING子句只能指定其中的一列。
  • USING子句中用到的列不能使用表名和别名作为前缀。
  • NATURAL JOIN子句和USING子句是相互排斥的,不能同时使用。
  • ON子句
    自然连接条件基本上是具有相同列名的表之间的等值连接。
    如果要指明任意连接条件,或要指明要连接的列,则可以使用ON子句。
    用ON将连接条件和其他检索条件分隔开,其他检索条件写在WHERE子句。
    ON子句可以提高代码的可读性。
SELECT   e.empno, e.ename, e.deptno, d.deptno, d.loc  
FROM     emp e  
JOIN   dept d  
ON    (e.deptno = d.deptno);
  • 外连接

左外连接
左外连接以FROM子句中左边表为基表,该表所有行数据按照连接条件无论是否与右边表能匹配上,都会被显示出来

SELECT e.ename,e.deptno,d.loc  
FROM emp e  
LEFT OUTER JOIN dept d  
ON (e.deptno = d.deptno);

右外连接
右外连接以FROM子句中右边表为基表,该表所有行数据按照连接条件无论是否与左边表能匹配上,都会被显示出来

SELECT e.ename,e.deptno,d.loc  
FROM emp e  
RIGHT OUTER JOIN dept d  
ON (e.deptno = d.deptno);

全外连接
全外连接返回两个表等值连接结果,以及两个表中所有等值连接失败的结果

SELECT   e.ename,e.deptno,d.loc  
FROM     emp e  
FULL    OUTER JOIN dept d  
ON       (e.deptno = d.deptno);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,313评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,369评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,916评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,333评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,425评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,481评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,491评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,268评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,719评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,004评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,179评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,832评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,510评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,153评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,402评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,045评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,071评论 2 352

推荐阅读更多精彩内容

  • 多表连接初步 引出 •思考如下问题? –写一条查询语句,查询员工姓名、部门名称、工作地点? 写一个查询显示员工姓名...
    wqjcarnation阅读 2,869评论 0 7
  • 多表连接初步 引出 •思考如下问题? –写一条查询语句,查询员工姓名、部门名称、工作地点? 写一个查询显示员工姓名...
    C_cole阅读 645评论 0 0
  • 第一章SQL 1.Oracle数据库基础 (1).开始>运行>输入:sqlpusw/nolog>确定sqlplus...
    蛋炒饭_By阅读 297评论 0 0
  • 5.多表查询 多表查询 目的:从多张表获取数据 前提:进行连接的多张表中有共同的列 等连接 通过两个表具有相同意义...
    乔震阅读 1,220评论 0 0
  • 连接MYSQL: 1、例1:连接到本机上的MYSQL 找到mysql的安装目录,一般可以直接键入命令mysql -...
    AlbenXie阅读 3,936评论 0 1