2021-04-05|閱讀時間 ‧ 約 10 分鐘

QUERY 函式大解析(一):基本原理與 SELECT

隆重介紹:QUERY 函式!
QUERY 是一個可以對大量資料查詢特定資訊,依據特定篩選條件快速回傳儲存格、欄、範圍的函式。
真的很好用!
這個函式用的語言為所謂的 Google Visualization API Query Language(Google 視覺化 API 搜尋語言),是 Google 開發的一個類似 SQL 搜尋的語言。如果你不曾聽過 SQL 也沒關係,在 Google 試算表上的應用算比較直覺了,不需要很複雜的巢狀語法、也不需要新學很多很多語法。
如果你平常已經在用 SQL 來搜尋、整理資料的話,恭喜你,你的 QUERY 已經學了一大半了;如果你剛從 Excel 轉到 Google 試算表的話,我也非常推薦你從頭開始學這個強力的函式。
我在方格子上寫了一系列使用 QUERY 的教學文章,也歡迎你來看看:
QUERY 函式大解析,系列文索引

優點

效率快
比起其他讀取資料的方法(如 IMPORTRANGE、直接用「=」參照等),QUERY 的執行時間大多可以在一眨眼間完成,就算有很大的資料,也可以輕易搜尋,效率很好。

維護容易
因為語法直覺,很快就能進行維護,如果需要更改語法也可以很直覺地編輯。

適合資料庫快速搜尋資訊、小型資料庫管理
在工作的時候 QUERY 可以幫助我快速統整資料!特別當資料會在試算表隨時變動的時候,QUERY 也會即時更新資訊,就像一個小型的資料庫一樣。如果只需要快速搜尋到一定的資訊、甚至掛上特定條件,也可以很快運算出來。

缺點

QUERY 輸出結果不能編輯
QUERY 和 FILTER、IMPORTRANGE 這類的函式一樣沒辦法直接對輸出結果編輯,而且如果結果覆蓋到輸出結果的話,會產生錯誤。
如果需要編輯的話,最理想還是可以透過原地貼上來解決、但如果資料筆數很大的話,可能就得再花其他手段來達成編輯的目標(例如下載成 .csv 後再匯入、輸出結果分段原地貼上、利用 QUERY 的 LIMIT 參數分段輸出後、再原地貼上等等)。

資料筆數(算)是有限制的
當搜尋的資料筆數太多,QUERY 就會稍稍變慢、效率就會和資料筆數成反比了,甚至連 Google 試算表本身也都會卡住。這時候可能還是用其他的資料庫軟體比較實在。

QUERY 輸出結果沒有格式
如果你在原本的資料範圍內有設定一些顏色、粗體、斜體、底線、字型等等的格式,QUERY 不會一起把這些設定輸出過來。格式這些東西如果真的有需要,可以用條件化格式稍稍美觀一下,或是等到資料都處理完畢後再來處理。

語法

非常地簡單:
=QUERY(資料, 查詢, [標題])
資料:查詢作業針對的儲存格範圍。
  • 這邊資料範圍有這三種資料格式:布林、數值(包含日期、時間)還有文字。
  • 如果資料範圍內的任一欄內有混合的資料格式,QUERY 會以主要的資料類型進行判斷,次要的資料類型會被視為空值。如果這樣的資料被視為空值的話,資料有可能會失準。 在進行 QUERY 前最好確保每個欄位的資料格式都是一致、該有的樣子。例如說我有個欄位應該要存放「金額」,資料格式應該是要是數值才對,如果包含其他格式(如布林值、時間)的話就不會被正確讀取到。
查詢:想要查詢的 Google 視覺化 API 語法。
視覺…A…什麼?沒關係,我們會慢慢說明。這邊就是要告訴 QUERY 你要輸出什麼結果、有什麼限制條件等等的參數。這邊的語法是按照這個視覺化 API 語法的文件規範的,整面英文看起來是有點可怕,但今後會一個一個說明!
我們會打出這類的東西:
=QUERY(資料, "SELECT *")
=QUERY(資料, "SELECT * WHERE B = 'Mr. Sheet'")
=QUERY(資料, "SELECT * WHERE B > 10 AND C > 10")
=QUERY(資料, "SELECT A, B, C WHERE G = '台灣'")
這邊也要注意,我們的查詢語法必須要有前後兩個雙引號包好,不然會出錯。
[標題]:資料是否包含標題行。
這個是選填的參數,通常我們只會放 -1、0、1 這三種數字。說明如下:
  • 如果忽略這個引數或設成 -1,QUERY 會根據資料內容自己猜測資料是否包含標題行。
  • 如果是 0,那就是告訴 QUERY 這筆資料沒有標題行。
  • 如果是 1,那就是告訴 QUERY 這筆資料有 1 行標題。

SELECT

