mysql零距離接觸-子查詢和鏈接

一,概念

(1)子查詢指嵌套在查詢內部,且必須始終出如今圓括號內。
(2)子查詢能夠包含多個關鍵字或條件,如:
DISTINCT / GROUP BY / ORDER BY / LIMIT / 函數等。
(3)子查詢的外層查詢能夠是:SELECT, INSERT, UPDATE , SET 或DO
(4)子查詢能夠返回標量、一行、一列或子查詢。函數

二,MySQL 子查詢分類

上面演示了一個簡單的子查詢例子,根據子查詢的返回數據形式(如上例中返回的 uid 序列),能夠分爲以下幾類:學習

    - 標量子查詢:返回單一值的標量,最簡單的形式。ui

    - 列子查詢:返回的結果集是 N 行一列。spa

    - 行子查詢:返回的結果集是一行 N 列。blog

    - 表子查詢:返回的結果集是 N 行 N 列。教程

子查詢操做符

在主查詢中,可使用比較操做符以使用操做符來對子查詢返回的結果進行比較,從而肯定查詢的條件。如上面例子使用了 IN 操做符。字符串

可使用的操做符有:= > < >= <= <> ANY IN SOME ALL EXISTS ,咱們將在本節餘下的教程中學習這些操做符在子查詢中的使用方法。it

三,具體

標量子查詢

標量子查詢是指子查詢返回的是單一值的標量,如一個數字或一個字符串,也是子查詢中最簡單的返回形式。io

可使用 = > < >= <= <> 這些操做符對子查詢的標量結果進行比較table

SELECT * FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2)

列子查詢

列子查詢是指子查詢返回的結果集是 N 行一列,該結果一般來自對錶的某個字段查詢返回。

一個列子查詢的例子以下:

SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1)

列子查詢中使用 IN、ANY、SOME 和 ALL 操做符(= ANY 或 = SOME 等價於 IN)

因爲列子查詢返回的結果集是 N 行一列,所以不能直接使用 = > < >= <= <> 這些比較標量結果的操做符。在列子查詢中可使用 IN、ANY、SOME 和 ALL 操做符:

    - IN:在指定項內,同 IN(項1,項2,…)。

    - ANY:與比較操做符聯合使用,表示與子查詢返回的任何值比較爲 TRUE ,則返回 TRUE 。

    - SOME:ANY 的別名,較少使用。

    - ALL:與比較操做符聯合使用,表示與子查詢返回的全部值比較都爲 TRUE ,則返回 TRUE 。

行子查詢

行子查詢是指子查詢返回的結果集是一行 N 列,該子查詢的結果一般是對錶的某行數據進行查詢而返回的結果集。

一個行子查詢的例子以下:

SELECT * FROM table1 WHERE (1,2) = (SELECT column1, column2 FROM table2)

在該例子中,在保證子查詢返回單一行數據的前提下,若是 column1=1 且 column2=2 ,則該查詢結果爲 TRUE。

MySQL 行構造符

在上面的例子中,WHERE 後面的 (1,2) 被稱爲行構造符,也能夠寫做 ROW(1,2)。行構造符一般用於與對能返回兩個或兩個以上列的子查詢進行比較。

表子查詢

表子查詢是指子查詢返回的結果集是 N 行 N 列的一個表數據。

SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog)

四,insert使用子查詢

INSERT [INTO] tbl_name [(col_name,...)] SELECT ...將查詢結果寫入數據表

INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

五,多表更新

UPDATE table_references SET col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}]... [WHERE where_condition]

table_references 變成:

table_references {[INNER|CROSS] JOIN } | {[LEFT|RIGHT] [OUTER] JOIN} table_references ON conditional_exp

如:

update tdb_goods inner join tdb_goods_cates on goods_cate=cate_name set goods_cate=cate_id;

六,鏈接

MySQL在SELECT語句、多表更新、多表刪除語句中支持JOIN操做。

table reference A
{[INNER|CROSS] JOIN | {LEFT|RIGHT} [OUTER] JOIN}
table_reference B
ON condition_expr

使用ON設定鏈接條件,也能夠用WHERE代替
· ON:設定鏈接條件
· WHERE:進行結果集記錄的過濾

內鏈接:
在MySQL中JOIN,INNER JOIN,CROSS JOIN是等價的


外鏈接:

LEFT JOIN左外鏈接;RIGHT JOIN右外鏈接

多表鏈接:

多表的鏈接跟兩張表的鏈接同樣
表的鏈接實質就是外鍵的逆向約束

七,無限分類

即在同一張表中既有父類,又有子類

自身鏈接:本身與本身鏈接,經過別名的方式將一張物理表,變成兩張邏輯表來實現,而後拼接出一張邏輯表!

八,多表刪除

(1)INSERT ... SELECT實現複製 INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20); (2)查找重複記錄 SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2; (3) 刪除重複記錄 DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;

相關文章
相關標籤/搜索