cy
關聯式資料庫邏輯結構
必要時,以某個欄位為外鍵(Foreign Key,FK)關聯到另一資料表的主鍵以獲得進一步的相關資料
每個資料表都各有其主鍵
橫列稱為記錄(Record)
直欄稱為欄位(Field)
WHERE 欄位名稱 = 值 or '名'
WHERE 比較名稱 LIKE 'a%'
字母不分大小寫,如需區分可在LIKE後加上BINARY
WHERE 欄位名稱 LIKE BINARY 'A%'
'a%' | '%a' | '%a%' |
---|---|---|
以a開頭 | 以a結尾 | 可以a在任何位置 |
_可限制字的長度_可代表一個中文字元
日期查詢也可用區間型
WHERE 欄位名稱 IN (欄位值);
用意:若橫向記錄內容完全相同,只留一筆
語法:SELECT DISTINCT 欄位值
ex:顯示國家種類
語法:SELECT 欄位名稱 AS 要改變的欄位名
ex:將firstname改變成First
ex:將(a*b)改成c
如果欄位ID是中文或有空格 前後加入、、去做修飾
ex:將ProductID 用產品編號表示
Concat()函數是用來連接兩個字符串,形成一個字符串,連接方式使用逗號。
語法:Concat(str1,str2,…)
MySQL 的CONVERT()函數可用來獲取一個類型的值,並產生另一個類型的值。
語法:CONVERT(value, type);
語法:ORDER BY 排序欄位 LIMIT 前N筆資料;
ex:列出前五筆資料
ex:一頁十筆資料,列出第三頁的十筆資料
刪除更新某幾筆 排序
limit N :返回N條記錄
offset M :跳過M條記錄,默認M=0,單獨使用似乎不起作用
limit N,M :相當於limit M offset N ,從第N條記錄開始,返回M條記錄
基本語法:
ex.美商供應的產品清單
SELECT * FROM products
SELECT ProductID, ProductName, UnitPrice FROM products
WHERE ??? 不知道哪國的商人
SELECT * FROM suppliers WHERE Country = 'USA'
取得SupplierID
SELECT ProductID, ProductName, UnitPrice FROM products WHERE SupplierID in (SELECT SupplierID FROM Suppliers WHERE Country = 'USA')
這裡使用FK(supplierID)來幫助查詢(用B表幫A表做事)
使用in,select只能一個欄位
上述先把針對products的查詢結果視同一個名為p的資料表, 接著計算出DiffPrice(子查詢),最後列出要顯示的項目
p.categoryID 是為了證明與categoryID相同
函數名稱 | 功能描述 |
---|---|
AVG | 計算平均值 |
COUNT | 有資料的共有幾筆 |
COUNT (*) | 一共多少筆(有Null值的記錄也算進去) |
MAX | 傳回最大值 |
MIN | 傳回最小值 |
SUM | 計算總和 |
STDEV | 計算標準差 |
VAR | 計算變異數 |
ex:avg(欄位名稱)
計算限制的欄位ex:avg(UnitPrice)from products where categroyID = 1
沒有在GROUP BY後,且無經過彙整函數的欄位名稱無法寫在SELECT後方
ex:SELECT categoryID, productID, AVG(UnitPrice)
FROM products
GROUP BY categoryID
語法:
ex:老師範例
UNION用於合併兩個或多個SELECT語句的結果,要求必須有相同數量的列、相似的數據類型,列的順序必須相同
注意:UNION默認選取不同值,允許重複則使用UNION ALL(合集) INTERSECT(交集) EXCEPT(差集)
[IF NOT EXISTS] 表示不存在才會創建。建議在sql腳本中使用create命令創建數據庫時加入此項,以免對應名稱的數據庫已經存在導致sql腳本終止,為可選項
[DEFAULT]如果使用了default,這個數據庫中創建的所有資料表默認都會繼承這個數據庫的字符集,為可選項。
[TEMPORARY](暫時的資料表)會在連線之後就消失,為可選項。
but測試結果是:
如果修改屬性,原本有預設也要一起設定,否則會消失
建立主鍵編號後即可修改資料
資料庫正規化 < 挪過去了
以空間換取時間加快查詢速度,不建議用於有頻繁更新或插入操作的資料表。
新增
刪除
查詢
測試用的 join-index
Mysql version > 8.0 (教室5.7 爛!!!)
欄位值不得重複:
key
on update/delete cascade
可加可不加,加入後如果修改外鍵就會跟著修改,如果沒加,則完全不更動
密碼:root
– 請試著描述 user, db, tables_priv 等資料表的作用?
user :查看使用者資料,紀錄使用者權限
db :各個使用者對每個資料庫的權限
table_priv :紀錄使用者對特定表內操作的權限
空字串:會保留 超過長度會被截掉 四捨五入
傳統模式:超過長度(不符合預設格式)會報錯 無法輸入成功 空白會保留 中文輸入長度
Both:四捨五入
手動加入時間
自動輸入系統時間
空字串下的日期模式
00-31表月底 可以正常顯示
其餘不符合格式 將顯示 0000-00-00 00:00:00
傳統模式中都直接報錯
預設第一個為1(Y),第二個為2(N)以此類推 ,錯誤會存為0
MySQL獨有的功能(?) one-hot是個不錯的替代方案
鎖住之後在解鎖之前只能閱讀
鎖住之後再解鎖之前啥都不能幹
解鎖
如果有超過一個人使用lock以先進先出原則
但是如果同時有read跟write,則先執行write
如果沒開始 新增刪除更改為autocommit
確認剛剛的修正
返回(斷線也算返回)
A 交易更新並確認資料前,其他交易不能讀取該資料
永遠看到同時間的數據直到結束transaction,讀取中資料會被鎖定,確保同一筆交易中的讀取資料必須相同
lock in share mode 共享鎖: 其他session可以讀取資料也可以繼續添加鎖(沒衝突的話) 但無法修改資料,直到狀態確認或結束
for update 排他鎖: 其他session不能讀取資料也不能繼續添加鎖 也無法修改資料,直到狀態確認或結束
LIMIT : SELECT, DELETE ,(UPDATE)老師版本
ORDER BY : SELECT, UPDATE DELETE
還原
同編號用後面的覆蓋將前面的delete
同編號將後面的skip
用逗號分隔欄位
欄位用雙引號包起來
分行
mysqldump
HW:CY 建立訂便當的系統(菜單 會員 訂單 廠商 ) 建立資料庫 建立資料表 等等 想加啥課堂上教的都可
EXPORT資料庫:
cd /applications/mamp/library/bin
./mysqldump -u root -p root –databases northwind > /Users/cy0001210/Documents/test.txt