# 資料庫 SQL語法 ###### tags: `SQL` ## CRUD ### 建立資料庫: ```sql! $ CREATE database <nice_db> $ DROP database <nice_db> ``` ### 資料型態: * CHAR/VARCHAR/TEXT * INTEGER/DECIMAL * DATE/DATETIME * BLOB=Binary Large Object ### 建立資料表: ```sql! CREATE TABLE "users" ( "id" INTEGER NOT NULL UNIQUE, "name" TEXT NOT NULL, "age" INTEGER NOT NULL, PRIMARY KEY("id" AUTOINCREMENT) ); ``` 儘量使用大寫下SQL指令 CHAR(10)沒填寫完的部分會填空,建議長度固定時使用 VARCHAR(10)會多花一個byte存長度,建議長度不固定時使用 ### 追加欄位: ```sql! ALTER TABLE heroes ADD COLUMN super_power VARCHAR(100) ``` ### 刪除欄位 ```sql! ALTER TABLE heroes DROP COLUMN super_power ``` ### 刪除資料表 ```sql! DROP TABLE users ``` ### 新增資料 ```sql! INSERT INTO heroes(id, name, hero_level, age) VALUES (300, 'KK_hero', 'S', 18) 字串要用''包起來 ``` ### 選擇所有檔案 ```sql SELECT * FROM heros ``` ### 撈出特定條件的所有檔案 ```sql! SELECT * FROM heroes WHERE hero_level = 'S' SELECT * FROM heroes WHERE hero_level = 'S' AND gender = 'F' ``` ### 只撈出特定欄位 ```sql! SELECT name, age FROM heroes WHERE hero_level = 'S' AND gender = 'F' ``` ### 撈出沒填資料的欄位 ```sql! SELECT * FROM heroes WHERE age is NULL ``` ### 相似字查詢 ```sql! SELECT * FROM heroes WHERE name like '%背心%' ``` ### 查詢數字區間 ```sql! SELECT * FROM heroes WHERE age >=10 AND age <=25 SELECT * FROM heroes WHERE age BETWEEN 10 AND 25; ``` ### OR查詢 ```sql SELECT * FROM heroes WHERE hero_level = 'S' OR hero_level = 'A' SELECT * FROM heroes WHERE hero_level IN ('S','A') ``` ### not ```sql! SELECT * FROM heroes WHERE hero_level != 'S' SELECT * FROM heroes WHERE hero_level <> 'S' ``` ### 不是...也不是... ```sql! SELECT * FROM heroes WHERE hero_level != 'S' AND hero_level != 'A' SELECT * FROM heroes WHERE hero_level NOT IN ('S', 'A') ``` ### 更新資料 ```sql! UPDATE heroes SET age = 10, hero_level = 'A' WHERE id = 25 ``` 所有人都+1歲: ```sql! UPDATE heroes SET age = age +1 ``` ### 刪除資料 ```sql! DELETE FROM heroes WHERE hero_level = 'C' ``` ## 進階查詢 ### 總數: ```sql! SELECT COUNT(*) FROM heroes WHERE hero_level = 'A' ``` ### 總和: ```sql! SELECT SUM(age) FROM heroes WHERE hero_level = 'S' ``` ### 平均: ```sql! SELECT AVG(age) FROM heroes WHERE hero_level = 'S' ``` min, max ### 分組: ```sql! SELECT hero_leel, sum(age) FROM heroes GROUP by hero_level ``` ```sql! SELECT DISTINCT hero_llevel FROM heroes ``` ```sql! SELECT * FROM heroes WHERE hero_level = 'S' ORDER BY age DESC ``` ```sql! SELECT * FROM heroes WHERE hero_level = 'S' ORDER BY age DESC LIMIT 6 ``` ```sql! SELECT * FROM heroes LIMIT 6 OFFSET 6 ``` ### 多個表格的查詢 ER diagram = Entity Relationship Diagram 子查詢: ```sql! SELECT * FROM monsters WHERE kill_by = ( SELECT * FROM heroes WHERE name in ("埼玉","傑諾斯") ) ``` 主鍵,獨一無二,not NULL ### 交集 inner/left/right ```sql! SELECT * FROM t1 INNER JOIN t2 ON t1.username = t2.name SELECT * FROM t1 RIGHT JOIN t2 ON t1.username = t2.name SELECT * FROM t1 LEFT JOIN t2 ON t1.username = t2.name ``` ```sql! SELECT h.name, m.name FROM battle_histories as b JOIN heroes as h JOIN monsters as m on b.hero_id = h.id AND b.monster_id = m.id ```