2022年4月2日 星期六

SQL 自學起手式

litecli completion [我失憶了嗎? 2024/1 重寫一篇差不多的: 自學 SQL 語法? sqlite 幫你閃電入門!]

想要從零開始學 SQL 語法, 該如何起步? 我會建議從 sqlite 著手, 因為它最輕巧, 一個檔案就是一個資料庫, 不需要煩惱帳號/密碼/使用者管理/...等等煩瑣的事, 讓你可以專心於 SQL 語言。 它只比標準 SQL 少一點點功能。 而且很多應用程式 (例如很多 android apps) 都採用 sqlite, 學會操作 sqlite 之後, 你可以用 adb pull 指令把手機上有趣的資料庫檔拿來研究, 所以也很有實用價值。 在 debian 系列的 linux 上面可以直接這樣安裝: apt install sqlite3

再來大力推薦安裝 liteclipip3 install litecli 裝完之後可能還需要編輯 ~/.bashrc , 在裡面加上一句 export PATH=$PATH:$HOME/.local/bin/litecli 並且開終端機新分頁, 系統才找得到 litecli 指令。 它的 [指令/表格名稱/欄位名稱/...] 快打/補完功能 (completion) 超級超級好用! 從原生的 sqlite3 命令列轉移到 litecli 命令列, 會讓你在10分鐘內開始相信自己是電影裡面下指令飛快的駭客高手, 信心立刻倍增。 等一下我們就來看一個範例。 它還有 其他很實用的功能, 你可以在設定檔裡面選用不同的色系風格、 輸出格式、 快速鍵等等, 甚至還可以自己定義常用查詢指令。

就像新手學 linux 不應該從安裝作業系統開始一樣, 我認為新手學 SQL 語法也不應該從 create table 開始, 而應該拿現成的範例資料庫來實驗, 直接跳進去, 第一步就開始玩有趣的 select 指令。 Sakila 是一個知名的 MySQL 範例資料庫, 它也被移植到其他許多不同的 DBMS。 先下載 「建立 schema」 跟 「新增資料」 的兩個 *.sql 指令檔:

wget https://raw.githubusercontent.com/jOOQ/sakila/main/sqlite-sakila-db/sqlite-sakila-schema.sql
wget https://raw.githubusercontent.com/jOOQ/sakila/main/sqlite-sakila-db/sqlite-sakila-insert-data.sql
然後建立一個新的資料庫檔 litecli sqlite-sakila.db (對, sqlite-sakila.db 原本並不存在, litecli 會自動產生它) 並且在 litecli 命令列底下讀入剛才下載的兩個檔案:
.read sqlite-sakila-schema.sql
begin transaction;
.read sqlite-sakila-insert-data.sql
commit;

如果沒有把第二個 .read 包在 transaction 裡面的話, 新增大量資料的速度會非...常...慢... 在我的電腦上, 會花40倍以上的時間! 關於提升大量 insert 的效率, 詳見 這篇 這個問答。 成功之後按 ^d 離開。

再次 litecli sqlite-sakila.db 進入剛剛建立好的範例資料庫。 先用 .tables 查詢 sakila 範例資料庫有哪些表格。 當輸出資料量超過一個螢幕時, 它會使用 less 這個 pager 來分頁, 此時可以按 q 離開。 然後:

  1. 敲入 "sel" 再按 Tab 鍵
  2. 敲入 " fr" 再按 Tab 鍵
  3. 敲入 " ci" 再按 Tab 鍵
  4. 按 ^a、 alt-f 把遊標移到 "select" 與 "from" 之間, 敲入 " ci" 再按 Tab 鍵

最後得到這個指令: select city_id from city 。 請注意我們先寫後面的表格名稱 (city) 再回頭寫前面的欄位名稱 (city_id) 這樣它才知道該從哪一個表格裡面推薦欄位名稱讓我們選。 Litecli 的命令列採用 GNU readline, 它的快速鍵清單 很值得瞄一下。 那麼, 現在就到 sqlite 教學網站 還有 「有感實用範例」 開始自學 SQL 指令吧!

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。