-

HSQLDB - 简介

HyperSQL数据库(HSQLDB)是一种现代关系型数据库管理器,符合SQL:2011标准和JDBC 4规范。它支持所有的核心功能和RDBMS。HSQLDB用于数据库应用程序的开发,测试和部署。

HSQLDB的主要和独特功能是标准合规性。它可以在用户的​​应用程序进程内,应用程序服务器内或作为单独的服务器进程提供数据库访问。

HSQLDB的特点

HSQLDB的组件

HSQLDB jar包中有三个不同的组件。

HyperSQL RDBMS和JDBC驱动程序提供核心功能。数据库管理器是可以与具有JDBC驱动程序的任何数据库引擎一起使用的通用数据库访问工具。

另外一个名为sqltool.jar的jar包含Sql Tool,它是一个命令行数据库访问工具。这是一个通用命令。线数据库访问工具,可以与其他数据库引擎一起使用。

HSQlDB - 安装

HSQLDB是以纯Java实现的关系数据库管理系统。您可以使用JDBC轻松地将该数据库嵌入到应用程序中。或者您可以单独使用操作。

学习提醒

按照HSQLDB的必备软件安装。

验证Java安装

由于HSQLDB是以纯Java实现的关系数据库管理系统,因此必须先安装JDK(Java Development Kit)软件才能安装HSQLDB。如果您已经在系统中安装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。

HSQLDB安装

以下是安装HSQLDB的步骤。

步骤1 - 下载HSQLDB包

从以下链接https://sourceforge.net/projects/hsqldb/files/下载最新版本的HSQLDB数据库点击链接后,您将获得以下屏幕截图。

下载HsqlDB

单击HSQLDB,下载将立即开始。最后,您将获得名为hsqldb-2.3.4.zip的zip文件

步骤2 - 提取HSQLDB zip文件

解压缩zip文件并将其放入C:目录。提取后,您将获得一个文件结构,如下面的屏幕截图所示。

提取HsqlDB

步骤3 - 创建一个默认数据库

HSQLDB没有默认数据库,因此您需要为HSQLDB创建一个数据库。让我们创建一个名为server.properties的属性文件,该文件定义了一个名为demodb的新数据库看看下面的数据库服务器属性。

server.database.0 = file:hsqldb/demodb
server.dbname.0 = testdb

将此server.properties文件放入HSQLDB主目录,即C: hsqldb- 2.3.4 hsqldb

现在在命令提示符下执行以下命令。

>cd C:hsqldb-2.3.4hsqldb
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server

执行上述命令后,将显示如下屏幕截图所示的服务器状态。

默认数据库

之后,您将在HSQLDB主目录C: hsqldb-2.3.4 hsqldb中找到hsqldb目录的以下文件夹结构那些文件是由HSQLDB数据库服务器创建的demodb数据库的临时文件,lck文件,日志文件,属性文件和脚本文件。

创建数据库

步骤4 - 启动数据库服务器

完成创建数据库后,必须使用以下命令启动数据库。

>cd C:hsqldb-2.3.4hsqldb
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0
file:hsqldb/demodb --dbname.0 testdb

执行上述命令后,您将获得以下状态。

启动数据库服务器

现在,您可以C: hsqldb-2.3.4 hsqldb bin位置打开runManagerSwing.bat的数据库主屏幕该蝙蝠文件将打开HSQLDB数据库的GUI文件。在此之前,它将通过一个对话框询问您的数据库设置。看看下面的截图。在此对话框中,输入设置名称,URL如上所示,然后单击确定。

运行ManagerSwing

您将获得HSQLDB数据库的GUI屏幕,如以下屏幕截图所示。

Hsql数据库

HSQlDB - 连接

在安装一章中,我们探讨了如何手动连接数据库。在本章中,我们将探讨如何以编程方式连接数据库(使用Java编程)。

看看下面的程序,这将启动服务器并在Java应用程序和数据库之间建立连接。

示例

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectDatabase {
   public static void main(String[] args) {
      Connection con = null;
      
      try {
         //Registering the HSQLDB JDBC driver
         Class.forName("org.hsqldb.jdbc.JDBCDriver");
         //Creating the connection with HSQLDB
         con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/testdb", "SA", "");
         if (con!= null){
            System.out.println("Connection created successfully");
            
         }else{
            System.out.println("Problem with creating connection");
         }
      
      }  catch (Exception e) {
         e.printStackTrace(System.out);
      }
   }
}

将此代码保存到ConnectDatabase.java文件中。您将不得不使用以下命令启动数据库。

>cd C:hsqldb-2.3.4hsqldb
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0
file:hsqldb/demodb --dbname.0 testdb

您可以使用以下命令来编译和执行代码。

>javac ConnectDatabase.java
>java ConnectDatabase

执行上述命令后,您将收到以下输出 -

Connection created successfully

HSQLDB - 数据类型

本章介绍了HSQLDB的不同数据类型。HSQLDB服务器提供六类数据类型。

精确的数字数据类型

数据类型
bigint -9,223,372,036,854,775,808 9,223,372,036,854,775,807
int -2,147,483,648 2,147,483,647
smallint -32,768 32,767
tinyint 0 255
0 1
decmial -10 ^ 38 +1 10 ^ 38 -1
Decimal -10 ^ 38 +1 10 ^ 38 -1
-922,337,203,685,477.5808 +922,337,203,685,477.5807
小钱 -214,748.3648 +214,748.3647

近似数值数据类型

数据类型
float -1.79E + 308 1.79E + 308
真实 -3.40E + 38 3.40E + 38

日期和时间数据类型

数据类型
约会时间 1753年1月1日 9999年12月31日
小时 1900年1月1日 2079年6月6日
date 存储日期如1991年6月30日
time 每天下午12:30的时间

注意 - 在这里,datetime具有3.33毫秒的精度,而小的datetime具有1分钟精度。

字符string数据类型

数据类型 描述
char 最大长度8,000个字符(固定长度非Unicode字符)
varchar 最多8,000个字符(可变长度非Unicode数据)
varchar(max) 最大长度为231个字符,可变长度的非Unicode数据(仅限SQL Server 2005)
文本 可变长度非Unicode数据,最大长度为2,147,483,647个字符

Unicode字符string数据类型

数据类型 描述
nchar 最大长度为4,000个字符(固定长度Unicode)
nvarchar 最大长度为4,000个字符(可变长度Unicode)
nvarchar(最大) 最大长度231个字符(仅限SQL Server 2005),(可变长度Unicode)
ntext 最大长度为1,073,741,823个字符(可变长度Unicode)

二进制数据类型

数据类型 描述
二进制 最大长度为8,000字节(固定长度二进制数据)
varbinary 最大长度为8,000字节(可变长度二进制数据)
varbinary(max) 最大长度为231字节(仅限SQL Server 2005),(可变长度二进制数据)
图片 最大长度为2,147,483,647字节(可变长度二进制数据)

其他数据类型

数据类型 描述
sql_variant 存储各种SQL Server支持的数据类型的值,文本,ntext和时间戳除外
时间戳 存储一个数据库范围的唯一编号,每次更新行时都会更新
唯一标识符 存储全局唯一标识符(GUID)
xml 存储XML数据。您可以将xml实例存储在列或变量中(仅限SQL Server 2005)
光标 引用光标对象
存储结果集以备后续处理

