發新話題

MySql 將 join 用於 update 和 delete 語法

MySql 將 join 用於 update 和 delete 語法

在 SQL 中,表連接(left join、right join、inner join 等)常常用於 select 語句,其實在 SQL 語法中,這些連接也是可以用於 update 和 delete 語句的,在這些語句中使用 join 還常常得到事半功倍的效果。具體語法請參見 SQL Server 叢書。

範例一:
先將兩表串連,再將`folder` 設置成 '3'(放入垃圾桶),MySQL 語法:
update `supe_spaceitems` LEFT JOIN `supe_spacenews` USING ( `itemid` ) set `folder` = '3' WHERE `message` LIKE '%中鳥社%' ;

範例二:
列出部落格的特定人(UID=7878)的日誌內容,MySQL 語法:
SELECT * FROM `supe_spaceblogs` LEFT JOIN `supe_spaceitems` USING ( `itemid` ) WHERE `uid` =7878

SQL 查詢的外連接(left join)的使用

SQL真的很強大,試想,這個世界上要是沒有了SQL語言,那將會變成怎麼樣?

我們先舉個例子吧:

現在我們假設要建立兩個表,人員表user與部門表dept

人員表user的結構是:
IDnamesexdept_id
1user11
2user21
3user32
4user41
5user52
6user62
7user71
8user83
部門表dept的結構是:
IDdept_name
1人事部
2業務部
3財務部
很明顯,人員表是通過dept_id字段,根據部門表來把人員紀錄進行分類,分成了三類
如果,現在要查user3所在的部門的名稱,應該怎麼做呢?
以往很多人都會用一對紀錄集進行嵌套查詢,如:
set rs1=createobject("adodb.recordset")
set rs2=createobject("adodb.recordset")
rs1.open "select * from [user] where name='user3'",conn,3
rs2.open "select * from [dept] where ID=" & rs1("dept_id"),conn,3
最後user3所在的部門的名稱就是 rs2("dept_name")。
上面的做法,是大多數人,對SQL查詢認識過於膚淺而造成的,SQL查詢的精深,遠不止這麼簡單與膚淺的!如果按照上面的做法,要是數據量大的時候,對於 SQL執行服務器資源的損耗會大大增加,查詢速度也很緩慢。因此針對類似這樣關係的兩個表之間的查詢,SQL提供了一套很高效的表連接語句,這裡,我們就一起討論一下其中的一個,外連接語句——left join,看通過left join語句是如何有效的解決上面的需求的:
其實使用left join語句,很方便的就能解決上面的查詢:
set rs1=createobject("adodb.recordset")
rs1.open "select * from (select * from [user] a left join [dept] b on a.dept_id=b.ID) where name='user3'",conn,3
然後,user3所在的部門的名稱就是 rs1("dept_name")
相對第一種方法,第二種方法節省了一個紀錄集的定義,減少了一個查詢的執行,很明顯,工作量節省了50%,也就是說效率提高了50%!
其實,通過left join語句,可以直接把兩個有關係的表作為一張表連接查詢輸出結果,但left join是左邊的外連接,在left join兩邊的表的位置不同,則會返回不一樣的結果,主要是以left join左邊的表為主表,把右邊的表連接起來:
select * from [user] a left join [dept] b on a.dept_id=b.ID
a.IDa.namea.sexa.dept_idb.IDb.dept_name
1user111人事部
2user211人事部
3user322業務部
4user411人事部
5user522業務部
6user622業務部
7user711人事部
8user833財務部
select * from [dept] b left join [user] a on a.dept_id=b.ID
b.IDb.dept_namea.dept_ida.namea.sexa.dept_id
1人事部1user11
1人事部2user21
1人事部4user41
1人事部7user71
2業務部3user32
2業務部5user52
2業務部6user62
3財務部8user83
在上面的例子當中,其中部門表dept的ID字段,是唯一性的,因此,在執行「select * from [user] a left join [dept] b on a.dept_id=b.ID」的時候,每個人員的紀錄只會對應一個部門紀錄,否則,就會出現一條人員紀錄,連接多條部門紀錄而組成的結果。
好了,今天探討就到此為止,懇請南北公司的richard大俠批評指正(richard可是南北公司的首席SQL語法編寫人員,SQL水平可厲害呢,不過其他方面就……例如長相之類的就…… -.-")

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。