博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sql之内外连接
阅读量:4145 次
发布时间:2019-05-25

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

作为开发,或多或少会接触到数据库,之前接触的都是零零散散的皮毛而已,现阶段正想系统学一下数据库,然后就写些以后复习用吧。。。

 

SQL连接常用来关联多张表。

常见的连接有:

内连接(INNER JOIN)

左(外)连接(LEFT (OUTER) JOIN)

右(外)连接(RIGHT (OUTER) JOIN)

全连接(FULL (OUTER) JOIN)

内连接(INNER JOIN)

最常见的连接,从多张表中返回所有符合一致条件的记录。

语法:

SELECT columnsFROM AINNER JOIN BON A.column = B.column;

下面的图能够很清晰地解释它:

示例

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_dateFROM suppliers INNER JOIN ordersON suppliers.supplier_id = orders.supplier_id;

以上的SQL语句,返回suppliers表和orders表中所有它们的supplier_id字段一致的记录。

假设有表supplier,它有两个字段supplier_id和supplier_name,它包含的数据如下:

supplier_id

supplier_name

10000

IBM

10001

Hewlett Packard

10002

Microsoft

10003

NVIDIA

另一张表orders,它有三个字段order_id, supplier_id和order_date,它包含如下数据:

order_id

supplier_id

order_date

500125

10000

2003/05/12

500126

10001

2003/05/13

500127

10004

2003/05/14

那么,运行以上的SQL语句,得到的结果如下:

supplier_id

name

order_date

10000

IBM

2003/05/12

10001

Hewlett Packard

2003/05/13

 

以前的内连接语法

最后,顺便提一下,以上的内连接例子可以隐式写成如下,两者等价(建议还是用INNERJOIN关键字):

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_dateFROM suppliers, ordersWHERE suppliers.supplier_id = orders.supplier_id;

左(外)连接(LEFT (OUTER) JOIN)

另一种连接叫左(外)连接,顾名思义,它从左边表(LEFT [OUTER] JOIN左边)中返回所有记录和那些符合条件的其他表的记录。

语法:

SELECT columnsFROM ALEFT [OUTER] JOIN BON A.column = B.column;

有些数据库中,LEFT OUTER JOIN关键字常常直接写成LEFT JION。

下面的图可以清晰地描述它返回的结果:

下面来看一个例子:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_dateFROM suppliersLEFT OUTER JOIN ordersON suppliers.supplier_id = orders.supplier_id;

以上的SQL语句,返回表suppliers中所有记录和表orders中符合supplier_id与表suppliers的supplier_id一致的记录。

 

假设有表suppliers,包含两个字段supplier_id和name,数据如下:

supplier_id

supplier_name

10000

IBM

10001

Hewlett Packard

10002

Microsoft

10003

NVIDIA

有表orders,有三个字段order_id, supplier_id和order_date,包含数据如下:

order_id

supplier_id

order_date

500125

10000

2003/05/12

500126

10001

2003/05/13

则以上的SQL语句返回结果如下:

supplier_id

supplier_name

order_date

10000

IBM

2003/05/12

10001

Hewlett Packard

2003/05/13

10002

Microsoft

<null>

10003

NVIDIA

<null>

老的语法,写法如下(同样建议用LEFT OUTER JOIN关键字):

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_dateFROM suppliers, ordersWHERE suppliers.supplier_id = orders.supplier_id(+);

右(外)连接(RIGHT (OUTER) JOIN)

另一种连接叫右(外)连接,与左(外)连接相反,它从右边表(RIGHT[OUTER] JOIN右边)中返回所有记录和那些符合条件的其他表的记录。

语法:

SELECT columnsFROM ARIGHT [OUTER] JOIN BON A.column = B.column;

下面的图可以清晰地描述它返回的结果:

 

同样,看一个例子:

SELECT orders.order_id, orders.order_date, suppliers.supplier_nameFROM suppliersRIGHT OUTER JOIN ordersON suppliers.supplier_id = orders.supplier_id;

这条SQL语句将返回表orders的所有记录和表suppliers中符合supplier_id与表orders的supplier_id一致的记录。

 

假设带字段supplier_id和name的表suppliers有如下数据:

supplier_id

supplier_name

10000

Apple

10001

Google

带字段order_id, supplier_id和order_date的表orders包含如下数据:

order_id

supplier_id

order_date

500125

10000

2013/08/12

500126

10001

2013/08/13

500127

10002

2013/08/14

则以上的SQL语句返回的结果如下:

order_id

order_date

supplier_name

500125

2013/08/12

Apple

500126

2013/08/13

Google

500127

2013/08/14

<null>

老的语法,写法如下(同样建议用RIGHT OUTER JOIN关键字):

SELECT orders.order_id, orders.order_date, suppliers.supplier_nameFROM suppliers, ordersWHERE suppliers.supplier_id(+) = orders.supplier_id;

全连接(FULL (OUTER) JOIN)

另一种连接叫全连接,它从左边表和右边表返回所有记录,条件不符的记录以null填充。

语法:

SELECT columnsFROM AFULL [OUTER] JOIN BON A.column = B.column;

下面的图能清晰反映它返回的结果:

同样看一个例子:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_dateFROM suppliersFULL OUTER JOIN ordersON suppliers.supplier_id = orders.supplier_id;

以上的SQL从表suppliers和表orders中返回所有记录,不管条件满不满足。

如果表suppliers的supplier_id在表orders中不存在,那么orders表的所有字段将用<null>填充;同样,如果表orders中的supplier_id在表suppliers中不存在,那么suppliers表的所有字段将用<null>填充。

假设表suppliers(有两个字段supplier_id和name)的数据如下:

supplier_id

supplier_name

10000

IBM

10001

Hewlett Packard

10002

Microsoft

10003

NVIDIA

表orders(有三个字段order_id, supplier_id和order_date)有数据如下:

order_id

supplier_id

order_date

500125

10000

2013/08/12

500126

10001

2013/08/13

500127

10004

2013/08/14

那么,上面的SQL语句返回结果如下:

supplier_id

supplier_name

order_date

10000

IBM

2013/08/12

10001

Hewlett Packard

2013/08/13

10002

Microsoft

<null>

10003

NVIDIA

<null>

<null>

<null>

2013/08/14

全连接没有老的语法,不过可以用UNION查询改写,有兴趣的可以自己写一下。

转载请注明出处!!!

你可能感兴趣的文章
实现包含min,max,push,pop函数的栈
查看>>
实验2-6 字符型数据的输入输出
查看>>
实验3-5 编程初步
查看>>
实验4-1 逻辑量的编码和关系操作符
查看>>
实验5-2 for循环结构
查看>>
实验5-3 break语句和continue语句
查看>>
实验5-4 循环的嵌套
查看>>
实验5-5 循环的合并
查看>>
实验5-6 do-while循环结构
查看>>
实验5-7 程序调试入门
查看>>
实验5-8 综合练习
查看>>
第2章实验补充C语言中如何计算补码
查看>>
深入入门正则表达式(java) - 命名捕获
查看>>
使用bash解析xml
查看>>
android系统提供的常用命令行工具
查看>>
Python基础-操作文件和目录
查看>>
Python基础-序列化
查看>>
SP91 GMS唤醒优化
查看>>
ERROR 1044 (42000)Access denied for user @localhost to database
查看>>
Eclipse安装Pydev后Window-Preferences没有显示PyDev的解决办法
查看>>