HSQLDB - 创建表

创建表的基本强制性要求是表名,字段名和这些字段的数据类型。或者,您还可以为表格提供关键约束。

用法

看看下面的语法。

CREATE TABLE table_name (column_name column_type);

示例

让我们创建一个名为tutorials_tbl的表与字段名称,如id,title,author和submission_date。看看下面的查询。

CREATE TABLE tutorials_tbl (
   id INT NOT NULL,
   title VARCHAR(50) NOT NULL,
   author VARCHAR(20) NOT NULL,
   submission_date DATE,
   PRIMARY KEY (id) 
);

执行上述查询后,您将收到以下输出 -

(0) rows effected

HSQLDB - JDBC程序

以下是用于在HSQLDB数据库中创建名为tutorials_tbl的表的JDBC程序。将程序保存到CreateTable.java文件中。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class CreateTable {
   
   public static void main(String[] args) {
      
      Connection con = null;
      Statement stmt = null;
      int result = 0;
      
      try {
         Class.forName("org.hsqldb.jdbc.JDBCDriver");
         con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/testdb", "SA", "");
         stmt = con.createStatement();
         
         result = stmt.executeUpdate("CREATE TABLE tutorials_tbl (
            id INT NOT NULL, title VARCHAR(50) NOT NULL,
            author VARCHAR(20) NOT NULL, submission_date DATE,
            PRIMARY KEY (id));
         ");
			
      }  catch (Exception e) {
         e.printStackTrace(System.out);
      }
      System.out.println("Table created successfully");
   }
}

您可以使用以下命令启动数据库。

>cd C:hsqldb-2.3.4hsqldb
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0
file:hsqldb/demodb --dbname.0 testdb

使用以下命令编译并执行上述程序。

>javac CreateTable.java
>java CreateTable

执行上述命令后,您将收到以下输出 -

Table created successfully

HSQLDB - Drop Table

删除现有的HSQLDB表非常简单。但是,删除任何现有的表格时,您需要非常小心,因为删除表格后,丢失的数据将无法恢复。

用法

以下是用于删除HSQLDB表的通用SQL语法。

DROP TABLE table_name;

示例

让我们考虑一个例子,从HSQLDB服务器中删除一个名为employee的表。以下是删除名为employee的表的查询。

DROP TABLE employee;

执行上述查询后,您将收到以下输出 -

(0) rows effected

HSQLDB - JDBC程序

以下是用于从HSQLDB服务器删除表员工的JDBC程序。

将以下代码保存到DropTable.java文件中。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class DropTable {
   public static void main(String[] args) {
      Connection con = null;
      Statement stmt = null;
      int result = 0;
      
      try {
         Class.forName("org.hsqldb.jdbc.JDBCDriver");
         con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/testdb", "SA", "");
         stmt = con.createStatement();
         result = stmt.executeUpdate("DROP TABLE employee");
      }catch (Exception e) {
         e.printStackTrace(System.out);
      }
      
      System.out.println("Table dropped successfully");
   }
}

您可以使用以下命令启动数据库。

>cd C:hsqldb-2.3.4hsqldb
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0
file:hsqldb/demodb --dbname.0 testdb

使用以下命令编译并执行上述程序。

>javac DropTable.java
>java DropTable

执行上述命令后,您将收到以下输出 -

Table dropped successfully

HSQLDB - 插入查询

您可以使用INSERT INTO命令在HSQLDB中实现Insert查询语句。您必须从表中的列字段顺序提供用户定义的数据。

用法

以下是INSERT查询的通用语法

INSERT INTO table_name (field1, field2,...fieldN)
VALUES (value1, value2,...valueN );

要将一个字符string类型的数据插入一个表中,您必须使用双引号或单引号将字符string值提供给insert query语句。

示例

让我们考虑一个例子,将一个记录插入到名为tutorials_tbl的表中,值为id = 100,title = Learn PHP,Author = John Poul,提交日期是当前日期。

以下是给定示例的查询。

INSERT INTO tutorials_tbl VALUES (100,"Learn PHP", "John Poul", NOW());

执行上述查询后,您将收到以下输出 -

1 row effected

HSQLDB - JDBC程序

这是JDBC程序,将记录插入表中,给定值为id = 100,title = Learn PHP,作者= John Poul,提交日期为当前日期。看看给定的程序。将代码保存到InserQuery.java文件中。

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.Statement;  

public class InsertQuery {
   public static void main(String[] args) { 
      Connection con = null; 
      Statement stmt = null; 
      int result = 0; 
      try { 
         Class.forName("org.hsqldb.jdbc.JDBCDriver"); 
         con = DriverManager.getConnection( 
            "jdbc:hsqldb:hsql://localhost/testdb", "SA", ""); 
         stmt = con.createStatement(); 
         result = stmt.executeUpdate("INSERT INTO tutorials_tbl 
            VALUES (100,"Learn PHP", "John Poul", NOW())"); 
         con.commit(); 
      }catch (Exception e) { 
         e.printStackTrace(System.out); 
      } 
      System.out.println(result+" rows effected"); 
      System.out.println("Rows inserted successfully"); 
   } 
} 

您可以使用以下命令启动数据库。

>cd C:hsqldb-2.3.4hsqldb 
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0 
file:hsqldb/demodb --dbname.0 testdb 

使用以下命令编译并执行上述程序。

>javac InsertQuery.java 
>java InsertQuery 

执行上述命令后,您将收到以下输出 -

1 rows effected 
Rows inserted successfully 

尝试使用INSERT INTO命令将以下记录插入tutorials_tbl

ID 标题 作者 提交日期
101 学习C Yaswanth 现在()
102 学MySQL 阿卜杜勒 现在()
103 学会尊敬 Bavya kanna 现在()
104 学习JDB 阿吉斯·库马尔 现在()
105 学习Junit Sathya Murthi 现在()

HSQLDB - 选择查询

SELECT命令用于从HSQLDB数据库中获取记录数据。在这里,您需要在Select语句中提及必需的字段列表。

用法

这是Select查询的通用语法。

SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE Clause]
[OFFSET M ][LIMIT N]

示例

这是一个例子,它从tutorials_tbl中获取所有记录的id,title和author字段我们可以通过使用SELECT语句来实现。以下是对该示例的查询。

SELECT id, title, author FROM tutorials_tbl

执行上述查询后,您将收到以下输出。

+------+----------------+-----------------+
|  id  |      title     |    author       |
+------+----------------+-----------------+
| 100  |     Learn PHP  |    John Poul    |
| 101  |     Learn C    |    Yaswanth     |
| 102  |   Learn MySQL  |     Abdul S     |
| 103  |   Learn Excell |   Bavya kanna   |
| 104  |   Learn JDB    |    Ajith kumar  |
| 105  |   Learn Junit  |   Sathya Murthi |
+------+----------------+-----------------+

HSQLDB - JDBC程序

