第一部分:子查詢
子查詢(subquery):出現在其他SQL語句内的SELECT子句
例如:
SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2);
其中:
SELECT * FROM t1 稱為Outer Query/Outer Statement
SELECT col2 FROM t2 稱為SubQuery
特點:嵌套在查詢内部,且必須始終出現在 圓括号内
子查詢可以包含多個關鍵字或條件:
DISTINCT,GROUP BY,ORDER BY,LIMIT,函數等
子查詢的外層查詢可以是:
SELECT,INSERT,UPDATE,SET,DO
子查詢可以傳回:标量,一行,一列,子查詢
比較運算符:
= , >, <, >=, <=, <>, !=, <=>
文法結構:
operand comparison_operator subquery
用ANY, SOME, ALL修飾
operand comparison_operator ANY (subquery)
operand comparison_operator SOME(subquery)
operand comparison_operator ALL(subquery)
使用[NOT] IN :
operand comparison_operator [NOT] IN (subquery)
=ANY 與 IN 等效
!=ALL 與 <>ALL 與 NOT IN 等效
使用[NOT] EXISTS:
如果子查詢傳回任何一行,EXISTS将傳回TRUE 否則傳回FALSE
INSERT...SELECT将查詢結果寫入資料表
INSERT [INTO] tbl_name [(col_name,...)] SELECT...
多表更新
UPDATE table_references SET col_name1={expr1 | DEFAULT} [,col_name1={expr1 | DEFAULT}]...[WHERE where_condition]
第二部分:連接配接
連接配接:MySQL在SELECT語句,多表更新,多表删除語句中支援JOIN操作
連接配接文法結構:
table_reference
{[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}
table_reference [[AS] alias]
ON condition_expr
資料參照表可以賦予别名
UPDATE table1 INNER JOIN table2 ON table1.name=table2.name SET table1.age=table2.age
連接配接類型:
INNER JOIN,内連接配接
JOIN == INNER JOIN == CROSS JOIN等價
LEFT [OUTER] JOIN,左外連接配接
RIGHT [OUTER] JOIN,右外連接配接
說明:
内連接配接(INNER JOIN):顯示左表及右表符合連接配接條件的記錄,A ∩ B
連接配接條件
通常使用ON關鍵字來設定連接配接條件,也可以實驗WHERE,WHERE關鍵字進行結果集記錄的過濾
CREATE ...SELECT建立資料表的同時,将查詢結果寫入到資料表
CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] select_statement
No query specified? 因為在\G後面是不需要加;
事實外鍵,實體外鍵
外連接配接
A LEFT JOIN B join_condition
(1)資料表B的結果集合依賴資料表A
(2)資料表A 的結果集合根據左連接配接條件依賴所有的資料表(B表除外)
(3)左外連接配接條件決定如何檢索資料表B(在沒有指定WHERE條件的情況下)
(4)如果資料表A的某條記錄符合WHERE條件,但是在資料表B不存在符合連接配接條件的記錄,将生成一個所有列為空的額外的B行
(5)如果使用内連接配接查找的記錄在資料表中不存在,并且在WHERE子句中嘗試一下操作:col_name IS NULL 時,如果col_name 被定義為NOT NULL ,MySQL将在找到符合連接配接執行條件的記錄後停止搜尋更多的行。
自身連接配接
同一資料表對其自身進行連接配接
多表删除
DELETE tbl_name[. *] [,tbl_name[.*]]...
FROM table_references
[WHERE where_condition]