oracle之表的连接查询

create table readerinfo(
readerid char(4) constraint pk_readerinfo_id primary key,
readername varchar2(20),
unit varchar2(20),
bookcount integer
);


create table bookinfo(
bookid char(4) constraint pk_bookid_bookinfo primary key,
readerid char(4) constraint fk_book_reade_readid references readerinfo(readerid),
bookname varchar2(20)
);

insert into readerinfo values('9701','朱三丰','计算机系',3);
insert into readerinfo values('9702','朱一丰','计算机系',4);
insert into readerinfo values('9703','朱二丰','计算机系',3);
insert into readerinfo values('9704','朱四丰','生物系',2);
insert into readerinfo values('9705','朱五丰','生物系',3);
insert into readerinfo values('9706','朱六丰','生物系',1);
insert into readerinfo values('9707','朱七丰','自动化系',3);
insert into readerinfo values('9709','朱九丰','自动化系',6);
insert into readerinfo values('9708','朱八丰','自动化系',4);


insert into bookinfo values('1000','9701','长征1');
insert into bookinfo values('1001','9701','长征2');
insert into bookinfo values('1002','9701','长征3');
insert into bookinfo values('1003','9707','长征1');
insert into bookinfo values('1004','9708','长征2');
insert into bookinfo values('1005','9709','长征1');
insert into bookinfo values('1006','9709','长征1');
insert into bookinfo values('1007','9704','长征1');
insert into bookinfo values('1008','9704','长征2');
insert into bookinfo values('1009','9704','长征3');


1:不用joint 和where 把两个表连接(笛卡尔连接)
select * from readerinfo,bookinfo order by readerinfo.readerid;


2:使用where字句指定连接表的连接条件
要求从bookinfo获得借出图书的信息,并通过readerinfo表获得相关读者信息
select a.bookid,a.bookname,b.readerid,b.unit from readerinfo b,bookinfo a
where a.readerid=b.readerid
order by a.bookid;


3:表通过别名实现自连接
要求从readerinfo表查询可借图书数目比编号为9704读者多的所有读者信息

select r1.readerid,r1.readername,r1.unit,r1.bookcount from readerinfo r1,readerinfo r2
where r2.readerid='9704' and r1.bookcount>r2.bookcount
order by r1.readerid;

4:通过子查询实现3的功能
要求从readerinfo表查询可借图书数目比编号为9704读者多的所有读者信息

select r1.readerid,r1.readername,r1.unit,r1.bookcount from readerinfo r1
where r1.bookcount>(select bookcount from readerinfo where readerid='9704');

           以下将讲解通过join 关键词进行连接

SELECT COLUMN FROM
TABLE1  /*进行连接的表*/
JOIN_TYPE /* 连接方式*/
TABLE2 /*进行连接的表*/
ON JOIN_CONDITION/*连接条件*/

其中连接方式有3种,1:内部链接[inner](可省) join
2:外部连接:分为三种(1):左外连接left [outer] join(2):右外连接 right [outer] join(3):全外连接full [outer] join
3:交叉连接 cross join

                     一:内部链接
内部连接:简单连接,它连接两个或多个表,只返回哪些符合条年的行
eg:
select column from table1 join table2
on table1.column=table2.column

等价于前面所讲的
select column from table1,table2
where table1.column=table2.column
1:使用inner join 实现等值连接
要求从bookinfo获得借出图书的信息,并通过readerinfo表获得相关读者信息
select b.bookid,b.bookname,r.readerid,r.readername from bookinfo b
join readerinfo r
on b.readerid=r.readerid;

2:实现不等值连接
要求根据readerinfo表提供的读者号范围查询对应的图书信息。
select b.bookid,b.bookname,r.readerid,r.readername from bookinfo b
join readerinfo r
on b.readerid in r.readerid
where r.readername like '___'
order by b.bookid;

                                二:自然连接(natural join)
自动根据相同的列匹配(特殊的等值内连接),但不能人为指定根据那一列,而是根据所有得列
而且相同的列只显示一行,当然可以选择要显示的列

                                  三:外部连接
(left [outer] join)
左外连接:被称为左向外连接,使用左外连接的查询,包含了左边表的全部记录,右边表则返回符号连接条件的记录
。也就是说,如果左边表的某行记录在右边表中没有匹配项,则在返回结果中右边表对应的列处补空值
(1)使用左外连接连接readerinfo和bookinfo表通过readerid

select * from readerinfo left outer join bookinfo
on readerinfo.readerid=bookinfo.readerid;


(right [outer] join)
2:右外连接和左外连接相同,只是匹配表变成右边的表
 select * from readerinfo right outer join bookinfo
on readerinfo.readerid=bookinfo.readerid;


(full outer join)
3:全外连接=左外连接+右外连接
 select * from readerinfo full outer join bookinfo
on readerinfo.readerid=bookinfo.readerid;


                                 四:交叉连接
就是笛卡尔连接,形成一个n*m的表

表的连接和聚合分析
1:要求查询readerinfo表中所有读者所借的图书数目
显示id,name,借书数
select r.readerid,r.readername,count(b.bookid) from readerinfo r
left outer join bookinfo b
on r.readerid=b.readerid
group by r.readerid,r.readername
order by r.readerid;

猜你喜欢

转载自blog.csdn.net/zhu0902150102/article/details/81448435