这是JDBC程序,它将从tutorials_tbl表中获取所有记录的id,title和author字段将以下代码保存到SelectQuery.java文件中。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class SelectQuery {
   
   public static void main(String[] args) {
      Connection con = null;
      Statement stmt = null;
      ResultSet result = null;
      
      try {
         Class.forName("org.hsqldb.jdbc.JDBCDriver");
         con = DriverManager.getConnection(
            "jdbc:hsqldb:hsql://localhost/testdb", "SA", "");
         stmt = con.createStatement();
         result = stmt.executeQuery(
            "SELECT id, title, author FROM tutorials_tbl");
         
         while(result.next()){
            System.out.println(result.getInt("id")+" | "+
               result.getString("title")+" | "+
               result.getString("author"));
         }
      } catch (Exception e) {
         e.printStackTrace(System.out);
      }
   }
}

您可以使用以下命令启动数据库。

>cd C:hsqldb-2.3.4hsqldb
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0
file:hsqldb/demodb --dbname.0 testdb

使用以下命令编译并执行上述代码。

>javac SelectQuery.java
>java SelectQuery

执行上述命令后,您将收到以下输出 -

100 | Learn PHP | John Poul
101 | Learn C | Yaswanth
102 | Learn MySQL | Abdul S
103 | Learn Excell | Bavya Kanna
104 | Learn JDB | Ajith kumar
105 | Learn Junit | Sathya Murthi

HSQLDB - 条款

一般来说,我们使用SELECT命令从HSQLDB表中获取数据。我们可以使用WHERE条件子句过滤结果数据。使用WHERE,我们可以指定选择条件从表中选择所需的记录。

用法

以下是SELECT命令WHERE子句从HSQLDB表中提取数据的语法。

SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....

我们可以使用条件过滤记录数据。我们在条件WHERE子句中使用不同的运算符。以下是可以与WHERE子句一起使用的运算符列表。

操作符 描述
= 检查两个操作数的值是否相等,如果是,则条件成立。 (A = B)不正确
!= 检查两个操作数的值是否相等,如果值不等于条件成立。 (A!= B)是真的
> 检查左操作数的值是否大于右操作数的值,如果是,则条件成为true。 (A> B)不正确
< 检查左操作数的值是否小于右操作数的值,如果是,则条件成为true。 (A <B)是真的
> = 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件成为true。 (A> = B)不正确
<= 检查左操作数的值是否小于或等于右操作数的值,如果是,则条件成为true。 (A <= B)为真

示例

这是一个例子,它检索诸如id,title以及题为“Learn C”的作者的细节。可以通过在SELECT命令中使用WHERE子句。以下是对相同的查询。

SELECT id, title, author FROM tutorials_tbl WHERE title = "Learn C";

执行上述查询后,您将收到以下输出。

+------+----------------+-----------------+
| id   |      title     |    author       |
+------+----------------+-----------------+
| 101  |      Learn C   |   Yaswanth      |
+------+----------------+-----------------+

HSQLDB - JDBC程序

