SQL自學常見6個易錯難點解析

有沒有小伙伴跟我一樣在自學SQL,自學數據分析的,+v: 35816146 一起學
我自學SQL在:http://xuesql.cn

6個易錯難點(節(jié)約大家的時間寫在最前面)
  • 關于 year % 2 = 0 這類奇怪算式,有沒有?
  • left joinright join,左連接右連接左連接右連接,繞暈有嗎?
  • group by為什么要加 sum 有沒有?
  • a = (select x form table) 括號里又有個SQL什么意思?
  • 求每一組的第一名,難倒了有嗎?
  • 我把 like 換成 = 為什么不行?有嗎?
開始

我用到自學SQL這個網站,我會把這幾個問題分別解析一下,截圖用到(http://xuesql.cn

自學SQL

接下來

關于 year % 2 = 0 這類奇怪算式

先看一個簡單的語句, select * from movies where year = 1998

image.png

注意我劃線的地方,year=1998 表示用等號來判斷,再看上圖的結果,只篩選出1998這一條數據對吧。
現在,改成 ,select * from movies where year % 2 = 0
image.png

一樣要注意我劃線的地方,觀察數據,可以發(fā)現year都是偶數吧。
year % 2 = 0 不是year = 0,而是 year 除以2的余數為0 (也就是偶數)

left joinright join左右連接的區(qū)別

很多人會問左連接,右連接到底有啥區(qū)別,傻傻搞不清,對吧。
很大一個原因,因為實際數據字段很多,你被搞暈了而已。
我們從最簡單的兩個表開始,就很好懂
表a和表b,一定記住他們的數據


image.png

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

結果是這樣

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


image.png
紅色的是不是你中有我,我中有你。(ID的交集)

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

image.png

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

image.png

所以!left join 是解決ID2,4無法在b中找到的問題(想想會不會有這樣的情況)
a right join b 什么意思?以right為主,誰在right,b在right
所以留下哪些ID?(1,3,5,7)

如何真的理解了,則可以回答下面的問題:
a left join bb right join a一樣不一樣?
如果a,b都只有ID 1,3,請問a left join ba right join b 一樣不一樣?

group by為什么要加 sum

看一下例子數據

image.png

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

第一步:把所有在一組的圈出來


第一步

沒毛病吧,咱們手工也得這么做啊。

第二步:每一組只能留下1條
問題來了,超過1條的 BradJohn留下哪條呢?
下面是結果:SELECT * FROM movies group by Director;

第二步

仔細對比第一,第二步哦,發(fā)現留下是最后1條。

現在理解Group By的過程了嗎?不理解這個過程怎么可能理解sum
加上count試下
select *,count(*) from movies group by Director;
問:第一步變嗎?

第一步

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

第二步

看到count 25了嗎,我已經紅線標出了。
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,一下搞暈了對吧。

比如:找電影產量最多的導演,最后一部電影信息

image.png

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

第一個

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

第二個

第二個和第一個結果是不是一樣,(select 'John Lasseter')結果不就是 John Lasseter
所以,select的結果可以出現在另一個select的條件里(子查詢)

這個不難理解,(select 'John Lasseter')實在太簡單了!
現在看第三個:

第三個

一定要注意我畫紅線的地方,第二和第三的結果一摸一樣對嗎?只是語句長短不一樣嘛。
現在可以看懂了嗎?
問題是:為什么要寫這么復雜?
如果表里新加了數據,產量最多的導演不是John Lasseter了? 你要重新數?
還是用這條復雜一點的SQL?(子查詢只是為了解決動態(tài)數據問題)

求每一組的第一名

Group By對吧,問題是怎么留下第一名呢?
還記得之前說的Group By默認留下誰嗎?(最后一條)
所以:怎么把第一名放到最后一條?

image.png

先排序,保證第一名在最后,然后再分組。

我把 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í)行看效果

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,920評論 0 13
  • 50個常用的sql語句Student(S#,Sname,Sage,Ssex) 學生表Course(C#,Cname...
    哈哈海閱讀 1,334評論 0 7
  • 說明:以下五十個語句都按照測試數據進行過測試,最好每次只單獨運行一個語句。 問題及描述: --1.學生表 Stud...
    lijun_m閱讀 1,387評論 0 1
  • Student(S#,Sname,Sage,Ssex) 學生表 Course(C#,Cname,T#) 課程表 S...
    忘了呼吸的那只貓閱讀 3,037評論 0 8
  • 讀書人:布朗 書籍:《細米》 感受:這是我讀的曹文軒的第四本書。打開《細米》第一章,便寫道“稻香渡是坐落在大河邊上...
    科學家的奶奶閱讀 282評論 0 0

友情鏈接更多精彩內容