# MySQL 上課隨手筆記 ###### tags: `MySQL`, `SQL` PS. *\~夜晚的星空~* 原發表於 HiNet Xuite DATE: 05/31/2012 04:21:43 PM ## Data Language ### Data Definition Language (DDL) CREATE, ALTER, DROP ### Data Manipulation Language (DML) SELECT, INSERT, DELETE, UPDATE ### Data Control Language (DCL) GRANT, DENY, REVOKE ## Examples: * 創建一個叫 db01 的資料庫 `CREATE Database db01;` * 顯示目前有哪些 database `show databases;` * 目前正在使用的 database `select database(); * 執行該檔案裡的指令 `\. "Path to command file"` * 於現在在的資料庫裡新增一個叫 Cust 的 table ```SQL CREATE TABLE Cust ( CustId char(10), CustName char(10), Addr char(10), Tel char(10) ); ``` * 看現在在的資料庫裡有什麼 table `show tables;` * 刪掉現在在的資料庫裡的 cust table `drop table cust;` * 新增資料至 table,可以用逗號連續新增 raws ```SQL INSERT INTO cust(CustId, CustName, Addr, Tel) VALUES ('C001', 'A-Comp', 'TP', '1236-4567'), ('C002', 'B-Comp', 'TP', '1236-4567'), ('C003', 'C-Comp', 'KS', '1236-4567'), ('C004', 'D-Comp', 'TP', '1236-4567'); ``` * 該欄位開頭為 D,且字串長度是 5。\_ 代表要有字 `WHERE ... LIKE 'D____' ` * 看 db01 裡有哪些 tables `show tables from db01;` * 看現在在的資料庫裡的 cust table 有什麼欄位 `show columns from cust;` * 在現在在的資料庫裡的 cust table 新增一個 Remark 欄位 ```SQL ALTER TABLE cust ADD Remarks char(10); ``` * 在現在在的資料庫裡的 cust table 修改 Remark 欄位 ```SQL ALTER TABLE cust MODIFY Remarks char(20); ``` * 在現在在的資料庫裡的 cust table 刪除 Remark 欄位 ```SQL ALTER TABLE cust DROP COLUMN Remarks; ``` * char 和varchar 最長是 255 bytes * float 和 double 是近似值,如果要用小數點且是真值,就要用 decimal * SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY - WHERE 比 GROUP BY 先執行 - GROUP BY 比 HAVING 先執行,HAVING 是依據 SELECT 的欄位 - HAVING 比 ORDER BY 先執行,ORDER BY 是依據 SELECT 的欄位 * NULL 的意義:1.**空值**,2.**未知** - NULL 要用 **IS** 判斷,不是 **=** - 任何值和 NULL 運算 (+, -, \*, /) => 都會變 NULL - `IFNULL(a, 0)` 若 a 是 NULL,則用 0 取代 * UNION 會自動 distinct * UNION ALL 不做 sdistinct * UNION 可以個別 SELECT, FROM, JOIN, WHERE, GROUP BY, HAVING,但不可以個別 ORDER BY * 把 csv 檔匯入 Cust table ```SQL Load Data Infile 'C:/mysql/inv/cust.csv' into table Cust Fields Terminated By ',' Lines Terminated By '\r\n' Ignore 1 lines; ``` * 在現在在的資料庫裡建立一個暫時表單 TMP ```SQL CREATE Temporary TABLE TMP SELECT * FROM Emp; ``` * 取得表單最後 Insert 的 primary key,須搭配 auto_increment 使用 `SELECT LAST_INSERT_ID()` * 將搜尋結果做成 View,view 只比直接 select 快一點點,差在 view 的 select 動作是已經 compile 過後 ```SQL CREATE VIEW v1 AS SELECT ... ``` * 將搜尋結果修改既有的 View ```SQL ALTER VIEW v1 AS SELECT ... ``` * 將 t1 table 的 ID 設定成 index IDX_t1_1 ```SQL CREATE INDEX `IDX_t1_1` ON `t1` (`ID`); ``` * 將 t1 table 的 ID 加上 Name 設定成 index IDX_t1_2 ```SQL CREATE INDEX `IDX_t1_2` ON `t1` (`ID`, `Name`); ``` * 將開始執行的表示符號改成兩個斜線 `delimiter //` * 將開始執行的表示符號改成分號 `delimiter ;` ## Procedure Stored Procedure 是存在 Database 下 ### Ex #1: ```SQL USE db01 drop procedure if exists p1; delimiter // CREATE PROCEDURE p1() BEGIN DECLARE n INT; SET n = 100; SELECT COUNT(*) INTO n FROM cust; SELECT n; END // delimiter ; ``` ```SQL call p1(); ``` ### Ex #2: ```SQL USE db01 drop procedure if exists p2; delimiter // CREATE PROCEDURE p2(in arg1 int, in arg2 int) BEGIN SELECT arg1 + arg2; END // delimiter ; ``` ```SQL call p2(3, 4); ``` ## Reference MySQL: 事件排程器 (Event Scheduler) http://waxway.blogspot.tw/2011/12/mysql-event-schedule.html