关系型数据库基础

一、关系型数据库概述

关系型数据库是一种基于关系模型的数据库,它将数据组织成一个或多个表(或称为关系),每个表由行和列组成。每一列都有一个唯一的名字,称为属性,表中的每一行是一个元组,代表一个完整的数据记录。关系型数据库通过表之间的关系来存储和管理数据,这些关系可以通过外键等约束来定义。

常见的关系型数据库管理系统(RDBMS)包括 MySQL、PostgreSQL、Oracle、SQL Server 等,它们都使用 SQL(Structured Query Language,结构化查询语言)作为数据查询和操作的标准语言。

二、数据库设计

  • 数据库建模 :在设计数据库之前,通常需要进行数据库建模。常用的建模方法有 E-R 图(实体 - 关系图),它可以清晰地表示实体、属性和实体之间的关系。例如,一个学校管理系统中,学生和课程是两个实体,它们之间存在多对多的关系,可以通过一个中间表来表示这种关系。
  • 范式设计 :为了减少数据冗余和提高数据一致性,关系型数据库通常遵循一定的范式。常见的范式有第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。遵守范式的设计原则可以帮助我们更好地组织数据,减少数据异常。

三、基本操作

  • 数据定义语言(DDL)
    • CREATE :用于创建数据库对象,如数据库、表、索引等。例如,创建一个学生表:
CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50),age INT,major VARCHAR(50)
);
* **ALTER** :用于修改已存在的数据库对象的结构。例如,添加一个列:
ALTER TABLE students ADD email VARCHAR(100);
* **DROP** :用于删除数据库对象。例如,删除一个表:
DROP TABLE students;
  • 数据操纵语言(DML)
    • INSERT :向表中插入数据。例如:
INSERT INTO students (id, name, age, major) VALUES (1, 'John Doe', 20, 'Computer Science');
* **UPDATE** :更新表中的数据。例如:
UPDATE students SET age = 21 WHERE id = 1;
* **DELETE** :删除表中的数据。例如:
DELETE FROM students WHERE id = 1;
  • 数据查询语言(DQL)
    • SELECT :用于查询表中的数据。例如,查询所有学生的信息:
SELECT * FROM students;
* 条件查询:可以根据特定条件查询数据。例如,查询年龄大于 20 的学生:
SELECT * FROM students WHERE age > 20;
* 排序查询:可以对查询结果进行排序。例如,按照年龄降序排列:
SELECT * FROM students ORDER BY age DESC;
* 分组和聚合查询:可以使用 GROUP BY 子句和聚合函数(如 COUNT、SUM、AVG 等)对数据进行分组和聚合。例如,统计每个专业的学生数量:
SELECT major, COUNT(*) FROM students GROUP BY major;
  • 数据控制语言(DCL)
    • GRANT :用于授予用户对数据库对象的访问权限。例如:
GRANT SELECT, INSERT ON students TO 'username'@'localhost';
* **REVOKE** :用于撤销用户的访问权限:
REVOKE SELECT ON students FROM 'username'@'localhost';

四、事务管理

  • 事务的 ACID 特性 :事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

    • 原子性:事务中的操作要么全部成功,要么全部失败。
    • 一致性:事务执行前后,数据库从一个一致状态转换到另一个一致状态。
    • 隔离性:并发执行的事务之间互不干扰。
    • 持久性:事务完成后,其对数据库的修改是永久的。
  • 事务操作 :在 SQL 中,可以使用 COMMIT 提交事务,使用 ROLLBACK 回滚事务。例如:

START TRANSACTION;
UPDATE account1 SET balance = balance - 100 WHERE id = 1;
UPDATE account2 SET balance = balance + 100 WHERE id = 2;
COMMIT;

五、索引

  • 索引的作用 :索引是数据库中用于提高查询速度的结构,类似于书籍的目录。通过在表的列上创建索引,可以加快对数据的查询速度。
  • 索引的类型 :常见的索引类型有单列索引、复合索引、唯一索引、全文索引等。
  • 创建索引 :例如,在学生表的 name 列上创建索引:
CREATE INDEX idx_name ON students (name);
  • 使用索引的注意事项 :虽然索引可以提高查询速度,但也会增加插入、更新和删除数据时的开销。因此,在创建索引时需要权衡查询性能和数据修改的开销。

六、视图

  • 视图的作用 :视图是一种虚拟表,其内容由查询定义。视图可以简化复杂的查询,隐藏数据的复杂性,还可以用于限制对某些数据的访问。
  • 创建视图 :例如,创建一个显示学生姓名和专业的视图:
