一 . mysql 多表查詢mysql
以前咱們有接觸到的mysql單表查詢,如今碰見的就是mysql的單表查詢方式,首先說一下,咱們寫項目通常都會建一個數據庫那數據庫裏面是否是存了好多張表呢,不可能把全部的數據都放到一張表裏面多部隊,確定是要來分表存儲數據的,這樣節省空間,數據的組織結構更清晰,解耦和程序更高,這些表本質上面是否是一個總體呢。sql
首先,咱們打開mysql,咱們得先建立一個表,而後才能查詢,create table XXX (輸入你想加入的表格內容);而後再建立一個表數據庫
create table XXX (輸入你想加入的表格內容);給兩個表都插入一些數據insert into XXX values(想要插入的內容); insert into XXX values(想要插入的內容); # 注意輸入的文件名不要重複,最好也是簡單點的,便於輸入輸出, 輸入好了以後咱們要查看錶結構和數據:desc XXX;desc XXX; # 養成良好的習慣,減小錯誤的產生 select * from XXX:查看當前表的結構及全部數據。設計
二 . 多表鏈接查詢code
結構:select 字段列表 from 表1 inner | left | right 表2 on 表1.字段 = 表2.字段,基本的結構差很少就是這樣blog
笛卡兒積現象解釋圖:io
我們爲了更好的管理數據,爲了節省空間,爲了數據組織結構更清晰,將數據拆分到了不一樣表裏面,可是本質上是否是仍是一份數據,一份重複內容不少的很大的數據,因此咱們即使是分表了,可是我們是否是還須要找到一個方案把兩個原本分開的表可以合併到一塊兒來進行查詢,那你是否是就能夠根據部門找員工,根據員工找部門了,對不對,可是咱們合併兩個表的時候,如何合併,根據什麼來合併,經過笛卡兒積這種合併有沒有浪費,咱們其實想作的是否是說咱們的員工表中dep_id這個字段中的數據和部門表裏面的id可以對應上就能夠了,由於咱們知道咱們設計表的時候,是經過這兩個字段來給兩個表創建關係的,對不對,看下圖:table
外鏈接之左鏈接:select XXX1.id ,XXX1 name ,XXX2.name as 表中的名稱欄 from XXX1 left join XXX2 on XXX1.dep_id = XXX2.id;基礎
外鏈接之右鏈接:select XXX1.id ,XXX1.nama ,XXX2.name as 表中的名稱欄 from XXX1 left join XXX2 on XXX1.dep_id =XXX2.id; select
# 別看兩個鏈接的長度不同,可是結構是如出一轍的,只是把左改爲了右,將右變成了左,其本質就是在內鏈接的基礎上增長左邊有右邊沒有的結果或者在內鏈接的基礎上增長右邊有左邊沒有的結果。
全外鏈接:本質就是使用union來將外鏈接的左鏈接和右鏈接合併起來,顯示左右兩個表所有記錄
select XXX1.id ,XXX1 name ,XXX2.name as 表中的名稱欄 from XXX1 left join XXX2 on XXX1.dep_id = XXX2.id,
union
select XXX1.id ,XXX1.nama ,XXX2.name as 表中的名稱欄 from XXX1 left join XXX2 on XXX1.dep_id =XXX2.id;
# 注意 union 與 union all 的區別:union會去掉相同的內容,由於union會去掉相同的記錄,由於union all 是將左
表和右表進行合併,因此右重複的記錄,經過union 就能夠將重複的記錄去重了。
符合條件鏈接查詢
之內鏈接的方式查詢XXX1和XXX2表,而且創建條件:好比age>25,那麼就拿到了大於25歲所在部門的全部員工。
子查詢:子查詢其實就是將你的一個查詢結果用括號括起來,這個結果也是一張表,就能夠將它交給另一個sql 語句,做爲它的一個查詢一句來進行操做。
select * from XXX1 inner join department on XXX1.內容項1 = department.項1
# 而後根據連表的結果進行where 過濾,將select * 改爲 select XXX1.內容項2
# 1.子查詢是將一個查詢語句潛逃在另外一個查詢與劇中。
# 2. 內層查詢語句的查詢結果,而能夠爲外層查詢語句提供查詢條件。
# 3. 子查詢中能夠包含:in ,not in , any , all, exists 和 not exists 等關鍵字。
# 4. 還能夠包含比較運算符:= ,!= ,> , < 等
三 . 子查詢
1.帶IN關鍵字的子查詢:IN關鍵字,顧名思義,帶關鍵字的查詢,子查詢的思路和解決問題同樣,先解決一個而後拿着這個的結果再去解決另一個問題,鏈接表的思路是將兩個表關聯在一塊兒,而後在進行group by ,having等操做,二者的思路是不同的。
2.比較運算符:=、!=、>、>=、<、<=、<>,比較運算符子查詢
#查詢大於全部人平均年齡的員工名與年齡
mysql> select name,age from emp where age > (select avg(age) from emp);
+---------+------+
| name | age |
+---------+------+
| alex | 48 |
| wupeiqi | 38 |
+---------+------+
2 rows in set (0.00 sec)
#查詢大於部門內平均年齡的員工名、年齡
select t1.name,t1.age from emp t1
inner join
(select dep_id,avg(age) avg_age from emp group by dep_id) t2
on t1.dep_id = t2.dep_id
where t1.age > t2.avg_age;
3.帶 exists 關鍵字的子查詢
exists關鍵字表示存在,在使用 exists關鍵字時,內層查詢語句不返回查詢的記錄。而是返回一個假值,True或 False,當返回 True,外層查詢語句將進行查詢;當返回值爲 False時, 外層查詢語句不進行查詢。還能夠寫 not exists, 和 exists 的效果是反的。
#department表中存在dept_id=203,Ture mysql> select * from employee -> where exists -> (select id from department where id=200); +----+------------+--------+------+--------+ | id | name | sex | age | dep_id | +----+------------+--------+------+--------+ | 1 | egon | male | 18 | 200 | | 2 | alex | female | 48 | 201 | | 3 | wupeiqi | male | 38 | 201 | | 4 | yuanhao | female | 28 | 202 | | 5 | liwenzhou | male | 18 | 200 | | 6 | jingliyang | female | 18 | 204 | +----+------------+--------+------+--------+ #department表中存在dept_id=205,False mysql> select * from employee -> where exists -> (select id from department where id=204); Empty set (0.00 sec)