oracle sql中自然连接的问题
这学期刚学数据库原理,跟着老师用oracle,然后做实验发现这样的问题:先看看表:createtablecustomer(customer_namevarchar2(20...
这学期刚学数据库原理,跟着老师用oracle,然后做实验发现这样的问题:
先看看表:
create table customer
(
customer_name varchar2(20) not null,
customer_street varchar2(20),
customer_city integer
);
create table borrower
(
customer_name varchar2(20) not null,
loan_number varchar2(20) not null
);
create table loan
(
loan_number varchar2(10) not null,
branch_name varchar2(20) not null,
amount integer not null
);
(基于篇幅就不把约束弄出来了,学过数据库系统概念都懂的)
现在有四个语句:
select *
from customer natural left outer join borrower natural left outer join loan;
select customer_name,branch_name
from customer natural left outer join borrower natural left outer join loan;
select customer_name
from customer natural left outer join borrower natural left outer join loan;
select customer_name,branch_name,loan_number
from customer natural left outer join borrower natural left outer join loan;
第一个执行结果很正常,查询出来共17行。
第二个吓死人了,查出来153行,而且不能同时在两个要查询的列名前加distinct,为啥?
第三个也吓人,查出来153行,distinct一下就变为正常的17行。
第四个也正常,查出来17行。
好了,我想问的是:一、为什么四个语句查出来的行数会不同?二、我听说自然连接有局限而且很多数据库不用了请问是为什么?它到底有什么局限?
忘大牛详细回答,小弟感激不尽~ 展开
先看看表:
create table customer
(
customer_name varchar2(20) not null,
customer_street varchar2(20),
customer_city integer
);
create table borrower
(
customer_name varchar2(20) not null,
loan_number varchar2(20) not null
);
create table loan
(
loan_number varchar2(10) not null,
branch_name varchar2(20) not null,
amount integer not null
);
(基于篇幅就不把约束弄出来了,学过数据库系统概念都懂的)
现在有四个语句:
select *
from customer natural left outer join borrower natural left outer join loan;
select customer_name,branch_name
from customer natural left outer join borrower natural left outer join loan;
select customer_name
from customer natural left outer join borrower natural left outer join loan;
select customer_name,branch_name,loan_number
from customer natural left outer join borrower natural left outer join loan;
第一个执行结果很正常,查询出来共17行。
第二个吓死人了,查出来153行,而且不能同时在两个要查询的列名前加distinct,为啥?
第三个也吓人,查出来153行,distinct一下就变为正常的17行。
第四个也正常,查出来17行。
好了,我想问的是:一、为什么四个语句查出来的行数会不同?二、我听说自然连接有局限而且很多数据库不用了请问是为什么?它到底有什么局限?
忘大牛详细回答,小弟感激不尽~ 展开
3个回答
展开全部
自然连接就是把两个表中相同属性"衔接",属性值相同的就保留下来,如果属性值不相同则去掉,注意,连接后的表的属性值个数为原来两个表的属性之和减去公共属性的个数,如果两个表没公共属性则自然连接就是笛卡尔乘积
对于第一个,你查的是所有的然后去连接,就取相同的个数;
对于第二个,这个两个字段未必都有,有了未必都同时相等,所以会出现axb的情况;
对于第三个,与第二个一样;
对于第四个,因为两个表都有loan_number字段,所以可以连接
另外对于distinct,任何时候查询每个select相邻的都只能使用一次distinct,这是用法
对于第一个,你查的是所有的然后去连接,就取相同的个数;
对于第二个,这个两个字段未必都有,有了未必都同时相等,所以会出现axb的情况;
对于第三个,与第二个一样;
对于第四个,因为两个表都有loan_number字段,所以可以连接
另外对于distinct,任何时候查询每个select相邻的都只能使用一次distinct,这是用法
更多追问追答
追问
额,你的意思是,自然连接的结果还依赖于所要查询的属性吗?我的理解是这样的:
四个语句执行的查询都针对同一张表(即已经通过相同列合并之后的表),四个语句不同的地方仅仅是查询的列名不同而已,也就是说,自然连接的结果和要查询的列应该是无关的。
追答
你说的对,自然连接一般显示列用*表示,用列名是无意义的
展开全部
表之间的join后面要带关系条件的,如 on a.id=b.id
distinct只能出现在select 后面一次,
distinct只能出现在select 后面一次,
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-06-17
展开全部
等值联接 就是使用相当判断条件构建的连接
自联接 就是将一个表看成两个表自己和自己连接
外部联接 就是以一个表为主和另一个进行连接,如果另一个中没有就采用空值代替,有分为左外连接、右外连接和全外连接
自然联接 就是将两个表按照同名的列表示相同意义,建立起一个等值内连接,返回结果的时候去掉重复的列,现在有很多数据库都不支持自然连接了
自联接 就是将一个表看成两个表自己和自己连接
外部联接 就是以一个表为主和另一个进行连接,如果另一个中没有就采用空值代替,有分为左外连接、右外连接和全外连接
自然联接 就是将两个表按照同名的列表示相同意义,建立起一个等值内连接,返回结果的时候去掉重复的列,现在有很多数据库都不支持自然连接了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询