大家好,我是知數堂SQL 優化班老師 網名:騎龜的兔子
今天給大家,帶來的是 SELF JOIN的應用
下面是,表結構和,INSERT 語句腳本。
create table t0718 (
idx int,
no int ,
val1 varchar(30),
val2 varchar(10)
);
insert into t0718 values( 1 ,10 ,'1 2 3' ,'11');
insert into t0718 values( 2 ,20 ,'4 5 6' ,'12');
insert into t0718 values( 3 ,30 ,'7 8 9' ,'13');
insert into t0718 values( 4 ,40 ,'4 8 9' ,'14');
insert into t0718 values( 5 ,50 ,'1 4 8' ,'15');
insert into t0718 values( 6 ,55 ,'3 2 9' ,'21');
insert into t0718 values( 7 ,13 ,'7 0 4' ,'33');
insert into t0718 values( 8 ,77 ,'1 6 9' ,'45');
insert into t0718 values( 9 ,22 ,'5 7 8' ,'23');
insert into t0718 values( 10 ,77 ,'8 0 9' ,'99');
在如上的數據中,對val1 進行查詢,如果查到了,如輸入值爲2 ,
那就返回,從下一行開始的三行數據,返回結果如下
類似這種,找出特定的值開始查出幾行數據問題,都需要一個連續的不間斷的一列,
或者如果沒有的話,需要人爲的製造出這樣的一個列,這裏爲了簡單,
把製作序列的事情去掉了,直接給出,如果不會的話,
可以參照 《SQL優化大神帶你寫有趣的SQL(5) 自定義變量的應用(1)》文章。
現在開始,進行分析,如果想得到上圖的所示的結果
第一,查出滿足條件的行,所在的唯一值,如pk,unique key ,這裏是idx
第二,拿着idx 查出大於idx 小於 等於idx+3的值,返回結果!
根據上面的思路寫SQL
第二步:拿着idx 查出大於idx 小於 等於idx+3的值,返回結果!
這裏因爲返回的是一個表的內容,所以推薦大家使用半連接
上面的SQL 理解起來,比較難!
在這裏解釋一下,exists 裏面t1表的結果集其實就是兩個值,1,6
那麼每一個t表中idx(idx 值爲1到10)比1大且小於等於4或者比6大且小於等於9的數
就是如圖所示的內容!
一個SQL 有好幾種解決方法,也可以寫成如下
在這兩個當中,讓我選的話,如果我是初學者 我會選擇第一個,因爲他可以無視JOIN之後的
結果重複性,具有通用性。但是如果我是中級以上的MySQL DBA我會選第二個,因爲我可以
熟練的掌握SQL,根據業務我會保證不會有重複值,因爲這樣更有利於性能優化,這裏涉及
一些執行計劃的分析,還有MySQL 特性問題,不再本系列討論範圍。
至於下面的SQL
雖然看似,也能得出正確的結果,但純粹是爲了得到結果而寫的沒有通用性,所以只是作爲
一個SQL多樣性,進行參考,沒有討論必要性。
謝謝大家~ 歡迎轉發
我是知數堂SQL 優化班老師~ ^^
如有關於SQL優化方面疑問和一起交流的請加 並且 @兔子@知數堂SQL優化
高性能MySQL,SQL優化羣 有葉金榮,吳炳錫 兩位大神坐鎮 :579036588
歡迎加入 知數堂大家庭。
從這期,開始還準備了,視頻,視頻地址在今日頭條,
https://www.ixigua.com/i6716134286379975176/
往期文章
1.比較有意思的SQL(1)
https://www.toutiao.com/i6707064970636427789/
2.有趣的SQL(2):兩個表沒連接條件的JOIN
https://www.toutiao.com/i6708876385844199940/
3.有意思的SQL(3) 行轉列,列轉行和複製
https://www.toutiao.com/i6711483799634444808/
4.有趣的SQL(4) 行轉列的複雜應用和優化思想
https://www.toutiao.com/i6712576799496208899/
5.SQL優化大神帶你寫有趣的SQL(5) 自定義變量的應用(1)
https://www.toutiao.com/i6713758942863819268/
大家關注下 頭條號 :SQL開發與優化
就可以看到相關視頻
葉老師的「MySQL核心優化」大課已升級到MySQL 8.0,掃碼開啓MySQL 8.0修行之旅吧
本文分享自微信公衆號 - 老葉茶館(iMySQL_WX)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。