CREATE VIEW student_info AS
SELECT name, major FROM students;
  • 查询视图 :查询视图和查询表类似:
SELECT * FROM student_info;
  • 更新视图 :某些情况下,可以通过视图更新数据,但复杂的视图可能不支持更新操作。

七、存储过程

  • 存储过程的作用 :存储过程是一组 SQL 语句的集合,它可以预先编译并存储在数据库中。通过调用存储过程,可以执行一系列的操作,减少网络传输,提高执行效率。
  • 创建存储过程 :例如,在 MySQL 中创建一个计算两个数之和的存储过程:
DELIMITER //
CREATE PROCEDURE add_numbers (IN a INT, IN b INT, OUT result INT)
BEGINSET result = a + b;
END //
DELIMITER ;
  • 调用存储过程
CALL add_numbers(5, 3, @result);
SELECT @result;

八、数据库连接池

  • 数据库连接池的作用 :在 JavaWeb 开发中,频繁地创建和关闭数据库连接会带来较大的性能开销。数据库连接池预先创建并维护一定数量的数据库连接,当应用需要进行数据库操作时,可以从连接池中获取一个空闲连接,使用完毕后再将连接归还给连接池,而不是真正地关闭连接。这样可以显著减少连接创建和释放的开销,提高数据库操作的性能和效率。
  • 常见的数据库连接池 :包括 DBCP(Apache 数据库连接池)、C3P0、HikariCP 等。
  • 配置连接池 :通常需要在应用初始化时配置连接池参数,如初始连接数、最大连接数、最小空闲连接数等。然后通过连接池提供的接口获取数据库连接,进行数据库操作。

九、总结

掌握关系型数据库的基础知识对于 Java 开发者来说是至关重要的,无论是进行 Web 开发还是企业级应用开发,都离不开与数据库的交互。通过深入理解关系型数据库的基本概念、数据库设计原则、SQL 语言的使用、事务管理、索引优化、视图和存储过程的应用等,开发者能够更加高效地进行数据库操作,构建出性能优良、数据一致的应用系统。在实际开发中,还需不断地实践和优化,以应对各种复杂的业务需求。

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

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

相关文章

wpf CommandParameter 传递MouseWheelEventArgs参数

在 WPF 中通过 CommandParameter 传递 MouseWheelEventArgs 参数时,需结合 ‌事件到命令的转换机制‌ 和 ‌参数转换器‌ 来实现。以下是具体实现方案及注意事项: 一、核心实现方法 1. ‌使用 EventToCommand 传递原始事件参数‌ 通过 Interaction.Tr…

八大排序之选择排序

本篇文章将带你详细了解八大基本排序中的选择排序 目录 (一)选择排序的时间复杂度和空间复杂度及稳定性分析 (二)代码实现 (三)输出结果 选择排序的基本原理是:每次从待排序的数组中找出最大值和最小值。具体流程是…

【算法学习】哈希表篇:哈希表的使用场景和使用方法

算法学习: https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言: 在之前学习数据结构时我们就学习了哈希表的使用方法,这里我们主要是针对哈希表的做题方法进行讲解,都是leetcode上的经典…

Java 中如何实现自定义类加载器,应用场景是什么?

在 Java 中,可以通过继承 java.lang.ClassLoader 类来实现自定义类加载器。自定义类加载器可以控制类的加载方式,实现一些特殊的应用场景。 实现自定义类加载器的步骤: 继承 java.lang.ClassLoader 类。 重写 findClass(String name) 方法 …

信创开发中跨平台开发框架的选择与实践指南

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…

WebRTC 服务器之Janus架构分析

1. Webrtc三种类型通信架构 1.1 1 对 1 通信 1 对 1 通信模型设计的主要⽬标是尽量让两个终端进⾏直联,这样即可以节省服务器的资源,⼜可以提⾼ ⾳视频的服务质量。WebRTC ⾸先尝试两个终端之间是否可以通过 P2P 直接进⾏通信,如果⽆法直接…

数字化转型进阶:26页华为数字化转型实践分享【附全文阅读】

本文分享了华为数字化转型的实践经验和体会。华为通过数字化变革,致力于在客户服务、供应链、产品管理等方面提高效率,并把数字世界带入每个组织,构建万物互联的智能世界。华为的数字化转型愿景是成为行业标杆,通过推进数字化战略、构建面向业务数字化转型的IT组织阵型、坚…

