pg数据库的db怎么查看表关联

pg数据库的db怎么查看表关联,第1张

一、数据库的多表连接查询,inner的不同用法

在pg数据库中建立两张表:

t_a和t_b如下所示:

t_a:

t_b:

1、inner join(内连接)

inner join就是根据on字段标示出来的条件,查询关联的表中符合条件的数据,并把他前部都显示出来,形成一个结果集。

执行如下语句

select * from t_a inner join t_b on t_a.adi=t_b.bid

得到的结果为:

这样的查询会显示出所有的数据,如果我们仅仅需要一部分的数据(例如我们只想查出t_a中所有aid和t_b中的bid相同的数据),那么查询语句应该变成:

select t_a.* from t_a inner join t_b on t_a.aid=t_b.bid

那么得到的数据如下所示,就只显示了t_a表中的数据。如下:

要排除重复的数据,在select后加distinct即可。

2、left join

left join 就是以表t_a为基础从右表t_b中查询出所有符合on条件的结果,在合并到表t_a中对应的部分,再作为一个结果集输出,在结果集中,会显示出表t_a中的所有数据。

执行如下查询语句:

select * from t_a left join t_b on t_a.aid=t_b.bid

得到如下结果:

可以看到,在查询的结果中,有一行关于表t_b的数据都为null,因为表t_b中没有符合on条件的数据。但是表t_a表显示出了全部的数据。那么在需要筛选的时候,应该着重于筛选表t_b中的数据,如果执行如下的语句:

select t_a.* from t_a left join t_b on t_a.aid=t_b.bid

那么得到的就是表t_a中的所有数据,那么这个查询就显得没有意义了。

3、right join

right join 就是以表t_b为基础从左表t_a中查询出所有符合on条件的结果,在合并到表t_b中对应的部分,再作为一个结果集输出,在结果集中,会显示出表t_b中的所有数据。

执行如下查询语句:

select * from t_a right join t_b on t_a.aid=t_b.bid

得到的结果为:

可以看到,查询的结果中,有两行数据在表t_a的对应部分都是null的,表示表t_a中没有符合on条件的数据,但是表t_b显示了全部的数据,那么需要做条件筛选的时候,我们就应该主要针对表t_a进行筛选。

二、查询一个父级的所有子级(包括子级的子级)

在pg数据库中建立一张表t_c如下:

要查出cid为1的所有的子级、包括cid为2、3、5的子级的集合。执行以下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,才能得到所有的子级的集合。

mysql支持多个库中不同表的关联查询,你可以随便链接一个数据库

然后,sql语句为:

select * from db1.table1 left join db2.table2 on db1.table1.id = db2.table2.id

只要用数据库名加上"."就能调用相应数据库的数据表了.

数据库名.表名

扩展资料

mysql查询语句

1、查询一张表:     select * from 表名;

2、查询指定字段:select 字段1,字段2,字段3....from 表名;

3、where条件查询:select 字段1,字段2,字段3 frome 表名 where 条件表达式;

例:select * from t_studect where id=1

  select * from t_student where age>22

4、带in关键字查询:select 字段1,字段2 frome 表名 where 字段 [not]in(元素1,元素2);

例:select * from t_student where age in (21,23)     

   select * from t_student where age not in (21,23)

5、带between and的范围查询:select 字段1,字段2 frome 表名 where 字段 [not]between 取值1 and 取值2;

例:select * frome t_student where age between 21 and 29

     select * frome t_student where age not between 21 and 29

1.左右连接:以哪个表为主,结果集为“主表”的全部记录+“副表”与“主表”相匹配的记录,如果“副表”中没有和“主表”相匹配的记录,则相对应的记录显示为NULL

2.左连接:左边表全部行+右边表相匹配的行,如果左边表中的某一行,在右边表中没有匹配的行,则显示NULL(left join 或者left outer join)

3.右连接:和左连接相反。(right join 或者right outer join)

4.内连接:它返回字段ID(连接条件)同时存在于两个表中的记录,也就是说,仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行,内联接消除与另一个表中的任何行不匹配的行。(inner join或者join)

5.全连接:不管匹配不匹配,全部都显示出来。(full join或者full outer join)

6.交叉连接:没有WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(cross join不带where)

7.自连接:给自己取个别名,一个表当两个表来使用。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9908071.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存