HyperSQL数据库(HSQLDB)是一种现代关系型数据库管理器,符合SQL:2011标准和JDBC 4规范。它支持所有的核心功能和RDBMS。HSQLDB用于数据库应用程序的开发,测试和部署。
HSQLDB的主要和独特功能是标准合规性。它可以在用户的应用程序进程内,应用程序服务器内或作为单独的服务器进程提供数据库访问。
HSQLDB使用内存结构来快速操作DB服务器。它可以根据用户的灵活性使用磁盘持久性,并可靠的崩溃恢复。
HSQLDB还适用于处理大数据集的商业智能,ETL和其他应用程序。
HSQLDB具有广泛的企业部署选项,例如XA事务,连接池数据源和远程认证。
HSQLDB以Java编程语言编写,并在Java虚拟机(JVM)中运行。它支持用于数据库访问的JDBC接口。
HSQLDB jar包中有三个不同的组件。
HyperSQL RDBMS引擎(HSQLDB)
HyperSQL JDBC驱动
数据库管理器(GUI数据库访问工具,带Swing和AWT版本)
HyperSQL RDBMS和JDBC驱动程序提供核心功能。数据库管理器是可以与具有JDBC驱动程序的任何数据库引擎一起使用的通用数据库访问工具。
另外一个名为sqltool.jar的jar包含Sql Tool,它是一个命令行数据库访问工具。这是一个通用命令。线数据库访问工具,可以与其他数据库引擎一起使用。
HSQLDB是以纯Java实现的关系数据库管理系统。您可以使用JDBC轻松地将该数据库嵌入到应用程序中。或者您可以单独使用操作。
按照HSQLDB的必备软件安装。
由于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的步骤。
步骤1 - 下载HSQLDB包
从以下链接https://sourceforge.net/projects/hsqldb/files/下载最新版本的HSQLDB数据库。点击链接后,您将获得以下屏幕截图。
单击HSQLDB,下载将立即开始。最后,您将获得名为hsqldb-2.3.4.zip的zip文件。
步骤2 - 提取HSQLDB zip文件
解压缩zip文件并将其放入C:目录。提取后,您将获得一个文件结构,如下面的屏幕截图所示。
步骤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如上所示,然后单击确定。
您将获得HSQLDB数据库的GUI屏幕,如以下屏幕截图所示。
在安装一章中,我们探讨了如何手动连接数据库。在本章中,我们将探讨如何以编程方式连接数据库(使用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服务器提供六类数据类型。
数据类型 | 从 | 至 |
---|---|---|
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分钟精度。
数据类型 | 描述 |
---|---|
char | 最大长度8,000个字符(固定长度非Unicode字符) |
varchar | 最多8,000个字符(可变长度非Unicode数据) |
varchar(max) | 最大长度为231个字符,可变长度的非Unicode数据(仅限SQL Server 2005) |
文本 | 可变长度非Unicode数据,最大长度为2,147,483,647个字符 |
数据类型 | 描述 |
---|---|
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) |
光标 | 引用光标对象 |
表 | 存储结果集以备后续处理 |
创建表的基本强制性要求是表名,字段名和这些字段的数据类型。或者,您还可以为表格提供关键约束。
看看下面的语法。
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数据库中创建名为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表非常简单。但是,删除任何现有的表格时,您需要非常小心,因为删除表格后,丢失的数据将无法恢复。
以下是用于删除HSQLDB表的通用SQL语法。
DROP TABLE table_name;
让我们考虑一个例子,从HSQLDB服务器中删除一个名为employee的表。以下是删除名为employee的表的查询。
DROP TABLE employee;
执行上述查询后,您将收到以下输出 -
(0) rows effected
以下是用于从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
您可以使用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
这是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 | 现在() |
SELECT命令用于从HSQLDB数据库中获取记录数据。在这里,您需要在Select语句中提及必需的字段列表。
这是Select查询的通用语法。
SELECT field1, field2,...fieldN table_name1, table_name2... [WHERE Clause] [OFFSET M ][LIMIT N]
您可以在单个SELECT命令中获取一个或多个字段。
您可以指定star(*)代替字段。在这种情况下,SELECT将返回所有字段。
您可以使用WHERE子句指定任何条件。
您可以使用OFFSET指定一个偏移量,其中SELECT将开始返回记录。默认情况下,offset为零。
您可以使用LIMIT属性限制返回数。
这是一个例子,它从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 | +------+----------------+-----------------+
这是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
一般来说,我们使用SELECT命令从HSQLDB表中获取数据。我们可以使用WHERE条件子句过滤结果数据。使用WHERE,我们可以指定选择条件从表中选择所需的记录。
以下是SELECT命令WHERE子句从HSQLDB表中提取数据的语法。
SELECT field1, field2,...fieldN table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....
您可以使用一个或多个由逗号分隔的表格,使用WHERE子句包含各种条件,但WHERE子句是SELECT命令的可选部分。
您可以使用WHERE子句指定任何条件。
您可以使用AND或OR运算符指定多个条件。
还可以使用WHERE子句与DELETE或UPDATE SQL命令一起指定条件。
我们可以使用条件过滤记录数据。我们在条件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 | +------+----------------+-----------------+
下面是从表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
无论何时要修改表的值,都可以使用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
以下是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表中删除记录,都可以使用DELETE FROM命令。
以下是DELETE命令从HSQLDB表中删除数据的通用语法。
DELETE FROM table_name [WHERE Clause]
如果未指定WHERE子句,则所有记录将从给定的MySQL表中删除。
您可以使用WHERE子句指定任何条件。
您可以一次删除单个表中的记录。
让我们考虑一个例子,从名为tutorials_tbl的表中删除记录数据,其ID为105。以下是实现给定示例的查询。
DELETE FROM tutorials_tbl WHERE id = 105;
执行上述查询后,您将收到以下输出 -
(1) rows effected
以下是实现给定示例的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
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"
您可以使用WHERE子句指定任何条件。
您可以使用LIKE子句以及WHERE子句。
您可以使用LIKE子句代替等号。
当LIKE子句与%符号一起使用时,它将像元字符搜索一样工作。
您可以使用AND或OR运算符指定多个条件。
可以使用WHERE ... LIKE子句与DELETE或UPDATE SQL命令一起指定条件。
让我们考虑一个例子来检索作者姓名以John开头的教程数据列表。以下是给定示例的HSQLDB查询。
SELECT * from tutorials_tbl WHERE author LIKE "John%";
执行上述查询后,您将收到以下输出。
+-----+----------------+-----------+-----------------+ | id | title | author | submission_date | +-----+----------------+-----------+-----------------+ | 100 | Learn PHP | John Poul | 2016-06-20 | +-----+----------------+-----------+-----------------+
以下是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
SQL SELECT命令只要在检索和显示记录时都遵循特定顺序的要求,就从HSQLDB表中提取数据。在这种情况下,我们可以使用ORDER BY子句。
以下是SELECT命令的语法以及ORDER BY子句来对HSQLDB中的数据进行排序。
SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]]
只要该字段被列出,您可以对返回的结果进行排序。
您可以在多个字段上对结果进行排序。
您可以使用关键字ASC或DESC以升序或降序获取结果。默认情况下,它是按升序排列。
您可以以通常的方式使用WHERE ... LIKE子句来设置条件。
让我们考虑一个例子,通过按升序排序作者姓名来获取和排序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 | +------+----------------+-----------------+
以下是通过按升序排序作者姓名来获取和排序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
每当需要使用单个查询从多个表中检索数据时,可以使用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 | +----+----------+-----+--------+
HSQLDB中有不同类型的联接。
INNER JOIN - 在两个表中都有匹配时返回行。
LEFT JOIN - 返回左表中的所有行,即使右表中没有匹配。
RIGHT JOIN - 返回右表中的所有行,即使左表中没有匹配。
FULL JOIN - 在其中一个表中有匹配时返回行。
SELF JOIN - 用于将表自身加入,就像表是两个表一样,临时重命名SQL语句中的至少一个表。
最常用的和重要的连接是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 | +----+----------+---------+
SQL NULL是用于表示缺失值的术语。表中的NULL值是一个字段中的值,显示为空白。每当我们尝试给出一个条件,将字段或列值与NULL进行比较时,它将无法正常工作。
我们可以通过使用三件事来处理NULL值。
IS NULL - 如果列值为NULL,则运算符返回true。
IS NOT NULL - 如果列值为NOT NULL,则运算符返回true。
<=> - 运算符比较值,即使对于两个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 | +-----------------+----------------+
这是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支持基于正则表达式和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 | +-----------------+
甲事务是数据库处理操作,其中执行,并视为一个单一的工作单元的顺序组。换句话说,当所有操作成功执行时,只有整个事务才能完成。如果事务中的任何操作失败,则整个事务将失败。
基本上,事物支持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);
以下查询从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;
无论何时需要更改表或字段的名称,请更改字段的顺序,更改字段的数据类型或任何表结构,可以使用ALTER命令实现相同的操作。
让我们考虑一个例子来解释使用不同场景的ALTER命令。
使用以下查询创建一个名为testalter_tbl的表,其字段为" id和name " 。
//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 | +------------+-------------+------------+-----------+-----------+------------+
每当需要更改列定义时,请使用MODIFY或CHANGE子句以及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 | +------------+-------------+------------+-----------+-----------+------------+
甲数据库索引是一种数据结构,提高了操作的速度在表中。索引可以使用一个或多个列创建,为快速随机查找和访问记录的有效排序提供依据。
在创建索引时,应该考虑将用于进行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 TABLE tbl_name ADD PRIMARY KEY(column_list) - 此语句添加一个PRIMARY KEY,这意味着索引值必须是唯一的,不能为NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name(column_list) - 此语句创建一个索引,其值必须是唯一的(除了NULL值,可能会出现多次)。
ALTER TABLE tbl_name ADD INDEX index_name(column_list) - 这将添加一个普通的索引,其中任何值可能会出现多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name(column_list) - 这将创建一个特殊的FULLTEXT索引,用于文本搜索。
以下是在现有表中添加索引的查询。
ALTER TABLE testalter_tbl ADD INDEX (c);
您可以使用DROP子句和ALTER命令删除任何INDEX。以下是删除上述创建的索引的查询。
ALTER TABLE testalter_tbl DROP INDEX (c);
您可以使用SHOW INDEX命令列出与表关联的所有索引。此格式输出(由 G指定)通常对此语句很有用,以避免长行换行。
以下是显示有关表的索引信息的通用语法。
SHOW INDEX FROM table_nameG