Oracle 数据库基础入门(五):限制查询与范式三约定深度解析
在 Oracle 数据库的学习进程中,限制查询与范式三约定是两个极为重要的概念。限制查询帮助我们精准获取特定范围的数据,而范式三约定则为数据库设计提供了科学的指导框架。对于 Java 全栈开发者而言,掌握这些知识不仅有助于高效地从数据库中提取数据,更能设计出结构合理、性能优良的数据库,为构建强大的应用系统奠定坚实基础。
目录
一、Oracle 限制查询
(一)与 MySQL 限制查询的对比
(二)伪列的奥秘
(三)限制查询的实际应用
二、范式三约定
(一)范式的重要性
(二)第 1 范式(原子性)
(三)第 2 范式(间接相关性)
(四)第 3 范式(直接相关性)
三.企业工作小技巧
一、Oracle 限制查询
(一)与 MySQL 限制查询的对比
在数据库查询操作中,限制查询是获取部分数据的常用手段。在 MySQL 中,我们使用limit关键字来实现限制查询。而在 Oracle 数据库里,对应的是rownum。理解这两者的差异和rownum的特性,对于在不同数据库环境下进行开发至关重要。
(二)伪列的奥秘
- 伪列的概念:伪列并非真实存在于物理表中的列,但它们能为我们提供额外的有用信息。在 Oracle 中,常见的伪列有
ROWID、ROWNUM、SYSDATE、CURRENT_DATE和USER。ROWID代表数据在磁盘中的地址值。通过它,我们可以快速定位到数据在物理存储中的位置,这在一些需要高效访问特定数据块的场景中非常有用。例如,在进行大规模数据迁移时,可以利用ROWID来准确地将数据从一个表移动到另一个表。ROWNUM代表每一行数据的编号。当数据加载到内存中时,数据库会自动为每一行添加对应的行号。这在限制查询和分页操作中扮演着核心角色。SYSDATE代表世界系统时间,CURRENT_DATE代表本地时间(与服务器设置的时区有关),USER则表示当前登录的用户。这些伪列在记录操作时间、跟踪用户行为等方面有着广泛应用。例如,在日志表中记录操作时间时,可以使用SYSDATE;在多用户系统中,根据USER伪列来区分不同用户的操作记录。
- 伪列的使用示例:
SELECT ROWID, ROWNUM, SYSDATE, CURRENT_DATE, USER, id, EMPLOYEENAME FROM EMPLOYEES;
这条语句将从EMPLOYEES表中查询出员工的id、EMPLOYEENAME,同时展示每行数据的ROWID、ROWNUM,以及当前的世界系统时间、本地时间和登录用户。
(三)限制查询的实际应用
- 获取排名靠前的数据:在许多实际场景中,我们需要获取排名靠前的数据。比如在游戏中,查询战力榜前 200 名、富豪榜前 100 名;在新闻系统中,获取热门新闻前 10 条等。以查询企业职员中工资排名前 3 的职工为例:
SELECT ROWNUM, data.* FROM ( SELECT * FROM EMPLOYEES ORDER BY SALARY DESC ) data WHERE ROWNUM <= 3;
这里先对EMPLOYEES表按照SALARY降序排列,然后在子查询结果中,通过ROWNUM筛选出前 3 条记录。在 Java 全栈开发的企业人事管理系统中,后端开发人员可以使用 JDBC 或相关框架(如 MyBatis)执行此 SQL 语句。将查询结果封装成 Java 对象(如Employee对象,包含员工的各项信息),再通过 RESTful API 传递给前端。前端可以将这些高收入员工信息以表格或卡片形式展示,方便管理层查看。
2. 分页查询:当数据量庞大时,一次性将所有数据展示在页面上既不现实也不高效。此时,分页查询就显得尤为重要。在 Oracle 中,分页查询的通用公式如下:
SELECT * FROM ( SELECT ROWNUM rn, data.* FROM ( -- 此处调整为 自己的SQL语句 select * from 表的表名 where [条件筛选] [order by 排序] [group by 分组] ) data WHERE ROWNUM <= :end_row ) WHERE rn >= :start_row;
例如,我们要对book表进行分页查询,查询未删除(delete_flag = 0)且按出版日期降序排列的书籍,每页显示 5 条数据,查询第 2 页的内容:
SELECT * FROM ( SELECT ROWNUM rn, data.* FROM ( SELECT * FROM book WHERE delete_flag = 0 ORDER BY publish_date DESC ) data WHERE ROWNUM <= 10 ) WHERE rn >= 6;
在这个查询中,最内部的子查询负责查询满足条件的具体数据;中间的子查询通过ROWNUM控制结尾行号,确保只获取前end_row条数据;最外层的子查询则通过rn(即ROWNUM的别名)做起始行号控制,筛选出从start_row开始的行。在 Java 全栈开发的图书管理系统中,前端页面发送分页请求(包含页码和每页数据量参数)到后端。后端接收请求后,根据页码和每页数据量计算出start_row和end_row的值,然后执行上述分页查询。将查询结果返回给前端,前端使用分页组件(如 Element - UI 的分页组件)将数据展示给用户,提升用户体验。
二、范式三约定
(一)范式的重要性
范式是数据库设计的理论体系和框架,如同建筑蓝图对于建筑施工的指导作用。范式三约定为数据库设计提供了明确的规则,遵循这些规则可以设计出结构清晰、数据冗余度低、易于维护和扩展的数据库。在 Java 全栈开发中,合理的数据库设计能够极大地简化后端数据处理逻辑,提升系统性能。
(二)第 1 范式(原子性)
- 原子性要求:第 1 范式要求列具有原子性,即列中的数据必须拆分到不能再拆分为止。例如,在一个学生信息表中,最初的设计可能是这样:
| id | 学生名称 | 年龄 | 家庭地址 |
|----|----------|------|-----------|
| 1 |张三 | 22 | 四川省成都市郫都区广州市路 33 号 |
| 2 | 李四 | 23 | 四川省绵阳市涪城区二龙镇 23 号 |
| 3 | 王五 | 21 | 广东省广州市天河区 11 号 |
| 4 | 马六 | 25 | 四川省成都市高新区北京路 23 号 |
当我们需要统计广州有多少个学生时,这种设计就显得力不从心。因为家庭地址列没有进行原子拆分,无法直接根据地址中的城市信息进行统计。 - 改进设计:遵循第 1 范式,将
家庭地址列拆分为省、市、区、详细地址,改进后的表结构如下:
| id | 学生姓名 | 年龄 | 省 | 市 | 区 | 详细地址 |
|----|----------|------|------|------|------|----------|
| 1 |张三 | 22 | 广州市路 33 号 |
| 2 | 李四 | 23 | 二龙镇 23 号 |
| 3 | 王五 | 21 | 11 号 |
| 4 | 马六 | 25 | 北京路 23 号 |
这样的设计使得数据更加结构化,方便进行各种统计和查询操作。在 Java 全栈开发的学生信息管理系统中,后端开发人员可以更轻松地编写 SQL 查询语句来统计不同地区的学生数量。前端也能更方便地根据这些结构化数据进行地址信息的展示和筛选。
(三)第 2 范式(间接相关性)
- 相关性原则:在遵循第 1 范式的基础上,第 2 范式要求表中的字段一定要跟主键有一定的相关性。以商品订单表为例,最初的设计可能是:
| 订单编号 | 商品编号 | 商品名称 | 单价 | 数量 | 客户 | 工作单位 | 联系方式 | 总价 |
|----------|----------|----------|--------|------|--------|----------|----------|--------|
| 001 | 001 | 推土机 | 10W | 4 | 张三 | 中铁 1 局 | …… | 40W |
| 002 | 002 | 挖挖机 | 15W | 3 | 王五 | 艾瑞 | …… | 45W |
| 003 | 003 | 压路机 | 20W | 2 | 李四 | 中铁 2 局 | …… | 40W |
| 004 | 001 | 推土机 | 10W | 2 | 马六 | 成都学院 | …… | 20W |
暂时将订单编号和商品编号视为联合主键。 - 表的拆分:仔细分析这个表,我们会发现客户的工作单位和联系方式等信息与订单本身的核心记录(商品购买情况)并非直接相关,而且存在数据冗余。例如,“吴亦凡” 的工作单位和联系方式在每个相关订单中都重复出现。根据第 2 范式,我们将商品订单表拆分为商品订单表和客户表:
- 客户表:
| id | 客户名称 | 工作单位 | 联系方式 |
|----|----------|----------|----------|
| 1 | 张三 | 中铁 1 局 | …… |
| 2 | 王五 | 艾瑞 | …… |
| 3 | 李四 | 中铁 2 局 | …… |
| 4 | 马六 | 成都学院 | …… | - 商品订单表:
| 订单编号 | 商品编号 | 商品名称 | 单价 | 数量 | 客户外键 | 总价 |
|----------|----------|----------|--------|------|----------|--------|
| 001 | 001 | 推土机 | 10W | 4 | 1 | 40W |
| 002 | 002 | 挖挖机 | 15W | 3 | 2 | 45W |
| 003 | 003 | 压路机 | 20W | 2 | 3 | 40W |
| 004 | 001 | 推土机 | 10W | 2 | 4 | 20W |
这样拆分后,数据的相关性更加清晰,减少了数据冗余。在 Java 全栈开发的电商系统中,后端开发人员可以通过外键关联客户表和商品订单表,方便地获取客户的订单信息以及客户的详细资料。前端在展示订单详情时,可以通过调用后端接口,获取关联的客户信息进行展示,提升用户体验。
- 客户表:
(四)第 3 范式(直接相关性)
- 直接相关的要求:在遵从第 1、2 范式的基础上,第 3 范式要求表中的字段一定要跟主键有直接相关性,而并非间接相关。继续以商品订单表为例,虽然经过第 2 范式的拆分,已经有了一定的优化,但商品订单表中的商品名称和单价等信息与订单的核心记录(订单编号、商品数量、客户外键等)并非直接相关,因为商品的名称和单价等信息本质上是商品自身的属性,与订单的关联是间接的。
- 进一步拆分:因此,根据第 3 范式,我们将商品订单表进一步拆分为商品表和订单表:
- 商品表:
| id | 商品名称 | 单价 | 商品描述 |
|----|----------|--------|----------|
| 1 | 推土机 | 10W | …… |
| 2 | 挖挖机 | 15W | …… |
| 3 | 压路机 | 20W | …… | - 订单表:
| ID | 商品外键 | 数量 | 客户外键 | 总价 |
|------|----------|------|----------|--------|
| 001 | 1 | 4 | 1 | 40W |
| 002 | 2 | 3 | 2 | 45W |
| 003 | 3 | 2 | 3 | 40W |
| 004 | 1 | 2 | 4 | 20W |
经过这样的拆分,每个表的职责更加单一,数据之间的关系更加直接和清晰。在 Java 全栈开发的电商系统中,这种设计使得后端在处理商品管理、订单管理等业务逻辑时更加高效。例如,在更新商品价格时,只需要在商品表中进行操作,而不会影响到订单表的其他数据。前端在展示商品详情和订单详情时,也能通过清晰的表结构和外键关联,准确地获取所需数据进行展示。
- 商品表:
三.企业工作小技巧
- 数据库设计阶段:在进行数据库设计时,严格遵循范式三约定。在设计表结构前,充分分析业务需求,确定每个表的主键和字段,确保满足原子性、相关性等要求。可以使用数据库建模工具(如 PowerDesigner)来辅助设计,通过图形化的方式展示表与表之间的关系,更直观地检查是否符合范式。在 Java 全栈开发团队中,数据库设计是后端开发的重要环节,前端开发人员也可以参与讨论,从用户体验和数据展示的角度提供建议,确保设计出的数据库既能满足业务需求,又便于前后端的数据交互。
- 查询优化阶段:在编写查询语句时,利用
ROWNUM进行限制查询和分页查询时,要注意其特性。由于ROWNUM是在查询结果集生成后才分配行号,所以在一些复杂查询中,要合理使用子查询来确保查询结果的准确性。例如,在多表联合查询后进行分页时,要确保先进行表的连接和筛选,再使用ROWNUM进行分页。在 Java 全栈开发中,后端开发人员可以将一些常用的分页查询封装成通用方法,供不同的业务模块调用,提高代码的复用性。同时,前端在发起分页请求时,要对页码和每页数据量进行合理的校验,防止非法参数导致的查询错误。 - 数据维护阶段:在数据库运行过程中,随着业务的发展,可能需要对表结构进行调整。此时,要谨慎操作,确保调整后的表结构仍然符合范式三约定。例如,当需要新增字段时,要分析该字段与主键的相关性,避免破坏范式。在 Java 全栈开发中,后端开发人员在进行数据库结构变更时,要及时通知前端开发人员,确保前端页面的数据展示和交互逻辑能够适应数据库的变化。同时,要做好数据备份和迁移工作,防止数据丢失。
通过对 Oracle 限制查询和范式三约定的深入学习,我们掌握了更强大的数据库操作和设计技能。在未来的 Java 全栈开发工作中,这些知识将帮助我们构建出更加高效、稳定和可扩展的应用系统。
相关文章:
Oracle 数据库基础入门(五):限制查询与范式三约定深度解析
在 Oracle 数据库的学习进程中,限制查询与范式三约定是两个极为重要的概念。限制查询帮助我们精准获取特定范围的数据,而范式三约定则为数据库设计提供了科学的指导框架。对于 Java 全栈开发者而言,掌握这些知识不仅有助于高效地从数据库中提…...
pgsql行列转换
目录 一、造测试数据 二、行转列 1.函数定义 2.语法 3.示例 三、列转行 1.函数定义 2.语法 3.示例 一、造测试数据 create table test ( id int, json1 varchar, json2 varchar );insert into test values(1,111,{111}); insert into test values(2,111,222,{111,22…...
Nginx 开启Baise认证
开启Baise认证 需要再站点Server配置中添加一下配置,添加htpasswd文件 server{auth_basic "HTTP Basic Authentication";auth_basic_user_file /etc/nginx/htpasswd;# 其他配置信息... }如果你的 Linux 服务器没有安装 htpasswd 工具,可以通…...
Android 多用户相关
Android 多用户相关 本文主要记录下android 多用户相关的adb 命令操作. 1: 获取用户列表 命令: adb shell pm list users 输出如下: Users:UserInfo{0:机主:c13} running默认只有一个用户, id为0 ,用户状态为运行 2: 创建新用户 命令: adb shell …...
基于python实现的疫情数据可视化分析系统
基于python实现的疫情数据可视化分析系统 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat 系统功能实现 总体设计 系统实现 系统功能模块 系统首页可以查看首页、疫情信息、核酸检测、新闻资讯、个人中心、后…...
计算机毕业设计SpringBoot+Vue.js陕西民俗网(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Win7重装不翻车!ISO镜像安全下载渠道+BIOS设置避雷手册
一、写在前面:为什么你需要这份教程? 当电脑频繁蓝屏、系统崩溃甚至无法开机时,重装系统可能是最后的救命稻草。但市面上的教程往往存在三大痛点: ⚠️ 镜像来源不明导致系统被植入后门 ⚠️ 启动盘制作失败反复折腾 ⚠️ 操作失…...
[项目]基于FreeRTOS的STM32四轴飞行器: 四.LED控制
基于FreeRTOS的STM32四轴飞行器: 四.LED控制 一.配置Com层二.编写驱动 一.配置Com层 先在Com_Config.h中定义灯位置的枚举类型: 之后定义Led的结构体: 定义飞行器状态: 在Com_Config.c中初始化四个灯: 在Com_Config.h外部声明…...
macos查询pip默认镜像地址
在 macOS 系统中,查询 pip 的默认镜像地址可以通过以下几种方法: 方法 1:直接通过 pip config list 命令查询 运行以下命令查看当前 pip 的配置(包括镜像地址): pip config list 如果输出中包含 global…...
计算机毕业设计SpringBoot+Vue.js青年公寓服务平台(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
【虚拟仿真】Unity3D中实现激光/射线的发射/折射/反射的效果(3D版)
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。...
flutter环境最新踩坑
## Flutter 开发常见问题排查与解决 ### 1. 项目初始化与依赖问题 bash # 清理项目 flutter clean # 获取依赖 flutter pub get # 详细日志运行 flutter run -v ### 2. 网络和下载问题 - 网络慢可能导致依赖下载卡住 - 使用 -v 参数可查看详细日志 - 检查网络连接 - 可以尝…...
使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控
使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控系统,可以分为以下几个步骤: 1. 系统架构设计 前端:使用 Vue.js、React 或 Angular 等前端框架实现用户界面。后端:使用 Spring Boot 提供 RESTful API,负责与…...
VScode 中文符号出现黄色方框的解决方法
VScode 中文符号出现黄色方框的解决方法 我的vscode的python多行注释中会将中文字符用黄色方框框处: 只需要打开设置搜索unicode,然后将这一项的勾选取消掉就可以了: 取消之后的效果如下: 另一种情况:中文显示出现黄色…...
⭐算法OJ⭐跳跃游戏【贪心算法】(C++实现)Jump Game 系列 I,II
既股票买卖系列之后的第二组贪心算法题目:跳跃游戏系列。这一篇介绍的两个问题,其输入均为一个数组,每个元素表示在该位置可以跳跃的最大长度。 55. Jump Game You are given an integer array nums. You are initially positioned at the …...
阿里云MaxCompute面试题汇总及参考答案
目录 简述 MaxCompute 的核心功能及适用场景,与传统数据仓库的区别 解释 MaxCompute 分层架构设计原则,与传统数仓分层有何异同 MaxCompute 的存储架构如何实现高可用与扩展性 解析伏羲(Fuxi)分布式调度系统工作原理 盘古(Pangu)分布式存储系统数据分片策略 计算与存…...
JCRQ1河马算法+四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测
JCRQ1河马算法四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-GRU-Attention、CNN-GRU-Attent…...
探索低空经济,无人机及载人直升机低空应用技术详解
探索低空经济时,无人机及载人直升机低空应用技术是核心要素。以下是对这两类技术的详细解析: 一、无人机低空应用技术 1. 飞行控制技术 无人机需要强大的飞行控制系统,这涉及传感器融合、飞行器稳定性控制、自动化飞行和紧急情况下的自动避…...
Python:简单的爬虫程序,从web页面爬取图片与标题并保存MySQL
文章目录 一、环境说明二、基本思路三、代码 一、环境说明 python 版本:3.10 MySQL版本:8 二、基本思路 首先,我们需要查看网页源代码 通过html源码,确定我们要抓取的内容所在标签的特点 然后,利用BeautifulSoup进…...
GStreamer —— 2.3、Windows下Qt加载GStreamer库后运行 - “教程3:动态管道“(附:完整源码)
运行效果(音频) 简介 上一个教程演示了GStreamer 概念。本教程中的管在它设置为 playing 状态之前完全构建。这没关系。如果 我们没有采取进一步的行动,数据会到达 pipeline 的 pipeline 和 pipeline 将生成错误消息并停止。但 我们将采取进一…...
【Java数据结构】前K个高频单词
前K个高频单词 692. 前K个高频单词 - 力扣(LeetCode) 解决这个问题我们先得知道每个单词出现的次数,用map存储下来,然后将出现次数最多的通过建立小根堆解决top-K问题 ,重点是top-K的求取。 1.建立map 首先我们可以…...
Ubuntu20.04本地配置IsaacLab 4.5.0的训练环境(一)
Ubuntu20.04本地配置IsaacLab 4.5.0的训练环境(一) 配置conda虚拟环境(对于这一步,个人感觉跟在配置IsaacLab那一节的./isaaclab.sh --install同样要执行这一步,建议先不执行)配置IsaacSim配置IsaacLab 写在…...
第二次CCF-CSP认证(含C++源码)
第二次CCF-CSP认证 第一道(easy)思路及AC代码 第二道(easy)基本思路及AC代码 第三道(mid)基本思路及AC代码solution 1 (模拟)solution 2(KMP) 第一道(easy) 题…...
前端多角色权限页面(同浏览器同时登录)数据互串解决
项目是使用vue3写的 问题说明 现在的问题是,在同个浏览器打开两个标签页(都是登录页面),A标签页先登录A的账号,然后B标签页登录B账号。我的登录信息(userInfo和token、权限等都是存放在localStorage中的&…...
常见面试问题:MVC模式
MVC(Model-View-Controller)是一种分层架构设计模式,核心思想是通过职责分离提升代码的可维护性和扩展性。它的三个组件分工如下: 1. Model(模型) 职责:管理数据和业务逻辑,与数据库…...
【项目】视频点播
一、项目介绍 1. 对视频点播系统的认识 搭建视频共享点播服务器,可以让所有人通过浏览器访问服务器,实现视频的上传查看,以及管理并播放的功能。主要是完成服务器端的程序业务功能的实现以及前端访问界面 html 的编写,能够支持客…...
vue videojs使用canvas截取视频画面
前言 刚开始做的时候太多坑,导致一直报错: Uncaught (in promise) TypeError: Failed to execute ‘drawImage’ on ‘CanvasRenderingContext2D’: The provided value is not of type ‘(CSSImageValue or HTMLCanvasElement or HTMLImageElement or H…...
DeepSeek私有化部署6:openEuler 24.03-LTS-SP1安装Open WebUI
Open WebUI是一个 Open WebUI 是一个可扩展的、功能丰富、用户友好的自托管 AI 平台,专为完全离线运行而设计。 它支持多种 LLM 运行环境,包括 Ollama 和 OpenAI 兼容的 API,并内置了用于 RAG 的推理引擎,是一个强大的 AI 部署解决…...
uniapp+微信小程序+地图+传入多个标记点显示+点击打开内置地图导航+完整代码
一、效果展示 二、完整代码 <template><view class"container"><map class"map-container" :latitude"latitude" :longitude"longitude" :markers"markers" :controls"controls" show-location m…...
摄像头应用编程(四):ARM Linux LCD实时预览UVC摄像头画面
文章目录 1、前言2、环境介绍3、步骤4、应用程序编写4.1、lcd初始化4.2、摄像头初始化4.3、jpeg解码4.4、开启摄像头4.5、完整的程序如下 5、测试5.1、编译应用程序5.2、运行应用程序 6、总结 1、前言 本次应用程序主要针对支持MJPEG格式输出的UVC摄像头。 2、环境介绍 rk35…...
