Yakim shu Hi, 這是我擴充腦內海馬體的地方。

[第九週] SQL - 內建函式、JOIN、排序

正規化 Normalization

分成多個 table,不同 table 存不同資料,減少每層的 table 複雜度,這樣的寫法比較有彈性

關連式資料庫:每個 table 都有關係,但切開來會比較好維護及查詢。

資料庫 table 的命名規則

內建函式

COUNT 數量

計算 comment 這個 table 有幾個 id

SELECT COUNT(id) FROM 'comment'

SUM 總和

計算 comment 這個 table 的 id 數字總和

SELECT SUM(id) FROM 'comment'

AVG 平均

計算 comment 這個 table 的 id 數字平均

SELECT AVG(id) FROM 'comment'

CONCAT 合併欄位( 字串連接 )

合併 comment 這個 table 的 id & name 的值

SELECT CONCAT(id, name) FROM 'comment'

between 用在數字、日期上( 條件篩選 )

找出在某個區間的資料

where number between 2 & 5

in 有點像陣列的 indexOf

選出 id 等於 1 || 2 || 3 的欄位

SELECT * FROM 'comments' WHERE id in (1, 2, 3)

like 用在字串上( 比對字元 )

選出包含 o 字串的所有欄位

SELECT * FROM 'comments' WHERE content like '%o%'

SQL Join 合併 table

用下圖解釋比較清楚:

(image from mattimattila.fi)


排序 ORDER BY

升冪 ascending (小 => 大)

SELECT * FROM users ORDER BY time ASC

降冪 descending(大 => 小)

SELECT * FROM users ORDER BY time DESC

分頁

回傳前 30 筆資料

SELECT * FROM users LIMIT 30

回傳 61~90 筆資料 ( 從 60 開始、回傳 30 筆資料 )

SELECT * FROM users LIMIT 30 OFFSET 60
SELECT * FROM users LIMIT 60, 30 // 跟上面一樣(OFFSET 60, LIMIT 30 的簡寫)

改名

as 關鍵字,後面接 <new-name>,用來縮減字詞還實用的

SELECT created_at as time, nickname as name FROM users

SELECT c.id, c.content, u.nickname as name
FROM comments as c, users as u
WHERE c.user_id = u.id


疑難雜症解惑

mysqli_set_charset($conn, "utf8")

<?php
$sql = "select from users where name='$name'"
?>

或者是用 sprintf


( 以上內容大部分是 程式導師實驗計畫第三期 的學習筆記,如有錯誤歡迎糾正,非常感謝 🤓 )