综合练习

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645

现有一个商店的数据库,记录顾客及其购物情况。根据要求完成任务

此数据库由下面 3 个表组成。

商品 product(商品号 productid,商品名 productname,单价 unitprice,商品类别 category,供应商 provider)

顾客 customer(顾客号 customerid,姓名 name,住址 location)

购买 purcase(顾客号 customerid,商品号 productid,购买数量 quantity)

每个顾客可以购买多件商品,每件商品可以被多个顾客购买。属于多对多的关系。

数据表的创建将在下一章介绍。

假设这 3 个数据表已经创建,现在需要完成下面任务 

(1)往表中插入数据。

商品(M01,佳洁士,8.00,牙膏,宝洁;

M02,高露洁,6.50,牙膏,高露洁;

M03,洁诺,5.00,牙膏,联合利华;

M04,舒肤佳,3.00,香皂,宝洁;

M05,夏士莲,5.00,香皂,联合利华;

M06,雕牌,2.50,洗衣粉,纳爱斯

M07,中华,3.50,牙膏,联合利华;

M08,汰渍,3.00,洗衣粉,宝洁;

M09,碧浪,4.00,洗衣粉,宝洁;)。

顾客(C01,Dennis,海淀;

C02,John,朝阳;

C03,Tom,东城;

C04,Jenny,东城;

C05,Rick,西城;)。

购买 (C01,M01,3;

C01,M05,2;

C01,M08,2;

C02,M02,5;

C02,M06,4;

C03,M01,1;

C03,M05,1;

C03,M06,3;

C03,M08,1;

C04,M03,7;

C04,M04,3;

C05,M06,2;

C05,M07,8;)。

(2)用 SQL 语句完成下列查询。

① 求购买了供应商“宝洁”产品的所有顾客。

② 求购买的商品包含了顾客“Dennis”所购买的所有商品的顾客(姓名)。

③ 求牙膏卖出数量最多的供应商。

(3)将所有的牙膏商品单价增加 10%

(4)删除从未被购买的商品记录

下面我们就来看看如何实现

(1)向数据表中输入数据

INSERT INTO product(productid,productname,unitprice,category,provider) VALUES ('M01','佳洁士',8.00,'牙膏','宝洁') ;
INSERT INTO product(productid,productname,unitprice,category,provider) VALUES ('M02','高露洁',6.50,'牙膏','高露洁') ;
INSERT INTO product(productid,productname,unitprice,category,provider) VALUES ('M03','洁诺',5.00,'牙膏','联合利华') ;
INSERT INTO product(productid,productname,unitprice,category,provider) VALUES ('M04','舒肤佳',3.00,'香皂','宝洁') ;
INSERT INTO product(productid,productname,unitprice,category,provider) VALUES ('M05','夏士莲',5.00,'香皂','联合利华') ;
INSERT INTO product(productid,productname,unitprice,category,provider) VALUES ('M06','雕牌',2.50,'洗衣粉','纳爱斯') ;
INSERT INTO product(productid,productname,unitprice,category,provider) VALUES ('M07','中华',3.50,'牙膏','联合利华') ;
INSERT INTO product(productid,productname,unitprice,category,provider) VALUES ('M08','汰渍',3.00,'洗衣粉','宝洁') ;
INSERT INTO product(productid,productname,unitprice,category,provider) VALUES ('M09','碧浪',4.00,'洗衣粉','宝洁') ;

增加用户信息

INSERT INTO customer (customerid,name,location) VALUES ('C01','Dennis','海淀') ;
INSERT INTO customer (customerid,name,location) VALUES ('C02','John','朝阳') ;
INSERT INTO customer (customerid,name,location) VALUES ('C03','Tom','东城') ;
INSERT INTO customer (customerid,name,location) VALUES ('C04','Jenny','东城') ;
INSERT INTO customer (customerid,name,location) VALUES ('C05','Rick','西城') ;

增加购买记录

INSERT INTO purcase (customerid,productid,quantity) VALUES ('C01','M01',3) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C01','M05',2) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C01','M08',2) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C02','M02',5) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C02','M06',6) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C03','M01',1) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C03','M05',1) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C03','M06',3) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C03','M08',1) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C04','M03',7) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C04','M04',3) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C05','M06',2) ;
INSERT INTO purcase (customerid,productid,quantity) VALUES ('C05','M07',8) ;

