1. 程式人生 > >數據庫的多表查詢

數據庫的多表查詢

技術部 rtm 否則 多表查詢 交叉連接 全部 員工 sele false

一.多表連接查詢

  1.交叉連接:不適用任何匹配條件,生成笛卡兒積

    select * from 表1,表2;

  2.內連接:只連接匹配的行

    select * from 表1,表2 where 表1.字段 = 表2.字段;

    select * from 表1 inner join 表2 on 表1.字段 = 表2.字段;  

  3.左連接:優先顯示左表全部記錄

    select * from 表1 left join 表2 on 表1.字段 = 表2.字段;

  4.右連接:優先顯示右表全部記錄

    select * from 表1 right join 表2 on 表1.字段 = 表2.字段;

  5.全外連接:顯示兩個表全部記錄,union all 顯示兩個表拼接的有重復的,union可以去重.

    select * from 表1 left join 表2 on 表1.字段 = 表2.字段

    union

    select * from 表1 right join 表2 on 表1.字段 = 表2.字段;

二.子查詢

  子查詢是將一個查詢語句嵌套在另一個查詢語句中,子查詢中的關鍵字有in,not in , all ,any ,exists,not exists,還有運算符 = ,!= ,< ,>

  1.in關鍵字子查詢 

技術分享圖片
#查看技術部員工姓名
   select name from
employee   where dep_id in (select id from department where name=技術);
關鍵字

  2.exists關鍵字子查詢

   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)
exists關鍵字

  3.比較運算符子查詢

技術分享圖片
#比較運算符:=、!=、>、>=、<、<=、<>
#查詢大於所有人平均年齡的員工名與年齡
mysql> select name,age from emp where age > (select avg(age) from emp);
+---------+------+
| name | age |
+---------+------+
| alex | 48 |
| wupeiqi | 38 |
+---------+------+
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;
比較運算符

數據庫的多表查詢