Java学习手册:关系型数据库基础

一、关系型数据库概述

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

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

二、数据库设计

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

三、基本操作

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

四、事务管理

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

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

sql 复制代码
START TRANSACTION;
UPDATE account1 SET balance = balance - 100 WHERE id = 1;
UPDATE account2 SET balance = balance + 100 WHERE id = 2;
COMMIT;

五、索引

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

六、视图

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

七、存储过程

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

八、数据库连接池

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

九、总结

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

相关推荐
@小匠3 小时前
Read Frog:一款开源的 AI 驱动浏览器语言学习扩展
人工智能·学习
小猿姐3 小时前
实测对比:哪款开源 Kubernetes MySQL Operator 最值得用?(2026 深度评测)
数据库·mysql·云原生
一灯架构5 小时前
90%的人答错!一文带你彻底搞懂ArrayList
java·后端
倔强的石头_5 小时前
从 “存得下” 到 “算得快”:工业物联网需要新一代时序数据平台
数据库
Y4090016 小时前
【多线程】线程安全(1)
java·开发语言·jvm
TDengine (老段)6 小时前
TDengine IDMP 可视化 —— 分享
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·时序数据
布局呆星6 小时前
SpringBoot 基础入门
java·spring boot·spring
风吹迎面入袖凉7 小时前
【Redis】Redisson的可重入锁原理
java·redis
GottdesKrieges7 小时前
OceanBase数据库备份配置
数据库·oceanbase
w6100104667 小时前
cka-2026-ConfigMap
java·linux·cka·configmap