表定义如下:
出版社: 出版社代码 char(2),出版社名称 varchar2(32) ;
图书:图书编号char(8),图书名称 varchar2(128),出版社代码 char(2),作者代号 char(4),图书简介 varchar2(128) ;
作者:作者代号 char(4),作者名称 varchar2(10),性别 char(1),年龄 number(3),文学方向 varchar2(64) ;
获奖名单: 获奖日期 date, 作者代号 char(4)
1找出"作者"库表中没有出现在"获奖名单"库表中的所有作者信息的SQL语句,(提示:使用NOT IN,和外部连接二种方法),并说明那种方法是不优化的?
2列出出版社为“工业出版社”的所有图书的信息;
3统计年龄40到35岁的作者的数量;
------解决思路----------------------
--oracle 11g r2下测试
--1.建立测试表
create table 出版社 (
出版社代码 char(2),
出版社名称 varchar2(32)
)
create Table 作者(
作者代号 varchar2(20),
作者名称 varchar2(20),
性别 char(1),
年龄 number(3),
文学方向 varchar2(64)
)
create table 图书 (
图书编号 char(8),
图书名称 varchar2(128),
出版社代码 char(2),
作者代号 varchar2(20),
图书简介 varchar2(128)
)
create table 获奖名单(
获奖日期 date,
作者代号 varchar2(20)
)
--2.构造测试数据
insert into 出版社 values('01','清华出版社');
insert into 出版社 values('02','工业出版社');
insert into 作者 values('烽火戏诸侯','烽火戏诸侯','M',30,'小说');
insert into 作者 values('洛水','洛水','M',35,'小说');
insert into 作者 values('张三','张三','M',40,'小说');
insert into 图书 values('001','雪中悍刀行','01','烽火戏诸侯','');
insert into 图书 values('002','陈二狗的妖孽人生','01','烽火戏诸侯','');
insert into 图书 values('003','知北游','02','洛水','');
insert into 图书 values('004','张三的美女总裁','02','张三','');
insert into 获奖名单 values(to_date('2015-3-30','yyyy-MM-dd'),'烽火戏诸侯');
insert into 获奖名单 values(to_date('2015-3-30','yyyy-MM-dd'),'洛水');
--3.找出"作者"库表中没有出现在"获奖名单"库表中的所有作者信息的SQL语句,(提示:使用NOT IN,和外部连接二种方法),并说明那种方法是不优化的?
--3.1 not in形式
select * from 作者 where 作者代号 not in (select 作者代号 from 获奖名单)
--3.2外连接
select * from 作者 a left join 获奖名单 b on a.作者代号=b.作者代号 where b.作者代号 is null
--以上两种查询方式都是可以优化的,第一种not in oracle会查询转换成内连接的的形式来查询,如果获奖名单表的数据量小的话可以使用/*+no_unnest*/
--的hint提示来阻止oracle查询转换,达到优化目的
--外连接的形式b.作者代号假设有索引的话,由于使用了is null不会用到索引
--4.列出出版社为“工业出版社”的所有图书的信息
select * from 图书 where 出版社代码 in (
select 出版社代码 from 出版社 where 出版社名称 != '工业出版社'
)
--5.统计年龄40到35岁的作者的数量
select * from 作者 where 年龄 between 35 and 40