(菜鳥一枚)
最近在看別人**的時候,總是碰到諸如join on的sql語句,上課那會兒老師也仔細的講過,
單獨的拿出來看的話也是很簡單的,只是放在那樣複雜的sql語句中,閱讀起來還是很費勁。
正好今天不怎麼忙,查查資料在總結一下。
工作中,我們都習慣了只查詢一張表中的資料,如果業務中需要去查詢另外一張表中的資料時,
我們往往習慣於遍歷查詢的資料然後根據外來鍵字段去查詢另外一張表,這樣做沒有什麼問題。
但是當我們需要關聯3張表甚至4張表,或者在一些大型的專案中需要些一些非常複雜的sql語句
的時候我們發現,這樣會使業務層的**非常非常複雜。
這個時候,關聯表查詢就會變得非常重要。
基本定義:
left join (左連線):返回包括左表中的所有記錄和右表中連線字段相等的記錄。
right join (右連線):返回包括右表中的所有記錄和左表中連線字段相等的記錄。
inner join (等值連線):只返回兩個表中連線字段相等的行。
full join (全外連線):返回左右表中所有的記錄和左右表中連線字段相等的記錄。
現在呢舉個例子:
a表
id name
1 小王
2 小李
3 小劉
b表id a_id job
1 2 老師
2 4 程式設計師
select a.name,b.job from a a inner join b b on a.id=b.a_id
只能得到一條記錄
小李 老師
select a.name,b.job from a a left join b b on a.id=b.a_id
三條記錄
小王 null
小李 老師
小劉 null
select a.name,b.job from a a right join b b on a.id=b.a_id
兩條記錄
小李 老師
null 程式設計師
select a.name,b.job from a a full join b b on a.id=b.a_id
四條資料
小王 null
小李 老師
小劉 null
null 程式設計師
以上的具體用法就看你的業務需求了,比如查詢多有人的職業,沒有職業的設定為null,左連線無疑是最
正確的,再比如查詢所有職業對於的人,沒有所對應的人就設定為0.右連線更為正確。
當然在工作的我們會看到關聯好幾張表的情況,這時候我們會多寫幾個join on語句,具體是哪個連線要按
具體的業務而定。
1<?
xml version="1.0" encoding="utf-8"
?>
2>34
<
namespace
="com.hebg3.mobiledealer.modules.client.store.order.dao.orderdao"
>56
<
sql
id="tordercolumns"
>
7 a.id as "id",
8 a.order_no as "orderno",
9 a.t_customer_id as "customer.id",
10 a.sys_office_id as "companyoffice.id",
11 a.order_date as "orderdate",
12 a.document_status as "documentstatus",
13 a.send_date as "senddate",
14 a.open_id as "openid",
15 a.create_by as "createby.id",
16 a.create_date as "createdate",
17 a.update_by as "updateby.id",
18 a.update_date as "updatedate",
19 a.remarks as "remarks",
20 a.del_flag as "delflag",
21 a.t_sales_entry_id as "salesentry.id",
22se.orderno as "salesentry.orderno",
23 c.name as "customer.name"
24sql
>
2526
<
sql
id="torderjoins"
>
27 join t_customer_relation cr on cr.t_customer_id = a.t_customer_id
28 join t_customer c on c.id=a.t_customer_id
29 left join t_sales_entry se on se.id=a.t_sales_entry_id
30sql
>
3132
3334
<
select
id="findpageorder"
resulttype
="torder"
>
35select
36<
include
refid
="tordercolumns"
/>
37from t_order a
38<
include
refid
="torderjoins"
/>
39<
where
>
40a.del_flag = #
41<
if test
="userid!=null and userid!=''"
>
42and cr.sys_user_id=#
43if
>
44<
if test
="id!=null and id!=''"
>
45and a.id=#
46if
>
47<
if48
test
="companyoffice !=null and companyoffice.id!=null and companyoffice.id!=''"
>
49and cr.sys_office_id=#
50if
>
51<
if test
="documentstatus!=null and documentstatus!=''"
>
52and a.document_status =#
53if
>
54<
if test
="documentstatuslist != null"
>
55and a.document_status in
56<
foreach
item
="item"
index
="index"
collection
="documentstatuslist"
open
="("
separator
=","
close
=")"
>57#
58foreach
>
5960
if>
61<
if test
="page !=null and page.groupby != null and page.groupby != ''"
>
62group by $
63if
>
64where
>
65<
choose
>
66<
when
test
="page !=null and page.orderby != null and page.orderby != ''"
>
67order by $
68when
>
69<
otherwise
>
70order by a.create_date desc
71otherwise
>
72choose
>
7374
select
>
以上
內連線,左連線,右連線,全外鏈結
最近在看別人 的時候,總是碰到諸如join on的sql語句,上課那會兒老師也仔細的講過,單獨的拿出來看的話也是很簡單的,只是放在那樣複雜的sql語句中,閱讀起來還是很費勁。正好今天不怎麼忙,查查資料在總結一下。工作中,我們都習慣了只查詢一張表中的資料,如果業務中需要去查詢另外一張表中的資料時,我們...
內連線,左外連線,右外連線,全連線
1.內連線我們通常用的連線,表表連線只顯示交集資料 2.外連線分左外連線 table1 left outer join on table2 和右外連線table1 right outer join on table2 和全連線 table1 full outer join on table2 2.1...
內連線,外連線,左連線,右連線,全連線
連線是指將關聯式資料庫中的兩個表根據內容一定的條件連線成乙個表.內連線是最常用的鏈結,也叫等值鏈結,最常見的格式是 selecta.b.fromta as a tb as b wherea.id b.id 或者 selecta.b.fromtaasainnerjoin tbasb on a.id b...