有沒有小伙伴跟我一樣在自學SQL,自學數據分析的,+v: 35816146 一起學
我自學SQL在:http://xuesql.cn
6個易錯難點(節(jié)約大家的時間寫在最前面)
- 關于
year % 2 = 0這類奇怪算式,有沒有? -
left join和right join,左連接右連接左連接右連接,繞暈有嗎? -
group by為什么要加sum有沒有? -
a = (select x form table)括號里又有個SQL什么意思? - 求每一組的第一名,難倒了有嗎?
- 我把
like換成=為什么不行?有嗎?
開始
我用到自學SQL這個網站,我會把這幾個問題分別解析一下,截圖用到(http://xuesql.cn)

接下來
關于
year % 2 = 0這類奇怪算式
先看一個簡單的語句, select * from movies where year = 1998

注意我劃線的地方,
year=1998 表示用等號來判斷,再看上圖的結果,只篩選出1998這一條數據對吧。現在,改成 ,select * from movies where
year % 2 = 0
一樣要注意我劃線的地方,觀察數據,可以發(fā)現year都是偶數吧。
year % 2 = 0 不是year = 0,而是 year 除以2的余數為0 (也就是偶數)
left join和right join左右連接的區(qū)別
很多人會問左連接,右連接到底有啥區(qū)別,傻傻搞不清,對吧。
很大一個原因,因為實際數據字段很多,你被搞暈了而已。
我們從最簡單的兩個表開始,就很好懂
表a和表b,一定記住他們的數據

問: a join b on a.ID = b.ID結果是什么?
先不說左右,就說join。(不理解連接無法理解左右)

一定要注意標紅的1,3兩個數據對吧,join是啥意思?a和b都有ID請留下,所有字段合到一起。(那么2,4,5,7哪去了?)
join的意思就是只要你中有我,我中有你的1,3;還不懂,看看下面

紅色的是不是你中有我,我中有你。(ID的交集)
所以join,left join,right join,第一步是ID的選取啊,不了解這個怎么可能了解接下來的。
徹底明白了join, 我們再說說 left join
a lelt join b 注意,這里的left啥意思?以left為主,誰在left呢,a在left。
那以left為主又是啥意思?
還記得a里面的ID 2和4嗎?

直接看結果,以left為主,就是left表的都留下(留下了2,4)
a lelt join b a在left,就留下a的所有ID

所以!left join 是解決ID2,4無法在b中找到的問題(想想會不會有這樣的情況)
a right join b 什么意思?以right為主,誰在right,b在right
所以留下哪些ID?(1,3,5,7)
如何真的理解了,則可以回答下面的問題:
a left join b 和 b right join a一樣不一樣?
如果a,b都只有ID 1,3,請問a left join b 和 a right join b 一樣不一樣?
group by為什么要加sum
看一下例子數據

SELECT * FROM movies group by
Director;想想看,按Director分組之后,有幾條數據?
一下是不是想不出來?可以拆解為2步:
第一步:把所有在一組的圈出來

沒毛病吧,咱們手工也得這么做啊。
第二步:每一組只能留下1條
問題來了,超過1條的 Brad 和 John留下哪條呢?
下面是結果:SELECT * FROM movies group by Director;

仔細對比第一,第二步哦,發(fā)現留下是最后1條。
現在理解Group By的過程了嗎?不理解這個過程怎么可能理解sum呢
加上count試下
select *,count(*) from movies group by Director;
問:第一步變嗎?

第二步,count(*)怎么作用?

看到count
2 和5了嗎,我已經紅線標出了。count什么意思?把組內的(注意看第一步)數一數,有幾個就輸出幾。
不難理解吧(只是計數)
再加個sum
select ,count(),sum(Length_minutes) from movies group by Director;
第一步會變嗎?不會吧
第二步,sum(Length_minutes)什么意思?肯定是組內的計算對吧
算什么?算 Length_minutes的和(組內每一個加起來就是sum)

手工算一算,對嗎?
a = (select x form table)括號里又有個SQL
怎么select里還套一個select,一下搞暈了對吧。
比如:找電影產量最多的導演,最后一部電影信息

暈不暈?
直接人工找出 產量最多 的導演名字不就行了嗎?

這個不暈了吧。那為什么還要嵌套?

第二個和第一個結果是不是一樣,(select 'John Lasseter')結果不就是 John Lasseter
所以,select的結果可以出現在另一個select的條件里(子查詢)
這個不難理解,(select 'John Lasseter')實在太簡單了!
現在看第三個:

一定要注意我畫紅線的地方,第二和第三的結果一摸一樣對嗎?只是語句長短不一樣嘛。
現在可以看懂了嗎?
問題是:為什么要寫這么復雜?
如果表里新加了數據,產量最多的導演不是John Lasseter了? 你要重新數?
還是用這條復雜一點的SQL?(子查詢只是為了解決動態(tài)數據問題)
求每一組的第一名
Group By對吧,問題是怎么留下第一名呢?
還記得之前說的Group By默認留下誰嗎?(最后一條)
所以:怎么把第一名放到最后一條?

先排序,保證第一名在最后,然后再分組。
我把
like換成=為什么不行
有人說:select * from movies where title like 'Car %' 有數據。
怎么換成,select * from movies where title = 'Car %'就沒數據了?
問:假設有一個title內容是 “Car %”,注意哦,它內容里就有%,請問 = 'Car %'
可以嗎?用 like 'Car %' 呢?
為什么這個又可以了呢?
= 'Car %' 表示完全相同,因為內容里有 %,肯定相同啊
like 'Car %' 表示Car后面跟任何東西都可以 %當然可以啊
但是,如果Car 后面不是% 而是其他 xxx,like 和 = 效果還一樣嗎?
最后:
end:以上SQL可以在 http://xuesql.cn 執(zhí)行看效果