Hal库下备份寄存器

首先要确保有外部电源给VBAT供电 生成后应该会有这两个文件(不知道为什么生成了好几次都没有,复制工程在试一次就有了) 可以看到stm32f407有20个备份寄存器 读写函数 void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t Backup…

使用 Vue3 + Webpack 和 Vue3 + Vite 实现微前端架构(基于 Qiankun)

在现代前端开发中,微前端架构逐渐成为一种流行的解决方案,尤其是在大型项目中。通过微前端,我们可以将一个复杂的单体应用拆分为多个独立的小型应用,每个子应用可以独立开发、部署和运行,同时共享主应用的基础设施。本…

【c++】【STL】list详解

目录 list的作用list的接口构造函数赋值运算符重载迭代器相关sizeemptyfrontbackassignpush_frontpop_frontpush_backpop_backinserteraseswapresizeclearspliceremoveremove_ifuniquemergesortreverse关系运算符重载(非成员函数) list的模拟实现结点类迭…

Redis持久化:

什么是Redis持久化: Redis 持久化是指将 Redis 内存中的数据保存到硬盘等持久化存储介质中,以便在 Redis 服务器重启或出现故障时能够恢复数据,保证数据的可靠性和持续性。Redis 提供了两种主要的持久化方式:RDB(Redi…

VBA 64位API声明语句第009讲

跟我学VBA,我这里专注VBA, 授人以渔。我98年开始,从源码接触VBA已经20余年了,随着年龄的增长,越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友,都来学习VBA,利用VBA,起码可以提高…

在pycharm profession 2020.3将.py程序使用pyinstaller打包成exe

一、安装pyinstaller 在pycharm的项目的Terminal中运行pip3 install pyinstaller即可。 安装后在Terminal中输入pip3 list看一下是否成功 二、务必在在项目的Terminal中输入命令打包,命令如下: python3 -m PyInstaller --noconsole --onefile xxx.py …

Unity SpriteRenderer(精灵渲染器)

🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎SpriteRenderer:精灵渲染器 💡Sprite Renderer是精灵渲染器,所有…

2.LED灯的控制和按键检测

目录 STM32F103的GPIO口 GPIO口的作用 GPIO口的工作模式 input输入检测 -- 向内检测 output控制输出 -- 向外输出 寄存器 寄存器地址的确定 配置GPIO口的工作模式 时钟的开启和关闭 软件编程驱动 LED 灯 硬件 软件 软件编程驱动 KEY 按键 硬件 软件 按键消抖 代码 STM32F…

Flink 的状态机制

在实时流处理领域,状态管理是构建复杂业务逻辑的核心能力。Apache Flink 通过统一的状态抽象和高效的容错机制,为开发者提供了从毫秒级窗口聚合到 TB 级历史数据关联的全场景支持。本文将深入剖析 Flink 状态机制的底层原理,结合实际案例展示…

【查看.ipynp 文件】

目录 如何打开 .ipynb 文件? 如果确实是 .ipynp 文件: .ipynp 并不是常见的 Jupyter Notebook 文件格式。通常,Jupyter Notebook 文件的扩展名是 .ipynb(即 Interactive Python Notebook)。如果你遇到的是 .ipynb 文…

Runnable组件重试机制降低程序错误率

一、LangChain 重试机制深度解析 当构建生产级AI应用时,with_retry() 机制可有效提升系统容错性,典型应用场景包括: API调用频率限制时的自动恢复模型服务临时不可用的故障转移网络波动导致的瞬时异常处理 参数详解与配置策略 1. 参数配置…

k8s笔记——kubebuilder工作流程

kubebuilder工作流程 Kubebuilder 工作流程详解 Kubebuilder 是 Kubernetes 官方推荐的 Operator 开发框架,用于构建基于 Custom Resource Definitions (CRD) 的控制器。以下是其核心工作流程的完整说明: 1. 初始化项目 # 创建项目目录 mkdir my-opera…

Java框架“若依RuoYi”前后端分离部署

运行环境 Eclipse IDE for Enterprise Java and Web Developers 下载Eclipse解压Eclipse到文件夹 Maven 下载Maven解压Maven到文件夹配置环境变量MAVEN_HOME为Maven安装位置配置环境变量path为%MAVEN_HOME%\bin Redis 下载Redis解压Redis到文件夹配置环境变量path为Redis安装位…