MySQL基礎(4)——子查詢(巢狀查詢)、聯結表、組合查詢
本篇主要整理查詢表、聯結表的相關內容。
一、子查詢
MySQL 4.1版本及以上支援子查詢
子查詢:巢狀在其他查詢中的查詢。
子查詢的作用:
1、進行過濾:
例項1:檢索訂購物品TNT2的所有客戶的ID
= +
一般,在WHERE子句中對於能巢狀的子查詢的數目沒有限制,不過在實際使用時由於效能的限制,不能巢狀太多的子查詢。
注意:列必須匹配 ——在WHERE子句中使用子查詢(如這裡所示),應該保證SELECT語句具有與WHERE子句中相同數目的列。通常,子查詢將返回單個列並且與單個列匹配,但如果需要也可以使用多個列。
示例2:返回訂購產品TNT2的客戶列表
該例項更為有效的方法是採用聯結進行查詢:
注意:具體關於聯結的內容下文會整理到。
2、建立計算欄位:
相關子查詢:涉及外部查詢的子查詢。當列名可能有多義性時必須使用該語法。
例項:顯示customers 表中每個客戶的訂單總數
總結:
子查詢最常見的使用是在WHERE子句的IN操作符中,以及用來填充計算列子查詢建立(和測試)查詢的最可靠的方法是逐漸進行, 這與MySQL處理它們的方法非常相同。首先,建立和測試最內層的查詢。然後,用硬編碼資料建立和測試外層查詢,並且僅在確認它正常後才嵌入子查詢。這時,再次測試它。對於要增加的每個查詢,重複這些步驟。這樣做僅給構造查詢增加了一點點時間,但節省了以後(找出查詢為什麼不正常)的大量時間,並且極大地提高了查詢一開始就正常工作的可能性。
二、聯結表
聯結表是SQL最強大的功能之一
1、一些相關的基礎知識儲備:
關係表:保證把資訊分解成多個表,一類資料一個表。各表通過某些常用的值(即關係設計中的關係(relational))互相關聯。節省時間和儲存空間,同時方便資料的修改、更新。因此,關係資料庫的可伸縮性遠比非關係資料庫要好。
可伸縮性(scale):能夠適應不斷增加的工作量而不失敗。設計良好的資料庫或應用程式稱之為可伸縮性好。
聯結:聯結是一種機制,用來在一條SELECT語句中關聯表,可以聯結多個表返回一組輸出。
聯結不是物理實體——它在實際的資料庫表中不存在。聯結由MySQL根據需要建立,它存在於查詢的執行當中。
在使用關係表時,僅在關係列中插入合法的資料非常重要。為防止這種情況發生,需要維護引用完整性,它是通過在表的定義中指定主鍵和外來鍵來實現的。
2、基礎聯結:
例項1:
這兩個表用WHERE子句正確聯結:WHERE子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id。注意:在引用的列可能出現二義性時,必須使用完全限定列名(用一個點分隔的表名和列名)。
在一條SELECT語句中聯結幾個表時,相應的關係是在執行中構造的,在資料庫表的定義中不存在能指示MySQL如何對錶進行聯結的東西。在聯結兩個表時,實際上是將第一個表中的每一行與第二個表中的每一行配對。WHERE子句作為過濾條件,它只包含那些匹配給定條件(這裡是聯結條件)的行。沒有WHERE子句,第一個表中的每個行將與第二個表中的每個行配對,而不管它們邏輯上是否可以配在一起。
笛卡兒積:由沒有聯結條件的表關係返回的結果。檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數。有時也被稱為叉聯結。
例項2:顯示編號為20005的訂單中的物品
應該保證所有聯結都有WHERE子句,否則MySQL將返回比想要的資料多得多的資料。
MySQL在執行時關聯指定的每個表以處理聯結。這種處理可能是非常耗費資源的,因此應該仔細,不要聯結不必要的表。聯結的表越多,效能下降越厲害。
等值聯結:基於兩個表之間的相等測試,也被稱為內部聯結。(最經常使用的聯結方式)
例項:
ANSI SQL規範首選INNER JOIN語法。此外,儘管使用WHERE子句定義聯結的確比較簡單,但是使用明確的聯結語法能夠確保不會忘記聯結條件,有時候這樣做也能影響效能。
3、高階聯結:
例項1:給表起別名(同給列起別名用法一樣)
注意:表別名只在查詢執行中使用。與列別名不一樣,表別名不返回到客戶機。
使用表別名的主要原因之一是能在單條SELECT語句中不 止一次引用相同的表
例項2:查詢生產ID為DTNTR的物品的供應商生產的其他物品
上述解決方法為自聯結,自聯結通常作為外部語句用來替代從相同表中檢索資料時使用的子查詢語句。該例項也可用子查詢來解決。雖然最終的結果是相同的,但有時候處理聯結遠比處理子查詢快得多。在解決問題時,可以試一下兩種方法,以確定哪一種的效能更好。
自然聯結:排除多次出現,使每個列只返回一次。一般我們用到的內部聯結都是自然聯結 。
例項3:自然聯結
自然聯結一般是通過對錶使用萬用字元(SELECT *),對所有其他表的列使用明確的子集來完成的。
外部聯結:聯結包含了那些在相關表中沒有關聯行的行。
例項4:檢索所有客戶,包括那些沒有訂單的客戶
用法與內部聯結相似,使用了關鍵字OUTER JOIN來指定聯結的型別。但是,與內部聯結關聯兩個表中的行不同的是,外部聯結還包括沒有關聯行的行。
存在兩種基本的外部聯結形式:左外部聯結和右外部聯結。在使用OUTER JOIN語法時,必須使用RIGHT或LEFT關鍵字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右邊的表,而LEFT 指出的是OUTER JOIN左邊的表)。上面的例子使用LEFT OUTER JOIN從FROM 子句的左邊表(customers表)中選擇所有行。
注意:MySQL不支援簡化字元*=和=*的使用,儘管這兩種操作符在其他DBMS中很流行。
例項5:檢索所有客戶及每個客戶所下的訂單數(包括沒有下任何訂單的客戶
聚集函式可以方便地與各種聯結型別一起使用
使用聯結和聯結條件:
1. 注意所使用的聯結型別。一般我們使用內部聯結,但使用外部聯 結也是有效的。
2. 保證使用正確的聯結條件,否則將返回不正確的資料。
3. 應該總是提供聯結條件,否則會得出笛卡兒積。
4. 在一個聯結中可以包含多個表,甚至對於每個聯結可以採用不同的聯結型別。雖然這樣做是合法的,一般也很有用,但應該在一起測試它們前,分別測試每個聯結。這將使故障排除更為簡單。
三、組合查詢
組合查詢:執行多個查詢(多條SELECT語句),並將結果作為單個查詢結果集返回。這些組合查詢通常稱為並(union)或複合查詢。
為何需要組合查詢?
- 在單個查詢中從不同的表返回類似結構的資料;
- 對單個表執行多個查詢,按單個查詢返回資料;
- 使用組合查詢可極大地簡化複雜的WHERE子句,簡化從多個表中檢索資料的工作。
1、建立組合查詢
關鍵字:UNION操作符
例項1:得到價格小於等於5的所有物品的一個列表,並且包括供應商1001和1002生產的所有物品(不考慮價格)。
UNION指示MySQL執行兩條SELECT語句,並把輸出組合成單個查詢結果集。該解法與where prod_price<=5 OR vend_id in(1001,1002);等效
使用並時需要注意的規則:
1. UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關鍵字UNION分隔(因此,如果組合4條SELECT語句,將要使用3個UNION關鍵字)。
2. UNION中的每個查詢必須包含相同的列、表示式或聚集函式(不過各個列不需要以相同的次序列出)。
3. 列資料型別必須相容:型別不必完全相同,但必須是DBMS可以隱含地轉換的型別(例如,不同的數值型別或不同的日期型別)
4. 使用UNION的組合查詢可以應用不同的表在一些簡單的例子中,使用UNION可能比使用WHERE子句更為複雜。 但對於更復雜的過濾條件,或者從多個表(而不是單個表)中檢索資料的情形,使用UNION可能會使處理更簡單。
UNION預設從查詢結果集中自動去除重複的行,如果 想返回所有匹配行,可使用UNION ALL而不實UNION。
注意:UNION幾乎總是完成與多個WHERE條件相同的工作。UNION ALL為UNION的一種形式,它完成WHERE子句完成不了的工作。如果確實需要每個條件的匹配行全部出現(包括重複行),則必須使用UNION ALL而不是WHERE
例項2:對組合查詢結果排序
在用UNION組合查詢時,只能使用一條ORDER BY子句,它必須出現在最後一條SELECT語句之後。對於結果集,不存在用一種方式排序一部分,而又用另一種方式排序另一部分的情況,因此不允許使用多條ORDER BY子句。該ORDER BY子句對所有SELECT語句返回的所有結果進行排序。
相關推薦
MySQL基礎(4)——子查詢(巢狀查詢)、聯結表、組合查詢
本篇主要整理查詢表、聯結表的相關內容。 一、子查詢 MySQL 4.1版本及以上支援子查詢 子查詢:巢狀在其他查詢中的查詢。 子查詢的作用: 1、進行過濾: 例項1:檢索訂購物品TNT2的所有客戶的ID = + 一般,在WHERE
MySQL--操作簡記(聯結表,組合查詢(UNION))
聯結表1.建立聯結SELECT vend_name,prod_name,prod_price FROM vendors, products WHERE vendors.vend_id = products.vend_id123上面的語句與之前最大的區別在於,指定的列位於兩張表
使用MyBatis(八)一對一關聯(巢狀查詢,巢狀結果)
1.建立2張表,建立主外來鍵關係 2.建立實體類 package com.yw.test06; public class Class { private int id; private
mysql必知必會--學習筆記(8)--子查詢 where巢狀查詢語句,作為計算欄位使用子查詢
1、子查詢的查詢過程一般是通過where中的in操作符來完成,in後面跟上一個子查詢,通常in之前的列名和子查詢查詢出來的列名是一致的。例如select name from book where id in (select book_id from store where s
MySQL 基礎數據類型優化(如何選擇數據類型)
高性能 amp 處理 字節 方便 集合 arc 大數 back 前言: 最近在看高性能 MySQL,記錄寫學習筆記: 高性能 MySQL 學習筆記(二) Schema與數據類型優化 筆記核心內容:MySQL 如何選擇正確的數據類
MySQL基礎環境_安裝配置教程(Windows7 64或Centos7.2 64、MySQL5.7)
secure https http cti -s entos 重啟 init data MySQL基礎環境_安裝配置教程(Windows7 64或Centos7.2 64、MySQL5.7) 安裝包版本 1) VMawre-workstation版本包 地址:
人工智慧(mysql)—— mysql高階查詢(索引、多表、連線)
一、索引 1、索引的定義 對資料庫中表的一列或者多列的值進行排序的一種結構(MySQL中索引用Btree方式) 2、索引的優點 加快資料的檢索速度 3、索引的缺點 a、
Oracle之子查詢(巢狀查詢select巢狀)
一、單值子查詢(> >= = < <= <> 子查詢的結果為1個數據) --查詢最高工資的員工資訊 --1.查詢出最高工資 --5000 select max(sal) from emp; --2. 工資等於最高工
MySQL事物的4種併發問題(髒讀,幻讀,不可重複度,丟失更新)
由於MySQL事物的隔離級別不同,可以造成一些併發問題:一、髒讀: 事物A修改了資料表中的一個數據num,但是沒有提交,此時事物B讀取了num,事物A rollback ,num改變為原來的值,那麼事物B讀到的num即為髒資料。二、幻讀: 事物A在用一個表,此時事
MySQL(學生表、教師表、課程表、成績表)多表查詢
多表查詢SQL語句 1、表架構 student(sid,sname,sage,ssex) 學生表 course(cid,cname,tid) 課程表 sC(sid,cid,sc
【Linux】【Services】【SaaS】Docker+kubernetes(4. 用ansible管理機器和軟件)
實現 service SDR https 輸出 公司 keygen /etc slave 1. 簡介 1.1. 公司環境使用的puppet,但是我更喜歡ansible,原因有二,第一,我是紅帽的忠粉:),第二,我對python比較熟悉 1.2. ansible官方網站:ht
MySql必知必會實戰練習(四)主鍵、外來鍵、sql約束、聯結表 MySql資料庫約束
本博將對主鍵、外來鍵、MySql資料庫約束和聯結表的相關特性進行總結和實戰 1. 主鍵 表中的每一行都應該具有可以唯一標識自己的一列(或一組列),而這個承擔標識作用的列稱為主鍵 如果沒有主鍵,資料的管理會十分混亂。比如會存在多條一模一樣的記錄,刪除和修改特定行十分困難 (1)哪些列可以作為
(python)子程序(Process類的使用)
Python提供了multiprocessing模組來開啟子程序,並在子程序中執行我們定製的任務。提一嘴(multiprocessing模組的功能眾多,支援子程序,通訊,共享資料,執行不同形式的同步。為些它提供了Process、Queue、Pipe、Lock等元件。)建立程序
MySQL資料庫(二)---資料型別、資料表、約束
資料型別 資料型別是指列、儲存過程引數、表示式和區域性變數的資料特徵,它決定了資料的儲存格式,代表了不同的資訊型別。 整形 TINYINT SMALLINT MEDIUMINT INT BIGINT 浮點型 M是數字總位數 D是小數
MySQL之終端(Terminal)管理資料庫、資料表、資料的基本操作
MySQL有很多的視覺化管理工具,比如“mysql-workbench”和“sequel-pro-”。 現在我寫MySQL的終端命令操作的文章,是想強化一下自己對於MySQL的理解,總會比使用圖形化的理解透徹,因為我本來就比較喜歡寫程式碼。同時寫出來這些文章,是想要給大家當個參考,希望也能對大家有所幫助,有所
hive支援sql大全(4-6:數值計算/日期函式/條件函式)
四、數值計算1. 取整函式: round 語法: round(double a) 返回值: BIGINT 說明: 返回double型別的整數值部分(遵循四捨五入) 舉例: hive> select round(3.1415926) from lxw_dua
1999:日誌排序(4.1演算法之排序和演算法效能)
1999:日誌排序 總時間限制: 1000ms 記憶體限制: 65536kB 描述 有一個網路日誌,記錄了網路中計算任務的執行情況,每個計算任務對應一條如下形式的日誌記錄:“hs_10000_p”是計算任務的名稱,“2007-01-17 19:22:53,
圖的儲存結構(鄰接矩陣、鄰接表、十字連結串列、鄰接多重表)詳解
上篇部落格講到,圖狀結構是非常複雜的結構,圖也是非常複雜的,所以圖的儲存就是一個非常重要的部分,因為我們不僅要表示頂點集,還要表示邊集,如何完整準確的表示圖呢,接下來,給大家講解四種圖的儲存方式。 一、鄰接矩陣法 1、定義 我們用一個二維陣列存放頂點間關係(邊或弧)的資料,這個二維陣
20181128(閉包函式,函式巢狀,名稱空間,作用域,裝飾器待補充)
一、函式物件 在面向物件的程式設計中 一切皆物件 具體的體現: 1.函式可以被引用 def bar(): print('from bar')f=barf()輸出結果為:from bar 2.函式可以作為函式的引數 def bar():
BZOJ4999 This Problem Is Too Simple!(樹上差分+dfs序+樹狀陣列)
對每個權值分別考慮。則只有單點加路徑求和的操作。樹上差分轉化為求到根的路徑和,子樹加即可。再差分後bit即可。注意樹上差分中根的父親是0,已經忘了是第幾次因為這個掛了。 #include<iostream> #include<cstdio> #include<cma