sql之内外连接

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

 

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

常见的连接有:

内连接(INNER JOIN)

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

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

全连接(FULL (OUTER) JOIN)


内连接(INNER JOIN)


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

语法:

SELECT columns
FROM A
INNER JOIN B
ON A.column = B.column;

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

示例

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers 
INNER JOIN orders
ON 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_date
FROM suppliers, orders
WHERE suppliers.supplier_id = orders.supplier_id;


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


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

语法:

SELECT columns
FROM A
LEFT [OUTER] JOIN B
ON A.column = B.column;

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

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


下面来看一个例子:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
LEFT OUTER JOIN orders
ON 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_date
FROM suppliers, orders
WHERE suppliers.supplier_id = orders.supplier_id(+);


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


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

语法:

SELECT columns
FROM A
RIGHT [OUTER] JOIN B
ON A.column = B.column;

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

 

同样,看一个例子:

SELECT orders.order_id, orders.order_date, suppliers.supplier_name
FROM suppliers
RIGHT OUTER JOIN orders
ON 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_name
FROM suppliers, orders
WHERE suppliers.supplier_id(+) = orders.supplier_id;


全连接(FULL (OUTER) JOIN)


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

语法:

SELECT columns
FROM A
FULL [OUTER] JOIN B
ON A.column = B.column;

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


同样看一个例子:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
FULL OUTER JOIN orders
ON 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查询改写,有兴趣的可以自己写一下。



转载请注明出处!!!

http://blog.csdn.net/stuqbx




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值