数据库---数据查询

article/2025/10/4 17:43:56

实验目的

熟练掌握使用SQL查询语言。完成各类查询操作(单表查询,连接查询,嵌套查询,集合查询)。

实验内容

现有一个单位内部的小型图书借阅系统,假设每本图书的数量无限制,并且可以借给任何单位成员,每个单位成员可以借多本书,单位成员与图书的关系是多对多的关系。假设系统中仅有三个关系模式。

数据表结构

Reader

属性名类型长度是否空含义
RNOvarchar24员工编号(主码)
Rnamevarchar210员工姓名
Rsexvarchar22性别
Rageintegerinteger年龄
Rbossvarchar210直接上司
Raddressvarchar230办公地点

Book

属性名类型长度是否空含义
BNOvarchar24书本编号(主码)
Bnamevarchar250书名
Bauthorvarchar250作者
Bpressvarchar250出版社
Bpricevarchar2numeric(6,2)价格

RB

属性名类型长度是否空含义
RNOvarchar24员工编号
BNOvarchar24书本编号
RBdatedate借阅日期
  1. 创建新的用户并授权:
create user c##cc identified by ccpassword ;
grant resource, connect, DBA  to c##cc;

在这里插入图片描述

  1. 以用户CC的身份建立连接,并在此连接下执行后面的操作;
    截图如下:
    在这里插入图片描述
    在这里插入图片描述

  2. 拷贝代码运行,删去旧的同名数据表:

DECLAREtmp INTEGER DEFAULT 0;
BEGINSELECTCOUNT(*)INTO tmpFROMuser_tablesWHEREtable_name = 'RB';IF ( tmp > 0 ) THENEXECUTE IMMEDIATE 'drop table RB';END IF;SELECTCOUNT(*)INTO tmpFROMuser_tablesWHEREtable_name = 'READER';IF ( tmp > 0 ) THENEXECUTE IMMEDIATE 'drop table READER';END IF;SELECTCOUNT(*)INTO tmpFROMuser_tablesWHEREtable_name = 'BOOK';IF ( tmp > 0 ) THENEXECUTE IMMEDIATE 'drop table BOOK';END IF;
END;

在这里插入图片描述

问:为何要先删去RB?能不能先删去READER

答:因为RB表中定义了外码RNO(被参照表Reader)和BNO(被参照表Book),如果先删去READER就会违反了参照完整性。

  1. 拷贝代码运行,建立表格及输入数据:
