數據庫的多表查詢
阿新 • • 發佈:2019-01-21
技術部 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);exists關鍵字+----+------------+--------+------+--------+ | 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)
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;比較運算符
數據庫的多表查詢