pg数据库多表查询(inner)和级联查询
一、數(shù)據(jù)庫的多表連接查詢,inner的不同用法
在pg數(shù)據(jù)庫中建立兩張表:
t_a和t_b如下所示:
t_a:
t_b:
1、inner join(內連接)
inner join就是根據(jù)on字段標示出來的條件,查詢關聯(lián)的表中符合條件的數(shù)據(jù),并把他前部都顯示出來,形成一個結果集。
執(zhí)行如下語句:
select * from t_a inner join t_b on t_a.adi=t_b.bid
得到的結果為:
這樣的查詢會顯示出所有的數(shù)據(jù),如果我們僅僅需要一部分的數(shù)據(jù)(例如我們只想查出t_a中所有aid和t_b中的bid相同的數(shù)據(jù)),那么查詢語句應該變成:
select t_a.* from t_a inner join??t_b on t_a.aid=t_b.bid
那么得到的數(shù)據(jù)如下所示,就只顯示了t_a表中的數(shù)據(jù)。如下:
要排除重復的數(shù)據(jù),在select后加distinct即可。
2、left join
left join 就是以表t_a為基礎從右表t_b中查詢出所有符合on條件的結果,在合并到表t_a中對應的部分,再作為一個結果集輸出,在結果集中,會顯示出表t_a中的所有數(shù)據(jù)。
執(zhí)行如下查詢語句:
select * from t_a left join t_b on t_a.aid=t_b.bid
得到如下結果:
可以看到,在查詢的結果中,有一行關于表t_b的數(shù)據(jù)都為null,因為表t_b中沒有符合on條件的數(shù)據(jù)。但是表t_a表顯示出了全部的數(shù)據(jù)。那么在需要篩選的時候,應該著重于篩選表t_b中的數(shù)據(jù),如果執(zhí)行如下的語句:
select t_a.* from t_a left join??t_b on t_a.aid=t_b.bid
那么得到的就是表t_a中的所有數(shù)據(jù),那么這個查詢就顯得沒有意義了。
3、right join
right join 就是以表t_b為基礎從左表t_a中查詢出所有符合on條件的結果,在合并到表t_b中對應的部分,再作為一個結果集輸出,在結果集中,會顯示出表t_b中的所有數(shù)據(jù)。
執(zhí)行如下查詢語句:
select * from t_a right join t_b on t_a.aid=t_b.bid
得到的結果為:
可以看到,查詢的結果中,有兩行數(shù)據(jù)在表t_a的對應部分都是null的,表示表t_a中沒有符合on條件的數(shù)據(jù),但是表t_b顯示了全部的數(shù)據(jù),那么需要做條件篩選的時候,我們就應該主要針對表t_a進行篩選。
二、查詢一個父級的所有子級(包括子級的子級)
在pg數(shù)據(jù)庫中建立一張表t_c如下:
要查出cid為1的所有的子級、包括cid為2、3、5的子級的集合。執(zhí)行以下sql語句
with recursive tb as(select * from t_c where parent_id='1' union all select t_c.* from t_c,tb where t_c.parent_id=tb.cid )select * from tb
得到如下的結果:
由查詢出的結果集可以看到,我們查詢出了除了父級(cid為1)以外的所有cid為父級的子級以及子級的子級。
我們來解析一下這個sql語句:
????????顯而易見的,這是一個遞歸的查詢方法。首先是with為查詢語句提供了輔助功能,可以看做是查詢語句中的臨時表,其次recursive是sql中遞歸的關鍵字,只有有了這個關鍵字,pg才知道with這個語句需要做遞歸操作。union all是去重的,t_c.parent_id=tb.cid 表示了t_c的parent_id要等于臨時表tb的cid要在整個with語句的外面查詢建立的臨時表tb,才能得到所有的子級的集合。
總結
以上是生活随笔為你收集整理的pg数据库多表查询(inner)和级联查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【python数字信号处理】——scip
- 下一篇: 【python学习】——读取csv文件