create table Reader
(RNO     varchar2(4) primary key,Rname  varchar2(10) not null,Rsex     varchar2(3),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 NAME, 2020-Rage BIRTHDAY 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、 查询名字中第二个字为“小”的员工姓名、办公地点;

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 WHERE BPRESS IN ('清华大学出版社','高等教育出版社')ORDER BY bpress DESC, BNAME ASC;

在这里插入图片描述
10、 查询员工的总人数

SELECT COUNT(*)  FROM READER

在这里插入图片描述
11、 查询借了书的员工的人数;

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

或:

SELECT COUNT(DISTINCT RNO) FROM RB;

在这里插入图片描述

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

SELECT COUNT(*) FROM RB WHERE Rno in ('R001', 'R002');

在这里插入图片描述

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

SELECT bname,bauthor,bpriceFROM BOOK
WHERE bprice IN (SELECT MAX(bprice) FROM book);

在这里插入图片描述
14、 查询Book表中书籍的平均价格,查询结果说明了什么;

select AVG(bprice) from book;

查询结果:去掉了空值

在这里插入图片描述

15、 查询book中包含的各个出版社及其出版书籍的数量;

SELECT bpress,COUNT(bpress) 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.rbdateFROM reader LEFT OUTER JOIN rb ON reader.rno=rb.Rno;

在这里插入图片描述

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

自身连接:

SELECT b.rnameFROM reader a, reader bWHERE b.raddress=a.raddress and a.rname='李小龙';

在这里插入图片描述
子查询:

SELECT RNAME FROM READER WHERE RADDRESS =(select raddress from reader where reader.rname='李小龙');

在这里插入图片描述
4、 查询借阅了“数据库原理”的员工所有信息(两种方法:连接查询、子查询)

连接查询:

select UNIQUE reader.rno,rname,rsex,raddressfrom reader,rb,bookwhere reader.rno=rb.rno and rb.bno=book.bno and book.bname='数据库原理';

在这里插入图片描述

子查询:

select RNO,RNAME,RSEX,RADDRESS from READER where RNO in(select rb.rno from rb where rb.bno in( select book.bno from book where book.bname='数据库原理'));   

在这里插入图片描述
问:为什么最后的子句不能是bno=( )?

答:因为两张表中都有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,a.raddress from reader a where a.rage<=ALL(select avg(rage) from reader group by raddress) ;   

在这里插入图片描述
6、 查询比所有数据库原理价格都低、并且不是清华大学出版社出版的书籍的信息;

select * from BOOK where BNAME='数据库原理';
select min(BPRICE) from BOOK where BNAME='数据库原理';
select * from BOOK;

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

select * from book where bprice<all(SELECT MIN(book.bprice) FROM BOOK WHERE bname='数据库原理') and bpress<>'清华大学出版社';

在这里插入图片描述
7、 查询借阅了B001的员工的编号、姓名、办公室;

select READER.RNO,RNAME,RADDRESS from READER;
select * from rb where bno='B001';

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

select reader.rno,rname,raddressfrom reader,rb where reader.rno=rb.rno and rb.bno='B001';

在这里插入图片描述
8、 查询没有借阅B001的员工的编号、姓名、办公室;

select rno,rname,raddress from readerwhere rno !=all(select rb.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);

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

select RNAME from READER  where not exists (select * from bookwhere not exists (select * from rb  where reader.rno=rb.rno and rb.bno=book.bno));

在这里插入图片描述
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 reader.rno, Rname,Rsex,raddress From Reader Where not exists (select * from rb  rb1 where rb1.rno='R004' and not exists (select * from rb rb2 where rb2.rno=reader.rno  and rb1.bno=rb2.bno)); 

在这里插入图片描述
11、 查询年龄大于30岁或者工作在416的员工信息(用集合查询完成)

Select * from reader where rage>30union select * from reader where raddress='416';

在这里插入图片描述

12、 查询年龄大于30岁并且工作不在416的员工信息(用集合查询完成)

Select * from reader where rage>30minus select * from reader where raddress='416';

在这里插入图片描述


http://chatgpt.dhexx.cn/article/6Gx3IFjo.shtml

相关文章

MySQL数据库数据查询

1.投影查询 1.1 查询student表中所有学生的学号、姓名和专业。 1.2 查询student表中所有列。 1.3 查询student表中所有学生的学生的sno、sname、speciality&#xff0c;并将结果中各列的标题分别修改为学号, 姓名, 专业。 1.4 设student1表的表结构和样本数据与student表相同…

MYSQL介绍——数据库查询(重点)

条件查询 很多时候&#xff0c;我们使用数据库时并不是关心表里所有的数据&#xff0c;而是一部分满足条件的数据&#xff0c;这类条件要用WHERE子 句来实现数据的筛选。 SELECT …… FROM …… WHERE 条件 [ AND | OR ] 条件 …… ;下面给出一个示例&#xff1a; SELECT * …

MySQL --- 数据库查询 - 基本查询

基本查询 MySQL 数据库使用SELECT语句来查询数据。 1. 查询多个字段 以下为在MySQL数据库中查询数据通用的 SELECT 语法&#xff1a; SELECT 字段名,字段名... FROM 表名; SELECT * FROM 表名; #查询所有字段 查询语句中可以使用一个或者多个表&#xff0c…

Database:数据库查询

学习笔记&#xff1a;使用SQL语句进行数据查询 Copyright: Jingmin Wei, Pattern Recognition and Intelligent System, School of Artificial and Intelligence, Huazhong University of Science and Technology 文章目录 学习笔记&#xff1a;使用SQL语句进行数据查询准备数…

数据库查询操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、复杂查询的相关操作&#xff1a;二.表的设计三.聚合查询四.联合查询&#xff1a;五.外连接六.自连接七.子查询八.合并查询 前言 提示&#xff1a;这里可以…

MySQL数据库查询数据

查询数据 数据库管理系统的一个最重要的功能就是数据查询&#xff0c;数据查询不应只是简单查询数据库中存储的数据&#xff0c;还应该根据需要对数据进行筛选&#xff0c;以及确定数据以什么样的格式显示。MySQL提供了功能强大、灵活的语句来实现这些操作。 基本查询语句 mys…

数据库查询语句-详细篇

今天来梳理一下数据库的一些查询语句&#xff0c;做软件/移动端/电脑端&#xff0c;开发程序时必然离不开数据库的设计以及查询&#xff1b; 一&#xff1a;具体的代码如下展示&#xff1a; 1.查询数据库指定表的所有信息 select * from uploadimagecode;2.查询当前数据表部…

数据库的查询操作

数据库的查询操作 1 DQL_基础查询 本案例使用到SQL语句的代码如下&#xff1a; USE db1; -- 使用数据库 CREATE TABLE student ( id int, -- 编号 name varchar(20), -- 姓名 age int, -- 年龄 sex varchar(5), -- 性别 address varchar(100), -- 地址 math int, -- 数学 …

数据库-简单查询

数据库的操作无外乎是增删改查&#xff0c;那么其中的查询是我们作为测试&#xff0c;用得最多的&#xff0c;那查询应该怎么做呢&#xff0c;我们来讲解一下。 1、介绍一下我们举例的表结构 表一&#xff1a; 学生表&#xff1a;&#xff08;学号&#xff0c;姓名&#xff0…

数据库常见的查询

目录 一、查询的完全限定写法 二、条件查询 三、模糊查询 四、范围查询 1&#xff09;关键字&#xff1a;between and 2&#xff09;关键字&#xff1a;in 3&#xff09;关键字&#xff1a;is null或者、is not null和<>null和!null 五、case when 1&#xff09…

查询数据(数据库)——简单查询

目录 1&#xff0e;最简单的查询 &#xff08;1&#xff09;查询指定列 &#xff08;2&#xff09;查询所有列 &#xff08;3&#xff09;查询计算列 &#xff08;4&#xff09;为列起别名 &#xff08;5&#xff09;使用DISTINCT关键字消除重复元组 2&#xff0e;查询满…

数据库之数据的查询

1 目的 1、理解SQL的特点&#xff1b; 2、掌握SELECT命令的使用&#xff1b; 3、掌握单表查询、连接查询、嵌套查询和集合查询&#xff1b; 4、掌握INSERT、UPDATE和DELETE命令的使用&#xff1b; 5、掌握将SQL命令嵌入到C#或其他高级语言&#xff1b; 2 要点 1、单表查询、…

【MySQL】数据库的基本查询

前言 上篇已经讲过数据库与表相关的一些相关的操作了&#xff0c;如果你对这部分依旧不太熟悉建议先去看看 传送门&#xff1a;【MySQL】逻辑库与数据表相关操作. 这篇就来说一下数据库中表的基本查询&#xff0c;看见是基本查询&#xff0c;就知道肯定有高级查询&#xff0…

SQL数据库的查询操作大全(select)

目录&#xff1a; 1、数据库的连接、创建 2、对字段的操作&#xff1a;&#xff08;alter table&#xff09; 3、对数据的操作&#xff08;插入、修改、删除&#xff09; 4、数据查询&#xff08;select&#xff09; 5、多表查询&#xff08;join on&#xff09; 6、约束…

JDK、Tomcat安装步骤

JDK安装 JDK下载地址 1.JDK安装 &#xff08;1&#xff09;运行Tomcat时需要先安装JDK&#xff0c;下载x64 installer &#xff08;2&#xff09;选择安装路径 &#xff08;3&#xff09;安装完成 2.配置环境变量 &#xff08;1&#xff09;“我的电脑”右键→属性→高级系…

Tomcat安装教程

1、下载 Tomcat。 你可以从 Apache Tomcat 官网&#xff08;Apache Tomcat - Welcome!&#xff09;上下载最新版本的 Tomcat。解压下载的压缩包。将下载的压缩包解压到指定的目录&#xff0c;例如 C:\Tomcat。 2、配置环境变量。 在 Windows 中&#xff0c;打开控制面板&…

详细到落泪的Tomcat安装教程....

前言 我个人是很少写基础软件的安装的&#xff0c;直到有一天诸葛铁头因为Tomcat安装的问题找到我… 诸葛铁头&#xff0c;原名诸葛铁蛋&#xff0c;因人比较头铁&#xff0c;故取名铁头。在诸葛体铁头建议下、以及征求了她的同意后&#xff0c;写了这篇文章。 虽然这篇文章…

Tomcat安装配置

Tomcat 是一个免费的开放源代码的 Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 JSP程序的首选。 1. Tomcat下载 1&#xff09;进入Tomcat官网&#xff0c;选择下载所需的Tomca…

Tomcat安装教程(windows)

1. 下载Tomcat 首先确定你Windows系统是64位&#xff0c;还是32位(现在大部分是64位)及JDK版本&#xff08;Tomcat在 JDK1.8 环境下能够正常运行&#xff09; 下载地址&#xff1a;Tomcat官网. 2. 安装Tomcat 解压压缩包&#xff0c;放在想要放在的盘符(最好不要是C盘&#…

Apache Tomcat安装配置

Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器。Tomcat 技术先进、性能稳定&#xff0c;而且免费&#xff0c;因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可&#xff0c;成为目前比较流行的Web 应用服务器。 Tomcat安装方法 1、下载Tomcat后&a…