零基礎如何學習SQL——了解select查詢語句

如果看這一篇文章對你來說都有些困難的話,你可以先閱讀我之前第一篇完全針對徹底零基礎的朋友所寫的文章,希望能幫助到你。知乎專欄-淺識SQL

學習SQL語句,如果你學會了select查詢語句,那麼你已經入門了,可以開始實戰練習,通過實戰查漏補缺;如果你還沒有掌握select查詢語句,那就算有人說你對SQL一竅不通,也完全不為過。

所以,是否掌握select語句,是SQL語句學習的一大分水嶺。

那麼,什麼是select語句呢?(又要祭出那句老話了,自己google去)

當然,我也會把我自己的理解說出來。

select語句,也就是查詢語句,是SQL語句中最基礎也是最常用的語句,通過使用select語句,你可以在資料庫中查詢到你想要查詢的數據。

select語句執行後,你的查詢結果會以表的形式顯示在結果框中。示例如下圖所示:

簡單的介紹說完了,我們進入今天的正題。

本次關於select語句的學習,將分為三點:

1. 配合select使用的常用語句

涉及語句: as / where / between / order by / distinct /null / top / like / union

2. 多表查詢語句

涉及語句: join / left join /right join

3. 分組查詢語句

涉及語句: group by / having

在本文中,將以下列五個表格數據作為示例說明:

本文所用軟體為SQL Server 2012,不同軟體之間的SQL語言存在些許的不同,請自行轉換為自己所用軟體的SQL語句。(SQL SELECT 語句鏈接中有不同軟體中SQL語句的差別,本文絕大部分使用的都是通用的SQL語句)

首先,請在你所用的資料庫中創建以上五個表格,建議剛學的朋友嘗試自己創建這五個表,有利於大家學習如何創建表,理解數據類型和如何新增數據等。

當然,大家也可以直接複製代碼至編譯窗口,由於代碼較長,所以不在文中顯示,請自行點擊進入鏈接直接複製題目代碼即可後複製代碼。

表格創建好了,那麼就正式開始select的學習。

一、配合select使用的常用語句

1 . as

使用 as 可以為表或者列(欄位)創建別名。

如示例圖中所示,兩段代碼都是查詢STUDENT表中的SNO,SNAME,SSEX 這三個欄位,而查詢二和查詢一不同的是,查詢二為student表創建了別名st,這樣,在整個查詢語句中,st就代表了student,所以"st.sno"就等同於"student.sno",同時,代碼將SNAME和SSEX兩個欄位分別賦予別名「學生姓名」和「學生性別」,所以在查詢二的查詢結果中,SNAME和SSEX也就自然顯示為「學生姓名」和「學生性別」了。

關於為表和欄位創建別名,在查詢語句中是極為常見並且極為便捷的,在後面的其他語句學習的示例中,我們將多次用到。

ps:

1). 代碼"student.sno"可以理解為「student表中的sno欄位」,"."這個點,大家當「的」去讀。因為這兩段代碼都只是在一個student表中查詢欄位,所以其實欄位前面的表名可以省略,正常來說,表名前面應該還有一個資料庫名,不過資料庫名就被我省略了。

2).SQL語句不區分大小寫。

3). 在語句中,as語句可以省略。

2. where 和 比較符

在select語句中使用where子句可以篩選數據。示例如下:

在示例中,通過where語句,我們查詢了所有學生中,性別為男的sno,snam和ssex三個欄位。大家也可以嘗試模仿查詢其中性別為「女」的學生信息。

where語句通常和比較符一起使用,如 =(等於)、< (小於)、> (大於)以及 >= (大於等於)等。關於where的使用,在鏈接SQL WHERE 子句中有較為詳細的說明。

大家可以嘗試查詢學號大於103的學生的所有信息。

3. between

between語句通常也是配合where語句進行使用,示例如下:

ps:between操作符中兩個邊界的數值都是內含的,也就是說這兩個值包含在查詢的篩選結果中。

4. order by

order by是一個用於排序的語句。使用方法如代碼所示

order by 欄位名 asc(升序) / desc(降序)