下面是从表tutorials_tblhaving标题检索记录数据的JDBC编程学习C将以下代码保存到WhereClause.java中

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class WhereClause {
   
   public static void main(String[] args) {
      Connection con = null;
      Statement stmt = null;
      ResultSet result = null;
      try {
         Class.forName("org.hsqldb.jdbc.JDBCDriver");
         con = DriverManager.getConnection(
            "jdbc:hsqldb:hsql://localhost/testdb", "SA", "");
         stmt = con.createStatement();
         result = stmt.executeQuery(
            "SELECT id, title, author FROM tutorials_tbl
            WHERE title = "Learn C"");
         
         while(result.next()){
            System.out.println(result.getInt("id")+" |
               "+result.getString("title")+" |
               "+result.getString("author"));
         }
      } catch (Exception e) {
         e.printStackTrace(System.out);
      }
   }

}

您可以使用以下命令启动数据库。

>cd C:hsqldb-2.3.4hsqldb
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0
file:hsqldb/demodb --dbname.0 testdb

使用以下命令编译并执行上述代码。

>javac WhereClause.java
>java WhereClause

执行上述命令后,将收到以下输出。

101 | Learn C | Yaswanth

HSQLDB - 更新查询

无论何时要修改表的值,都可以使用UPDATE命令。这将修改任何HSQLDB表中的任何字段值。

用法

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

UPDATE table_name SET field1 = new-value1, field2 = new-value2 [WHERE Clause]

示例

让我们考虑一个例子,将教程的标题从“学习C”更新为“C和数据结构”,其ID为“101”。以下是更新的查询。

UPDATE tutorials_tbl SET title = "C and Data Structures" WHERE id = 101;

执行上述查询后,您将收到以下输出。

(1) Rows effected

HSQLDB - JDBC程序

以下是JDBC程序,它会将教程标题从Learn C更新C,并将 ID 101的数据结构更新将以下程序保存到UpdateQuery.java文件中。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class UpdateQuery {
   
   public static void main(String[] args) {
      Connection con = null;
      Statement stmt = null;
      int result = 0;
      
      try {
         Class.forName("org.hsqldb.jdbc.JDBCDriver");
         con = DriverManager.getConnection(
            "jdbc:hsqldb:hsql://localhost/testdb", "SA", "");
         stmt = con.createStatement();
         result = stmt.executeUpdate(
            "UPDATE tutorials_tbl SET title = "C and Data Structures" WHERE id = 101");
      } catch (Exception e) {
         e.printStackTrace(System.out);
      }
      System.out.println(result+" Rows effected");
   }
}

您可以使用以下命令启动数据库。

>cd C:hsqldb-2.3.4hsqldb
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0
file:hsqldb/demodb --dbname.0 testdb

使用以下命令编译并执行上述程序。

>javac UpdateQuery.java
>java UpdateQuery

执行上述命令后,您将收到以下输出 -

1 Rows effected

HSQLDB - 删除条款

无论何时要从任何HSQLDB表中删除记录,都可以使用DELETE FROM命令。

用法

以下是DELETE命令从HSQLDB表中删除数据的通用语法。

DELETE FROM table_name [WHERE Clause]

示例

让我们考虑一个例子,从名为tutorials_tbl的表中删除记录数据,其ID为105以下是实现给定示例的查询。

DELETE FROM tutorials_tbl WHERE id = 105;

执行上述查询后,您将收到以下输出 -

(1) rows effected

HSQLDB - JDBC程序

以下是实现给定示例的JDBC程序。将以下程序保存到DeleteQuery.java中

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class DeleteQuery {
   
   public static void main(String[] args) {
      Connection con = null;
      Statement stmt = null;
      int result = 0;
      
      try {
         Class.forName("org.hsqldb.jdbc.JDBCDriver");
         con = DriverManager.getConnection(
            "jdbc:hsqldb:hsql://localhost/testdb", "SA", "");
         stmt = con.createStatement();
         result = stmt.executeUpdate(
            "DELETE FROM tutorials_tbl   WHERE id=105");
      } catch (Exception e) {
      
         e.printStackTrace(System.out);
      }
      System.out.println(result+" Rows effected");
   }
}

您可以使用以下命令启动数据库。

>cd C:hsqldb-2.3.4hsqldb
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0
file:hsqldb/demodb --dbname.0 testdb

使用以下命令编译并执行上述程序。

>javac DeleteQuery.java
>java DeleteQuery

执行上述命令后,您将收到以下输出 -

1 Rows effected

HSQLDB - LIKE条款

RDBMS结构中有一个WHERE子句。您可以使用WHERE子句等于我们想要进行完全匹配的符号(=)。但是我们可能需要过滤掉作者姓名中应包含“john”的所有结果。这可以使用SQL LIKE子句以及WHERE子句来处理。

如果SQL LIKE子句与%字符一起使用,则在UNIX中列出所有文件或目录时,它将像UNIX中的元字符(*)一样工作。

用法

以下是LIKE子句的通用SQL语法。

SELECT field1, field2,...fieldN table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = "somevalue"

示例

让我们考虑一个例子来检索作者姓名以John开头的教程数据列表以下是给定示例的HSQLDB查询。

SELECT * from tutorials_tbl WHERE author LIKE "John%";

执行上述查询后,您将收到以下输出。

+-----+----------------+-----------+-----------------+
|  id |      title     |   author  | submission_date |
+-----+----------------+-----------+-----------------+
| 100 |    Learn PHP   | John Poul | 2016-06-20      |
+-----+----------------+-----------+-----------------+

HSQLDB - JDBC程序

以下是JDBC程序,它检索作者名称以John开头的教程数据列表将代码保存到LikeClause.java中

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class LikeClause {
   
   public static void main(String[] args) {
      Connection con = null;
      Statement stmt = null;
      ResultSet result = null;
      
      try {
         Class.forName("org.hsqldb.jdbc.JDBCDriver");
         con = DriverManager.getConnection(
            "jdbc:hsqldb:hsql://localhost/testdb", "SA", "");
         stmt = con.createStatement();
         result = stmt.executeQuery(
            "SELECT * from tutorials_tbl WHERE author LIKE "John%";");
         
         while(result.next()){
            System.out.println(result.getInt("id")+" |
               "+result.getString("title")+" |
               "+result.getString("author")+" |
               "+result.getDate("submission_date"));
         }
      } catch (Exception e) {
         e.printStackTrace(System.out);
      }
   }
}

您可以使用以下命令启动数据库。

>cd C:hsqldb-2.3.4hsqldb
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0
file:hsqldb/demodb --dbname.0 testdb

使用以下命令编译并执行上述代码。

>javac LikeClause.java
>java LikeClause

执行以下命令后,将收到以下输出。

100 | Learn PHP | John Poul | 2016-06-20

HSQLDB - 排序结果

SQL SELECT命令只要在检索和显示记录时都遵循特定顺序的要求,就从HSQLDB表中提取数据。在这种情况下,我们可以使用ORDER BY子句。

用法

以下是SELECT命令的语法以及ORDER BY子句来对HSQLDB中的数据进行排序。

SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]

示例

让我们考虑一个例子,通过按升序排序作者姓名来获取和排序tutorials_tbl的记录以下是对相同的查询。

SELECT id, title, author from tutorials_tbl ORDER BY author ASC;

执行上述查询后,您将收到以下输出。

+------+----------------+-----------------+
| id   |     title      |     author      |
+------+----------------+-----------------+
| 102  |  Learn MySQL   |     Abdul S     | 
| 104  |  Learn JDB     |    Ajith kumar  |
| 103  |  Learn Excell  |    Bavya kanna  |
| 100  |  Learn PHP     |    John Poul    |
| 105  |  Learn Junit   |   Sathya Murthi |
| 101  |  Learn C       |    Yaswanth     |
+------+----------------+-----------------+

HSQLDB - JDBC程序

以下是通过按升序排序作者姓名来获取和排序tutorials_tbl的记录的JDBC程序将以下程序保存到OrderBy.java中

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class OrderBy {
   
   public static void main(String[] args) {
      Connection con = null;
      Statement stmt = null;
      ResultSet result = null;
      
      try {
         Class.forName("org.hsqldb.jdbc.JDBCDriver");
         con = DriverManager.getConnection(
            "jdbc:hsqldb:hsql://localhost/testdb", "SA", "");
         stmt = con.createStatement();
         result = stmt.executeQuery(
            "SELECT id, title, author from tutorials_tbl
            ORDER BY author ASC");
         
         while(result.next()){
            System.out.println(result.getInt("id")+" |
            "+result.getString("title")+" |
            "+result.getString("author"));
         }
      } catch (Exception e) {
         e.printStackTrace(System.out);
      }
   }
}

您可以使用以下命令启动数据库。

>cd C:hsqldb-2.3.4hsqldb
hsqldb>java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0
file:hsqldb/demodb --dbname.0 testdb

使用以下命令编译并执行上述程序。

>javac OrderBy.java
>java OrderBy

执行上述命令后,将收到以下输出。

102 | Learn MySQL           | Abdul S
104 | Learn JDB             | Ajith kumar
103 | Learn Excell          | Bavya Kanna
100 | Learn PHP             | John Poul
105 | Learn Junit           | Sathya Murthi
101 | C and Data Structures | Yaswanth

HSQLDB - 加入

每当需要使用单个查询从多个表中检索数据时,可以使用RDBMS中的JOINS。您可以在单SQL查询中使用多个表。加入HSQLDB的行为是指将两个或多个表砸到一个表中。

考虑以下客户和订单表。

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 |
+----+----------+-----+-----------+----------+
Orders:
+-----+---------------------+-------------+--------+
|OID  |         DATE        | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |      3      |  3000  |
| 100 | 2009-10-08 00:00:00 |      3      |  1500  |
| 101 | 2009-11-20 00:00:00 |      2      |  1560  |
| 103 | 2008-05-20 00:00:00 |      4      |  2060  |
+-----+---------------------+-------------+--------+

现在,让我们尝试检索客户的数据和相应客户放置的订单金额。这意味着我们正在从客户和订单表中检索记录数据。我们可以通过在HSQLDB中使用JOINS概念来实现。以下是JOIN查询的相同。

SELECT ID, NAME, AGE, AMOUNT FROM CUSTOMERS, ORDERS WHERE CUSTOMERS.ID =
ORDERS.CUSTOMER_ID;

执行上述查询后,您将收到以下输出。

+----+----------+-----+--------+
| ID |   NAME   | AGE | AMOUNT |
+----+----------+-----+--------+
|  3 | kaushik  |  23 |  3000  |
|  3 | kaushik  |  23 |  1500  |
|  2 | Khilan   |  25 |  1560  |
|  4 | Chaitali |  25 |  2060  |
+----+----------+-----+--------+

JOIN类型

HSQLDB中有不同类型的联接。

内部联接

最常用的和重要的连接是INNER JOIN。它也被称为EQUIJOIN。

INNER JOIN通过基于连接谓词组合两个表(table1和table2)的列值来创建新的结果表。该查询将table1的每一行与table2的每一行进行比较,以找到满足连接谓词的所有行对。当满足连接谓词时,每个匹配的行A和B的列值被合并到结果行中。

用法

INNER JOIN的基本语法如下。

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_field = table2.common_field;

考虑以下两个表,一个标题为CUSTOMERS表,另一个标题为ORDERS表,如下所示:

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

+-----+---------------------+-------------+--------+
| OID |         DATE        | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |      3      | 3000   |
| 100 | 2009-10-08 00:00:00 |      3      | 1500   |
| 101 | 2009-11-20 00:00:00 |      2      | 1560   |
| 103 | 2008-05-20 00:00:00 |      4      | 2060   |
+-----+---------------------+-------------+--------+

现在,让我们使用INNER JOIN查询来连接这两个表,如下所示:

SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
INNER JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

执行上述查询后,您将收到以下输出。

+----+----------+--------+---------------------+
| ID |   NAME   | AMOUNT |         DATE        |
+----+----------+--------+---------------------+
| 3  |  kaushik |  3000  | 2009-10-08 00:00:00 |
| 3  |  kaushik |  1500  | 2009-10-08 00:00:00 |
| 2  |  Khilan  |  1560  | 2009-11-20 00:00:00 |
| 4  | Chaitali |  2060  | 2008-05-20 00:00:00 |
+----+----------+--------+---------------------+

左加入

HSQLDB LEFT JOIN返回左表中的所有行,即使右表中没有匹配项。这意味着如果ON子句与右表中的0(零)记录匹配,则连接仍将返回结果中的一行,但在右侧表的每列中为NULL。

这意味着左连接将返回左表中的所有值,加上右表中的匹配值,如果没有匹配连接谓词,则返回NULL。

用法

LEFT JOIN的基本语法如下:

SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;

这里给定的条件可以是任何给定的表达式,根据您的要求。

考虑以下两个表,一个标题为CUSTOMERS表,另一个标题为ORDERS表,如下所示:

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

+-----+---------------------+-------------+--------+
| OID |        DATE         | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |     3       | 3000   |
| 100 | 2009-10-08 00:00:00 |     3       | 1500   |
| 101 | 2009-11-20 00:00:00 |     2       | 1560   |
| 103 | 2008-05-20 00:00:00 |     4       | 2060   |
+-----+---------------------+-------------+--------+

现在,让我们使用LEFT JOIN查询来连接这两个表,如下所示:

SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

执行上述查询后,您将收到以下输出 -

+----+----------+--------+---------------------+
| ID |   NAME   | AMOUNT |         DATE        |
+----+----------+--------+---------------------+
|  1 |  Ramesh  |  NULL  |        NULL         |
|  2 |  Khilan  |  1560  | 2009-11-20 00:00:00 |
|  3 |  kaushik |  3000  | 2009-10-08 00:00:00 |
|  3 |  kaushik |  1500  | 2009-10-08 00:00:00 |
|  4 | Chaitali |  2060  | 2008-05-20 00:00:00 |
|  5 |  Hardik  |  NULL  |        NULL         |
|  6 |  Komal   |  NULL  |        NULL         |
|  7 |  Muffy   |  NULL  |        NULL         |
+----+----------+--------+---------------------+

右加入

HSQLDB RIGHT JOIN返回右表中的所有行,即使左表中没有匹配。这意味着如果ON子句与左表中的0(零)记录匹配,则连接仍将返回结果中的一行,但在左侧表的每列中为NULL。

这意味着右连接将返回正确表中的所有值,如果没有匹配的连接谓词,则返回左表中的匹配值或NULL。

用法

RIGHT JOIN的基本语法如下:

SELECT table1.column1, table2.column2...
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;

考虑以下两个表,一个标题为CUSTOMERS表,另一个标题为ORDERS表,如下所示:

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

+-----+---------------------+-------------+--------+
| OID |       DATE          | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |      3      |  3000  |
| 100 | 2009-10-08 00:00:00 |      3      |  1500  |
| 101 | 2009-11-20 00:00:00 |      2      |  1560  |
| 103 | 2008-05-20 00:00:00 |      4      |  2060  |
+-----+---------------------+-------------+--------+

现在,让我们使用RIGHT JOIN查询来连接这两个表,如下所示:

SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
RIGHT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

执行上述查询后,您将收到以下结果。

+------+----------+--------+---------------------+
|  ID  |   NAME   | AMOUNT |        DATE         |
+------+----------+--------+---------------------+
|  3   |  kaushik |  3000  | 2009-10-08 00:00:00 |
|  3   |  kaushik |  1500  | 2009-10-08 00:00:00 |
|  2   |  Khilan  |  1560  | 2009-11-20 00:00:00 |
|  4   | Chaitali |  2060  | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+

完全加入

HSQLDB FULL JOIN结合了左右外连接的结果。

连接的表将包含来自两个表的所有记录,并为两侧缺少的匹配填充NULL。

用法

FULL JOIN的基本语法如下:

SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;

这里给定的条件可以是任何给定的表达式,根据您的要求。

考虑以下两个表,一个标题为CUSTOMERS表,另一个标题为ORDERS表,如下所示:

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

+-----+---------------------+-------------+--------+
| OID |         DATE        | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |    3        | 3000   |
| 100 | 2009-10-08 00:00:00 |    3        | 1500   |
| 101 | 2009-11-20 00:00:00 |    2        | 1560   |
| 103 | 2008-05-20 00:00:00 |    4        | 2060   |
+-----+---------------------+-------------+--------+

现在,让我们使用FULL JOIN查询来连接这两个表,如下所示:

SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS
FULL JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

执行上述查询后,您将收到以下结果。

+------+----------+--------+---------------------+
|  ID  |    NAME  | AMOUNT |        DATE         |
+------+----------+--------+---------------------+
|   1  |  Ramesh  |  NULL  |        NULL         |
|   2  |  Khilan  |  1560  | 2009-11-20 00:00:00 |
|   3  |  kaushik |  3000  | 2009-10-08 00:00:00 |
|   3  |  kaushik |  1500  | 2009-10-08 00:00:00 |
|   4  | Chaitali |  2060  | 2008-05-20 00:00:00 |
|   5  |  Hardik  |  NULL  |        NULL         |
|   6  |   Komal  |  NULL  |        NULL         |
|   7  |   Muffy  |  NULL  |        NULL         |
|   3  |  kaushik |  3000  | 2009-10-08 00:00:00 |
|   3  |  kaushik |  1500  | 2009-10-08 00:00:00 |
|   2  |  Khilan  |  1560  | 2009-11-20 00:00:00 |
|   4  | Chaitali |  2060  | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+

自我加盟

SQL SELF JOIN用于将表连接到自身,就像表是两个表一样,临时重命名SQL语句中的至少一个表。

用法

SELF JOIN的基本语法如下:

SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_field = b.common_field;

这里,WHERE子句可以是任何给定的表达式,根据您的要求。

考虑以下两个表,一个标题为CUSTOMERS表,另一个标题为ORDERS表,如下所示:

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

现在,让我们使用SELF JOIN查询来加入这个表,如下所示:

SELECT a.ID, b.NAME, a.SALARY FROM CUSTOMERS a, CUSTOMERS b
WHERE a.SALARY > b.SALARY;

执行上述查询后,您将收到以下输出 -

+----+----------+---------+
| ID |   NAME   | SALARY  |
+----+----------+---------+
| 2  |  Ramesh  | 1500.00 |
| 2  |  kaushik | 1500.00 |
| 1  | Chaitali | 2000.00 |
| 2  | Chaitali | 1500.00 |
| 3  | Chaitali | 2000.00 |
| 6  | Chaitali | 4500.00 |
| 1  |  Hardik  | 2000.00 |
| 2  |  Hardik  | 1500.00 |
| 3  |  Hardik  | 2000.00 |
| 4  |  Hardik  | 6500.00 |
| 6  |  Hardik  | 4500.00 |
| 1  |  Komal   | 2000.00 |
| 2  |  Komal   | 1500.00 |
| 3  |  Komal   | 2000.00 |
| 1  |  Muffy   | 2000.00 |
| 2  |  Muffy   | 1500.00 |
| 3  |  Muffy   | 2000.00 |
| 4  |  Muffy   | 6500.00 |
| 5  |  Muffy   | 8500.00 |
| 6  |  Muffy   | 4500.00 |
+----+----------+---------+

HsqlDB - 空值

SQL NULL是用于表示缺失值的术语。表中的NULL值是一个字段中的值,显示为空白。每当我们尝试给出一个条件,将字段或列值与NULL进行比较时,它将无法正常工作。

我们可以通过使用三件事来处理NULL值。

要查找NULL或NOT NULL的列,请分别使用IS NULL或IS NOT NULL。

示例

让我们考虑一个例子,其中有一个表tcount_tbl,其中包含两列,作者和tutorial_count。我们可以向tutorial_count提供NULL值,表示作者甚至没有发布一个教程。因此,该作者的tutorial_count值为NULL。

执行以下查询。

create table tcount_tbl(author varchar(40) NOT NULL, tutorial_count INT);
INSERT INTO tcount_tbl values ("Abdul S", 20);
INSERT INTO tcount_tbl values ("Ajith kumar", 5);
INSERT INTO tcount_tbl values ("Jen", NULL);
INSERT INTO tcount_tbl values ("Bavya kanna", 8);
INSERT INTO tcount_tbl values ("mahran", NULL);
INSERT INTO tcount_tbl values ("John Poul", 10);
INSERT INTO tcount_tbl values ("Sathya Murthi", 6);

使用以下命令显示tcount_tbl表中的所有记录

select * from tcount_tbl;

执行上述命令后,将收到以下输出。

+-----------------+----------------+
|     author      | tutorial_count |
+-----------------+----------------+
|      Abdul S    |      20        |
|    Ajith kumar  |      5         |
|        Jen      |     NULL       |
|    Bavya kanna  |      8         |
|       mahran    |     NULL       |
|     John Poul   |      10        |
|   Sathya Murthi |      6         |
+-----------------+----------------+

要查找tutorial_count列为NULL的记录,以下是查询。

SELECT * FROM tcount_tbl WHERE tutorial_count IS NULL;

执行查询后,您将收到以下输出。

+-----------------+----------------+
|     author      | tutorial_count |
+-----------------+----------------+
|       Jen       |     NULL       |
|      mahran     |     NULL       |
+-----------------+----------------+

要查找tutorial_count列不为NULL的记录,以下是查询。

SELECT * FROM tcount_tbl WHERE tutorial_count IS NOT NULL;

执行查询后,您将收到以下输出。

+-----------------+----------------+
|      author     | tutorial_count |
+-----------------+----------------+
|      Abdul S    |      20        |
|     Ajith kumar |       5        |
|     Bavya kanna |       8        |
|     John Poul   |      10        |
|   Sathya Murthi |       6        |
+-----------------+----------------+

HSQLDB - JDBC程序

这是JDBC程序,从表tcount_tbl中分别检索记录,其中tutorial_ count为NULL,tutorial_count为NOT NULL。将以下程序保存到NullValues.java中

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class NullValues {
   public static void main(String[] args) {
      Connection con = null;
      Statement stmt_is_null = null;
      Statement stmt_is_not_null = null;
      ResultSet result = null;
      try {
         Class.forName("org.hsqldb.jdbc.JDBCDriver");
         con = DriverManager.getConnection(
            "jdbc:hsqldb:hsql://localhost/testdb", "SA", "");
         stmt_is_null = con.createStatement();
         stmt_is_not_null = con.createStatement();
         result = stmt_is_null.executeQuery(
            "SELECT * FROM tcount_tbl WHERE tutorial_count IS NULL;");
         System.out.println("Records where the tutorial_count is NULL");
         
         while(result.next()){
            System.out.println(result.getString("author")+" |
            "+result.getInt("tutorial_count"));
         }
         result = stmt_is_not_null.executeQuery(
            "SELECT * FROM tcount_tbl WHERE tutorial_count IS NOT NULL;");
         System.out.println("Records where the tutorial_count is NOT NULL");
         
         while(result.next()){
            System.out.println(result.getString("author")+" |
            "+result.getInt("tutorial_count"));
         }
      } catch (Exception e) {
         e.printStackTrace(System.out);
      }
   }
}

使用以下命令编译并执行上述程序。

>javac NullValues.java
>Java NullValues

执行上述命令后,将收到以下输出。

Records where the tutorial_count is NULL
Jen         | 0
mahran      | 0

Records where the tutorial_count is NOT NULL
Abdul S        | 20
Ajith kumar    | 5
Bavya kanna    | 8
John Poul      | 10
Sathya Murthi  | 6

HSQLDB - 正则表达式

HSQLDB支持基于正则表达式和REGEXP运算符的模式匹配操作的一些特殊符号。

以下是模式表,可以与REGEXP运算符一起使用。

模式 什么模式匹配
^ 字符string开始
$ 字符string结束
任何单个字符
[...] 方括号之间列出的任何字符
[^ ...] 任何字符未列在方括号之间
p1 | p2 | p3 交替 匹配任何模式p1,p2或p3
* 前一个元素的零个或多个实例
+ 前一个元素的一个或多个实例
{n} 前一个元素的n个实例
{m,n} m到前一个元素的n个实例

示例

让我们尝试不同的示例查询来满足我们的要求。看看下面给出的查询。

尝试此查询以查找名称以“^ A”开头的所有作者。

SELECT author FROM tcount_tbl WHERE REGEXP_MATCHES(author,"^A.*");

执行上述查询后,您将收到以下输出。

+-----------------+
|     author      |
+-----------------+
|     Abdul S     |
|    Ajith kumar  |
+-----------------+

尝试此查询以查找名称以“ul $”结尾的所有作者。

SELECT author FROM tcount_tbl WHERE REGEXP_MATCHES(author,".*ul$");

执行上述查询后,您将收到以下输出。

+-----------------+
|     author      |
+-----------------+
|    John Poul    |
+-----------------+

尝试此查询以查找名称中包含“th”的所有作者。

SELECT author FROM tcount_tbl WHERE REGEXP_MATCHES(author,".*th.*");

执行上述查询后,您将收到以下输出。

+-----------------+
|     author      |
+-----------------+
|    Ajith kumar  | 
|     Abdul S     |
+-----------------+

尝试这个查询找到所有作者的名字以元音(a,e,i,o,u)开头。

SELECT author FROM tcount_tbl WHERE REGEXP_MATCHES(author,"^[AEIOU].*");

执行上述查询后,您将收到以下输出。

+-----------------+
|     author      |
+-----------------+
|     Abdul S     |
|    Ajith kumar  |
+-----------------+

HSQLDB - 事物

事务是数据库处理操作,其中执行,并视为一个单一的工作单元的顺序组。换句话说,当所有操作成功执行时,只有整个事务才能完成。如果事务中的任何操作失败,则整个事务将失败。

事物属性

基本上,事物支持4个标准属性。它们可以被称为ACID属性。

原子性 - 事务中的所有操作都将成功执行,否则事务将在失败时中止,之前的操作将回滚到之前的位置。

一致性 - 数据库在成功提交的事务时正确更改状态。

隔离 - 它使事务能够独立运行并且彼此透明。

耐久性 - 在系统发生故障的情况下,提交的事务的结果或效果仍然存在。

提交,回滚和保存点

这些关键字主要用于HSQLDB事务。

提交 - 始终通过执行COMMIT命令完成成功的事务。

回滚 - 如果事务中发生故障,则应执行ROLLBACK命令以将事务中引用的每个表都返回到之前的状态。

保存点 - 创建要回滚的事务组内的一个点。

以下示例说明事务概念以及提交,回滚和Savepoint。让我们考虑具有列id,name,age,address和salary的表格。

ID 名称 年龄 地址 薪水
1 拉姆什 32 艾哈迈达巴德 2000.00
2 卡伦 25 德里 1500.00
3 Kaushik 23 哥打 2000.00
4 朝阳 25 孟买 6500.00
5 哈希 27 博帕尔 8500.00
6 卡姆什 22 MP 1500.00
7 Murali 24 印多尔 10000.00

使用以下命令根据上述数据创建客户表。

CREATE TABLE Customer (id INT NOT NULL, name VARCHAR(100) NOT NULL, age INT NOT
NULL, address VARCHAR(20), Salary INT, PRIMARY KEY (id));
Insert into Customer values (1, "Ramesh", 32, "Ahmedabad", 2000);
Insert into Customer values (2, "Karun", 25, "Delhi", 1500);
Insert into Customer values (3, "Kaushik", 23, "Kota", 2000);
Insert into Customer values (4, "Chaitanya", 25, "Mumbai", 6500);
Insert into Customer values (5, "Harish", 27, "Bhopal", 8500);
Insert into Customer values (6, "Kamesh", 22, "MP", 1500);
Insert into Customer values (7, "Murali", 24, "Indore", 10000);

COMMIT示例

以下查询从age = 25的表中删除行,并使用COMMIT命令将这些更改应用于数据库。

DELETE FROM CUSTOMERS WHERE AGE = 25;
COMMIT;

执行上述查询后,您将收到以下输出。

2 rows effected

成功执行上述命令后,通过执行以下给定命令检查客户表的记录。

Select * from Customer;

执行上述查询后,您将收到以下输出。

+----+----------+-----+-----------+----------+
| ID |   NAME   | AGE |   ADDRESS |  SALARY  |
+----+----------+-----+-----------+----------+
| 1  |  Ramesh  |  32 | Ahmedabad |   2000   |
| 3  |  kaushik |  23 |   Kota    |   2000   |
| 5  |  Harish  |  27 |   Bhopal  |   8500   |
| 6  |  Kamesh  |  22 |    MP     |   4500   |
| 7  |  Murali  |  24 |   Indore  |   10000  |
+----+----------+-----+-----------+----------+

回滚示例

让我们考虑与输入相同的客户表。

ID 名称 年龄 地址 薪水
1 拉姆什 32 艾哈迈达巴德 2000.00
2 卡伦 25 德里 1500.00
3 Kaushik 23 哥打 2000.00
4 朝阳 25 孟买 6500.00
5 哈希 27 博帕尔 8500.00
6 卡姆什 22 MP 1500.00
7 Murali 24 印多尔 10000.00

以下是通过从具有age = 25的表中删除记录来解释关于回滚功能的示例查询,然后ROLLBACK数据库中的更改。

DELETE FROM CUSTOMERS WHERE AGE = 25;
ROLLBACK;

成功执行上述两个查询后,可以使用以下命令查看Customer表中的记录数据。

Select * from Customer;

执行上述命令后,将收到以下输出。

+----+----------+-----+-----------+----------+
| ID |   NAME   | AGE |   ADDRESS |  SALARY  |
+----+----------+-----+-----------+----------+
|  1 |  Ramesh  |  32 | Ahmedabad |   2000   |
|  2 |  Karun   |  25 |   Delhi   |   1500   |
|  3 |  Kaushik |  23 |   Kota    |   2000   |
|  4 | Chaitanya|  25 |   Mumbai  |   6500   |
|  5 |  Harish  |  27 |   Bhopal  |   8500   |
|  6 |  Kamesh  |  22 |     MP    |   4500   |
|  7 |  Murali  |  24 |    Indore |   10000  |
+----+----------+-----+-----------+----------+

删除查询会删除其年龄= 25的客户的记录数据。“回滚”命令会回滚客户表上的这些更改。

保存点示例

当您可以将事务回滚到某一点而不回滚整个事务时,保存点是事务中的一个点。

让我们考虑与输入相同的客户表。

ID 名称 年龄 地址 薪水
1 拉姆什 32 艾哈迈达巴德 2000.00
2 卡伦 25 德里 1500.00
3 Kaushik 23 哥打 2000.00
4 朝阳 25 孟买 6500.00
5 哈希 27 博帕尔 8500.00
6 卡姆什 22 MP 1500.00
7 Murali 24 印多尔 10000.00

让我们考虑在这个例子中,你打算从Customers表中删除三个不同的记录。您要在每次删除之前创建一个保存点,以便您可以随时回滚到任何保存点,以将相应的数据返回到其原始状态。

这是一系列的操作。

SAVEPOINT SP1;
DELETE FROM CUSTOMERS WHERE ID = 1;
SAVEPOINT SP2;
DELETE FROM CUSTOMERS WHERE ID = 2;
SAVEPOINT SP3;
DELETE FROM CUSTOMERS WHERE ID = 3;

现在,您创建了三个Savepoint并删除了三个记录。在这种情况下,如果要回滚具有Id 2和3的记录,请使用以下回滚命令。

ROLLBACK TO SP2;

请注意,只有第一次删除,因为您回滚到SP2。使用以下查询显示客户的所有记录。

Select * from Customer;

执行上述查询后,您将收到以下输出。

+----+----------+-----+-----------+----------+
| ID |   NAME   | AGE |   ADDRESS |  SALARY  |
+----+----------+-----+-----------+----------+
|  2 |   Karun  |  25 |  Delhi    |   1500   |
|  3 |  Kaushik |  23 |  Kota     |   2000   |
|  4 | Chaitanya|  25 |  Mumbai   |   6500   |
|  5 |  Harish  |  27 |  Bhopal   |   8500   |
|  6 |  Kamesh  |  22 |  MP       |   4500   |
|  7 |  Murali  |  24 |  Indore   |  10000   |
+----+----------+-----+-----------+----------+

发布保存点

我们可以使用RELEASE命令释放Savepoint。以下是通用语法。

RELEASE SAVEPOINT SAVEPOINT_NAME;

HsqlDB - 改变命令

无论何时需要更改表或字段的名称,请更改字段的顺序,更改字段的数据类型或任何表结构,可以使用ALTER命令实现相同的操作。

让我们考虑一个例子来解释使用不同场景的ALTER命令。

使用以下查询创建一个名为testalter_tbl的表,其字段为" idname "

//below given query is to create a table testalter_tbl table.
create table testalter_tbl(id INT, name VARCHAR(10));

//below given query is to verify the table structure testalter_tbl.
Select * From INFORMATION_SCHEMA.SYSTEM_COLUMNS as C Where C.TABLE_SCHEM =
   "PUBLIC" AND C.TABLE_NAME = "TESTALTER_TBL";

执行上述查询后,您将收到以下输出。

+------------+-------------+------------+-----------+-----------+------------+
|TABLE_SCHEM |  TABLE_NAME | COLUMN_NAME| DATA_TYPE | TYPE_NAME | COLUMN_SIZE|
+------------+-------------+------------+-----------+-----------+------------+
|   PUBLIC   |TESTALTER_TBL|     ID     |     4     |   INTEGER |     4      |
|   PUBLIC   |TESTALTER_TBL|    NAME    |     12    |   VARCHAR |     10     |
+------------+-------------+------------+-----------+-----------+------------+

删除或添加列

无论何时要从HSQLDB表中删除现有的列,那么可以使用DROP子句和ALTER命令。

使用以下查询从表testalter_tbl 中删除列(name)。

ALTER TABLE testalter_tbl DROP name;

在成功执行上述查询之后,您可以使用以下命令知道名称字段是否从表testalter_tbl中删除。

Select * From INFORMATION_SCHEMA.SYSTEM_COLUMNS as C Where C.TABLE_SCHEM =
   "PUBLIC" AND C.TABLE_NAME = "TESTALTER_TBL";

执行上述命令后,将收到以下输出。

+------------+-------------+------------+-----------+-----------+------------+
|TABLE_SCHEM |  TABLE_NAME | COLUMN_NAME| DATA_TYPE | TYPE_NAME | COLUMN_SIZE|
+------------+-------------+------------+-----------+-----------+------------+
|  PUBLIC    |TESTALTER_TBL|      ID    |      4    |   INTEGER |     4      |
+------------+-------------+------------+-----------+-----------+------------+

无论何时要将任何列添加到HSQLDB表中,可以使用ADD子句和ALTER命令。

使用以下查询将名为NAME的列添加到表testalter_tbl中

ALTER TABLE testalter_tbl ADD name VARCHAR(10);

成功执行上述查询后,您可以使用以下命令知道名称字段是否添加到表testalter_tbl中。

Select * From INFORMATION_SCHEMA.SYSTEM_COLUMNS as C Where C.TABLE_SCHEM =
   "PUBLIC" AND C.TABLE_NAME = "TESTALTER_TBL";

执行上述查询后,您将收到以下输出。

+------------+-------------+------------+-----------+-----------+------------+
|TABLE_SCHEM |  TABLE_NAME | COLUMN_NAME| DATA_TYPE | TYPE_NAME | COLUMN_SIZE|
+------------+-------------+------------+-----------+-----------+------------+
|  PUBLIC    |TESTALTER_TBL|      ID    |     4     |   INTEGER |     4      |
|  PUBLIC    |TESTALTER_TBL|     NAME   |     12    |   VARCHAR |     10     |
+------------+-------------+------------+-----------+-----------+------------+

更改列定义或名称

每当需要更改列定义时,请使用MODIFYCHANGE子句以及ALTER命令。

让我们考虑一个例子来解释如何使用CHANGE子句。testalter_tbl包含两个字段 - id和name - 分别具有数据类型int和varchar。现在让我们尝试将id的数据类型从INT更改为BIGINT。以下是进行更改的查询。

ALTER TABLE testalter_tbl CHANGE id id BIGINT;

成功执行上述查询后,可以使用以下命令验证表结构。

Select * From INFORMATION_SCHEMA.SYSTEM_COLUMNS as C Where C.TABLE_SCHEM =
   "PUBLIC" AND C.TABLE_NAME = "TESTALTER_TBL";

执行上述命令后,将收到以下输出。

+------------+-------------+------------+-----------+-----------+------------+
|TABLE_SCHEM |  TABLE_NAME | COLUMN_NAME| DATA_TYPE | TYPE_NAME | COLUMN_SIZE|
+------------+-------------+------------+-----------+-----------+------------+
|  PUBLIC    |TESTALTER_TBL|      ID    |     4     |   BIGINT  |     4      |
|  PUBLIC    |TESTALTER_TBL|     NAME   |     12    |   VARCHAR |     10     |
+------------+-------------+------------+-----------+-----------+------------+

现在让我们尝试在testalter_tbl中将列NAME的大小从10增加到20 以下是使用MODIFY子句以及ALTER命令实现此查询。

ALTER TABLE testalter_tbl MODIFY name VARCHAR(20);

成功执行上述查询后,可以使用以下命令验证表结构。

Select * From INFORMATION_SCHEMA.SYSTEM_COLUMNS as C Where C.TABLE_SCHEM =
   "PUBLIC" AND C.TABLE_NAME = "TESTALTER_TBL";

执行上述命令后,将收到以下输出。

+------------+-------------+------------+-----------+-----------+------------+
|TABLE_SCHEM |  TABLE_NAME | COLUMN_NAME| DATA_TYPE | TYPE_NAME | COLUMN_SIZE|
+------------+-------------+------------+-----------+-----------+------------+
|  PUBLIC    |TESTALTER_TBL|    ID      |      4    |    BIGINT |     4      |
|  PUBLIC    |TESTALTER_TBL|    NAME    |     12    |   VARCHAR |    20      |
+------------+-------------+------------+-----------+-----------+------------+

HSQLDB - 索引

数据库索引是一种数据结构,提高了操作的速度在表中。索引可以使用一个或多个列创建,为快速随机查找和访问记录的有效排序提供依据。

在创建索引时,应该考虑将用于进行SQL查询的列是什么,并在这些列上创建一个或多个索引。

实际上,索引也是表的类型,它们将主键或索引字段和指向每个记录的指针保存到实际表中。

用户看不到索引。它们仅用于加快查询速度,并将被数据库搜索引擎用来快速查找记录。

INSERT和UPDATE语句在具有索引的表上占用更多时间,而SELECT语句在这些表上运行得更快。原因是插入或更新时,数据库也需要插入或更新索引值。

简单独特的索引

您可以在表上创建唯一的索引。一个唯一索引意味着两行不能有相同的索引值。以下是在表上创建索引的语法。

CREATE UNIQUE INDEX index_name
ON table_name (column1, column2,...);

您可以使用一个或多个列创建索引。例如,使用tutorial_author在tutorials_tbl上创建一个索引。

CREATE UNIQUE INDEX AUTHOR_INDEX
ON tutorials_tbl (tutorial_author)

您可以在表上创建一个简单的索引。只需从查询中省略UNIQUE关键字,创建一个简单的索引。一个简单的索引允许表中的重复值。

如果要按照降序对列中的值进行索引,可以在列名后添加保留字DESC。

CREATE UNIQUE INDEX AUTHOR_INDEX
ON tutorials_tbl (tutorial_author DESC)

ALTER命令添加和删除INDEX

有四种类型的语句用于将索引添加到表中 -

以下是在现有表中添加索引的查询。

ALTER TABLE testalter_tbl ADD INDEX (c);

您可以使用DROP子句和ALTER命令删除任何INDEX。以下是删除上述创建的索引的查询。

ALTER TABLE testalter_tbl DROP INDEX (c);

显示INDEX信息

您可以使用SHOW INDEX命令列出与表关联的所有索引。此格式输出(由 G指定)通常对此语句很有用,以避免长行换行。

以下是显示有关表的索引信息的通用语法。

SHOW INDEX FROM table_nameG