H2数据库-简介

H2是开源的轻量级Java数据库。它可以嵌入Java应用程序中或以客户端-服务器模式运行。H2数据库主要可以配置为作为内存数据库运行,这意味着数据将不会持久存储在磁盘上。由于具有嵌入式数据库,因此它不用于生产开发,而主要用于开发和测试。

可以在嵌入式模式或服务器模式下使用此数据库。以下是H2数据库的主要功能-

  • 极快的开源JDBC API
  • 在嵌入式和服务器模式下可用;内存数据库
  • 基于浏览器的控制台应用程序
  • 占用空间小-jar文件大小约为1.5MB

H2数据库的功能

H2数据库的主要特点如下-

  • 这是一个非常快的数据库引擎。
  • H2是开源的,并用Java编写。
  • 它支持标准的SQL和JDBC API。它也可以使用PostgreSQL ODBC驱动程序。
  • 它具有嵌入式和服务器模式。
  • H2支持集群多版本并发
  • 它具有强大的安全功能。

附加功能

以下是H2数据库的一些其他功能-

  • H2是基于磁盘的或内存中的数据库和表,只读数据库支持,临时表。
  • H2提供事务支持(已提交读),两阶段提交的多个连接,表级锁定。
  • H2是基于成本的优化程序,使用遗传算法进行复杂查询(零管理)。
  • H2包含可滚动和可更新的结果集支持,大结果集,外部结果排序,函数可以返回结果集。
  • H2支持加密数据库(AES),SHA-256密码加密,加密功能和SSL。

H2数据库中的组件

为了使用H2数据库,您需要具有以下组件-

  • 网络浏览器
  • H2控制台服务器

这是一个客户端/服务器应用程序,因此服务器和客户端(浏览器)都需要运行它。

H2数据库-安装

H2是用Java编写的数据库。通过使用JDBC,我们可以轻松地将此数据库嵌入到我们的应用程序中。我们可以在许多不同的平台或任何版本的Java Runtime Environment上运行它。但是,在安装数据库之前,应在系统中安装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,则访问下面的Install JDK链接。

安装H2数据库

我们可以在许多不同的平台上运行此数据库。在本章中,我们将学习在Windows上安装H2数据库的知识。

以下是在Windows操作系统上安装H2数据库的步骤。

步骤1:下载H2设定档

从给定的链接下载最新版本的H2数据库。在此链接中,您将获得两种类型的H2数据库的最新版本。一种是Windows Installer类型(即.exe文件),另一种是其他操作系统的与平台无关的zip文件。

下载.exe文件后,单击Windows安装程序以下载Windows支持的H2数据库。在这种情况下,我们将使用H2数据库的1.4.192版本。

步骤2:安装H2数据库

下载后,我们在下载目录中获得了H2 Windows安装程序文件(即h2-setup-yyyy-mm-dd.exe)。要开始H2数据库的安装过程,请双击安装程序文件。

以下屏幕是安装过程的第一步。提供一个我们要在其中安装H2数据库服务器的路径,如以下屏幕快照所示。

H2数据库-简介

如上面的屏幕截图所示,默认情况下它将以C\ ProgramFilesx86\ H2作为目标文件夹。单击下一步继续进行下一步。弹出以下屏幕。

H2数据库-简介

在上面的屏幕截图中,单击“安装”按钮以开始安装过程。安装后,我们得到以下屏幕截图。

H2数据库-简介

单击完成以完成安装过程。

步骤3:验证H2数据库安装

安装后,让我们验证系统中的数据库安装。单击Windows→键入H2控制台→单击H2控制台图标。连接到URL http// localhost8082。在连接时,H2数据库将要求数据库注册,如以下屏幕截图所示。

H2数据库-简介

在上面的对话框中填写所有详细信息,例如“保存的设置”,“设置名称”,“驱动程序类”,“ JDBC URL”,“用户名”和“密码”。在JDBC URL中,指定数据库的位置和数据库名称。用户名和密码是数据库的用户名和密码的字段。单击连接。

弹出数据库欢迎页面,如以下屏幕截图所示。

H2数据库-简介

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

MP

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命令的通用查询语法。

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命令的通用语法。

BACKUP TO fileNameString;

在此示例中,让我们将当前数据库的备份复制backup.zip文件中。相同地使用以下命令。

BACKUP TO 'backup.zip';

执行上述命令后,您将在本地文件系统中获取backup.zip文件。

H2数据库-通话

CALL是属于H2数据库服务器的SQL命令。此命令用于计算简单表达式。它在单个列字段中返回给定表达式的结果。当它返回结果数组时,该数组中的每个元素都显示为列值。

句法

以下是CALL命令的通用语法。

CALL expression;

我们可以在这种语法中使用算术表达式。