最后一定要提交事务

commit

如果事务不提交,那么 session 一旦关闭数据就消失了

(2)用 SQL 语句完成下列查询

与之前的部门和员工不同的是,本次的查询属于多对多的查询应用,这一点在某种程度上决定了查询的复杂度

① 求购买了供应商“宝洁”产品的所有顾客

确定要使用的数据表

customer 表:可以取得顾客信息。

product 表:商品表中可以找到供应商信息。

purcase 表:保存顾客购买商品的记录。

第一步:找到供应商“宝洁”的所有商品编号,因为有了商品编号才可以查找到购买记录

select productid
from product 
where provider='宝洁';

 第二步:以上的查询返回多行单列,按照要求,应该在 where子句之中出现,现在又属于一个范围的匹配,那么可以使用 IN 进行判断,找出购买记录是为了找到顾客信息

select customerid
from purcase
where productid IN (select productidfrom product where provider='宝洁') ;

第三步:以上返回了顾客的编号,直接利用 where子句过滤

select *
from customer
where customerid IN (select customeridfrom purcasewhere productid IN (select productidfrom product where provider='宝洁') ) ;

② 求购买的商品包含了顾客“Dennis”所购买的所有商品的顾客(姓名)。

确定要使用的数据表

customer 表:顾客信息。

purcase 表:购买的商品记录。

首先需要知道“Dennis”购买了那些商品。所有的购买记录保存在了 purcase 表之中,而要想查购买记录,只需要知道顾客的编号即可。

顾客编号通过 customer 表查询

select productid
from purcase
where customerid=(select customeridfrom customerwhere name='Dennis' );

可以发现,此人购买了 M01、M05、M08,而其他用户必须包含这些内容才可以算是购买过此商品。

现在先不嵌套子查询,假设已经知道了购买的顾客编号为“C01”。

SELECT productid FROM purcase WHERE customerid='C01' MINUS
SELECT productid FROM purcase WHERE customerid='C03' ;

“C01”的购买记录:M01、M05、M08

依次内推

SELECT productid FROM purcase WHERE customerid='C01' ;
SELECT productid FROM purcase WHERE customerid='C02' ;
SELECT productid FROM purcase WHERE customerid='C03' ;
SELECT productid FROM purcase WHERE customerid='C04' ;
SELECT productid FROM purcase WHERE customerid='C05' ;

那么现在的问题就在于如何可以将 C03 保留,其他编号删除。可以借助集合操作。通过差集的计算可以找到规律

C01 和 C02 顾客做差运算(M01、M05、M08)

SELECT productid FROM purcase WHERE customerid='C01' MINUS
SELECT productid FROM purcase WHERE customerid='C02' ;

C01 和 C03 顾客做差运算(null)

SELECT productid FROM purcase WHERE customerid='C01' MINUS
SELECT productid FROM purcase WHERE customerid='C03' ;

如果包含有 C01 的全部内容差的结果是 null,可以利用学习过一个运算符补充,这个运算符的特点是如果有数据则查询,如果没有数据则不查询

SELECT * 
FROM customer ca
WHERE NOT EXISTS(SELECT p1.productid FROM purcase p1WHERE customerid=(SELECT customeridFROM customer WHERE name='Dennis') MINUSSELECT p2.productid FROM purcase p2WHERE customerid=ca.customerid ) 
AND ca.name<>'Dennis' ;

③ 求牙膏卖出数量最多的供应商

确定要使用的数据表

product 表:供应商信息

product 表:商品分类以及出售的数量

purcase 表:销售记录

第一步:查找出牙膏的商品编号,如果没有编号就不可能知道购买记录。

SELECT productid FROM product WHERE category='牙膏' ;

第二步:以上查询返回多行单列,把返回的结果在 WHERE 子句嵌套使用。根据 purcase 表找到所有牙膏的销售数量

SELECT productid,SUM(quantity)
FROM purcase 
WHERE productid IN (SELECT productid FROM product WHERE category='牙膏')
GROUP BY productid;

第三步:因为要找牙膏的最高销售数量,所以需要进行统计函数嵌套,而一旦嵌套之后,统计查询的 SELECT 子句里面不允许出现其他任何字段

