# 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