---
tags: MySQL, SQL
---
# MySQL
[TOC]
* * *
### MySQL 登入
mysql -u USER(root) -p(PW) # 不直接打passqord 會用戶動界面要求輸入PW
指令結尾:
- `;` or `\g` 執行 'COL' 表示
- `\G` 執行 'ROW' 表示
- `\c` 清除指令
- `\h` or `\?` 幫助說明
#### 以下
- `D_Name` : DATABASE NAME
- `T_Name` : TABLE NAME
- `Col_Name` : COLUMN NAME
- `V_Name` : VIEW NAME
### 顯示資料庫, 表, 資料列
- `SHOW DATABASES ;` (+S)
- `TABLES ;` (+S)
- `COLUMNS FROM T_Name ;` (+S)
### 選擇使用資料庫:
- `USE D_Name`
### 創造資料庫DATABASE 表TABLE:
- `CREATE DATABASE D_Name ;`
- `CREATE TABLE T_Name(Col 條件, Col....) ;`
### 表列創建資料:
- `SHOW CREATE TABLE T_Name` 可以查看創建的資料
- `DESCRIBE T_Name` 描述 COLUMNS 資料結構特性 等同:(SHOW COLUMNS FROM TABLE)
### 提出資料:
- `SELECT * FROM TABLE;`
- `COLUMN.name FROM TABLE.name;`
### 比較運算符號:
- `=, >, <, !=`
- `BETWEEN, IN, IS NULL, IS NOT`
### LIKE 模糊搜尋 萬用字元:
| 萬用字元 | / |
| ---- | -------------- |
| `%` | 零到多個任意字元 可有空字串 |
| `_` | 一個任意字元 |
輸出 1, 0 (T, F)
### 插入資料:
- `INSERT INTO T_Name(COL...) VALUES(VALUE),(....)`
可以指定COL 或是全部 INTO可有可無
### 修改表:
ALTER TABLE table_name
| function | / |
| --------------------- | ------------------------------------------------------------ |
| ADD Col-new 條件 | 添加COL |
| DROP Col | 刪除COL |
| MODIFY Col 條件 | 修改COL的條件 |
| CHANGE Col New_Col 條件 | 同上 可以順便改COL名字 |
| RENAME T_Name-new | 改表名 改表名字另一種方法 (不使用 ALTER) RENAME TABLE T_Name TO NEW_T_Name |
### 修改資料:
UPDATE table_name SET COLUMN = VALUE
WHERE 條件 AND優先OR # 會配上 WHERE 來限制範圍
### 刪除資料 刪除ROW 刪除COL 用ALTER FROM:
- `DELETE FROM T_Name WHERE 條件`
##### 一次刪除多個表資料
- `DELETE A, B FROM T_Name-A, T_Name-B WHERE 條件` (A, B 別名)
### 查尋表:
| code | / |
| ------------------------------------ | ------------------------------------------------------- |
| `SELECT * FROM T_Name ;` | 查看 T_Name 表 |
| `SELECT Col, Col.... FROM T_Name ;` | 指定COLUMN 在 T_Name 表 |
| 加上條件 以下 | |
| `DISTINCT` | 不重複 SAME ROW |
| `WHERE` 條件 | 條件限制 |
| `GROUP BY Col` | 分群 配合 COUNT(), SUM(), MAX()..... |
| `HAVING` 條件 | 分群GROUP BY後的WHERE |
| `ORDER BY Col` or 條件 | 排序 sort |
| `LIMIT num1 OFFSET num2` | 限制數量起點 LIMIT N OFFSET M = LIMIT M, N |
| `WITH ROLLUP` | 配合GROUP BY 顯示不分組(全部ROW)的情況 (COUNT(), SUM(), MAX().....) |
### 結合資料表
```SQL
SELECT COL... FROM T_Name-A, T_Name-B
WHERE A.COL = B.COL # 用 WHERE 結合
```
```SQL
SELECT COL... FROM T_Name-A
JOIN T_Name-B ON (A.COL = B.COL) # 用 JOIN 結合
JOIN T_Name-B USING(COL) # 當結合COL同名使用
```
```SQL
INNER JOIN = JOIN
LEFT JOIN # 左邊(原表資料都列出)表沒符合也列出 用NULL補
RIGHT JOIN # 右邊(加入表資料都列出)表沒符合也列出 用NULL補
```
### 結合相同COL數的資料表 彼此ROW結合
- UNION ALL : TABLE_A UNION ALL TABLE_B (NEW Col_Name由 TABLE_A 決定)
- UNION 同上 有加上 DISTINCT 效果 刪去重複ROW
### 創造視界
- 不會實際占空間(由其他表來展現), 同時修改它也能修改到原本的表!! VIEW 會記得當初設定的條件
- VIEW 無法配合 SUM(), MIN(), MAX(), COUNT(), DISTINCT, GROUP BY, HAVING, UNION !!
- CREATE VIEW V_Name 'AS' (SELECT..... ) # AS 不能省略
- SHOW CREATE VIEW V_Name # 查尋當初創造的條件
- DROP VIEW V_Name # 刪除視界
### SELECT 查詢執行順序:
1. FROM和JOINS
> 首先執行該FROM子句和後續步驟JOIN以確定正在查詢的數據的總工作集。這包括此子句中的子查詢,並且可以導致在引擎蓋下創建臨時表,其中包含要連接的表的所有列和行。
2. WHERE
> 一旦我們擁有了總工作數據集,就會將第一遍WHERE約束應用於各個行,並且丟棄不滿足約束的行。每個約束只能直接從FROM子句中請求的表訪問列。SELECT查詢部分中的別名在 大多數數據庫中都不可訪問,因為它們可能包含依賴於尚未執行的查詢部分的表達式。
3. GROUP BY
> WHERE然後,應用約束後的其餘行將根據GROUP BY子句中指定的列中的公共值進行分組。作為分組的結果,只有與該列中的唯一值一樣多的行。隱含地,這意味著只有在查詢中具有聚合函數時才需要使用它。
4. HAVING
> 如果查詢具有GROUP BY子句,則HAVING子句中的約束將應用於分組行,丟棄不滿足約束的分組行。與該WHERE 子句一樣,在大多數數據庫中也無法從此步驟訪問別名。 # 接在GROUP BY 後的 WHERE (WHERE 不能放在 GROUP BY 後面)
5. SELECT
> SELECT最後計算查詢部分中的任何表達式。
6. DISTINCT
> 在剩餘的行中,標記為列的具有重複值的DISTINCT行將被丟棄。 DISTINCT(丟棄重複的值) # SELECT DISTINCT COLUMN... FROM TABLE
7. ORDER BY
> 如果ORDER BY子句指定了一個訂單,那麼這些行將按指定的數據按升序或降序排序。由於SELECT已經計算了查詢部分中的所有表達式,因此可以在此子句中引用別名。
8. LIMIT/OFFSET
> 最後,落入由所指定的範圍之外的行LIMIT和OFFSET從查詢返回的被丟棄,在離開最後行的集合。 LIMIT N OFFSET M = LIMIT M, N
### CREATE TABLE
1.數據類型 描述
- INTEGER, BOOLEAN
> 整數數據類型可以存儲整數值,例如數字或年齡的計數。在一些實現中,布爾值僅表示為僅0或1的整數值。
- FLOAT,DOUBLE,REAL
> 浮點數據類型可以存儲更精確的數值數據,如測量值或小數值。根據該值所需的浮點精度,可以使用不同的類型。
- CHARACTER(num_chars),VARCHAR(num_chars),TEXT
> 基於文本的數據類型可以在各種語言環境中存儲字符串和文本。在處理這些列時,各種類型之間的區別通常相當於數據庫的效率。
- CHARACTER和VARCHAR(變量字符)
> 類型都指定了它們可以存儲的最大字符數(較長的值可能被截斷),因此使用大表存儲和查詢會更有效。
- DATE, DATETIME
> SQL還可以存儲日期和時間戳,以跟踪時間序列和事件數據。特別是在跨時區操縱數據時,它們可能很難處理。
- BLOB
> 最後,SQL可以將二進制數據存儲在數據庫中的blob中。這些值通常對數據庫不透明,因此您通常必須使用正確的元數據存儲它們以重新查詢它們。
### 數據類型:
| 數據類型 | / |
| --------- | ------------------------------------------------ |
| 數值型 | |
| INT | -2147483648 ~ 2147483647 |
| TINYINT | -128 ~ 127 |
| SMALLINT | -32768 ~ 32767 |
| MEDIUNINT | -8388608 ~ 8388607 |
| BIGINT | -9223372036854775808 ~ 9223372036854775807 |
| FLOAT | -3.402823466E+38 ~ -1.175494351E-38 |
| DOUBLE | 1.7976931348623157E+308 ~ -2.22507385072014E-308 |
| 字串型 | |
| CHAR | 固定長度字串 最多 255 字元 |
| VARCHAR | 可變長度字串 最多 255 字元 |
| TEXT | 長字串 最多 65535 字元 |
| LONGTEXT | 超長字串 最多 4294967295 字元 |
| 日期時間型 | |
| DATE | yyyy-mm-dd |
| TIME | hh:mm:ss |
| DATETIME | yyyy-mm-dd hh:mm:ss |
| TIMESTAMP | yyyy-mm-dd hh:mm:ss |
| YEAR | yyyy |
#### ENUM(列舉)
ENUM('A','B','C') 只能插入A,B,C, NULL (需要看設定是否容許)
#### SET(集合)
SET('A','B','C') 可以插入A,B,C 的組合 'A', 'A,B', 'A,C', 'A,B,C' ...
2.表約束 COLUMN 的條件
在本課中,我們不會深入研究表約束,但每列都可以有其他表約束,這限制了可以插入到該列中的值。這不是一個全面的列表,但會顯示一些您可能會覺得有用的常見約束。
約束 描述
PRIMARY KEY 這意味著此列中的值是唯一的,並且每個值都可用於標識此表中的單個行。 "可以加在Col後 也可以在最後使用函式指定Col , PRIMARY KEY(Col)"
AUTO_INCREMENT 對於整數值,這意味著該值會自動填充並隨每行插入而遞增。並非所有數據庫都支持。 可用ALTER TABLE AUTO_INCREMENT = NUM 更改目前數字
UNIQUE 這意味著此列中的值必須是唯一的,因此您不能在此列中插入具有相同值的另一行作為表中的另一行。與“PRIMARY KEY”的不同之處在於它不必是表中行的鍵。
NOT NULL 這意味著插入的值不能為“NULL”。
CHECK (expression) 這允許您運行更複雜的表達式來測試插入的值是否為value。例如,您可以檢查值是正數,還是大於特定大小,或者以特定前綴等開頭。
FOREIGN KEY 這是一致性檢查,可確保此列中的每個值對應另一個表中列中的另一個值。