天天看點

程式員之路:MySQL子查詢與連接配接

第一部分:子查詢

子查詢(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]