---
# System prepended metadata

title: MySQL
tags: [' SQL', MySQL]

---

---
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	這是一致性檢查，可確保此列中的每個值對應另一個表中列中的另一個值。
