作为开发,或多或少会接触到数据库,之前接触的都是零零散散的皮毛而已,现阶段正想系统学一下数据库,然后就写些以后复习用吧。。。
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
带字段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
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查询改写,有兴趣的可以自己写一下。
转载请注明出处!!!