使用示例如下:

左邊的查詢一對student表中所有數據按照sno欄位從小到大升序排序顯示,查詢二則是降序排序顯示。

ps:升序時asc可以省略,即當order by 後沒有跟 asc 或者 desc 時,默認為升序 asc 。

5. distinct & null

如果在select語句中的select關鍵字後加上distinct,那麼就意味著重複值將被從列表中清除。所以distinct就相當於Excel中的去重功能。示例如下:

我們要查詢student表中的class欄位,有distinct的話,就好輸出所有的class數值,而當添加了distinct的話,則會將class數值中所有重複項都刪掉,只剩非重複項。

null實際上是空值的意思,因為我所準備的五個表中沒有null空值的數據,我嫌麻煩,就不在這裡進行示例演示了,大家可以點擊鏈接SQL NULL 值進行了解。

6. top

top用於限定返回結果集的數量,可以指定數量,也可以指定百分比,且top必須於order by語句配合使用。

如果用通俗點的方式說的話,top(2)就是選取排名前兩名的數據,而top(5%)就是選取排名前5%的數據,示例如下:

示例中按照學生成績排名倒序排名,然後選取了成績最高的前五名學生的信息,這是top語句的典型用法,大家也可以試試按照百分比選取。

7. like

like通常在where語句中與通配符一起使用,用於搜索列中的指定模式。

舉例說明,like可以搜索student表中中所有姓王的同學,或者couse課程表中所有編碼以「3-」開通的課程。示例如下:

示例查詢所有姓名為「王%」樣式的同學數據。

而代碼中的 % 就是通配符,通配符有 % ,_ ,[abc] , [^abc]等,大家可以自行點擊鏈接SQL通配符進行學習。

在這裡主要說明一下 % 和 _ 這兩個通配符。

%:代表任意0個或以上字元的字元串。

_ :下劃線,代表單個字元串。

自行理解。

8.union

unoin可以將兩個及以上的select語句查詢結果統一結合成一個。SQL UNION 和 UNION ALL 操作符

如果使用union,那麼結果中的重複行就被刪掉,如果使用union all,那麼就不會刪除重複行。示例如下:

示例中的union看起來用的毫無意義,這是必然的,畢竟我們的示例用表數量有限,這裡只是做個演示方便大家理解而已。在實際運用中,union還是非常常用的。

以上就是select語句在使用是經常配合使用的子語句介紹了,如果有疑問的話,可以在評論中留言。

二、多表查詢語句

很多時候,我們想要查詢的數據,並不是都存儲於一張表中的,而是存儲於多張表中,那麼我們改怎麼從多張表中查詢我們想要的數據呢?

情景一:如上圖所示,我們想要查詢成績排名前三的同學的學號(sno)、姓名(sname),性別(ssex),課程編號(cno)以及成績(degree),很明顯,這五個欄位,並不能在一張表中全部找到,而是存放於兩張表中的,那麼我們改怎麼從這兩張表中查詢到我們想要的這些數據呢?

方法是,運用 join 語句。SQL JOIN

join 用於根據兩個或多個表中的列之間的關係,從這些表中查詢數據。

我們先來看一下情景一中我們到底該如何編寫select語句,示例如下:

示例圖中亮綠色的內容為代碼注釋,代碼注釋是為了方便理解代碼而編寫的說明性文字,並不會被編譯執行。

所有的 join 語句,必須於 on 關鍵字(語句)配合使用。在on語句中,將指定哪些列被用來聯接(join)兩張表。

如果聯接三張表的話,就寫兩次join ... on ...,大家千萬記住,每一個 join 必然跟著一個 on 。

至於 left join 和 right join ,本來是打算好好說明一下的,不過讓我偷個懶,大家先根據鏈接自己學習一下吧SQL LEFT JOIN,過兩天我會把示例的圖片貼上來,嘿嘿。

對了,在實際工作的查詢中,通常使用left join比較多,至於為什麼,等你自己實踐就知道了,而且,學完本篇文章,我相信你也完全可以自己進行實踐了。

