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