SQL查询数据

本文详细介绍Oracle SQL数据库操作流程,包括用户授权、数据表创建与删除、数据插入与查询等核心内容。涵盖数据完整性、复合查询、子查询等高级主题,适用于数据库管理员和开发者深入理解Oracle SQL操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、 创建新的用户并授权:

create user cc identified by ccpassword ;
grant resource, connect, DBA  to cc;

2、 以用户CC的身份建立连接,并在此连接下执行后面的操作;
3、 拷贝代码运行,删去旧的同名数据表:

Declare
tmp integer default 0;
Begin
select count(*) into tmp from user_tables where table_name='RB';
if(tmp>0) then
execute immediate 'drop table RB';
end if;
select count(*) into tmp from user_tables where table_name='READER';
if(tmp>0) then
execute immediate 'drop table READER';
end if;
select count(*) into tmp from user_tables where table_name='BOOK';
if(tmp>0) then
execute immediate 'drop table BOOK';
end if;
end;

问:为何要先删去RB?能不能先删去READER?
答:因为RB表中已经定义了外键RNO(关联了Reader)和BNO(关联了Book),如果先删去READER就违反了参照完整性。
4、 拷贝代码运行,建立表格及输入数据:

create table Reader
(
    RNO	varchar2(4) primary key,
    Rname	varchar2(10) not null,
    Rsex	varchar2(2),
    Rage	integer,
    Rboss	varchar2(10),
    Raddress	varchar2(30)
) ;
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R001','张三',20,'男','李四','416');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R002','张三',35,'女',null,'417');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R003','李四',30,'男',null,'416');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R004','王五',20,'男',null,'417');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R005','马六',40,'男',null,'416');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R006','刘三',20,'男',null,'417');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R007','王四',40,'男','李四','416');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R008','李小龙',20,'男','李四','417');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R009','王小倩',40,'男','李四','416');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R010','王一小',20,'男','李四','417');

create table Book
(
    BNO	varchar2(4),
    Bname	varchar2(50) not null,
    Bauthor	varchar2(50),
    Bpress	varchar2(50),
    Bprice	numeric(6,2), 
    primary key(BNO)
);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B001','严蔚敏','数据结构','清华大学出版社',null);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B002','唐发根','数据结构','北航出版社',24);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B003','王珊','数据库原理','高等教育出版社',40);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B004','张飞','数据库原理','清华大学出版社',30);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B005','王珊','数据库原理','清华大学出版社',null);

create table RB
(
    RNO varchar2(4),
    BNO varchar2(4),
    RBdate date default sysdate,
    primary key(RNO,BNO),
    foreign key (RNO) references Reader(RNO),
    foreign key (BNO) references Book(BNO)
);
insert into RB (RNO,BNO) values ('R001','B001');
insert into RB (RNO,BNO) values ('R001','B002');
insert into RB (RNO,BNO) values ('R001','B004');
insert into RB (RNO,BNO) values ('R002','B001');
insert into RB (RNO,BNO) values ('R003','B001');
insert into RB (RNO,BNO) values ('R004','B001');
insert into RB (RNO,BNO) values ('R004','B002');
insert into RB (RNO,BNO) values ('R005','B001');
insert into RB (RNO,BNO) values ('R006','B001');
insert into RB (RNO,BNO) values ('R006','B003');
insert into RB (RNO,BNO) values ('R006','B005');
insert into RB (RNO,BNO) values ('R006','B002');
insert into RB (RNO,BNO) values ('R006','B004');

1、 查询全体员工的姓名和出生年份;

SELECT RNAME,2020-RAGE BIRYEAR FROM READER;

2、 查询工作在416房间的员工的所有信息;

SELECT * FROM READER WHERE RADDRESS=416;

3、 查询年龄在30到50岁之间的员工姓名、年龄;

SELECT RNAME,RAGE FROM READER WHERE RAGE BETWEEN 30 AND 50;

4、 查询借了书的员工的编号,排除相同的元素;

SELECT DISTINCT RNO FROM RB;

5、 查询名字中包含字“小”的员工姓名、办公地点;

SELECT RNAME,RADDRESS FROM READER WHERE RNAME LIKE '%小%';

6、 查询名字中第二个字为“小”的员工姓名、办公地点;
注:ORACLE只需一个下划线符号代表一个汉字

SELECT RNAME,RADDRESS FROM READER WHERE RNAME LIKE '_小%';

7、 查询所有不姓“李”的员工姓名、性别;

SELECT RNAME,RSEX FROM READER WHERE RNAME NOT LIKE '李%';

8、 查询Book表中价格不为空值的书名、出版社;

SELECT BNAME,BPRESS,BPRICE FROM BOOK WHERE BPRICE IS NOT NULL;

9、 查询清华大学出版社和高等教育出版社出版的所有书籍,按照出版社降序、书名升序排列;
select * from book;

上面的语句用来查看后面的语句结果对不对。

select * from book ORDER BY BNAME,BPRESS DESC;

10、 查询员工的总人数

SELECT COUNT(*) TOTAL FROM READER;

11、 查询借了书的员工的人数;

SELECT COUNT(RNO) FROM READER WHERE READER.RNO IN (SELECT DISTINCT RNO FROM RB);

或:

SELECT COUNT(DISTINCT RNO)FROM RB;

