SQL

序言

雖然我是前端,但我也是想試試看後端的。某次面試,公司要找後端開發,但寫到 SQL 時,我才發現自己對後端最重要的資料庫一無所知。

很明顯,這次面試被打槍了。有沒有人懂非對稱加密怎麼做的(小聲)

要學 SQL 的話,除了自己架資料庫外,SQLZoo 這網站也是個好資源。

2020/03/22 增筆:我最近發現以探案為主題的sql-mysteries也頗好玩:遊戲用生動的故事與查探機制,來教人怎麼用 JOIN 指令,關聯其他的資料。

資料庫資訊

資料庫(Database)下面會有資料表(Table);而資料表的基本架構和表格一樣,以欄與列構成。而這些資料表,都要有一個主鍵(Key value)以資辨識。

關聯式資料庫

在關聯式資料庫(Relational database)的體系下,開發者可以透過資料表的鍵值與外來鍵(Foreign key),與其他的資料表結合。只不過,一個資料表的鍵值,只能對應另一個資料表的外來鍵。如果需要對應多個資料表的外來鍵,也就是被稱為多型關聯(Polymorphic Associations)的東西......我還沒看到解決辦法,但似乎與後端程式語言有關? 🤔

指令備查

以 MySQL/MariaDB 系列指令為準。

Nested query & subquery (巢狀查詢與子查詢)

捲毛蔡:「在 SELECT 指令內再放一個 SELECT 指令查詢;通常放在 SELECT 後面的 WHERE 子句,可取得詳細查詢條件。」


-- https://learnsql.com/blog/sql-nested-select/
SELECT * FROM Students WHERE Students.GPA > ( SELECT AVG(Students.GPA) FROM Students );
SELECT AVG(Classes.number_of_students) FROM Classes WHERE Classes.teacher_id IN (
    SELECT Teachers.id FROM Teachers WHERE Teachers.subject = 'English' OR Teachers.subject = 'History'
);

People id Name Age 1 Titan 18 2 John 6 3 Alex 40 4 Back 36 5 Deed 22

Marriage id spouse_id 1 5 5 1 3 4 4 3

-- To find someone who is single
SELECT * FROM People WHERE People.id NOT IN ( SELECT Marriage.spouse_id FROM Marriage );

-- Show:
-- id 	Name 	Age
-- 2 	John 	6

correlated or synchronized sub-query (相關子查詢或同步子查詢)

「我們可以在子查詢,參閱外部查詢的數值。我們為表格再命名,便可以分別內外兩個不同的表格。」

連結