H2 数据库 – 快速指南
H2 数据库 – 快速指南
H2 数据库 – 介绍
H2 是一个开源的轻量级 Java 数据库。它可以嵌入到 Java 应用程序中或以客户端-服务器模式运行。主要是,H2 数据库可以配置为作为内存数据库运行,这意味着数据不会保留在磁盘上。由于嵌入式数据库,它不用于生产开发,而主要用于开发和测试。
该数据库可以在嵌入式模式或服务器模式下使用。以下是 H2 数据库的主要功能 –
- 极快的开源 JDBC API
- 可用于嵌入式和服务器模式;内存数据库
- 基于浏览器的控制台应用程序
- 占用空间小 – 大约 1.5MB jar 文件大小
H2数据库的特点
H2 数据库的主要特点如下 –
-
它是一个非常快的数据库引擎。
-
H2 是开源的,用 Java 编写。
-
它支持标准的 SQL 和 JDBC API。它也可以使用 PostgreSQL ODBC 驱动程序。
-
它具有嵌入式和服务器模式。
-
H2 支持集群和多版本并发。
-
它具有强大的安全功能。
附加的功能
以下是 H2 数据库的一些附加功能 –
-
H2 是基于磁盘或内存中的数据库和表,只读数据库支持,临时表。
-
H2 提供事务支持(读提交)、2-phase-commit 多个连接、表级锁定。
-
H2 是一个基于成本的优化器,使用遗传算法进行复杂查询,零管理。
-
H2包含可滚动和可更新的结果集支持,大结果集,外部结果排序,函数可以返回一个结果集。
-
H2支持加密数据库(AES)、SHA-256密码加密、加密功能和SSL。
H2 数据库中的组件
为了使用 H2 数据库,您需要具有以下组件 –
- 网络浏览器
- H2 控制台服务器
这是一个客户端/服务器应用程序,因此需要服务器和客户端(浏览器)来运行它。
H2 数据库 – 安装
H2 是一个用 Java 编写的数据库。我们可以使用 JDBC 轻松地将此数据库嵌入到我们的应用程序中。我们可以在许多不同的平台或任何版本的 Java 运行时环境上运行它。但是在安装数据库之前,系统中应该已经安装了Java。
验证 Java 安装
如果系统中安装了JDK,请尝试以下命令验证Java版本。
java –version
如果系统中成功安装了JDK,那么我们将得到以下输出。
java version "1.8.0_91" Java(TM) SE Runtime Environment (build 1.8.0_91-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
如果系统中未安装 JDK,请访问以下链接安装 JDK。
安装 H2 数据库
我们可以在许多不同的平台上运行这个数据库。在本章中,我们将学习在 Windows 上安装 H2 数据库。
以下是在 Windows 操作系统上安装 H2 数据库的步骤。
步骤 1:下载 H2 安装文件
从给定的链接下载最新版本的H2 数据库。在此链接中,您将获得两种类型的 H2 数据库的最新版本。一种是 Windows Installer 类型(即 .exe 文件),第二种是适用于其他操作系统的与平台无关的 zip 文件。
下载 .exe 文件后,单击 Windows 安装程序以下载 Windows 支持的 H2 数据库。在本例中,我们使用版本为 1.4.192 的 H2 数据库。
第二步:安装H2数据库
下载后,我们在下载目录中获得 H2 Windows 安装程序文件(即 h2-setup-yyyy-mm-dd.exe)。要开始 H2 数据库的安装过程,请双击安装程序文件。
以下屏幕是安装过程的第一步。提供我们要安装 H2 数据库服务器的路径,如下面的屏幕截图所示。
如上图所示,默认情况下,它会将C:\ProgramFiles (x86)\H2作为目标文件夹。单击下一步继续下一步。弹出以下屏幕。
在上面的屏幕截图中,单击安装按钮开始安装过程。安装后,我们得到以下截图。
单击完成以完成安装过程。
步骤 3:验证 H2 数据库安装
安装完成后,让我们验证一下系统中的数据库安装。单击 Windows → 键入 H2 Console → 单击 H2 控制台图标。连接到 URL http://localhost:8082。在连接时,H2 数据库将要求数据库注册,如下面的屏幕截图所示。
填写以上对话框中的所有详细信息,例如 Saved Settings、Settings Name、Driver Class、JDBC URL、User Name 和 Password。在 JDBC URL 中,指定数据库所在的位置和数据库名称。用户名和密码是数据库的用户名和密码字段。单击连接。
弹出数据库欢迎页面,如下面的屏幕截图所示。
H2 数据库 – 选择
Select 命令用于从一个表或多个表中获取记录数据。如果我们设计一个选择查询,那么它以结果表的形式返回数据,称为结果集。
句法
SELECT 语句的基本语法如下 –
SELECT [ TOP term ] [ DISTINCT | ALL ] selectExpression [,...] FROM tableExpression [,...] [ WHERE expression ] [ GROUP BY expression [,...] ] [ HAVING expression ] [ { UNION [ ALL ] | MINUS | EXCEPT | INTERSECT } select ] [ ORDER BY order [,...] ] [ [ LIMIT expression ] [ OFFSET expression ] [ SAMPLE_SIZE rowCountInt ] ] [ FOR UPDATE ]
要获取所有可用字段,请使用以下语法。
SELECT * FROM table_name;
例子
考虑具有以下记录的 CUSTOMER 表 –
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
要获取带有给定数据的客户表,请执行以下查询。
CREATE TABLE CUSTOMER (id number, name varchar(20), age number, address varchar(20), salary number); INSERT into CUSTOMER values (1, 'Ramesh', 32, 'Ahmedabad', 2000); INSERT into CUSTOMER values (2, 'Khilan', 25, 'Delhi', 1500); INSERT into CUSTOMER values (3, 'kaushik', 23, 'Kota', 2000); INSERT into CUSTOMER values (4, 'Chaitali', 25, 'Mumbai', 6500); INSERT into CUSTOMER values (5, 'Hardik', 27, 'Bhopal', 8500); INSERT into CUSTOMER values (6, 'Komal', 22, 'MP', 4500); INSERT into CUSTOMER values (7, 'Muffy', 24, 'Indore', 10000);
以下命令是一个示例,它将获取 CUSTOMER 表中可用客户的 ID、姓名和薪水字段。
SELECT ID, NAME, SALARY FROM CUSTOMERS;
上述命令产生以下结果。
+----+----------+----------+ | ID | NAME | SALARY | +----+----------+----------+ | 1 | Ramesh | 2000.00 | | 2 | Khilan | 1500.00 | | 3 | kaushik | 2000.00 | | 4 | Chaitali | 6500.00 | | 5 | Hardik | 8500.00 | | 6 | Komal | 4500.00 | | 7 | Muffy | 10000.00 | +----+----------+----------+
使用以下查询获取 CUSTOMERS 表的所有字段。
SQL> SELECT * FROM CUSTOMERS;
上述查询产生以下结果 –
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
H2 数据库 – 插入
SQL INSERT 语句用于向数据库中的表添加新的数据行。
句法
以下是 INSERT INTO 语句的基本语法。
INSERT INTO tableName { [ ( columnName [,...] ) ] { VALUES { ( { DEFAULT | expression } [,...] ) } [,...] | [ DIRECT ] [ SORTED ] select } } | { SET { columnName = { DEFAULT | expression } } [,...] }
使用此 INSERT 语句,我们可以将新记录或新行插入到表中。使用 DIRECT 子句时,结果直接影响到目标表,无需任何中间步骤。但是,在为表的所有列添加值时,请确保值的顺序与表中的列的顺序相同。
例子
让我们举个例子,尝试将以下给定的记录插入到 Customer 表中。
ID | 名称 | 年龄 | 地址 | 薪水 |
---|---|---|---|---|
1 | 拉梅什 | 32 | 艾哈迈达巴德 | 2000年 |
2 | 吉兰 | 25 | 德里 | 1500 |
3 | 考希克 | 23 | 哥打 | 2000年 |
4 | 柴尾 | 25 | 孟买 | 6500 |
5 | 哈迪克 | 27 | 博帕尔 | 8500 |
6 | 科马尔 | 22 | 议员 | 4500 |
7 | 马菲 | 24 | 印多尔 | 10000 |
我们可以通过执行以下命令将所有给定的记录放入客户表中。
INSERT INTO CUSTOMER VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000); INSERT INTO CUSTOMER VALUES (2, 'Khilan', 25, 'Delhi', 1500); INSERT INTO CUSTOMER VALUES (3, 'kaushik', 23, 'Kota', 2000); INSERT INTO CUSTOMER VALUES (4, 'Chaitali', 25, 'Mumbai', 6500); INSERT INTO CUSTOMER VALUES (5, 'Hardik', 27, 'Bhopal', 8500); INSERT INTO CUSTOMER VALUES (6, 'Komal', 22, 'MP', 4500); INSERT INTO CUSTOMER VALUES (7, 'Muffy', 24, 'Indore', 10000);
H2 数据库 – 更新
UPDATE 查询用于更新或修改表中的现有记录。我们可以使用 WHERE 子句和 UPDATE 查询来更新选定的行,否则所有行都会受到影响。
句法
以下是 UPDATE 查询的基本语法。
UPDATE tableName [ [ AS ] newTableAlias ] SET { { columnName = { DEFAULT | expression } } [,...] } | { ( columnName [,...] ) = ( select ) } [ WHERE expression ] [ ORDER BY order [,...] ] [ LIMIT expression ]
在此 UPDATE 语法中,我们可以使用 AND 或 OR 子句组合多个条件。
例子
考虑具有以下记录的 CUSTOMER 表。
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
如果要获取客户表以及给定数据,请执行以下查询。
CREATE TABLE CUSTOMER (id number, name varchar(20), age number, address varchar(20), salary number); INSERT into CUSTOMER values (1, 'Ramesh', 32, 'Ahmedabad', 2000); INSERT into CUSTOMER values (2, 'Khilan', 25, 'Delhi', 1500); INSERT into CUSTOMER values (3, 'kaushik', 23, 'Kota', 2000); INSERT into CUSTOMER values (4, 'Chaitali', 25, 'Mumbai', 6500); INSERT into CUSTOMER values (5, 'Hardik', 27, 'Bhopal', 8500); INSERT into CUSTOMER values (6, 'Komal', 22, 'MP', 4500); INSERT into CUSTOMER values (7, 'Muffy', 24, 'Indore', 10000);
以下命令是一个示例,它将为 ID 为 6 的客户更新 ADDRESS –
UPDATE CUSTOMERS SET ADDRESS = 'Pune' WHERE ID = 6;
现在,CUSTOMERS 表将具有以下记录。我们可以通过执行以下查询来检查客户表记录。
SELECT * FROM CUSTOMERS;
上述查询产生以下结果。
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | Pune | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
要修改 CUSTOMERS 表中的所有 ADDRESS 和 SALARY 列值,我们不需要使用 WHERE 子句。UPDATE 查询如下 –
UPDATE CUSTOMERS SET ADDRESS = 'Pune', SALARY = 1000.00;
现在,CUSTOMERS 表将具有以下记录。我们可以通过执行以下查询来检查客户表记录。
SELECT * FROM CUSTOMERS;
上述查询产生以下结果 –
+----+----------+-----+---------+---------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+---------+---------+ | 1 | Ramesh | 32 | Pune | 1000.00 | | 2 | Khilan | 25 | Pune | 1000.00 | | 3 | kaushik | 23 | Pune | 1000.00 | | 4 | Chaitali | 25 | Pune | 1000.00 | | 5 | Hardik | 27 | Pune | 1000.00 | | 6 | Komal | 22 | Pune | 1000.00 | | 7 | Muffy | 24 | Pune | 1000.00 | +----+----------+-----+---------+---------+
H2 数据库 – 删除
SQL DELETE 查询用于从表中删除现有记录。我们可以使用 WHERE 子句和 DELETE 查询来删除选定的记录,否则将删除所有记录。
句法
以下是删除命令的通用查询语法。
DELETE [ TOP term ] FROM tableName [ WHERE expression ] [ LIMIT term ]
上述语法从表中删除行。如果指定了 TOP 或 LIMIT,则最多删除指定数量的行(如果为 null 或小于零,则没有限制)。
例子
考虑具有以下记录的 CUSTOMER 表。
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
以下命令将删除 ID 为 6 的客户的详细信息。
DELETE FROM CUSTOMERS WHERE ID = 6;
执行上述命令后,通过执行以下命令检查 Customer 表。
SELECT * FROM CUSTOMERS;
上面的命令产生以下输出 –
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
如果我们想从 CUSTOMERS 表中删除所有记录,我们不使用 WHERE 子句。DELETE 查询如下所示。
DELETE FROM CUSTOMER;
执行上述命令后,Customer 表中将没有可用的记录。
H2 数据库 – 备份
BACKUP 是用于将数据库备份放入单独的 .zip 文件的命令。对象没有被锁定,当它进行备份时,事务日志也会被复制。执行此命令需要管理员权限。
句法
以下是备份命令的通用语法。
BACKUP TO fileNameString;
例子
在本例中,让我们将当前数据库备份到backup.zip文件中。使用以下命令相同。
BACKUP TO 'backup.zip';
执行上述命令后,您将在本地文件系统中获得 backup.zip 文件。
H2 数据库 – 调用
CALL 是属于 H2 数据库服务器的 SQL 命令。该命令用于计算一个简单的表达式。它在单列字段中返回给定表达式的结果。当它返回一个结果数组时,数组中的每个元素都显示为一个列值。
句法
以下是 CALL 命令的通用语法。
CALL expression;
我们可以在这个语法中使用算术表达式。
例子
让我们举个例子,使用 call 命令执行算术表达式 (15 &ast 25)。
CALL 15*25;
上述命令产生以下输出。
375 |
---|
375 |
H2 数据库 – 解释
EXPLAIN 命令显示语句的执行计划。当我们使用 EXPLAIN ANALYZE 命令执行语句时,查询计划将包括每个表的实际行扫描计数。
句法
以下是 EXPLAIN 命令的通用语法。
EXPLAIN { [ PLAN FOR ] | ANALYZE } { select | insert | update | delete | merge}
除了这个语法,我们还可以使用选择、插入、删除和合并。
例子
此示例说明 ID 为 1 的客户的查询计划详细信息。
EXPLAIN SELECT * FROM CUSTOMER WHERE ID = 1;
上面的命令产生以下输出 –
H2 数据库 – 合并
MERGE 命令用于更新现有行并将新行插入表中。主键列在使用此命令时起着重要作用;它用于查找行。
句法
以下是 MERGE 命令的通用语法。
MERGE INTO tableName [ ( columnName [,...] ) ] [ KEY ( columnName [,...] ) ] { VALUES { ( { DEFAULT | expression } [,...] ) } [,...] | select }
在上面的语法中,KEY 子句用于指定主键列名。连同 VALUES 子句,我们可以使用原始值插入,或者我们可以使用 select 命令检索另一个表值并将其存储到该表中。
例子
在这个例子中,让我们尝试向客户表中添加一条新记录。以下是表中新记录的详细信息。
Column Name | 价值 |
---|---|
ID | 8 |
NAME | 洛克什 |
AGE | 32 |
ADDRESS | 海得拉巴 |
SALARY | 2500 |
使用以下查询,让我们将给定的记录插入到 H2 数据库查询中。
MERGE INTO CUSTOMER KEY (ID) VALUES (8, 'Lokesh', 32, 'Hyderabad', 2500);
上述查询产生以下输出。
Update count: 1
让我们通过执行以下查询来验证 Customer 表的记录。
SELECT * FROM CUSTOMER;
上述查询产生以下输出。
ID | 名称 | 年龄 | 地址 | 薪水 |
---|---|---|---|---|
1 | 拉梅什 | 32 | 艾哈迈达巴德 | 2000年 |
2 | 吉兰 | 25 | 德里 | 1500 |
3 | 考希克 | 23 | 哥打 | 2000年 |
4 | 柴塔利 | 25 | 孟买 | 6500 |
5 | 哈迪克 | 27 | 博帕尔 | 8500 |
6 | 科马尔 | 22 | 议员 | 4500 |
7 | 马菲 | 24 | 印多尔 | 10000 |
8 | 洛克什 | 32 | 海得拉巴 | 2500 |
现在让我们尝试使用Merge命令更新记录。以下是要更新的记录的详细信息。
Column Name | 价值 |
---|---|
ID | 8 |
NAME | 洛基 |
AGE | 32 |
ADDRESS | 海得拉巴 |
SALARY | 3000 |
使用以下查询将给定记录插入到 H2 数据库查询中。
MERGE INTO CUSTOMER KEY (ID) VALUES (8, 'Loki', 32, 'Hyderabad', 3000);
上述查询产生以下输出。
Update count: 1
让我们通过执行以下查询来验证 Customer 表的记录。
SELECT * FROM CUSTOMER;
上述查询产生以下输出 –
ID | 名称 | 年龄 | 地址 | 薪水 |
---|---|---|---|---|
1 | 拉梅什 | 32 | 艾哈迈达巴德 | 2000年 |
2 | 吉兰 | 25 | 德里 | 1500 |
3 | 考希克 | 23 | 哥打 | 2000年 |
4 | 柴塔利 | 25 | 孟买 | 6500 |
5 | 哈迪克 | 27 | 博帕尔 | 8500 |
6 | 科马尔 | 22 | 议员 | 4500 |
7 | 马菲 | 24 | 印多尔 | 10000 |
8 | 洛基 | 32 | 海得拉巴 | 3000 |
H2 数据库 – 显示
SHOW 是用于显示表的模式、表或列的列表的命令。
句法
以下是 SHOW 命令的通用语法。
SHOW { SCHEMAS | TABLES [ FROM schemaName ] | COLUMNS FROM tableName [ FROM schemaName ] }
例子
以下命令可用于获取当前数据库中的表列表。
SHOW TABLES;
上述命令产生以下输出。
TABLE_NAME | TABLE_SCHEMA |
---|---|
CUSTOMER | 上市 |
EMP | 上市 |
H2 数据库 – 创建
CREATE 是一个通用的 SQL 命令,用于在 H2 数据库服务器中创建表、模式、序列、视图和用户。
创建表
创建表是用于在当前数据库中创建用户自定义表的命令。
句法
以下是创建表命令的通用语法。
CREATE [ CACHED | MEMORY ] [ TEMP | [ GLOBAL | LOCAL ] TEMPORARY ] TABLE [ IF NOT EXISTS ] name [ ( { columnDefinition | constraint } [,...] ) ] [ ENGINE tableEngineName [ WITH tableEngineParamName [,...] ] ] [ NOT PERSISTENT ] [ TRANSACTIONAL ] [ AS select ]
通过使用 Create Table 命令的通用语法,我们可以创建不同类型的表,例如缓存表、内存表和临时表。以下是描述给定语法中不同子句的列表。
-
CACHED – 缓存表是常规表的默认类型。这意味着行数不受主内存的限制。
-
MEMORY – 内存表是临时表的默认类型。这意味着内存表不应变得太大,索引数据保存在主内存中。
-
TEMPORARY – 关闭或打开数据库时删除临时表。基本上,临时表有两种类型 –
-
GLOBAL 类型 – 所有连接均可访问。
-
LOCAL 类型 – 当前连接可访问。
临时表的默认类型是全局类型。临时表的索引保存在主内存中,除非临时表是使用 CREATE CACHED TABLE 创建的。
-
-
ENGINE – 只有在使用自定义表实现时才需要 ENGINE 选项。
-
NOT PERSISTENT – 它是一个修饰符,用于将完整的表数据保存在内存中,并且在数据库关闭时所有行都将丢失。
-
TRANSACTIONAL – 这是一个提交打开事务的关键字,此命令仅支持临时表。
例子
在此示例中,让我们使用以下给定数据创建一个名为 tutorials_tbl 的表。
Sr.No | 列名 | 数据类型 |
---|---|---|
1 | ID | 整数 |
2 | 标题 | 瓦尔查尔(50) |
3 | 作者 | 瓦尔查尔(20) |
4 | 提交日期 | 日期 |
以下查询用于创建表tutorials_tbl以及给定的列数据。
CREATE TABLE tutorials_tbl ( id INT NOT NULL, title VARCHAR(50) NOT NULL, author VARCHAR(20) NOT NULL, submission_date DATE );
上述查询产生以下输出。
(0) rows effected
创建架构
Create Schema 是用于在特定授权下(在当前注册用户下)创建依赖于用户的架构的命令。
句法
以下是创建架构命令的通用语法。
CREATE SCHEMA [ IF NOT EXISTS ] name [ AUTHORIZATION ownerUserName ]
在上述通用语法中,AUTHORIZATION 是用于提供相应用户名的关键字。此命令是可选的,这意味着如果我们不提供用户名,则它将考虑当前用户。执行命令的用户必须具有管理员权限,以及所有者。
此命令在此连接中提交一个打开的事务。
例子
在此示例中,让我们使用以下命令在 SA 用户下创建名为test_schema的架构。
CREATE SCHEMA test_schema AUTHORIZATION sa;
上述命令产生以下输出。
(0) rows effected
创建序列
序列是用于通过遵循 id 或任何随机列值的序列来生成数字的概念。
句法
以下是创建序列命令的通用语法。
CREATE SEQUENCE [ IF NOT EXISTS ] newSequenceName [ START WITH long ] [ INCREMENT BY long ] [ MINVALUE long | NOMINVALUE | NO MINVALUE ] [ MAXVALUE long | NOMAXVALUE | NO MAXVALUE ] [ CYCLE long | NOCYCLE | NO CYCLE ] [ CACHE long | NOCACHE | NO CACHE ]
此通用语法用于创建序列。序列的数据类型是BIGINT。在这个序列中,即使事务回滚,值也不会被重用。
例子
在此示例中,让我们使用以下查询创建一个名为SEQ_ID的序列。
CREATE SEQUENCE SEQ_ID;
上述查询产生以下输出。
(0) rows effected
H2 数据库 – 更改
ALTER 是一个命令,用于通过向alter命令添加不同的子句来更改表结构。根据场景,我们需要在 alter 命令中添加相应的子句。在本章中,我们将讨论alter 命令的各种场景。
更改表添加
Alter Table Add 是一个命令,用于向表中添加新列以及相应的数据类型。此命令在此连接中提交事务。
句法
以下是“更改表添加”命令的通用语法。
ALTER TABLE [ IF EXISTS ] tableName ADD [ COLUMN ] { [ IF NOT EXISTS ] columnDefinition [ { BEFORE | AFTER } columnName ] | ( { columnDefinition } [,...] ) }
例子
在此示例中,我们将向表tutorials_tbl添加一个新列start_date。start_date 的数据类型是日期。以下是添加新列的查询。
ALTER TABLE tutorials_tbl ADD start_date DATE;
上述查询产生以下输出。
(6) rows effected
更改表添加约束
更改表添加约束是一个命令,用于向表添加不同的约束,例如主键、外键、非空等。
如果所需的索引尚不存在,则会自动创建它们。不可能禁用对唯一约束的检查。此命令在此连接中提交一个打开的事务。
句法
以下是更改表添加约束命令的通用语法。
ALTER TABLE [ IF EXISTS ] tableName ADD constraint [ CHECK | NOCHECK ]
例子
在此示例中,让我们使用以下查询将主键约束(tutorials_tbl_pk) 添加到表tutorials_tbl的列 id 。
ALTER TABLE tutorials_tbl ADD CONSTRAINT tutorials_tbl_pk PRIMARYKEY(id);
上述查询产生以下输出。
(6) row (s) effected
更改表重命名约束
该命令用于重命名特定关系表的约束名称。此命令在此连接中提交一个打开的事务。
句法
以下是更改表重命名约束命令的通用语法。
ALTER TABLE [ IF EXISTS ] tableName RENAME oldConstraintName TO newConstraintName
使用此语法时,请确保旧约束名称应与相应列一起存在。
例子
在此示例中,我们将表tutorials_tbl的主键约束名称从tutorials_tbl_pk更改为tutorials_tbl_pk_constraint。以下是执行此操作的查询。
ALTER TABLE tutorials_tbl RENAME CONSTRAINT tutorials_tbl_pk TO tutorials_tbl_pk_constraint;
上述查询产生以下输出。
(1) row (s) effected
更改表 更改列
此命令用于更改特定表的列的结构和属性。更改属性意味着更改列的数据类型、重命名列、更改标识值或更改选择性。
句法
以下是 Alter Table Alter Column 命令的通用语法。
ALTER TABLE [ IF EXISTS ] tableName ALTER COLUMN columnName { { dataType [ DEFAULT expression ] [ [ NOT ] NULL ] [ AUTO_INCREMENT | IDENTITY ] } | { RENAME TO name } | { RESTART WITH long } | { SELECTIVITY int } | { SET DEFAULT expression } | { SET NULL } | { SET NOT NULL } }
在上述语法中 –
-
RESTART – 命令更改自动增量列的下一个值。
-
SELECTIVITY – 命令设置列的选择性(1-100)。基于选择性值,我们可以对列的值进行成像。
-
SET DEFAULT – 更改列的默认值。
-
SET NULL – 将列设置为允许 NULL。
-
SET NOT NULL – 将列设置为允许 NOT NULL。
例子
在此示例中,我们将使用以下查询将表tutorials_tbl的列从Title重命名为Tutorial_Title。
ALTER TABLE tutorials_tbl ALTER COLUMN title RENAME TO tutorial_title;
上述查询产生以下输出。
(0) row(s) effected
以类似的方式,我们可以使用 ALTER 命令执行不同的场景。
H2 数据库 – 删除
DROP 是取自通用 SQL 语法的命令。该命令用于从内存中删除数据库组件及其结构。我们将在本章中讨论 Drop 命令的不同场景。
删除表
Drop Table 是删除相应表及其结构的命令。
句法
以下是 Drop Table 命令的通用语法。
DROP TABLE [ IF EXISTS ] tableName [,...] [ RESTRICT | CASCADE ]
如果我们使用 RESTRICT 并且存在具有依赖视图的表,则该命令将失败。当我们使用 CASCADE 关键字时,所有依赖视图都将被删除。
例子
在此示例中,我们将使用以下查询删除名为 test 的表。
DROP TABLE test;
上述查询产生以下输出。
(6) row (s) effected
删除架构
Drop Schema 是从数据库服务器中删除相应模式的命令。它不适用于当前模式。
句法
DROP SCHEMA [ IF EXISTS ] schemaName
例子
在此示例中,我们将使用以下查询删除名为test_schema的模式。
DROP SCHEMA TEST_SCHEMA;
上述查询产生以下输出。
(0) row(s) effected
掉落顺序
Drop Sequence 是用于从表结构中删除序列的命令。
句法
以下是 Drop Sequence 命令的通用语法。
DROP SEQUENCE [ IF EXISTS ] sequenceName
此命令在此连接中提交一个打开的事务。
例子
在这个例子中,我们将删除一个名为sequence_id 的序列。以下是命令。
DROP SEQUENCE sequence_id;
上述命令产生以下输出。
(0) row (s) effected
拖放视图
Drop View 是用于删除现有视图的命令。如果使用 CASCADE 子句,所有相关视图也会被删除。
句法
以下是 Drop View 命令的通用语法。
DROP VIEW [ IF EXISTS ] viewName [ RESTRICT | CASCADE ]
例子
在此示例中,我们将使用以下查询删除名为sample_view的视图。
DROP VIEW sample_view;
上述查询产生以下输出。
(0) row (s) effected
H2 数据库 – 截断
TRUNCATE 是用于从表中删除数据的命令。与不带 WHERE 子句的 DELETE FROM 不同,此命令无法回滚。此命令在此连接中提交一个打开的事务。
句法
以下是 truncate 命令的通用语法。
TRUNCATE TABLE tableName
例子
在此示例中,我们将使用以下查询截断名为test的表。
TRUNCATE TABLE test;
上述查询产生以下输出。
(6) row (s) effected
H2 数据库 – 提交
COMMIT 是 SQL 语法中用于提交事务的命令。我们可以提交特定事务,也可以提交当前执行的事务。
句法
COMMIT 命令有两种不同的语法。
以下是用于提交当前事务的 commit 命令的通用语法。
COMMIT [ WORK ]
以下是用于提交特定事务的 commit 命令的通用语法。
COMMIT TRANSACTION transactionName
示例 1
在此示例中,让我们使用以下命令提交当前事务。
COMMIT
上述命令产生以下输出。
Committed successfully
示例 2
在本例中,我们将使用以下命令提交名为tx_test的事务。
COMMIT TRANSACTION tx_test;
上述命令产生以下输出。
Committed successfully
H2 数据库 – 授予
Grant 是来自 SQL 语法的命令,用于向表、用户或角色授予权限。执行此命令需要管理员权限。此命令在此连接中提交一个打开的事务。
在本章中,我们将讨论 Grant 命令的不同场景。
授予权利
授予权限是向表、用户或角色提供管理员权限的命令。
句法
以下是 Grant 命令的通用语法。
GRANT { SELECT | INSERT | UPDATE | DELETE | ALL } [,...] ON { { SCHEMA schemaName } | { tableName [,...] } } TO { PUBLIC | userName | roleName }
例子
在此示例中,我们将使用以下命令将测试表授予只读权限。
GRANT SELECT ON TEST TO READONLY
上述命令产生以下输出。
Grant successfully
授予更改任何架构
Grant Alter Any Schema 是向相应用户授予架构更改权限的命令。
句法
以下是 Grant Alter Any Schema 命令的通用语法。
GRANT ALTER ANY SCHEMA TO userName
例子
在此示例中,我们将向名为test_user的用户授予架构的更改权限。确保 test_user 存在。以下是授予更改权限的查询。
GRANT ALTER ANY SCHEMA TO test_user;
上述查询产生以下输出。
Granted successfully to test_user
H2 数据库 – 保存点
SAVEPOINT 是用于临时保存交易的命令。最好在事务中维护保存点,因为在必要时将事务回滚到相应的保存点会很有帮助。
句法
以下是 Savepoint 命令的通用语法。
SAVEPOINT savepointName
例子
在本例中,我们将使用以下命令创建一个名为 Half_Done 的保存点。
SAVEPOINT Half_Done;
上述命令产生以下输出。
Savepoint created
H2 数据库 – 回滚
ROLLBACK 是 SQL 语法中的一个命令,用于将事务回滚到保存点或前一个事务。通过使用此命令,我们可以回滚到特定的保存点,也可以回滚到之前执行的事务。
句法
ROLLABCK 命令有两种不同的语法。
以下是回滚命令的通用语法。
ROLLBACK [ TO SAVEPOINT savepointName ]
以下是特定事务的回滚命令的通用语法。
ROLLBACK TRANSACTION transactionName
示例 1
在此示例中,我们将使用以下命令将当前事务回滚到名为sp1_test的保存点。
ROLLBACK sp1_test;
上述命令产生以下输出。
Rollback successfully
示例 2
在下面的示例中,我们将使用给定的命令回滚名为tx_test的完整事务。
ROLLBACK TRANSACTION tx_test;
上述命令产生以下输出。
Rollback successfully
H2 数据库 – JDBC 连接
H2是一个JAVA数据库。我们可以使用 JDBC 与这个数据库进行交互。在本章中,我们将看到如何创建与 H2 数据库的 JDBC 连接以及与 H2 数据库的 CRUD 操作。
通常,创建 JDBC 连接有五个步骤。
步骤 1 – 注册 JDBC 数据库驱动程序。
Class.forName ("org.h2.Driver");
步骤 2 – 打开连接。
Connection conn = DriverManager.getConnection ("jdbc:h2:~/test", "sa","");
第 3 步– 创建声明。
Statement st = conn.createStatement();
步骤 4 – 执行语句并接收结果集。
Stmt.executeUpdate("sql statement");
步骤 5 – 关闭连接。
conn.close();
在继续创建完整程序之前,我们需要将h2-1.4.192.jar 文件添加到 CLASSPATH。我们可以从文件夹C:\Program Files (x86)\H2\bin 中获取这个jar。
创建表
在这个例子中,我们将编写一个创建表的程序。考虑一个名为Registration的表,它具有以下字段。
S.No | 列名 | 数据类型 | 非空 | 首要的关键 |
---|---|---|---|---|
1 | ID | 数字 | 是的 | 是的 |
2 | 第一的 | 瓦尔查尔(255) | 不 | 不 |
3 | 最后的 | 瓦尔查尔(255) | 不 | 不 |
4 | 年龄 | 数字 | 不 | 不 |
下面是一个名为H2jdbcCreateDemo的示例程序。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class H2jdbcCreateDemo { // JDBC driver name and database URL static final String JDBC_DRIVER = "org.h2.Driver"; static final String DB_URL = "jdbc:h2:~/test"; // Database credentials static final String USER = "sa"; static final String PASS = ""; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { // STEP 1: Register JDBC driver Class.forName(JDBC_DRIVER); //STEP 2: Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); //STEP 3: Execute a query System.out.println("Creating table in given database..."); stmt = conn.createStatement(); String sql = "CREATE TABLE REGISTRATION " + "(id INTEGER not NULL, " + " first VARCHAR(255), " + " last VARCHAR(255), " + " age INTEGER, " + " PRIMARY KEY ( id ))"; stmt.executeUpdate(sql); System.out.println("Created table in given database..."); // STEP 4: Clean-up environment stmt.close(); conn.close(); } catch(SQLException se) { //Handle errors for JDBC se.printStackTrace(); } catch(Exception e) { //Handle errors for Class.forName e.printStackTrace(); } finally { //finally block used to close resources try{ if(stmt!=null) stmt.close(); } catch(SQLException se2) { } // nothing we can do try { if(conn!=null) conn.close(); } catch(SQLException se){ se.printStackTrace(); } //end finally try } //end try System.out.println("Goodbye!"); } }
将上述程序保存到 H2jdbcCreateDemo.java 中。通过在命令提示符下执行以下命令来编译并执行上述程序。
\>javac H2jdbcCreateDemo.java \>java H2jdbcCreateDemo
上述命令产生以下输出。
Connecting to database... Creating table in given database... Created table in given database... Goodbye!
执行完后,我们可以查看使用H2 SQL接口创建的表。
插入记录
在这个例子中,我们将编写一个插入记录的程序。让我们将以下记录插入到表Registration 中。
ID | 第一的 | 最后的 | 年龄 |
---|---|---|---|
100 | 扎拉 | 阿里 | 18 |
101 | 马纳兹 | 法特玛 | 25 |
102 | 扎伊德 | 汗 | 30 |
103 | 萨米特 | 米塔尔 | 28 |
下面是一个名为H2jdbcInsertDemo的示例程序。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class H2jdbcInsertDemo { // JDBC driver name and database URL static final String JDBC_DRIVER = "org.h2.Driver"; static final String DB_URL = "jdbc:h2:~/test"; // Database credentials static final String USER = "sa"; static final String PASS = ""; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try{ // STEP 1: Register JDBC driver Class.forName(JDBC_DRIVER); // STEP 2: Open a connection System.out.println("Connecting to a selected database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); System.out.println("Connected database successfully..."); // STEP 3: Execute a query stmt = conn.createStatement(); String sql = "INSERT INTO Registration " + "VALUES (100, 'Zara', 'Ali', 18)"; stmt.executeUpdate(sql); sql = "INSERT INTO Registration " + "VALUES (101, 'Mahnaz', 'Fatma', 25)"; stmt.executeUpdate(sql); sql = "INSERT INTO Registration " + "VALUES (102, 'Zaid', 'Khan', 30)"; stmt.executeUpdate(sql); sql = "INSERT INTO Registration " + "VALUES(103, 'Sumit', 'Mittal', 28)"; stmt.executeUpdate(sql); System.out.println("Inserted records into the table..."); // STEP 4: Clean-up environment stmt.close(); conn.close(); } catch(SQLException se) { // Handle errors for JDBC se.printStackTrace(); } catch(Exception e) { // Handle errors for Class.forName e.printStackTrace(); } finally { // finally block used to close resources try { if(stmt!=null) stmt.close(); } catch(SQLException se2) { } // nothing we can do try { if(conn!=null) conn.close(); } catch(SQLException se) { se.printStackTrace(); } // end finally try } // end try System.out.println("Goodbye!"); } }
将上述程序保存到 H2jdbcInsertDemo.java 中。通过在命令提示符下执行以下命令来编译并执行上述程序。
\>javac H2jdbcInsertDemo.java \>java H2jdbcInsertDemo
上述命令产生以下输出。
Connecting to a selected database... Connected database successfully... Inserted records into the table... Goodbye!
读取记录
在这个例子中,我们将编写一个读取记录的程序。让我们尝试从表Registration 中读取所有记录。
下面是一个名为H2jdbcRecordDemo的示例程序。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class H2jdbcReadDemo { // JDBC driver name and database URL static final String JDBC_DRIVER = "org.h2.Driver"; static final String DB_URL = "jdbc:h2:~/test"; // Database credentials static final String USER = "sa"; static final String PASS = ""; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { // STEP 1: Register JDBC driver Class.forName(JDBC_DRIVER); // STEP 2: Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); // STEP 3: Execute a query System.out.println("Connected database successfully..."); stmt = conn.createStatement(); String sql = "SELECT id, first, last, age FROM Registration"; ResultSet rs = stmt.executeQuery(sql); // STEP 4: Extract data from result set while(rs.next()) { // Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); // Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); } // STEP 5: Clean-up environment rs.close(); } catch(SQLException se) { // Handle errors for JDBC se.printStackTrace(); } catch(Exception e) { // Handle errors for Class.forName e.printStackTrace(); } finally { // finally block used to close resources try { if(stmt!=null) stmt.close(); } catch(SQLException se2) { } // nothing we can do try { if(conn!=null) conn.close(); } catch(SQLException se) { se.printStackTrace(); } // end finally try } // end try System.out.println("Goodbye!"); } }
将上述程序保存到 H2jdbcReadDemo.java 中。通过在命令提示符下执行以下命令来编译并执行上述程序。
\>javac H2jdbcReadDemo.java \>java H2jdbcReadDemo
上述命令产生以下输出。
Connecting to a selected database... Connected database successfully... ID: 100, Age: 18, First: Zara, Last: Ali ID: 101, Age: 25, First: Mahnaz, Last: Fatma ID: 102, Age: 30, First: Zaid, Last: Khan ID: 103, Age: 28, First: Sumit, Last: Mittal Goodbye!
更新记录
在这个例子中,我们将编写一个程序来更新记录。让我们尝试从表Registration 中读取所有记录。
下面是一个名为H2jdbcUpdateDemo的示例程序。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class H2jdbcUpdateDemo { // JDBC driver name and database URL static final String JDBC_DRIVER = "org.h2.Driver"; static final String DB_URL = "jdbc:h2:~/test"; // Database credentials static final String USER = "sa"; static final String PASS = ""; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { // STEP 1: Register JDBC driver Class.forName(JDBC_DRIVER); // STEP 2: Open a connection System.out.println("Connecting to a database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); // STEP 3: Execute a query System.out.println("Connected database successfully..."); stmt = conn.createStatement(); String sql = "UPDATE Registration " + "SET age = 30 WHERE id in (100, 101)"; stmt.executeUpdate(sql); // Now you can extract all the records // to see the updated records sql = "SELECT id, first, last, age FROM Registration"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ // Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); // Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); } rs.close(); } catch(SQLException se) { // Handle errors for JDBC se.printStackTrace(); } catch(Exception e) { // Handle errors for Class.forName e.printStackTrace(); } finally { // finally block used to close resources try { if(stmt!=null) stmt.close(); } catch(SQLException se2) { } // nothing we can do try { if(conn!=null) conn.close(); } catch(SQLException se) { se.printStackTrace(); } // end finally try } // end try System.out.println("Goodbye!"); } }
将上述程序保存到 H2jdbcUpdateDemo.java 中。通过在命令提示符下执行以下命令来编译并执行上述程序。
\>javac H2jdbcUpdateDemo.java \>java H2jdbcUpdateDemo
上述命令产生以下输出。
Connecting to a selected database... Connected database successfully... ID: 100, Age: 30, First: Zara, Last: Ali ID: 101, Age: 30, First: Mahnaz, Last: Fatma ID: 102, Age: 30, First: Zaid, Last: Khan ID: 103, Age: 28, First: Sumit, Last: Mittal Goodbye!
删除记录
在这个例子中,我们将编写一个程序来删除记录。让我们尝试从表Registration 中读取所有记录。
下面是一个名为H2jdbcDeleteDemo的示例程序。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class H2jdbcDeleteDemo { // JDBC driver name and database URL static final String JDBC_DRIVER = "org.h2.Driver"; static final String DB_URL = "jdbc:h2:~/test"; // Database credentials static final String USER = "sa"; static final String PASS = ""; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { // STEP 1: Register JDBC driver Class.forName(JDBC_DRIVER); // STEP 2: Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); // STEP 3: Execute a query System.out.println("Creating table in given database..."); stmt = conn.createStatement(); String sql = "DELETE FROM Registration " + "WHERE id = 101"; stmt.executeUpdate(sql); // Now you can extract all the records // to see the remaining records sql = "SELECT id, first, last, age FROM Registration"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ // Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); // Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); } rs.close(); } catch(SQLException se) { // Handle errors for JDBC se.printStackTrace(); } catch(Exception e) { // Handle errors for Class.forName e.printStackTrace(); } finally { // finally block used to close resources try { if(stmt!=null) stmt.close(); } catch(SQLException se2) { } // nothing we can do try { if(conn!=null) conn.close(); } catch(SQLException se) { se.printStackTrace(); } // end finally try } // end try System.out.println("Goodbye!"); } }
将上述程序保存到 H2jdbcDeleteDemo.java 中。通过在命令提示符下执行以下命令来编译并执行上述程序。
\>javac H2jdbcDeleteDemo.java \>java H2jdbcDeleteDemo
上述命令产生以下输出。
Connecting to a selected database... Connected database successfully... ID: 100, Age: 30, First: Zara, Last: Ali ID: 102, Age: 30, First: Zaid, Last: Khan ID: 103, Age: 28, First: Sumit, Last: Mittal Goodbye!