你或許有察覺到,在我們剛剛示範的語法內,反覆有「SELECT」這個字眼。這是代表「選取」的意思。SELECT 在 Google 試算表上的意義就是「選取想要的欄位」,告訴 QUERY 函式你想得到什麼結果。如果省略 SELECT 的話,就會回傳全部的欄位,但大多時候還是會很建議把 SELECT 寫上去。

SELECT *
選取全部欄位。

SELECT A
選取資料範圍的 A 欄。
你當然可以用別的字母代替,例如 SELECT A、SELECT B、SELECT C 等。在指定的時候確保你指定的欄位在前面定義的範圍裡。比如說,如果你想要選取 E 欄而打了 SELECT E,但你之前的範圍卻只定義到 D 欄,就會產生錯誤:
=QUERY(Sheet!A:D,"SELECT E") --> 產生錯誤!#ERROR

SELECT A, B, C …
你當然也可以選取兩個以上的欄,並且用逗號分隔。
像是 SELECT A, B, C,就會回傳 A 欄、B 欄、C 欄。要回傳多少欄位是沒有限制的,但也一樣要確保你的欄有在起初定義的範圍內。這邊的 A、B、C 也不一定得按照字母順序排列,你如果希望輸出結果是按 B、C、A 這個順序出現,那就寫 SELECT B, C, A。
SELECT 也可以和其他的彙總參數一起併用,得到範圍的平均、最大值、最小值、總和等等的數字,這個也會在之後另外講解。

練習

接下來,你可以試試看用這個試算表來練習 QUERY。
試著打開一個空白的工作表,做以下的 QUERY:
  1. 利用 SELECT 選取全部的欄位。
  2. 利用 SELECT 選取「學校名稱」。
  3. 利用 SELECT 選取「學校名稱」、「公/私立」、「電話」。
=QUERY('小學列表'!A:G, "SELECT *")
=QUERY('小學列表'!A:G, "SELECT B")
=QUERY('小學列表'!A:G, "SELECT B, C, F")
如何,還 OK 嗎?如果不確定怎麼做的話,也可以看看下面的教學喔!

利用 SELECT 選取全部的欄位
選一個你想要開始顯示結果的儲存格,輸入:
=QUERY(
像是這個樣子:
再來就是定義資料範圍了。在函式還在編輯的狀態下,你可以直接點下面的「小學列表」工作表,再用滑鼠把全部資料選起來。我是以欄為單位選的,所以出現 '小學列表'!A:G:
如果你直接按工作表左上角範圍選取,應該會出現 '小學列表'!1:2635。這也沒關係,QUERY 也讀得到你的資料。
但如果今後你的資料會往下生長(例如又多了新的小學的資料),我比較建議用「欄」的角度去選取,這樣不論資料怎麼更新、或是語法維護上都不必太操心。
如果你想要直接用打的來指定範圍,其實目前為止就是:
=QUERY('小學列表'!A:G
單引號表示工作表名稱,驚嘆號表示參照其他的工作表。
再來,我們就要來用 SELECT 來選取全部的欄位(SELECT 要大寫或是小寫都沒關係)。先打上一個逗點,之後用 SELECT * 來選取全部欄位。別忘了前後要加上雙引號,確定沒問題後就再加上右括號收尾:
=QUERY('小學列表'!A:G, "SELECT *")
痛快按下 Enter,就會看到你的 QUERY 成果:
這邊的 QUERY 結果都是未格式化的文字,儲存格的格式不會跟著過來這裡喔。

利用 SELECT 選取「學校名稱」
接下來,就和上面的方式一樣定義範圍,但要 SELECT 的欄位就不是全部(*)了,而是「小學列表」的 B 欄。語法就會是:
=QUERY('小學列表'!A:G, "SELECT B")
結果就會像這個樣子:

利用 SELECT 選取「學校名稱」、「公/私立」、「電話」
其實也就是同樣的道理了,我們要來取「小學列表」的 B、C、F 欄位。語法就是:
=QUERY('小學列表'!A:G, "SELECT B, C, F")
就會得到下列結果:
以上就是 QUERY 函式的第一部分,原理和 SELECT 的用法!
我們之後還會再推出幾篇,來詳細講解 QUERY 的應用方式。QUERY 真的是我工作的好夥伴,真心推薦大家。
如果你喜歡這次的文章,歡迎你透過這些方法支持我:
・按下愛心、按下儲存
・留言告訴我你的想法
・加入喜特先生的官方沙龍,即時看到我發布的教學
・付費訂閱喜特先生的官方沙龍,加入每月小額訂閱方案
・追蹤喜特先生的 Facebook
・按這邊小額贊助我的創作!
想要看更多文章,歡迎來到我的 Notion 頁面找找有沒有你需要的資源喔!
我是喜特先生,Mr. Sheet,我們下個教學見!

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.