MySQL的深入淺出(三)—— 多表查詢和子查詢

一、多表連接查詢

數據表的連接查詢比較常用的有內連接和外連接查詢兩種

1.內連接(指定條件下的笛卡爾積)

內連接有兩種,顯式的和隱式的,返回連接表中符合連接條件和查詢條件的數據行。(所謂的鏈接表就是數據庫在做查詢形成的中間表)。

例如:下面的語句3和語句4的結果是相同的。
語句1:隱式的內連接,沒有inner join,形成的中間表爲兩個表的笛卡爾積。

select o.id,o.order_number,c.id,c.name from customers c, orders o wherec.id=o.customer_id;

語句2:顯示的內連接,一般稱爲內連接,有inner join,形成的中間表爲兩個表經過on條件過濾後的笛卡爾積。

select o.id,o.order_number,c.id,c.name from customers c inner join orders o onc.id=o.customer_id;

這裏注意的是on後面其實跟的就是外鍵約束中相對應的兩個列名!

2.外連接

外連接分2種,左連接和右連接;它們用法上一樣一樣的,查詢 邏輯上互爲相反;具體語法如下:

SELECT field1,field2,...fieldn from table_name LEFT|RIGHT JOIN join_table ON join_condition;

左連查詢和右連查詢的區別是,以執行語句中的哪個表爲主表, 所謂主表即以主表爲準,主表中有的數據才顯示, 主表中沒有的
數據即使附表中有也不顯示在結果中

  • 建議小表拼大表
select c_name,ct_name from commodity inner join commoditytype on c_type=ct_id;
select c_name,ct_name from commoditytype(小表) inner join commodity(大表) on c_type=ct_id;#效率高

一張圖看懂 內外 左右連接查詢的區別
在這裏插入圖片描述


二、子查詢

連接查詢確實能將兩張表格同時查詢輸出,但有是我只是想 用一張表的數據作爲條件去查另一張表,我們需要用到子查詢了;

  • 單行單例
    我們一起來看下面這條查詢語句:
select * from table_a where sal > ( select sal from table_b where name = 'TomCat' ); 

這其實就是一條簡單的子查詢語句,先從b表中查詢出tomcat的
售價,那括號內的查詢結果一定是單行單例的一個值了,那麼再 通過這個值去查詢出售價大於這個值的所有商品;

注意:這裏的返回值必須是單行單例的值!

  • 單行多列(應用不多)
    返回結果在內存中構成一個單行多列的數據表,返回單行多列的子查詢在實際應用中與返回單行單列的數據類似,只是查詢條件可以擴展成多個,用括號把查詢條件括起來:
 select * from table_a where (sal,name) = ( select sal,name from table_b where name = 'TomCat' );

先從b表中查詢出tomcat的售價,輸出的結果有2個列屬於單行多 列,分別是售價和名字,那麼再通過這兩個值去查詢和這兩個值 相等的所有商品; 注意:這裏的返回值和查詢的列名順便必須一致!

  • 單列多行
select * from table_a where sal IN (select sal from table_b;);//查詢結果在返回字段結果內的 
select * from table_a where sal NOT IN (select sal from table_b;);//查詢結果不在返回字段結果內的
select * from table_a where sal >=ANY (select sal from table_b;);//查詢結果在返回字段結果內任意滿足 
select * from table_a where sal >=ALL (select sal from table_b;);//查詢結果在返回字段結果內全部滿足

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章