
五分鐘讓你學會 SQL(二)
咱們上回書說到,最基礎的 sql 查詢就是如此的簡單。沒有看到的可以看下曆史文章的上一篇。
今天,我們詳細了解下基本查詢模型
SELECT * FROM table
外的一些晉級語句,包括
WHERE
條件過濾、
oder by
排序、
group by
分組查詢、
limit
限制條數以及邏輯運算符以及一些并表查詢等文法
用的資料庫還是上文說到的那個我改造了一下的 U.S. County-Level Data ,下載下傳連結見上文付費部分。→_→
先了解下 SQL 中的邏輯運算符:
還有一個要知道的就是「%」,它在 SQL 裡代表的是通配符。
OK,我們先從條件過濾說起來,針對之前的資料加一下條件(
WHERE
),隻看 county 是 Snohomish 的。
SELECT
*
FROM covid_19_us
WHERE county LIKE 'Snohomish'
輸出:
是不是很神奇?我們還可以看 county 是 Snohomish 和 Cook 的:
SELECT
*
FROM covid_19_us
WHERE county IN ( 'Snohomish','Cook','Orange')
輸出:
當然你還可以根據其他的條件,通過邏輯運算符進行不同的條件過濾。
我還想讓輸出的資料按照 data_uninx (這個字段内容是記錄建立的時間戳)進行倒序看最新的記錄,這就要用到
order by
排序了:
SELECT
*
FROM covid_19_us
WHERE county like 'Snohomish'
order by data_uninx desc
輸出:
這裡解釋下,
order by column DESC
代表的就是以 column 作為排序的依據,将其進行降序(
DESC
)排列,如果是升序排列的話,用
ASC
表示
對了,我還想看看這些資料中按照按照州(state)集合,看看各種的病例數和死亡數加總結果。這時候就要用到
group by
SELECT
state,
sum(cases),
sum(deaths)
FROM covid_19_us
group by state
輸出結果:
最後,這個資料将近 50w 行,從 1 月 1 日到 8 月 22 的全美資料都在這裡邊,一個是每次查詢耗時耗力,我隻想看最近的 5 條記錄怎麼呢?這時候就用到了
limit
。
SELECT
*
FROM covid_19_us
WHERE county like 'Snohomish'
order by data_uninx desc
limit 5
輸出結果:
好了,現在你基本可以開始進行查詢了,但是如果你隻掌握了這些最基礎的用法在工作中似乎還是無法實作「查詢自由」,因為我們在前邊的學習中,有一個重要的假設:所有資料都在一個表中,但在實際的業務系統中,這樣的資料表是很少存在的。為了性能上的一些考慮,一般系統都會進行分庫分表進行管理,比如一個商城可能包括了産品表、訂單表、使用者表,可是你要查詢某一個使用者買了多少東西,花了多少錢,每個東西的産品參數是什麼這類問題時就會涉及到跨越三個表去查詢。這時候我們就用到了跨表查詢的技能。也就是說我們為了檢索我們所需要的資料,将來自不同資料表的資料連接配接到一起。
聽起來複雜的樣子……
其實并不難,我們在上一篇文章中提到了「關系型資料庫」這個詞不知道你還有沒有印象,「關系型」資料庫最大的好處之一就是「關系」:表和表之間存在關系,我們可以通過「連接配接」(
join
)将它們連接配接到一起。
有
inner join
,
left join
,
right join
,
full join
等,我們用的比較多的是一般是
inner join
和
left join
。
其中
inner join
(等值連接配接)隻傳回兩個表中聯結字段相等的行
而
left join
(做連接配接)則是将左表(table1)傳回所有行,即使右表(table2)中沒有比對。如果右表中沒有比對則傳回 NULL。
right join
與
left join
正好相反,右表(table1)傳回所有行,即使左表(table1)中沒有比對。如果左表中沒有比對則傳回 NULL。
full join
則是不管左表(table1)還是右表(table2),隻要其中一個表中存在比對,則傳回結果,我們可以了解為是
left join
和
right join
結果的合集.
我們還是舉個例子:
SELECT
covid_19_us.state,
sum(covid_19_us.cases),
sum(covid_19_us.deaths),
us.state_abbr
FROM covid_19_us left join us on covid_19_us.state = us.state
where covid_19_us.state in ('Washington','Illinois','California')
group by covid_19_us.state,us.state_abbr
輸出結果:
ok,SQL 你學會了麼,重要的還是要練,隻看不練是沒有用的……
順便推薦一個線上 SQL 學習網站:sqlzoo,可以去這裡學習下,支援英文、日文、中文,不過中文是繁體中文。可以在上邊線上執行 sql 語句。
#About Me
張小璋,野蠻生長成世界500強企業供應鍊金融産品經理的法語畢業生。微信公衆号:張小璋碎碎念(ID:<a href="" target="_blank" rel="external nofollow" > SylvainZhang )。
一直在網際網路金融公司從事産品經理工作并負責網際網路金融産品線,深耕網際網路金融和區塊鍊領域。「PMCAFF」、「人人都是産品經理」專欄作家、「PmTalk」簽約作家。