关系数据库如何查询多表有联系数据

关系数据库如何查询多表有联系数据,第1张

关联查询是日常工作中常用的查询方式,关联查询sql编写的思路一般如下:1、先确定所连接的表,2、再确定所要查询的字段,3、确定连接条件以及连接方式(表连接分类: 内连接、外连接、交叉连接、自连接)

1、内连接:[inner] join on

分类:等值连接、非等值连接

(1)等值连接: 指使用等号"=“比较两个表的连接列的值,相当于两表执行笛卡尔后,取两表连结列值相等的记录(自然连接是一种特殊的等值连接)(2)非等值连接:指使用”>“或”<"比较两个表的连接列的值,相当于两表执行笛卡尔后,取一个表大于或小于另一个表的连结列值的记录

2、外连接

分类:左外连接、右外连接、全外连接

(1)左外连接:left outer join

连接效果:查询结果包含左、右两个表需要查询的全部行,左侧的表中的全部数据都会被显示出来,但是右侧表的数据,只有和左侧匹配上的数据才会被查询出来!否则显示为null(2)右外连接:right outer join

连接效果:查询结果包含左、右两个表需要查询的全部行,右侧的表中的全部数据都会被显示出来,但是左侧表的数据,只有和右侧匹配上的数据才会被查询出来!否则显示为null(3)全外连接:full/all outer join,查询结果包含左、右两个表需要查询的全部行,对应字段没有值显示null

3、交叉连接

左表中的每一行与右表中的所有行组合,也叫表与表之间做笛卡尔积查询

4、自连接

当前表与自身的连接查询,关键点在于虚拟化出一张表,即给自身的表定义一个别名

表连接方式

left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。

right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。

inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。

full join:外连接,返回两个表中的行:left join + right join。

cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

可以有两种处理方法,1、两表先合并,后求和

select日期,sum(数值)as数值from

(select日期,金额as数值fromA表

unionall

select日期,数量as数值fromB表)

groupby日期

2、先求和后合并,再求和

select日期,sum(数值)as数值from

(select日期,sum(金额)as数值fromA表groupby日期

unionall

select日期,sum(数量)as数值fromB表groupby日期)

groupby日期

对于“如果要实现总和的相乘、相除,或者相减得话,应该怎么写呢?”,你得提出明确需求,那后才能设计。

如果是相乘、相除,或者相减,得有条件,还像上面,用日期关联,A表-B表,A表求和:select日期,sum(金额)as数值fromA表groupby日期

B表求和:select日期,sum(数量)as数值fromB表groupby日期

在执行A表-B表时,由于用日期关联,则某一日期对应的记录可能会产生三种情况:A表B表都有;A表有B表无;A表无B表有。

1、需要先找出所有日期,select日期fromA表

union

select日期fromB表

2、对于A表中所有数据以上表中日期为依据构造所有相关日期数据,如果有日期数据,则为原数据,否则为0。

selecta日期as日期,casewhenb数值isNULLthenb数值else0endas数值

from

(select日期fromA表

union

select日期fromB表)a

leftjoin

(select日期,sum(金额)as数值fromA表groupby日期)b

ona日期=b日期

3、同样对于B表也如此。

4、2表相减即得。

selecta3日期as日期,a3数值-b3数值as数值

from

(

selecta1日期as日期,casewhenb1数值isNULLthenb1数值else0endas数值

from

(select日期fromA表

union

select日期fromB表)a1

leftjoin

(select日期,sum(金额)as数值fromA表groupby日期)b1

ona1日期=b1日期

)a3,(

selecta2日期as日期,casewhenb2数值isNULLthenb2数值else0endas数值

from

(select日期fromA表

union

select日期fromB表)a2

leftjoin

(select日期,sum(金额)as数值fromB表groupby日期)b2

ona2日期=b2日期

)b3

wherea3日期=b3日期

当然,以上只是一种方法,还有其他方法也可以实现,尽供参考。

sql多表关联查询跟条件查询大同小异,主要是要知道表与表之前的关系很重要;

举例说明:(某数据库中有3张表分别为:userinfo,dep,sex)

userinfo(用户信息表)表中有三个字段分别为:user_di(用户编号),user_name(用户姓名),user_dep(用户部门) 。(关系说明:userinfo表中的user_dep字段和dep表中的dep_id字段为主外键关系,userinfo表中的user_sex字段和sex表中的sex_id字段为主外键关系)

dep(部门表)表中有两个字段分别为:dep_id(部门编号),dep_name(部门名称)。(主键说明:dep_id为主键)

sex(性别表)表中有两个字段分别为:sex_id(性别编号),sex_name(性别名称)。(主键说明:sex_id为主键)

‍‍一,两张表关键查询

1、在userinfo(用户信息表)中显示每一个用户属于哪一个部门。sql语句为:

select userinfouser_di,userinfouser_name,dep_name from userinfo,dep where userinfouser_dep=depdep_id

2、在userinfo(用户信息表)中显示每一个用户的性别。sql语句为:

select userinfouser_di,userinfouser_name,sexsex_name from userinfo,sex where userinfouser_sex=sexsex_id

二、多张表关键查询

最初查询出来的userinfo(用户信息表)表中部门和性别都是以数字显示出来的,如果要想在一张表中将部门和性别都用汉字显示出来,需要将三张表同时关联查询才能实现。

sql语句为:

select userinfouser_di,userinfouser_name,depdep_name,sexsex_name from userinfo,dep,sex where userinfouser_dep=depdep_id and userinfouser_sex=sexsex_id

(多个条件用and关联)

num 是我随便写的一个他们需要做条件的列名。具体按照你自己的列名来写。

test_Table 这个是给联合起来查询的表取的一个别名,随便你写什么名字都行。

select max(num)

from (

select num from TABLE_2010

union

select num fromTABLE_2011

union

select num from TABLE_2012

) as test_Table

1

select

  stStudentNumber,

  stName,

  count()

from

  student st,

  sbook sk

where

  stStudentNumber=skStudentNumber

and to_char(skBorrowingTime,'yyyy')='2008'

group by

  stStudentNumber,

  stName

2

select

  bBookNumber,

  bBookName,

  stName,

  skBorrowingTime,

  skShouldReturnTime

from

  student st,

  sbook sk,

  book  b

where

  stStudentNumber=skStudentNumber

and skBookNumber = bBookNumber

and month(skBorrowingTime) =month(sysdate)

3

Create view yourViewName as

select

  bBookNumber,

  bBookName,

  stName,

  skBorrowingTime,

  skShouldReturnTime

from

  student st,

  sbook sk,

  book  b

where

  stStudentNumber=skStudentNumber

and skBookNumber = bBookNumber

and month(skBorrowingTime) =month(sysdate)

没运行过可能有点问题

以上就是关于关系数据库如何查询多表有联系数据全部的内容,包括:关系数据库如何查询多表有联系数据、数据库的连表查询怎么弄、sql数据库多表查询(sql数据库多表查询示例)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/sjk/10187657.html

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

发表评论

登录后才能评论

评论列表(0条)

保存