MySQL學習筆記13-16

 

十3、使用子查詢app

 

1、子查詢:嵌套在其餘查詢中的查詢。ide

 

子查詢老是從內向外處理。函數

 

一、利用子查詢進行過濾。測試

 

例如:訂單存儲在兩個表中其中orderitems表中存儲各訂單的物品。Orders表不存儲客戶信息,只存儲客戶的IDCustomers存儲客戶的信息。spa

 

先在要列出訂購物品TNT2的全部客戶。orm

 

SELECT cust_name, cust_contactxml

 

FROM customers排序

 

WHERE cut_id IN (SELECT cust_idip

 

                FROM ordersci

 

                WHERE order_num IN (SELECT order_num

 

                                    FROM orderitems

 

                                    WHERE prod_id = ‘TNT2’));

 

 

 

二、做爲計算字段使用子查詢

 

十4、聯結表

 

一、聯結

 

聯結的做用:聯結是一種機制,用來在一條SELECT語句中關聯表。

 

二、建立聯結

 

聯結的建立很是簡單,規定要聯結的全部的表以及它們如何關聯便可

 

例如:SELECT vend_name, prod_name, prod_price

 

      FROM vendors, products

 

      WHERE vendors.vend_id = products.vend_id

 

      ORDER BY vend_name, prod_name;

 

等值聯結(內部聯結):基於兩個表之間的相等測試。

 

這種聯結也可使用稍微不一樣的語法來實現

 

例如:SELECT vend_name, prod_name, prod_price

 

      FROM vendors INNER JOIN products

 

         ON vendors.vend_id = products.vend_id;

 

在這裏,兩個表之間的關係是FROM子句的組成部分,以INNER JOIN指定。在使用這種語法時,聯結條件用特定的ON子句而不是WHERE子句給出

 

 

 

聯結多個表

 

SQL對一條SELECT語句中能夠聯結的表的數目沒有限制。首先列出全部表,而後定義表之間的關係,WHERE後跟多個關係時,用AND鏈接。

 

 

 

 

 

例如:SELECT prod_name, vend_name, prod_price, quantity

 

      FROM orderitems, products, vnedors

 

      WHERE products.vend_id = vendors.vend_id

 

          AND orderitems.prod_id = products.prod_id

 

          AND order_num = 20005;

 

 

 

十5、建立高級聯結

 

一、使用表別名

 

別名除了用於列名和計算字段外,SQL還容許給表名起別名。這樣作有兩大理由:

 

--縮短SQL語句

 

--容許在單條SELECT語句中屢次使用相同的表

 

 

 

例如:SELECT cust_name, cust_contact

 

      FROM customers AS c, orders AS o, orderitems AS oi

 

      WHERE c.cust_id = o.cust_id

 

         AND oi.order_num = o.order_num

 

         AND prod_id = ‘TNT2’;

 

注意:表別名只在查詢執行中使用。與列別名不同,表別名不返回到客戶機。

 

二、使用不一樣類型的聯結

 

迄今爲止咱們使用的爲內部聯結或等值聯結的簡單聯結。如今看其餘三種聯結,它們分別是自聯結、天然聯結和外部聯結

 

1)、自聯結

 

     使用表別名的主要緣由之一是能在單條SELECT語句中不止一次引用相同的表。

 

例如:假如發現某物品(其IDDTNTR)存在問題,所以想知道生產該物品的供應商生產的其餘物品是否也存在問題。此查詢要求首先招待生產IDDTNTR的物品的供應商,而後找出這個供應商生產的其餘物品。

 

方法一:使用子查詢

 

SELECT prod_id, prod_name

 

FROM products

 

WHERE vend_id = (SELECT vend_id

 

                 FROM products

 

                 WHERE prod_id = ‘DTNTR’);

 

方法2、使用自聯結

 

  SELECT p1.prod_id, p1.prod_name

 

  FROM products AS p1, products AS p2

 

  WHERE p1.vend_id = p2.vend_id

 

     AND p2.prod_id = ‘DTNTR’;

 

 

 