SELECT productid,SUM(quantity)
FROM purcase 
WHERE productid IN (SELECT productid FROM product WHERE category='牙膏')
GROUP BY productid
HAVING SUM(quantity)=(SELECT MAX(SUM(quantity))FROM purcase WHERE productid IN (SELECT productid FROM product WHERE category='牙膏')GROUP BY productid);

第四步:由于最后只是需要一个供应商的信息,只需要根据商品编号查找到供应商信息即可

SELECT provider
FROM product
WHERE productid=(SELECT productidFROM purcase WHERE productid IN (SELECT productid FROM product WHERE category='牙膏')GROUP BY productidHAVING SUM(quantity)=(SELECT MAX(SUM(quantity))FROM purcase WHERE productid IN (SELECT productid FROM product WHERE category='牙膏')GROUP BY productid));

(3)将所有的牙膏商品单价增加 10%


UPDATE product SET unitprice=unitprice*1.1 WHERE category='牙膏' ;

(4)删除从未被购买的商品记录

第一步:找出所有购买过的商品信息

SELECT productid FROM purcase ;

第二步:使用 not in 就可以表示未购买过的商品记录

DELETE FROM product WHERE productid NOT IN (SELECT productid FROM purcase) ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/271081.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交友盲盒系统PHP开源的盲盒源码

源码介绍&#xff1a; 交友盲盒系统是一款基于PHP开发的开源免费盲盒系统&#xff0c;旨在为用户提供一个充满乐趣和惊喜的社交体验。该系统具有丰富的功能和灵活的扩展性&#xff0c;可以轻松地满足各种线上交友、抽奖活动等场景的需求。 安装说明&#xff1a; PHP版本&…

海外IP代理应用:亚马逊使用什么代理IP?

代理IP作为网络活动的有力工具&#xff0c;同时也是跨境电商的必备神器。亚马逊作为跨境电商的头部平台&#xff0c;吸引了大量的跨境电商玩家入驻&#xff0c;想要做好亚马逊&#xff0c;养号、测评都需要代理IP的帮助。那么应该使用什么代理IP呢&#xff1f;如何使用&#xf…

LeetCode 刷题 [C++] 第300题.最长递增子序列

题目描述 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 题目…

【学习笔记】卫星基础知识

一、什么是卫星以及它如何工作&#xff1f; 通信卫星是一种人造卫星&#xff0c;通过使用转发器在源和接收器之间中继和放大无线电电信信号。卫星的工作原理是接收从地球发送的无线电信号并将无线电信号重新发送回地球。卫星使用从大型太阳能电池阵列收集的太阳能&#xff0c;…

npm ERR! code ERR_INVALID_URL报错解决

这个报错是URL错误&#xff0c;要排除两个点 npm的registry有没有搞错&#xff0c;也就是npm源有没有搞错 打开文件C:/User/<用户名>/.npmrc查看npm设置查看registry的设置有没有格式错误正确设置格式&#xff1a;registry"https://registry.npmmirror.com"或…

Spring揭秘:ApplicationContextAware应用场景及实现原理!

内容概要 ApplicationContextAware接口能够轻松感知并在Spring中获取应用上下文&#xff0c;进而访问容器中的其他Bean和资源&#xff0c;这增强了组件间的解耦&#xff0c;了代码的灵活性和可扩展性&#xff0c;是Spring框架中实现高级功能的关键接口之一。 核心概念 它能用…

双体系Java学习之关键字,标识符以及命名规范

刚开学&#xff0c;然后之前的课程暂时停在了多态&#xff0c;接下来开始跟着学校的步伐重新开始学一下&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 关键字 标识符 命名规范

响应式编程五股票订阅系统实现

响应式编程五 使用StepVerifier测试响应式流StepVerifier要点 使用StepVerifier进行高级测试股票订阅系统数据库表 使用StepVerifier测试响应式流 出于测试目的&#xff0c;Reactor 提供了额外的 reactor-test 模块&#xff0c;该模块提供了 StepVerifier。StepVerifier 提供了…

Android视角看鸿蒙第三课(module.json中的各字段含义之nametype)