让我们举个例子,并使用调用命令执行算术表达式(15 * 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数据库-简介

H2数据库-合并

MERGE命令用于更新现有行并将新行插入表中。使用此命令时,主键列起着重要的作用。它用于查找行。

句法

以下是MERGE命令的通用语法。

MERGE INTO tableName [ ( columnName [,...] ) ]

[ KEY ( columnName [,...] ) ]

{ VALUES { ( { DEFAULT | expression } [,...] ) } [,...] | select }

在以上语法中,KEY子句用于指定主键列名称。连同VALUES子句,我们可以使用基本值插入,也可以使用select命令将另一个表值检索并存储到该表中。

在此示例中,让我们尝试将新记录添加到“客户”表中。以下是表中新记录的详细信息。

栏名

ID

8

名称

洛克希

年龄

32

地址

海得拉巴

薪水

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

Chaitali

25

孟买

6500

5

哈迪克

27

博帕尔

8500

6

科马尔

22

MP

4500

7

玛菲

24

印多尔

10000

8

洛克希

32

海得拉巴

2500

现在让我们尝试使用Merge命令更新记录。以下是要更新的记录的详细信息。

栏名

ID

8

名称

洛基

年龄

32

地址

海得拉巴

薪水

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

Chaitali

25

孟买

6500

5

哈迪克

27

博帕尔

8500

6

科马尔

22

MP

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

顾客

上市

电磁脉冲

上市

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 -缓存表是常规表的默认类型。这意味着行数不受主存储器的限制。
  • 内存-内存表是临时表的默认类型。这意味着内存表不应太大,索引数据将保留在主内存中。
  • TEMPORARY-在关闭或打开数据库时删除临时表。基本上,临时表有两种类型-
    • 全局类型-所有连接均可访问。
    • 本地类型-当前连接可访问。

临时表的默认类型是全局类型。临时表的索引保留在主内存中,除非使用CREATE CACHED TABLE创建临时表。

  • ENGINE-仅当使用自定义表实现时才需要ENGINE选项。
  • NOT PERSISTENT-这是一个修饰符,用于将完整的表数据保留在内存中,并且在关闭数据库时所有行都会丢失。
  • TRANSACTIONAL-这是一个提交开放事务的关键字,此命令仅支持临时表。

在此示例中,让我们使用以下给定数据创建一个名为tutorials_tbl的表。

序号

栏名

数据类型

1个

ID

整数

2

标题

Varchar(50)

3

作者

Varchar(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 [ IF NOT EXISTS ] name [ AUTHORIZATION ownerUserName ]

在以上通用语法中,AUTHORIZATION是用于提供相应用户名的关键字。此命令是可选的,这意味着如果我们不提供用户名,则它将考虑当前用户。执行命令的用户必须具有管理员权限以及所有者。

该命令在此连接中提交一个打开的事务。

在此示例中,让我们使用以下命令在SA用户下创建一个名为test_schema的架构。

CREATE SCHEMA test_schema AUTHORIZATION sa;

上面的命令产生以下输出。

(0) rows effected

创建序列

序列是一个概念,用于通过遵循id或任何随机列值的序列来生成数字。

句法

以下是create sequence命令的通用语法。

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的数据类型为Date。以下是添加新列的查询。

ALTER TABLE tutorials_tbl ADD start_date DATE;

上面的查询产生以下输出。

(6) rows effected

更改表添加约束

更改表添加约束是用于向表添加不同约束的命令,例如主键,外键,非null等。

如果所需的索引尚不存在,则会自动创建它们。无法禁用唯一约束检查​​。该命令在此连接中提交一个打开的事务。

句法

以下是“更改表添加约束”命令的通用语法。

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 [ IF EXISTS ] tableName [,...] [ RESTRICT | CASCADE ]

如果我们使用的是RESTRICT并且存在具有依赖视图的表,则该命令将失败。当我们使用CASCADE关键字时,将删除所有从属视图。

在此示例中,我们将使用以下查询删除名为test的表。

DROP TABLE test;

上面的查询产生以下输出。

(6) row (s) effected

删除架构

删除模式是从数据库服务器删除相应模式的命令。它不适用于当前架构。

句法

DROP SCHEMA [ IF EXISTS ] schemaName

在此示例中,我们将使用以下查询删除名为test_schema的架构。

DROP SCHEMA TEST_SCHEMA;

上面的查询产生以下输出。

(0) row(s) effected

掉落顺序

删除序列是用于从表结构中删除序列的命令。

句法

以下是“丢弃序列”命令的通用语法。

DROP SEQUENCE [ IF EXISTS ] sequenceName

该命令在此连接中提交一个打开的事务。

在此示例中,我们将删除一个名为sequence_id的序列。以下是命令。

DROP SEQUENCE sequence_id;

上面的命令产生以下输出。

(0) row (s) effected

放下视图

删除视图是用于删除现有视图的命令。如果使用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

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 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语法中的命令,用于将事务回滚到Savepoint或上一个事务。通过使用此命令,我们可以回滚到特定的保存点,也可以回滚到先前执行的事务。

句法

ROLLABCK命令有两种不同的语法。

以下是rollback命令的通用语法。

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 Filesx86\ H2 \ bin获得此jar

建立表格

在此示例中,我们将编写一个用于创建表的程序。考虑一个名为Registration的表,该表具有以下字段。

序号

栏名

数据类型

非空

首要的关键

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!

 

上一篇:PowerJob 在线日志饱受好评的秘诀:小但实用的分布式日志系统


下一篇:A1006