2)、天然聯結

 

     天然聯結排除屢次出現,使每一個列只返回一次。

 

   迄今爲止,咱們創建的每一個內部聯結都是天然聯結。

 

 

 

 

 

3)、外部聯結

 

     外部聯結:聯結包含了那些在關聯表中沒有關聯行的行。

 

例如:先給出一個內部聯結,它檢索全部客戶及其訂單

 

      SELECT customers.cust_id, orders.order_num

 

      FROM customers INNER JOIN orders

 

        ON customers.cust_id = orders.cust_id;

 

 

 

下面給出外部聯結。檢索全部客戶,包括那些沒有訂單的客戶

 

 

 

SELECT customers.cust_id, orders.order_num

 

FROM customers LEFT OUTER JOIN orders

 

 ON customers.cust_id = orders.cust_id;

 

 

 

這條SELECT語句使用了關鍵字OUTER JOIN來指定聯結的類型。可是,與內部聯結關聯兩個表中的行不一樣的是,外部聯結還包括沒有關聯行的行。在使用OUTER JOIN語法時,必須使用RIGHTLEFT關鍵字指定其包括其全部行的表(RIGHT指出的是OUTER JOIN右邊的表,而LEFT指出的是OUTER JOIN左邊的表)

 

三、使用帶彙集函數的聯結

 

若是要檢索全部客戶及每一個客戶所下的訂單數,下面使用了COUNT()函數的代碼可完場工做。

 

SELECT customers.cust_name,

 

       customers.cust_id,

 

       COUNT(orders.order_num) AS num_ord

 

FROM customers INNER JOIN orders

 

ON customers.cust_id = orders.cust_id

 

GROUP BY customers.cust_id;

 

SELECT語句使用INNER JOINcustomersorders表互相關聯。

 

四、使用聯結和聯結條件

 

  • 注意所使用的聯結類型。通常咱們使用內部聯結,但使用外部聯結也是有效的
  • 應該老是提供聯結條件,不然會得出笛卡兒積
  • 在一個聯結中能夠包含多個表,甚至對於每一個聯結能夠採用不一樣的聯結類型。

 

 

 

十6、組合查詢

 

本章講述如何利用UNION操做符將多條SELECT語句組合成一個結果集

 

1、組合查詢

 

  MySQL容許執行多個查詢(多條SELECT語句),並將結果做爲單個查詢集返回。這些組合查詢一般稱爲並或複合查詢

 

須要使用組合查詢的兩種狀況:

 

  • 在單個查詢中從不一樣的表返回相似結構的數據
  • 對單個表執行多個查詢,按單個查詢返回數據

 

 

 

2、建立組合查詢

 

  

 

可用UNION操做符來組合數條SQL查詢。

 

UNION的使用很簡單。所須要作的只是給出每條SELECT語句,在各條語句之間放上關鍵字UNION

 

例如:假設須要價格小於等於5的全部物品的一個列表,並且還想包括供應商10011002生產的全部物品(不考慮價格)

 

 SELECT vend_id, prod_id, prod_price

 

 FROM products

 

 WHERE prod_price <= 5

 

 UNION

 

 SELECT vend_id, prod_id, prod_price

 

 FROM products

 

 WHERE vend_id IN (1001,1002);

 

 

 

UNION規則:

 

  •  UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關鍵字UNION分隔
  •  UNION中的每一個查詢必須包含相同的行、表達式或彙集函數(不過各個列不須要以形同的次序列出)
  •  列數據類型必須兼容:兼容沒必要徹底相同,但必須是DBMS能夠隱含地轉換的類型

 

 

 

包含或取消重複的行

 

使用UNION自動去除重複的行,若是要返回全部的行(包括重複的行)可以使用UNION ALL

 

 

 

對組合查詢結果排序

 

在用UNION組合查詢時,只能使用一條ORDER BY子句,它必須出如今最後一條SELECT語句以後。

相關文章
相關標籤/搜索