目錄
正文
數(shù)據(jù)來源: Parch & Posey 造紙公司
數(shù)據(jù)詳情: 銷售的紙張有三種:
- 普通紙 - Regular
- 海報(bào)紙 - Poster
- 高光銅版紙 - Glossy
實(shí)體關(guān)系圖(ERD)
實(shí)體關(guān)系圖 (ERD) 英文名為Entity Relationship Diagram, 是查看數(shù)據(jù)庫中數(shù)據(jù)的常用方式。下面是我們將用于 Parch & Posey 數(shù)據(jù)庫的 ERD评汰。每一個(gè)電子表格都會(huì)以一個(gè)表的形式呈現(xiàn), 這些圖可幫助你可視化正在分析的數(shù)據(jù)夺颤,包括:
- 表的名稱镣奋。
- 每個(gè)表中的列。
- 表配合工作的方式悉尾。
最上方為每個(gè)表的名稱.
下方的每行代表每個(gè)列名.
例如突那,region 表有兩列: id 和 name,而 web_events 表有四列
注意事項(xiàng)
在 Parch & Posey 數(shù)據(jù)庫中构眯,共有五個(gè)表(基本上是 5 個(gè)電子表格):
- web_events
- accounts
- orders
- sales_reps
- region
將這些表格連接在一起的 "crow's foot" 表示法顯示了一個(gè)表中的列與另一個(gè)表中的列之間的關(guān)聯(lián)愕难。在第一課中,你將學(xué)習(xí)使用 SQL 與單個(gè)表進(jìn)行交互的基礎(chǔ)知識(shí)惫霸。在下一節(jié)課中猫缭,你將進(jìn)一步了解這些連接對(duì)于使用 SQL 和關(guān)系數(shù)據(jù)庫的重要性。
練習(xí): ERD基礎(chǔ)知識(shí)
項(xiàng)目介紹
對(duì)于這些課程結(jié)束時(shí)的項(xiàng)目壹店,將下載一個(gè)程序饵骨,在本地計(jì)算機(jī)上編寫代碼。然后茫打,通過查詢數(shù)據(jù)庫,使用與一家音樂店鋪相關(guān)聯(lián)的數(shù)據(jù)來分析和回答商業(yè)問題妖混。
課程大綱
此課程的三節(jié)課旨在介紹 SQL 的以下方面:
SQL 基礎(chǔ)知識(shí)
- 了解 SQL 的工作原理
- 學(xué)習(xí) SQL 語言的基礎(chǔ)知識(shí)
- 學(xué)習(xí)如何編寫代碼
- 與在 Excel 中分析的表類似的表進(jìn)行交互
SQL 連接
- 認(rèn)識(shí)實(shí)體關(guān)系圖 (ERD)
- 如何連接關(guān)系數(shù)據(jù)庫中的多個(gè)表
SQL 聚合
- 能夠匯總數(shù)據(jù)庫中多個(gè)表中的數(shù)據(jù)老赤。
簡(jiǎn)介
深入學(xué)習(xí)編寫 SQL 查詢之前,我們先來看看什么使 SQL 和利用 SQL 的數(shù)據(jù)庫這么受歡迎制市。
我認(rèn)為將 SQL 視為一種語言還是很重要的抬旺。因此,SQL 的最后一個(gè)字是語言祥楣。SQL 可用于我們?cè)谶@節(jié)課中使用的數(shù)據(jù)庫以外的任何方面开财。也就是說,SQL 最受歡迎的功能是與數(shù)據(jù)庫交互误褪。在這節(jié)課中责鳍,你可以將數(shù)據(jù)庫看作一堆位于一個(gè)地方的 excel 電子表格。但并不是所有數(shù)據(jù)庫都是放在一個(gè)地方的一堆 excel 電子表格兽间,不過在這節(jié)課中历葛,這個(gè)解釋是合理的。
為什么數(shù)據(jù)分析師也用 SQL嘀略?
世界上許多數(shù)據(jù)都存儲(chǔ)在數(shù)據(jù)庫中,而世界上絕大多數(shù)數(shù)據(jù)庫都是通過結(jié)構(gòu)化查詢語言(Structured Query Language)來訪問的,而結(jié)構(gòu)化語言通常稱為SQL,讀作/'es kju 'el/, 該語言自20世紀(jì)70年代就有了,如今它已成為最常用的數(shù)據(jù)和數(shù)據(jù)庫訪問方式.
SQL有各種各樣的函數(shù)能夠讓用戶瀏覽,操作和修改數(shù)據(jù), 使用傳統(tǒng)關(guān)系數(shù)據(jù)庫與 SQL 交互有一些主要優(yōu)點(diǎn)恤溶。
最明顯的 5 個(gè)優(yōu)點(diǎn)是:
- SQL 很容易理解。
- 傳統(tǒng)的數(shù)據(jù)庫允許我們直接訪問數(shù)據(jù)帜羊。
- 傳統(tǒng)的數(shù)據(jù)庫可使我們審核和復(fù)制數(shù)據(jù)咒程。
- SQL 是一個(gè)可一次分析多個(gè)表的很好工具。
- 相對(duì)于 Google Analytics 等儀表板工具讼育,SQL 可使我們分析更復(fù)雜的問題帐姻。
SQL 與 NoSQL
你可能聽說過 NoSQL稠集,它表示 Not only SQL(不僅僅是 SQL)。使用 NoSQL 的數(shù)據(jù)庫時(shí)卖宠,你編寫的數(shù)據(jù)交互代碼會(huì)與本節(jié)課所介紹的方式有所不同巍杈。NoSQL 更適用于基于網(wǎng)絡(luò)數(shù)據(jù)的環(huán)境,而不太適用于我們現(xiàn)在要介紹的基于電子表格的數(shù)據(jù)分析扛伍。最常用的 NoSQL 語言之一是 MongoDB筷畦。Udacity 上有一個(gè)關(guān)于 MongoDB 的完整課程,你可以免費(fèi)觀看 此處刺洒,但這些不是這個(gè)程序的重點(diǎn)內(nèi)容鳖宾。
為什么企業(yè)選擇使用 SQL?
以Twitter為例,每次寫下一條推文,這條推文就需要存儲(chǔ)到某個(gè)地方,這樣才能讓我所有的粉絲看到,Twitter存儲(chǔ)了大量關(guān)于我推文的消息,例如時(shí)間,作者.如果我是在回復(fù)或是在轉(zhuǎn)發(fā),那么所有相關(guān)的推文鏈接也會(huì)被存儲(chǔ)起來,這些信息會(huì)用于決定誰能夠看到我的推文以及他們看到推文的時(shí)間,這就是數(shù)據(jù)庫的功能, 數(shù)據(jù)庫存儲(chǔ)信息,以便之后訪問,而SQL這門語言允許分析師及其他人訪問這些信息.
為什么企業(yè)喜歡使用數(shù)據(jù)庫
- 數(shù)據(jù)庫有大量屬性可以很好地 完成這個(gè)任務(wù),最重要的是,數(shù)據(jù)庫做了很多工作來檢查數(shù)據(jù)完整性, 數(shù)據(jù)完整新能夠確保被鍵入的數(shù)據(jù)符合條件且保持一致性,如下圖.
- 可以快速訪問數(shù)據(jù) - SQL 可使我們從數(shù)據(jù)庫中快速獲取結(jié)果逆航。 可以優(yōu)化代碼鼎文,快速獲取結(jié)果
- 可以很容易共享數(shù)據(jù) - 多個(gè)人可以訪問存儲(chǔ)在數(shù)據(jù)庫中的數(shù)據(jù),所有訪問數(shù)據(jù)庫的用戶獲得的數(shù)據(jù)都是一樣因俐。
數(shù)據(jù)庫如何存儲(chǔ)數(shù)據(jù)
特點(diǎn)
- 數(shù)據(jù)庫表與Excel表類似, 但有些更嚴(yán)格的規(guī)則. 以數(shù)據(jù)庫表為例, 該表有列組成, 每列必須有獨(dú)一無二的列名或描述性列名.
- Excel中每個(gè)單元格都能有自己的數(shù)據(jù)類型. 但是數(shù)據(jù)庫表中, 一列中的所有數(shù)據(jù)都必須有相同的類型, 將整個(gè)列認(rèn)為是定量離散的或是某種字符串拇惋。這說明如果特定列中有一行字符串,那么整個(gè)列可能會(huì)更改為文本數(shù)據(jù)類型抹剩。
數(shù)據(jù)庫類型
SQL 數(shù)據(jù)庫
數(shù)據(jù)庫的類型有很多撑帖,都用于不同的用途。在本課中澳眷,我們將使用 Postgres胡嘿,這是一個(gè)流行的開源數(shù)據(jù)庫,具有非常完整的分析函數(shù)庫钳踊。
一些最受歡迎的數(shù)據(jù)庫包括::
- MySQL
- Access
- Oracle
- Microsoft SQL Server
- Postgres
你也可以在其他編程框架中編寫 SQL衷敌,如 Python、Scala 和 HaDoop拓瞪。
細(xì)微差別
這些 SQL 數(shù)據(jù)庫中的每一個(gè)可能在語法和可用函數(shù)上存在細(xì)微差異 -- 例如缴罗,MySQL 中沒有像 Postgres 中類似的可用于修改日期的函數(shù)。你在 Postgres 中看到的大部分直接適用于在其他框架中和數(shù)據(jù)庫環(huán)境中使用 SQL吴藻。如需了解存在的差異瞒爬,可查看文檔。大多數(shù) SQL 環(huán)境都有很好的在線文檔沟堡,通過快速的 Google 搜索便可輕松訪問.
語句(Statement)類型
何為語句(Statement)
- 語句會(huì)告訴數(shù)據(jù)庫你想對(duì)數(shù)據(jù)進(jìn)行何種操作.
- SQL 語句是可以讀取和處理數(shù)據(jù)的代碼侧但。但這不是一個(gè)真正的句子。
- SQL 不區(qū)分大小寫 - 這意味著可以在代碼中的任何位置寫入大寫和小寫航罗。
- 另外禀横,還可以使用分號(hào)結(jié)束 SQL 語句,但某些 SQL 環(huán)境結(jié)尾時(shí)不需要分號(hào)粥血。
例如:
- CREATE TABLE 是一個(gè)在數(shù)據(jù)庫中創(chuàng)建新表的語句柏锄。
- DROP TABLE 是刪除數(shù)據(jù)庫中表的語句酿箭。
但是大多數(shù)數(shù)據(jù)分析工作并不需要?jiǎng)?chuàng)建以及刪除數(shù)據(jù), DROP 和 CREATE 語句實(shí)際上會(huì)更改數(shù)據(jù)庫中的數(shù)據(jù)。在大多數(shù)公司趾娃,分析師沒有權(quán)限使用這些類型的語句缭嫡。這是一個(gè)不錯(cuò)的規(guī)定 - 原因是實(shí)際上更改數(shù)據(jù)庫中的數(shù)據(jù)是一件需要很大權(quán)限的事情. 通常僅數(shù)據(jù)庫管理員具有這個(gè)權(quán)限. 分析工作需要的是操作和瀏覽數(shù)據(jù), 只是偶爾才會(huì)更新基礎(chǔ)數(shù)據(jù)源.
SELECT 語句
SELECT 讀取并顯示數(shù)據(jù)。我們將這稱為查詢(Queries)抬闷。
兩種用于每個(gè)查詢的語句
SELECT用于提醒查詢要返回哪些列妇蛀。列命由逗號(hào)隔開, 最后一個(gè)列名后無需加逗號(hào), 也可以使用
*
選取所有列FROM用于提醒查詢?cè)谀膫€(gè)表中查詢。注意笤成,這個(gè)表中需要有列评架。
SELECT
& FROM
稱為子句, 有些子句是非必須語句, 但是SELECT
,FROM
皆為必須項(xiàng),
Q: 生成一張列表如下圖, 記錄Parch & Posey曾接下的所有訂單, 該公司把訂單記錄在一張叫Orders(訂單)的表里, 每筆訂單都有唯一的ID, 可用于索引,還有一個(gè)時(shí)間戳, 記錄了下訂單的時(shí)間, 還包括每種紙的銷售數(shù)量和所得營(yíng)收.
A:
SELECT * FROM demo.orders
規(guī)定查詢格式
大寫
大寫命令(SELECT
、FROM
)炕泳,小寫查詢中的其他內(nèi)容是常見做法纵诞。這使得查詢更容易讀取,這在編寫更復(fù)雜的查詢時(shí)更為重要培遵。準(zhǔn)備編寫查詢時(shí)浙芙,這是一個(gè)很好的習(xí)慣。
表和變量名中不需要空格
通常在列名中使用下劃線籽腕,避免使用空格茁裙。 在 SQL 中使用空格有點(diǎn)麻煩。 在 Postgres 中节仿,如果列或表名稱中有空格,就需要使用雙引號(hào)括住這些列/表名稱(例如:FROM \"Table Name\"
掉蔬,而不是 FROM table_name
)廊宪。在其他環(huán)境中,可能會(huì)使用方括號(hào)(例如:FROM [Table Name]
)女轿。
在查詢中使用空格
SQL 查詢忽略空格箭启,因此可以根據(jù)需要在代碼之間添加盡可能多的空格和空行,并且查詢結(jié)果是相同的蛉迹。我們來看下面這個(gè)查詢
SELECT account_id FROM orders
等價(jià)于這個(gè)查詢:
SELECT account_id
FROM orders
SQL 不區(qū)分大小寫
如果你已經(jīng)使用過其他語言編程傅寡,那么可能會(huì)熟悉編程語言,如果沒有區(qū)分大小寫鍵入正確的字符北救,那么會(huì)非常麻煩荐操。 SQL 不區(qū)分大小寫。 我們來看看下面的查詢:
SELECT account_id FROM orders
和這個(gè)相同:
select account_id from orders
也和這個(gè)相同:
SeLeCt AcCoUnt_id FrOm oRdErS
但是珍策,我會(huì)再次提醒你遵循上面講述的完全大寫命令的慣例托启,而將其他代碼片段小寫。
分號(hào)
根據(jù) SQL 環(huán)境攘宙,查詢結(jié)尾可能需要一個(gè)執(zhí)行的分號(hào)屯耸。 這個(gè)"要求"在其他環(huán)境中比較靈活拐迁。我們認(rèn)為在每個(gè)語句的末尾添加一個(gè)分號(hào)是最好的做法,如果環(huán)境能夠一次顯示多個(gè)結(jié)果疗绣,那么這樣做還可以一次運(yùn)行多個(gè)命令线召。
最好的做法:
SELECT account_id FROM orders;
因?yàn)椋覀冞@里的環(huán)境不需要分號(hào)多矮,你會(huì)看到?jīng)]有分號(hào)的解決方案:
SELECT account_id FROM orders
LIMIT語句
大多數(shù)時(shí)候只是看一下數(shù)據(jù)的前幾行, 以便了解自己真正關(guān)心哪些字段, 以及相對(duì)這些字段執(zhí)行什么操作.
假設(shè), 如果你想看一下離開Posey網(wǎng)站的流量, 那么首先就是弄清楚網(wǎng)站流量表里存儲(chǔ)了什么數(shù)據(jù), 如果想要查看表的前幾行時(shí)缓淹,LIMIT 語句就能派上用場(chǎng)。這可比加載整個(gè)數(shù)據(jù)集要快得多工窍。
LIMIT 命令始終是查詢的最后一部分割卖。下面的例子僅顯示訂單表的前 10 行和所有列:
SELECT *
FROM orders
LIMIT 10;
可以通過將 10 更改為任何其他數(shù)字來更改行數(shù)。
ORDER BY 語句
Q1: 假設(shè)你是Parch & Posey財(cái)務(wù)部的職員, 你想查看最新訂單來確認(rèn)發(fā)票已經(jīng)發(fā)給了相關(guān)顧客, 此時(shí)ORDER BY 語句可以實(shí)現(xiàn)該操作. 可以使用ORDER BY按日期對(duì)訂單進(jìn)行排序.
ORDER BY 語句可使我們按任意行排序表患雏。如果熟悉 Excel鹏溯,這與使用過濾器進(jìn)行排序相似。
ORDER BY 語句始終在 SELECT 和 FROM 語句之后淹仑,但位于 LIMIT 語句之前丙挽。 學(xué)習(xí)其他命令時(shí),這些語句的順序?qū)⒏鼮橹匾?如果使用 LIMIT 語句匀借,它將始終顯示在最后颜阐。
SELECT *
FROM demo.orders
ORDER BY occurred_at
LIMIT 10;
可以在 ORDER BY 語句中的列之后添加 DESC,然后按降序排序吓肋,因?yàn)槟J(rèn)是按升序排序的
SELECT *
FROM demo.orders
ORDER BY occurred_at DESC
LIMIT 10;
Q2: 假設(shè)你想按賬戶(account)對(duì)結(jié)果進(jìn)行排序, 然后每個(gè)賬戶里,把訂單按從大到小排序, 找出每個(gè)賬戶最大的一筆訂單是什么?
你可以對(duì)多個(gè)列使用ORDER BY 從而實(shí)現(xiàn)該操作,排序?qū)戳忻麑懴碌南群筮M(jìn)行, 因此對(duì)于上述問題, 可以先給account_id 和 total_amt_usd進(jìn)行排序, 然后對(duì)結(jié)果降序,那么最大值就會(huì)出現(xiàn).
A:
SELECT account_id, total_amt_usd
FROM orders
ORDER BY account_id, total_amt_usd DESC
如果先對(duì)total_amt_usd進(jìn)行降序, 在對(duì)account_id進(jìn)行排序, 那么此時(shí)得到的結(jié)果的第一條值應(yīng)該是最大金額數(shù)所對(duì)應(yīng)的id,因此ORDER BY 后面的排序是按照順序進(jìn)行的.
SELECT account_id, total_amt_usd
FROM orders
ORDER BY total_amt_usd DESC, account_id
問題
1.編寫一個(gè)查詢凳怨,返回按從最新到最早排序的 訂單 中的前 5 行,但需首先列出每個(gè)日期的最大 total_amt_usd是鬼。
SELECT *
FROM orders
ORDER BY total_amt_usd DESC, occurred_at DESC
LIMIT 5;
2.編寫一個(gè)查詢肤舞,返回按從最早到最新排序的 訂單 中的前 10 行,但需首先列出每個(gè)日期的最小 total_amt_usd
SELECT *
FROM orders
ORDER BY total_amt_usd, occurred_at
LIMIT 10;
WHERE語句
假設(shè)你是Parch & Posey的客戶經(jīng)理, 想要了解客戶最近的所有訂單, 可以用WHERE 子句生成列表, 列出那位客戶的所有訂單.
WHERE子句能夠讓你用一些具體的標(biāo)準(zhǔn)來篩選一系列結(jié)果就像在Excel里用的篩選(filter)功能, 不過用WHERE 篩選功能,能回答更有意義的問題.
WHERE子句的順序
WHERE子句位于FROM后, 但是在ORDER BY或LIMIT前.
作為客戶經(jīng)理, 你要寫一個(gè)查詢, 僅呈現(xiàn)高級(jí)客戶的訂單, 在這里以賬戶ID 4251來表示.
SELECT *
FROM demo.orders
WHERE account_id = 4251
ORDER BY occurred_at
LIMIT 1000
注意: 如果你寫一個(gè)WHERE 子句,根據(jù)一列的值來篩選數(shù)據(jù),就像我們?cè)谶@里做的,結(jié)果只呈現(xiàn)滿足條件的行, 背后的原理就是每一行都是一個(gè)數(shù)據(jù)點(diǎn)或觀察數(shù)據(jù), 該行所包含的所有信息是一個(gè)整體, 在這里,一行里的所有信息都與一筆紙張訂單有關(guān)
WHERE 語句中使用的常用符號(hào)包括:
- >(大于)
- <(小于)
- >=(大于或等于)
- <=(小于或等于)
- =(等于)
- !=(不等于)
問題
編寫一個(gè)查詢
1.從訂單表提取出大于或等于 1000 的 gloss_amt_usd 美元數(shù)額的前五行數(shù)據(jù)(包含所有列)
SELECT *
FROM orders
WHERE gloss_amt_usd >= 1000
LIMIT 5;
2.從訂單表提取出小于 500 的 total_amt_usd美元數(shù)額的前十行數(shù)據(jù)(包含所有列)
SELECT *
FROM orders
WHERE total_amt_usd < 500
LIMIT 10;
你會(huì)注意到我們?cè)谑褂眠@些 WHERE 語句時(shí)均蜜,不需要 ORDER BY李剖,除非要實(shí)際整理數(shù)據(jù)。不必對(duì)數(shù)據(jù)進(jìn)行排序囤耳,仍可繼續(xù)執(zhí)行條件篙顺。
WHERE 與非數(shù)字?jǐn)?shù)據(jù)一起使用
比較運(yùn)算符處理非值數(shù)據(jù)時(shí), 等于和不等于形成了閉集,能讓你挑選匹配或不匹配任意值的行.
如果你使用的運(yùn)算符值為非值, 那你得用單引號(hào)(單引號(hào)或雙引號(hào)都可以 - 如果原始文本中有引號(hào),就一定要注意)把值括起來
Q: 過濾賬戶(accounts )表格充择,從該表格中篩選出 Exxon Mobil 的 name德玫、website 和 primary point of contact (primary_poc)。
SELECT name, website, primary_poc
FROM accounts
WHERE name = 'Exxon Mobil';
算術(shù)運(yùn)算符
假設(shè)我們要計(jì)算非標(biāo)準(zhǔn)紙張銷售數(shù)量, 我們先來看看訂單表中的每列的訂單數(shù)量
海報(bào)紙和高光銅版紙為非標(biāo)準(zhǔn)紙, 因此為了達(dá)到目的我們需要將這兩種紙張的訂單量加在一起, 為非標(biāo)準(zhǔn)紙創(chuàng)建一列.
將現(xiàn)有的列組合,生成的新列稱為派生列.
派生列可以由簡(jiǎn)單的算術(shù)或任意數(shù)量的高級(jí)運(yùn)算得出, 我們可以把列名稱換成更具描述性的名字, 要做到這一點(diǎn), 我們可以生成派生列的那一行最后加上AS, 描述性名稱不要用大寫字母或空格比如該例子中可以使用nonstandard_qty(非標(biāo)準(zhǔn)紙張數(shù)量)
常見運(yùn)算包括:
- *(乘法)
- +(加法)
- -(減法)
- /(除法)
注意運(yùn)算順序以及括號(hào)的運(yùn)用.
邏輯運(yùn)算符
邏輯運(yùn)算符包括:
- LIKE
可用于進(jìn)行類似于使用 WHERE 和 = 的運(yùn)算椎麦,但是這用于你可能不知道自己想準(zhǔn)確查找哪些內(nèi)容的情況化焕。 - IN
用于執(zhí)行類似于使用 WHERE 和 = 的運(yùn)算,但用于多個(gè)條件的情況 - NOT
這與 IN 和 LIKE一起使用铃剔,用于選擇 NOT LIKE 或 NOT IN 某個(gè)條件的所有行撒桨。 - AND & BETWEEN
可用于組合所有組合條件必須為真的運(yùn)算查刻。 - OR
可用于組合至少一個(gè)組合條件必須為真的運(yùn)算。
LIKE語句
假設(shè)你是Parch&Posey的互聯(lián)網(wǎng)營(yíng)銷經(jīng)理, 你希望確定通過谷歌頁面進(jìn)來的網(wǎng)站流量.
如上圖所示, 來自谷歌的引用頁URL, 全都有相同的域名, 但往往還跟著一堆冗余的東西.
此時(shí)如果使用WHERE referrer_url = 'http://www.google.com'
,并不會(huì)得到結(jié)果.因此如果要寫出一行篩選代碼抓取所有來自谷歌的流量,而不受地址尾部冗余信息影響的話, 你可以使用LIKE運(yùn)算符.
如果在給定列中, 有很多相似,但又有些不同的值, LIKE運(yùn)算符就會(huì)很有用. LIKE函數(shù)需要使用通配符, 在這我們用的通配符是百分號(hào)%, % 匹配任何數(shù)量的字符凤类,產(chǎn)生一組特定的字符或者遵循一組特定的字符, 記住穗泵,需要用單引號(hào)或雙引號(hào)將傳達(dá)給 LIKE 運(yùn)算符的文本括住,因?yàn)檫@個(gè)字符串中的大小寫字母不一樣谜疤。 搜索 'T' 與搜索 't' 不同佃延。
SELECT *
FROM demo.web_events_full
WHERE referrer_url LIKE '%google%';
1.使用 accounts (客戶) 表查找所有以 'C' 開頭公司名。
SELECT name
FROM accounts
WHERE name LIKE 'C%';
2.名稱中包含字符串 'one' 的所有公司名夷磕。
SELECT name
FROM accounts
WHERE name LIKE '%one%';
3.所有以 's' 結(jié)尾的公司名履肃。
SELECT name
FROM accounts
WHERE name LIKE '%s';
IN語句
假設(shè)你是Parch&Posey的銷售經(jīng)理, 你想看看若干重點(diǎn)賬戶的表現(xiàn).比如你只想看沃爾瑪和蘋果公司賬戶的信息.
IN函數(shù)能讓你根據(jù)若干可能值來篩選數(shù)據(jù), 對(duì)于非值數(shù)據(jù), 要用引號(hào)括起來, 對(duì)于值數(shù)據(jù), 則可直接輸入.比如,要實(shí)現(xiàn)如上問題,語句如下.
SELECT *
FROM demo.accounts WHERE name IN ('Walmart', 'Apple')
其中在括號(hào)內(nèi)可以放多個(gè)值, 但在不同的值之間, 你都得輸入一個(gè)逗號(hào).
1.使用 客戶 表查找 Walmart、Target 和 Nordstrom 的name (客戶名稱), primary_poc (主要零售店), and sales_rep_id (銷售代表 id)坐桩。
SELECT name, primary_poc, sales_rep_id
FROM accounts
WHERE name IN ('Walmart','Target','Nordstrom');
2.使用 web_events 表查找有關(guān)通過 organic 或 adwords 聯(lián)系的所有個(gè)人信息尺棋。
SELECT *
FROM web_events
WHERE channel IN ('organic','adwords');
NOT語句
假設(shè)你是Parch&Posey的銷售經(jīng)理, 你在考慮把兩位最出色得銷售代表提升為管理人員, 但你需要弄清楚, 如何將他們所有得賬戶, 分?jǐn)偨o其他銷售代表.
要實(shí)現(xiàn)上述問題, 首先看看Parch&Posey共有多少賬戶, 現(xiàn)在來看看這兩位高業(yè)績(jī)銷售代表經(jīng)手得賬戶.
要決定把這些賬戶指派給誰, 還需要考慮其他銷售代表手頭正在處理得賬戶, 也就是說你要查看所有, 現(xiàn)在這個(gè)查詢里沒有列出得賬戶, NOT運(yùn)算符可以實(shí)現(xiàn)上述過程.NOT 運(yùn)算符是一個(gè)非常有用的運(yùn)算符,用于與之前介紹的兩個(gè)運(yùn)算符 IN 和 LIKE 一起運(yùn)算绵跷。通過指定 NOT LIKE 或 NOT IN膘螟,我們可以查找到所有不符合特定條件的行。
示例1
SELECT sales_rep_id, name
FROM demo.accounts
WHERE sales_rep_id NOT IN (321500,321570) ORDER BY sales_rep_id
示例2
SELECT *
FROM demo.web_events_full
WHERE referrer_url NOT LIKE %google%
AND和BETWEEN語句
假設(shè)你是Parch&Posey的銷售經(jīng)理, 你想知道哪些客戶不久前買過紙張, 而且現(xiàn)在又差不多到時(shí)間采購了, 假設(shè)現(xiàn)在是2017年1月,你可能想查看那些之前3到9個(gè)月采購過紙張的客戶, 也就是在2016年的4月到10月之間.
要實(shí)現(xiàn)以上操作, 可以使用AND. AND 運(yùn)算符用于 WHERE 語句中碾局,用于一次考慮多個(gè)邏輯子句荆残。 使用 AND 連接一個(gè)新的語句時(shí),需要指定你感興趣的列净当∧谒梗可以同時(shí)連接盡可能多的考慮語句。
SELECT *
FROM orders
WHERE occurred_at >= '2016-04-01' AND occurred_at <= '2016-10-01'
ORDER BY occurred_at DESC;
需要注意的是AND運(yùn)算符能運(yùn)行兩個(gè)完整的獨(dú)立的邏輯語句, 雖然它們都在同一列名下運(yùn)行, 但我們不能只輸入WHERE occurred_at >= '2016-04-01 'AND <='2016-10-01'
, 因?yàn)?code><='2016-10-01'并不是一個(gè)邏輯語句,無法評(píng)估真假, 查詢結(jié)果會(huì)報(bào)錯(cuò).
BETWEEN 運(yùn)算符
有時(shí)使用 BETWEEN 比使用 AND 使語句更清楚一些像啼。特別是在 AND 語句的不同部分使用相同的列時(shí)嘿期,就可以使語句比較清晰。 在上一個(gè)視頻中埋合,我們可能已經(jīng)使用了BETWEEN。
而不是編寫:
WHERE column >= 6 AND column <= 10
編寫成以下這樣萄传,或許會(huì)更好:
WHERE column BETWEEN 6 AND 10
1.編寫一個(gè)查詢甚颂,返回所有訂單,其中 standard_qty 超過 1000秀菱,poster_qty 是 0振诬,gloss_qty 也是 0。
SELECT *
FROM orders
WHERE standard_qty > 1000 AND poster_qty = 0 AND gloss_qty = 0;
2.使用客戶表查找所有不以 'C' 開始但以 's' 結(jié)尾的公司名衍菱。
SELECT name
FROM accounts
WHERE name NOT LIKE 'C%' AND name LIKE '%s';
3.使用 web_events 表查找通過 organic 或 adwords 聯(lián)系赶么,并在 2016 年的任何時(shí)間開通帳戶的個(gè)人全部信息,并按照從最新到最舊的順序排列脊串。
SELECT *
FROM web_events
WHERE channel IN ('organic','adwords') AND occurred_at BETWEEN '2016-01-01' AND '2017-01-01'
ORDER BY occurred_at DESC;
OR語句
假設(shè)你是Parch&Posey的銷售經(jīng)理, 你想出了另一個(gè)好辦法來提高營(yíng)收, 向既有客戶銷售新的紙張種類, 為了找出最佳的潛在客戶, 你想查看哪些沒訂過某種紙的既有客戶, 不同類型紙張的訂單, 在訂單表里有三個(gè)不同的列標(biāo)出, 所以你需要寫一個(gè)查詢, 對(duì)這三列進(jìn)行邏輯比較.
為了實(shí)現(xiàn)上述操作, 你可以使用OR, OR是SQL里的邏輯運(yùn)算符, 可用于選擇滿足兩個(gè)條件之一的行. 與 AND 運(yùn)算符類似辫呻,OR 運(yùn)算符可以組合多個(gè)語句清钥。 使用 OR 連接新的語句時(shí),需要指定你感興趣的列放闺∷钫眩可以同時(shí)連接盡可能多的考慮語句。
SELECT account_id, occurred_at, standard_qty, gloss_qty, poster_qty
FROM orders
WHERE standard_qty = 0 OR gloss_qty = 0 OR poster_qty = 0
算術(shù)運(yùn)算符(+怖侦、*篡悟、-、/ ) 可以使用 OR 運(yùn)算符將 LIKE匾寝、IN搬葬、NOT、AND 和 BETWEEN邏輯連接到一起艳悔。將多個(gè)運(yùn)算組合到一起時(shí)急凰,可能經(jīng)常需要使用括號(hào)來確保我們要執(zhí)行的邏輯能得到正確執(zhí)行。
如果我要找出沒有同時(shí)包含三種紙張的訂單, 最佳潛在客戶可能是那些既沒有訂過某種紙張, 又是最近才下訂單的顧客.
保留之前查詢的篩選條件, 再查詢2016-10-01
之后的訂單, 查詢?nèi)缦?/p>
SELECT account_id, occurred_at, standard_qty, gloss_qty, poster_qty
FROM orders
WHERE (standard_qty = 0 OR gloss_qty = 0 OR poster_qty = 0)
AND occurred_at >= '2016-10-01'
1.查找 訂單 (orders) id 的列表很钓,其中 gloss_qty 或 poster_qty 大于 4000香府。只在結(jié)果表中包含 id 字段。
SELECT id
FROM orders
WHERE gloss_qty > 4000 OR poster_qty > 4000;
2.編寫一個(gè)查詢码倦,返回訂單 (orders) 的列表企孩,其中標(biāo)準(zhǔn)數(shù)量 (standard_qty)為零,光澤度 (gloss_qty) 或海報(bào)數(shù)量 (poster_qty)超過 1000袁稽。
SELECT *
FROM orders
WHERE standard_qty = 0 AND (gloss_qty > 1000 OR poster_qty > 1000);
3.查找以 'C' 或 'W' 開頭的所有公司名 (company names)勿璃,主要聯(lián)系人 (primary contact) 包含 'ana' 或 'Ana',但不包含 'eana'推汽。
SELECT *
FROM accounts
WHERE (name LIKE 'C%' OR name LIKE 'W%')
AND ((primary_poc LIKE '%ana%' OR primary_poc LIKE '%Ana%')
AND primary_poc NOT LIKE '%eana%')
概括
命令
語句 | 用法 | 其他詳情 |
---|---|---|
SELECT | SELECT Col1, Col2, ... | 提供你想要的列 |
FROM | FROM Table | 提供列存在的表 |
LIMIT | LIMIT 10 | 限制返回的行數(shù) |
ORDER BY | ORDER BY Col | 根據(jù)列對(duì)表排序补疑。與 DESC 一起使用。 |
WHERE | WHERE Col > 5 | 用于過濾結(jié)果的條件語句 |
LIKE | WHERE Col LIKE '%me% | 僅拉取文本中包含 'me' 的列 |
IN | WHERE Col IN ('Y', 'N') | 僅過濾包含 'Y' 或 'N' 列的行 |
NOT | WHERE Col NOT IN ('Y', "N') | NOT 經(jīng)常與 LIKE 和 IN 一起使用 |
AND | WHERE Col1 > 5 AND Col2 < 3 | 過濾兩個(gè)或多個(gè)條件必須為真的行 |
OR | WHERE Col1 > 5 OR Col2 < 3 | 過濾至少一個(gè)條件必須為真的行 |
BETWEEN | WHERE Col BETWEEN 3 AND 5 | 通常比使用 AND 的語法簡(jiǎn)單 |
其他提示
盡管 SQL 不區(qū)分大小寫(它不在乎你將語句全部大寫還是小寫)歹撒,但我們討論了一些最佳實(shí)踐莲组。關(guān)鍵詞的順序非常重要!