MYSQL學習筆記(八)之子查詢的優化 使用連線

2021-07-03 19:05:01 字數 2233 閱讀 4440

當在其他表進行子查詢時,mysql會將結果儲存在一張臨時表中,查詢結束後會釋放建立的臨時表,這就將使查詢的速度變慢。在多表查詢時一般不使用子查詢,而使用連線。

連線分為內連線,外連線,外連線又分為左外連線和右外連線。

例項:

觀察表tdb_goods會發現,欄位goods_cate和brand_name中有很多重複的記錄。

可以對goods_cate,brand_name進行分類。

語句:select  `goods_cate` from `tdb_goods` group by `goods_cate`;

語句:select  `brand_name` from `tdb_goods` group by `brand_name`;

我們發現在僅僅上面的23條記錄中就有很多重複的條目,如果記錄的條數為1000條,10000條,1000000條甚至更多呢?那將會多少是重複的?並且儲存乙個漢字要佔兩位元組,那有沒有更好的辦法來記錄這些資料呢?答案是有的。

可以把goods_cate和brand_name設定為「邏輯外來鍵「,通過外來鍵關聯其他的表來達到儲存的目的。

具體操作如下:

建立一張tdb_goods_cates表,把上面分類的結果插入到表中。

使用insert ...select....語句把記錄插入的表中

現在台式電腦對應有個編號為1,其他的類別都有乙個對應的編號。

接下來我們通過create...select實現查詢和插入資料一步到位。

查詢表中的記錄如下:

表中各種類別也都對應有乙個編號。

同樣的我們把錶tdb_goods中欄位goods_cate和brand_name中的相應類別也更新為對應的編號,並把欄位名也相應的更新為cate_id,和brand_id.

使用內連線(inner join)來更新。

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

update tdb_goods as a inner join `tdb_goods_brands` as b on a.brand_name=b.brand_name set a.brand_name=b.brand_id.

注意更新brand_name時一定要為兩張表起別名。因為兩張表中有重複字段,會有二義性。

修改欄位名稱alter table  tdb_goods

同樣的當我們要顯示產品的資訊時,也要同多表連線才能得到具體的值,而不是對應的編號。

使用內連線inner join來查詢出表中的資訊。

C 學習筆記(八) LINQ查詢之子查詢

在linq中,所謂的子查詢就是包含在另乙個查詢的lambda表示式中的查詢語句。下面這個示例中就是使用子查詢對一組 家名字按姓氏排序 string musos ienumerablequery musos.orderby m m.split last string names ienumerable...

mysql之子查詢

所謂子查詢,就是指在乙個查詢之中巢狀了其他的若干查詢,通過子查詢可以實現多表查詢,該查詢語句中可能包含in,any,all和exists等關鍵字,除此之外還可以包含比較運算子,子查詢經常出現在where和from字句中。where字句中的子查詢 該位置處的子查詢一般返回單行單列,多行單列,單行多列資...

MySQL 之子查詢

定義 子查詢指乙個查詢語句巢狀在另乙個查詢語句內部的查詢,這個特性從 mysql4.1 開始引入,在 select 子句中先計算子查詢,子查詢結果作為外層另乙個查詢的過濾條件,查詢可以基於乙個表或者多個表。子查詢中常用的操作符有 any some all in 和 exists。子查詢可以新增到 s...