mysql必知必會 mysql必知必會(四)

2021-10-11 16:03:21 字數 3846 閱讀 7498

十四、理解子查詢

1、通過子查詢過濾

這本書在所有的章節都關連到了資料庫表,訂單資料是儲存在兩個表中,orders表儲存著:訂單號碼、顧客id和訂單日期。個人的訂單列表關連著orderitems表,訂單表沒有儲存顧客資訊,它只是儲存著顧客id,這實際的顧客資訊是儲存在customers表中。

現在假設你想要乙個預定「tnt2」所有的顧客,如何來檢索這個資訊呢?有一些幾個步驟:

(1)檢索所有訂單包含tnt2的訂單號

(2)根據訂單號檢索所有顧客的顧客id

(3)根據顧客id檢索所有顧客的資訊

這些步驟中的每一步都可以被單獨執行,通過這麼做,可以通過乙個select語句後面跟著where從句後再跟乙個select語句

(1)首先我們根據orderitems表找到訂單號

(2)然後根據訂單號在20005到20007找到顧客id

(3)最後將這兩個命令連線起來就是我們需要找的內容了

這裡我們用到了兩個select語句,那麼系統執行該命令會先執行(1)再執行(2)

2、使用子查詢來進行計算操作

另乙個使用子查詢的是建立計算,比如你想通過customers表顯示每乙個顧客的所有訂單的數量,訂單是儲存在orders表中,與customer id相關聯。

為了執行該操作,需要做如下步驟

(1)從customers表中檢索顧客列表

(2)通過和orders表關連訂單表,檢索每乙個顧客訂單數目的總和。

(1)找到顧客id為10001的訂單總和

select count(*) from orders where cust_id = 10001;

(2)檢索每個顧客訂單數目的總和

首先我們查詢的是cust_name、cust_state還有各個顧客的訂單總和

這裡有個新的知識點order.cust_id = customer.cust_id,這個從句是告訴sqlcustomers表與訂單表中的cust_id比較

例題請看sqlzoo練習(2)

十五、連線表

1、理解join

sql最強有力的特性之一就是在資料檢索查詢中即時進行連線表的能力,join是執行select語句最重要的操作,理解join和join語法對學習sql是很重要的。

在你有效率的使用join 之前,你必須理解關係表和關聯式資料庫設計的基礎,接下來的內容絕不會完全涵蓋該主題,但足以使您提高並執行。

(1)理解關係表

最好的理解關係表的方法是看真實世界的案例。

假設你有乙個資料庫表包含乙個商品目錄,每乙個目錄項都是單獨的一行,每一項都儲存著各種資訊,包括商品詳細描述和**,建立這商品的公司的**商資訊。

這裡的關鍵是多次出現相同的資料永遠不是一件好事,這個原則是關聯式資料庫設計的基礎,關係表經過精心設計,因此資訊可以分為多個表,這些表通過公共值相互關聯(因此在關係設計中是相互關聯的)

在我們的例子中,你可以建立兩張表,乙個是**商資訊表,乙個是商品資訊表,**商資訊表包含所有**商的資訊,一行對應乙個**商,每乙個**商都是唯一的,這值被稱為主鍵,可以是**商的id,或者其他任意唯一的值,商品表儲存的是商品資訊,沒有除了**商id之外的其他**商的詳細資訊,這值被稱為外來鍵,使vendors表和商品表相關聯,使用**商id能夠讓你使用**商表。

(2)為什麼使用join呢?

如前所述,將資料分為多個錶可實現更有效的儲存,更輕鬆的操作和更大的可伸縮性。 但是這些好處是有代價的。如果資料儲存在多個表中,那麼如何使用單個select語句檢索該資料?

答案是使用join, 簡而言之,join是一種用於關聯select語句中的表的機制(因此稱為join)。 使用特殊語法,可以join多個表,以便返回一組輸出,並且join可以即時關聯每個表中的正確行。

2、建立乙個join

建立乙個join是非常簡單的,您必須指定要包括的所有表以及它們如何相互關聯。 看下面的例子:

請仔細閱讀前面的**。通過指定列,select語句以相同的方式從所有您已查詢的宣告中開始檢索。 這裡的最大區別是,兩個指定列(prod_name和prod_price)在乙個表中,而另一列(vend_name)在另乙個表中。現在看一下from子句。 與所有先前的select語句不同,此語句在from子句中列出了兩個表,即**商和產品。 這些是此select語句中要連線的兩個表的名稱。 這些表通過where子句正確連線,該子句指示mysql將vendors表中的vend_id與products表中的vend_id進行匹配。您會注意到,這些列被指定為vendors.vend_id和products.vend_id。 此處需要此標準列名稱,因為如果您僅指定vend_id,mysql將無法告訴您所指的是vend_id列(因為其中有兩個,每個表乙個)

3、內連線

select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id = products.vend_id;

在該命令中,select命令是相同的,但是from從句是不同的。這裡兩個表的關係 是通過inner join 連線在一起的。

4、多表連線

sql沒有限制join表的數量,貴族和其他join是相同的,首先列出所有表,然後定義彼此的關係,這裡有乙個例子:

join的含義就是將兩個表通過欄位在一起。

例題請看sqlzoo練習(2)

mysql的必知必會 mysql 必知必會 筆記

好久沒有寫了。1 show columns from table 等同於describe table顯示的是表的結構。而select from table 則顯示的是整個表中插入的資料。2 select distinct c1,c2 from table除非列不相同,否則所有行將被檢索出來,即不能對...

mysql必知必會

一周了,總想寫點什麼,有的時候進步真的很難在一周顯示出來,週三的時候,我跟我的領導說,好快啊,又週三了,不知不覺,他說是啊,現在對於他來說,有時候他過一天可能跟我過一周的感覺差不多,每天都在忙,時間過的特別快,也沒有感覺做出來點什麼,當然實際肯定是怎麼做了一些東西的,是否我以後也會如此呢?說說技術把...

mysql必知必會

觸發器 create trigger 觸發器名稱 觸發器必須有名字,最多64個字元,可能後面會附有分隔符.它和mysql中其他物件的命名方式基本相象.觸發器有執行的時間設定 可以設定為事件發生前或後。同樣也能設定觸發的事件 它們可以在執行insert update或delete的過程中觸發。on 表...