Android视角看鸿蒙第三课(module.json中的各字段含义) 前言 上篇文章我们试图找到鸿蒙app的程序入口&#xff0c;确定了在鸿蒙工程中,由AppScope下的app.json5负责应用程序的图标及名称,由entry->src->main-module.json5负责桌面图标及名称的展示。 AppScope下的app.js…

YOLOv8实例分割实战:ONNX模型转换及TensorRT部署

课程链接&#xff1a;https://edu.csdn.net/course/detail/39320 PyTorch版的YOLOv8支持高性能的实时实例分割。 TensorRT是针对英伟达GPU的加速工具。 ONNX &#xff08;Open Neural Network Exchange&#xff09; 作为一个开放的网络模型中间表示&#xff08;IR&#xff0…

2024年最新阿里云服务器地域选择方法,以及可用区说明

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

linux命令行或桌面 显卡压力测试

windows下的压力测试非常简单&#xff0c;有很多图形化的测试工具 在github上找到一个项目&#xff1a;github链接 1.下载工具 cd /usr/localgit clone https://github.com/wilicc/gpu-burn如果没有安装git&#xff0c;则先安装 apt-get install git2.安装 cd /usr/local/…

SpringBoot源码解读与原理分析(三)条件装配

文章目录 2.3 Spring Framework的条件装配2.3.1 基于Profile的装配1.Profile源码解读2.使用Profile注解&#xff08;3&#xff09;命令行参数配置Profile3.Profile运用于实际开发4.Profile的不足 2.3.2 基于Conditional的装配1.Conditional源码解读2.Conditional使用3.Conditio…

[pdf]《软件方法》强化自测题业务建模需求分析共191页,230题

潘加宇《软件方法》强化自测题业务建模需求分析共191页&#xff0c;230题&#xff0c;已上传CSDN资源。 在完成书中自测题基础上&#xff0c;进一步强化。 也可到以下地址下载&#xff1a; 资料http://www.umlchina.com/url/quizad.html 如果需要网盘提取码&#xff1a;uml…

北斗卫星助力无人机在沙漠播种,促进沙漠治理

北斗卫星助力无人机在沙漠播种&#xff0c;促进沙漠治理 近年来&#xff0c;随着科技的不断发展&#xff0c;北斗卫星和无人机技术的结合被广泛应用于沙漠治理领域&#xff0c;为解决沙漠化问题提供了全新的思路和解决方案。 近日&#xff0c;黄河“几字弯”北岸的内蒙古自治…

FreeRTOS操作系统学习——空闲任务及其钩子函数

空闲任务 当 FreeRTOS 的调度器启动以后就会自动的创建一个空闲任务&#xff0c;这样就可以确保至少有一任务可以运行。但是这个空闲任务使用最低优先级&#xff0c;如果应用中有其他高优先级任务处于就绪态的话这个空闲任务就不会跟高优先级的任务抢占 CPU 资源。空闲任务还有…

mirthConnect忽略HTTPS SSL验证

mirthConnect SSL忽略验证 1、下载https网站证书 点击不安全---->证书无效 2、查看mirth 秘钥库口令 在mirthConnect 的conf目录下面keystore.storepass 3、导入证书到本地 在jdk的bin目录下面执行 keytool -importcert -file "下载的网站证书路径" -keysto…

经典语义分割(二)医学图像分割模型UNet

经典语义分割(二)医学图像分割模型UNet 我们之前介绍了全卷积神经网络( FCN) &#xff0c;FCN是基于深度学习的语义分割算法的开山之作。 今天我们介绍另一个语义分割的经典模型—UNet&#xff0c;它兼具轻量化与高性能&#xff0c;通常作为语义分割任务的基线测试模型&#x…

Springboot 的几种配置文件形式

方式一&#xff1a;多个yml文件 步骤1&#xff1a;创建多个配置文件 application.yml #主配置文件 application-dev.yml #开发环境的配置 application-prod.yml #生产环境的配置 application-test.yml #测试环境的配置步骤2&#xff1a;applicaiton.yml中指定配置 在a…

时光机关:探秘Java中的Timer和TimerTask

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 时光机关&#xff1a;探秘Java中的Timer和TimerTask 前言Timer和TimerTask的基本概念Timer&#xff1a;TimerTask&#xff1a;为何它们是 Java 中任务调度的得力工具&#xff1a; Timer的使用方法创建…