今天依然學習了數據表的相關操作,這章主要講的就是數據表的查詢。
一、連接查詢
1.基本概念
我們學習連接查詢,就要先了解連接查詢的概念,那到底什么是連接查詢呢?連接查詢就是將兩個或兩個以上的白,連接起來,當做一個數據源,並從中獲取所需要的數據。
到底怎么樣連接呢?其實就是將兩個表的每一行數據對接起來,每次對接的結果就是連接之后的一行數據。
進行連接查詢之后:
當然上面沒有連接條件的連接,也可以寫成以下幾種:
select * from 表1,表2;
select * from 表1 join 表2;
select * from 表1 cross join 表2;
以上的連接都可以叫做交叉連接;
2.基本形式
連接的基本形式是:
表1 [連接形式] join 表2 [on 連接條件];
如果是3個表,則可以進一步擴展為:
表1 [連接形式] join 表2 [on 連接條件] [連接形式] join 表3 [on 連接條件]
3.連接的分類
連接的根據連接形式的不同可以分為以下幾類:
交叉連接
也就是剛才上面距離的那種連接,它沒有條件只是按照連接的基本概念進行連接,將所有可能出現的行全部兩兩相互組成行,也稱為“笛卡爾積”;
對於表1(有n個字段,m行),表2(x個字段,y行)那他們交叉連接的結果就是:有n+x個字段,m*y行;
內連接
形式: select * from 表1 inner join 表2 on 連接條件;
注意:沒有條件的內連接就是交叉連接;
我們再查詢的時候,一定要注意,查出來的數據要有意義,我們的內連接其目的就是幫我們在多個表中尋找出有意義的數據;
以上表中的數據,info.id = n.id是被稱作“連接條件的”,它基本上就是我們之前所學的“外鍵關系的一種描述”。
注意:
這種的表跟表之間的內連接查詢,雖然可以體現為表跟表之間的關系連接——外鍵關系——但並不是有外鍵關系才能使用這種連接。
另外也可以使用as取別名。
左外連接
形式:表1(左表) left join 表2(右表) on 連接條件
含義:其實就是將兩個表的內連接的結果,再加上左邊表的不符合內連接所設定的條件的那些數據的結果選擇出來;
右外連接
形式:表1(左表) right join 表2(右表) on 連接條件
含義:就是將連個表的內連接結果,再加上右邊表的不符合內連接所設定的條件的那些數據的結果選擇出來;
全外連接
形式:mysql 不支持全連接的語法;
含義:兩個表的內連接結果,再加上兩表中都不符合條件的部分所得出的數據結果。
為了更好的理解連接查詢,我們多舉幾個例子:
二、子查詢
1.基本含義
一個select語句就是一個查詢語句:
select 字段或者表達式 from 數據源 where XX為判斷條件
所謂的子查詢,就是在一個查詢語句的內部的某些位置又出現的查詢語句。同常,子查詢是為了主查詢而服務的,都是子查詢獲得結果之后,才會去執行主查詢。
子查詢的方式:
select 字段||表達式||子查詢 [as 別名] from 表明||連接結果||子查詢 where 字段||表達式||子查詢
以上寫 子查詢 的位置都可以出現子查詢;
子查詢按使用位置可以分為:
--作為主查詢的結果數據
select c, (select f1 from tabe2)as f11 from tab1;這里的子查詢應該只有一個數據。
--作為主查詢的數據源
select c from (select f1 form tab2)這里的子查詢應該有多個數據。
--作為主查詢的條件數據
select c from tab1 where c in(select f1 from tab2) 在這里子查詢可以是多個數據。
2.常見的子查詢
比較運算符中的子查詢
形式: 操作數 比較運算符 (標量子查詢)
說明: 操作數,就是一個字段名;
舉例:select .... from XXX where id > 5;
找出商品的最高價格:
select * from product where price = (select max(price) from product);
使用in的子查詢
形式: XX in (子查詢列表);
舉例:
select * from product where protype_id in (select protype_id from product_type where protype_name like "%電%");
使用any的子查詢
形式: 操作數 比較運算符 any (列子查詢);
含義:當某個字段 對於該列子查詢的其中任意一個值,滿足該比較運算符,則就算是滿足條件了,即:只要有一個值滿足,則就滿足。
舉例:
表1
id | age |
1 | 18 |
2 | 19 |
5 | 26 |
13 | 22 |
表2
id | name |
1 | 小紅 |
2 | 小花 |
6 | 小草 |
9 | 小明 |
表達式 select * from tab1 where id >any (select id from tab2 where id<6);
則可以輸出的結果為:
id | age |
2 | 19 |
5 | 26 |
13 | 22 |
使用all的子查詢
形式: 操作數 比較運算符 all (列子查詢)
含義: 當某個字段對於該列子查詢的所有數據值,都滿足該比較運算符,才算滿足了條件,即要求全部滿足,才算滿足;
舉例:
表1
id | age |
1 | 18 |
2 | 19 |
5 | 26 |
13 | 22 |
表2
id | name |
1 | 小紅 |
2 | 小花 |
6 | 小草 |
9 | 小明 |
表達式: select * from tab1 where id < any (select id from tab2 where id>2);
輸出結果為:
id | age |
1 | 18 |
2 | 19 |
5 | 26 |
使用some 子查詢
some 是any的同義詞,用法與any相同
使用exists查詢
形式: where exists(子查詢)
含義:該子查詢如果“有數據”,則exists的結果是true,否則就是false;
說明:因為,exists子查詢的該含義,會造成主查詢往往出現全部都取出,或全部不取出 的情況;
在實際應用中,該子查詢,往往都不是獨立的子查詢,而是會需要跟“主查詢”的數據源,建立某種關心--通常就是連接關系。建立的方式是“隱士的”,即沒有在代碼上體現關系,但卻在內部有其連接的實質。
連接方式通常就體現在子查詢的where條件語句中,使用了主查詢表中的數據;
注意:
這種查詢語句沒有辦法獨立運行,而是必須跟主查詢一起使用;
該子查詢中的條件,應該設定為跟主查詢的某個字段一頂的關聯性判斷,通常該判斷就是這兩個表的“本來就該有的連接條件”;
如果一個查詢需求,可以使用連接查詢,也可以使用子查詢,我們通常是推薦使用連接查詢的,這樣的效率會更高;
三、聯合查詢
在mysql手冊中,將連接查詢翻譯為聯合查詢(join),而聯合查詢(union)沒有明顯的翻譯;在通常的文章中,join被翻譯為連接查詢;union才被翻譯為聯合查詢;
1.基本概念
將兩個具有相同字段數量的查詢語句的結果,以上下堆疊的方式合並為一個查詢結果
兩個select 語句的查詢結果的字段數必須一致,也應該讓兩個查詢語句的字段類型也保持一致,也可以聯合更多的查詢結果;
2.語法形式
select 語句1 union [all || distinct] select 語句2;
聯合查詢的語句,默認會“自動消除重復行”,默認為distinct,如果想要將所有的數據顯示,就用all,這里,用all才具有意義;
3.細節注意
應該將這個聯合查詢的結果理解為最終為一個表格數據,且默認使用第一個select 語句中的字段名;
默認情況下,order by子句和limit 子句只能對整個聯合之后的結果進行排序 select.....union select......order by xxx limit m,n;
如果第一個select語句中的列有別名,則order by子句中就必須使用別名。
使用聯合查詢來實現全外查詢: