关联查询是日常工作中常用的查询方式,关联查询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日期,金额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_id2、在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
selectstStudentNumber,
stName,
count()
from
student st,
sbook sk
where
stStudentNumber=skStudentNumber
and to_char(skBorrowingTime,'yyyy')='2008'
group by
stStudentNumber,
stName
2
selectbBookNumber,
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 asselect
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数据库多表查询示例)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)