12、 查询“张三”所借图书的数量;

SELECT COUNT(BNO) FROM RB WHERE RNO IN (SELECT RNO FROM READER WHERE RNAME='张三');           

13、 查询最贵的书籍的作者姓名;

SELECT bname,bauthor,bprice FROM book WHERE bprice = (SELECT MAX(BPRICE) FROM BOOK);

14、 查询Book表中书籍的平均价格,查询结果说明了什么;

SELECT AVG(BPRICE) FROM BOOK;

价格为空的并未列入计算
去掉了空值
15、 查询book中包含的各个出版社及其出版书籍的数量;

SELECT BPRESS,COUNT(BNO) FROM BOOK GROUP BY BPRESS;

复合查询
1、 查询每个员工及其借书情况,列出员工编号、姓名和借书日期

SELECT READER.RNO,RNAME,RBDATE FROM READER,RB WHERE READER.RNO = RB.RNO;

2、 查询每个员工及其借书所有字段(没有借书的员工也列出来);(用左外连接)

SELECT READER.RNO,RNAME,RSEX,RB.BNO,RB.RBDATE FROM READER LEFT OUTER JOIN RB ON (READER.RNO=RB.RNO);

3、 查询与“李小龙”工作在同一个办公室的员工信息(用两种方法:自身连接、子查询);
自身连接:

SELECT B.RNAME FROM READER A,READER B WHERE A.RNAME='李小龙' AND B.RADDRESS = A.RADDRESS;

子查询:

SELECT RNAME FROM READER WHERE RADDRESS = (SELECT RADDRESS FROM READER WHERE RNAME='李小龙');

4、 查询借阅了“数据库原理”的员工所有信息(两种方法:连接查询、子查询)

SELECT DISTINCT reader.rno, rname, rsex, raddress FROM reader, book,rb WHERE  book.bname = '数据库原理' AND rb.bno = book.bno AND reader.rno = rb.rno;
SELECT rno,rname,raddress FROM reader WHERE reader.rno IN(SELECT rno FROM rb WHERE bno IN(SELECT bno FROM book WHERE bname='数据库原理'));

问:为什么最后的子句不能是bno=( )?
括号内返回的可能是多个值,等于号不合适
5、 查询小于或等于同一办公室中成员的平均年龄的员工编号、姓名、年龄。
select RNO,RNAME,RAGE,RADDRESS from READER order by raddress;

select raddress,avg(rage) from reader group by raddress ;

上面的两句用来查看后面的语句结果对不对。

SELECT a.rno,a.rname,a.rage FROM reader a,(SELECT raddress,AVG(rage) avgage FROM reader GROUP BY raddress) b WHERE a.rage <= b.avgage AND a.raddress = b.raddress;

6、 查询比所有数据库原理价格都低、并且不是清华大学出版社出版的书籍的信息;
select * from BOOK where BNAME=‘数据库原理’;
select min(BPRICE) from BOOK where BNAME=‘数据库原理’;
select * from BOOK;

上面的语句用来查看后面的语句结果对不对。

select *from book where bpress != '清华大学出版社' and bprice <(select min(bprice)from book where bname='数据库原理');;

7、 查询借阅了B001的员工的编号、姓名、办公室;
select READER.RNO,RNAME,RADDRESS from READER;
select * from rb where bno=‘B001’;

上面的语句用来查看后面的语句结果对不对。

SELECT reader.rno,rname,raddress FROM reader,rb WHERE bno = 'B001' AND reader.rno = rb.rno;

8、 查询没有借阅B001的员工的编号、姓名、办公室;

SELECT rno,rname,raddress FROM reader WHERE rno NOT IN (SELECT rno FROM rb WHERE bno = 'B001');

9、 查询借阅了所有书籍的员工的姓名;
select bno from book;
select reader.rno,rname,rb.bno from rb left outer join reader on (reader.rno=rb.rno);

上面的语句用来查看后面的语句结果对不对。

//参考课本P111【例46】

SELECT rname FROM reader WHERE rno = (SELECT rno FROM rb GROUP BY rno HAVING COUNT(rb.bno) = (SELECT COUNT(*) FROM book));

注:前两句SELECT是为了显示原数据表的数据,以检查查询结果是否正确。
10、 查询至少借阅了编号为R004的员工借阅的全部书籍的员工姓名、性别、办公室
Select * From Rb Where Rno=‘R004’;
select reader.rno,rname,rb.bno from rb left outer join reader on (reader.rno=rb.rno);

上面的语句用来查看后面的语句结果对不对。

//参考上一题

select rname,rsex,raddress from reader where not exists(select * from rb a where a.rno='R004' and not exists (select * from rb b where b.rno=reader.rno and a.bno=b.bno));

注:前两句SELECT是为了显示原数据表的数据,以检查查询结果是否正确。
11、 查询年龄大于30岁或者工作在416的员工信息(用集合查询完成)

SELECT * FROM reader WHERE rage > 30 UNION SELECT * FROM reader WHERE raddress = 416;

12、 查询年龄大于30岁并且工作不在416的员工信息(用集合查询完成)
注意:ORACLE的集合减,不是’except’,而是’ minus’

SELECT * FROM reader WHERE rage > 30 MINUS SELECT * FROM reader WHERE raddress = 416;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值