現在大家已經學會了一次在多張表中查詢自己想要的數據,離可以自己實踐已經越來越近了,現在只剩最後一步,那就是分組查詢。

三、分組查詢語句

1. group by

情景二:現在,我想要查詢所有學生在考試中的平均分,這該如何操作呢?

請大家嘗試一下,如何實現情景二的這個需求。

平均分不知道怎麼求?自己Google去,大家千萬要養成遇到自己不會的地方就自行搜索的好習慣,畢竟作為零基礎的初學者,在學習過程中一定會遇到很多的問題的,自行解決這些問題,可以加深學習的印象,提升自己自學的能力。

好吧,扯多了,以上就是求平均分的方法,掌握了求平均分的方法之後,我們嘗試實現情景二的需求。

出錯了,這麼完美的代碼怎麼會出錯呢?我看看看錯誤提示:

消息 8120,級別 16,狀態 1,第 2 行(顯示錯在哪裡)

選擇列表中的列 SCORE.SNO 無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。(顯示為什麼錯了)

根據錯誤提示提示我們,因為沒有聚合函數,『STUDENT.SNO』 無效,這是什麼原因呢?

因為求平均數的這個函數沒有錯,但是,系統不知道你這個平均數,是根據誰來求的,是根據學號?還是根據課程?還是根據其他諸如性別、班級等等。

系統無法判斷,他不知道這個平均數,到底是根據什麼求的平均數。

那麼既然找到的原因,那麼解決就好了,不知道,那就讓他知道嘛。

怎麼讓他知道?

通過 group by 語句SQL GROUP BY。

我們要查看每個學生的平均分,自然要根據學生學號來算平均分了,所以按下圖修改代碼:

以上,就是group by的用法了。

2. having

情景三:我想要知道哪些學生的平均分是高於80分的,平均分到底是多少。

哈哈,這個情景的需求,對於學過本篇第一部分的你來說,似乎完全沒有難度啊,果斷擼代碼:

有出錯了,為什麼會出錯呢?

看錯誤提示,where附近有語法錯誤,什麼語法錯誤呢?

其實,在SQL的語法中,當通過 group by 進行分組之後,就無法通過where語句來進行篩選了。

那麼,我們分組後想要進行篩選該怎麼辦呢?

用 havinng 語句SQL HAVING 子句。

當查詢用 group by 進行分組後,如果想要進行篩選,那麼只能通過 having 語句來進行篩選,讓我們將上面那個錯誤代碼中的 where 改成 having ,示例如下:

這一次,情景三中想要的結果,就順利顯示出來了。

在這裡再重新提醒一次,在查詢用 group by 分組後,無法再使用 where 語句進行篩選,而只能用 having 語句進行篩選。

關於 group by 和 having 的使用,在初期一定會出現非常多的問題,代碼出錯時,好好根據錯誤提示排查錯誤,耐心利用好Google搜索問題,多練多用自然會就會知道如何正確使用了。

本篇關於 select 語句的學習,就到這裡為止了,如果還有疑問或者文中哪裡有錯誤的話,還望大家直言指出,謝謝支持。

我開了一個知乎專欄-零基礎如何學習數據分析的專欄,屆時會將我自己學習的內容整理輸出在其中,希望能夠幫到一些跟我一樣零基礎想要自學的朋友們。感興趣的朋友也可以關注專欄,謝謝。

下期內容:

1. 整理自己近期實踐中遇到並解決了的問題。(這個我相信對於很多零基礎的朋友還是非常有幫助的,因為都是我自己實踐中遇到並且通過Google解決的,非常基礎但是又很重要。)

暫時只有這一個計劃,在後面一段實踐,可能會重點去學習一些資料庫的基礎理論知識,希望有了解的大神能夠提一些學習建議。謝謝大家。


推薦閱讀:

使用CUDA加速SQL查詢的研究狀況目前如何,未來的發展會怎樣?
Oracle資料庫在違章表裡面,怎麼找出30天內違章大於3次的人?
Python3 pandas如何加快SQL Server讀寫速度?
請教一個SQL,詳情請看問題補充?

TAG:SQL | 查询 | 数据分析 |