Apache Derby 简明教程

Apache Derby - Quick Guide

Apache Derby - Introduction

Apache Derby 是一个完全基于 (编写/实现于) Java 编程语言的*关系* 数据库 管理 系统。它是由 Apache 软件基金会开发的一个开源数据库。

Oracle 释出了名称为 JavaDB 的 Apache Derby 等价版本。

Features of Apache Derby

以下项是 Derby 数据库的显著功能−

  1. Platform independent − Derby 使用磁盘数据库格式,其中数据库存储在具有与数据库同名的目录中磁盘中的文件中。

  2. No modifying data − 因此,你可以在不修改数据的情况下将 Derby 数据库移至其他计算机。

  3. Transactional support − Derby 对确保数据完整性的事务提供完全支持。

  4. Including databases − 你可以将预构建/现有数据库纳入当前 Derby 应用程序。

  5. Less space − Derby 数据库占用的空间小,即它占用的空间较小,而且易于使用和部署。

  6. Embed with Java Application − Derby 提供了一个可以嵌入到 Java 应用程序中的嵌入式数据库引擎,它将在与应用程序相同的 JVM 中运行。仅加载驱动程序就会启动数据库,它将随应用程序停止。

Limitations of Apache Derby

以下是 Apache Derby 的局限性−

  1. Derby 不支持 BLOB 和 LONGVARCHAR 等数据类型的索引。

  2. 如果 Derby 没有足够的磁盘空间,它将立即关闭。

Data storage

在存储数据时,Apache Derby 遵循一个称为 conglomerate 的概念。其中,表的数据将存储在单独的文件中。同样,表的每个索引也存储在单独的文件中。因此,数据库中每个表或索引都将有一个单独的文件。

Apache Derby Library/Components

Apache Derby 发行版提供各种组件。在已下载的 Apache 发行版的 lib 文件夹中,你可以观察到表示各种组件的 jar 文件。

Jar file

Component

Description

derby.jar

数据库引擎和 JDBC 驱动程序

Apache Derby 的数据库引擎是一个嵌入式关系数据库引擎,它支持 JDBC 和 SQL API。它也充当嵌入式驱动程序,你可以使用该嵌入式驱动程序通过 Java 应用程序与 Derby 通信。

derbynet.jar derbyrun.jar

Network server

Apache Derby 的网络服务器提供了客户端服务器功能,其中客户端可以通过网络连接到 Derby 服务器。

derbyclient.jar

Network client JDBC driver

derbytools.jar

Command line tools

该 jar 文件包含诸如 sysinfo, ijdblook 等工具。

derbyoptionaltools.jar

可选的命令行实用程序(工具)

此 JAR 文件提供可选工具:databaseMetaData 可选工具、foreignViews 可选工具、luceneSupport 可选工具、rawDBReader 可选工具、simpleJson 可选工具等

derbyLocale_XX.jar

本地化消息的 JAR 文件

除了上述 JAR 文件外,您还可以看到几个 derbyLocale_XX.jar(es、fr、hu、it、ja 等)。使用这些文件,您可以本地化 Apache Derby 的消息。

Apache Derby - Deployment Modes

您可以在两种模式下部署 Apache Derby,即嵌入式模式和服务器模式。

Embedded mode

您可以使用 Java 应用程序(使用嵌入式驱动程序)在嵌入式模式下运行 Derby。如果您在嵌入式模式下部署 Derby,数据库引擎将在与 Java 应用程序相同的 JVM 中运行。它随应用程序一起启动和停止。您只能使用此应用程序访问数据库。

embedded mode

Server mode

在服务器模式中,Derby 将在应用程序服务器的 JVM 中运行,您可以在其中向服务器发送请求以访问它。与嵌入式模式不同,多个应用程序(Java)可以向服务器发送请求并访问数据库。

server mode

Apache Derby - Environment Setup

后续章节将说明如何下载和安装 Apache Derby。

Downloading Apache Derby

访问 Apache Derby 主页 https://db.apache.org/derby/ 。单击“下载”选项卡。

home page of apache derby

选择并单击 Apache Derby 最新版本的链接。

latest version of apache derby

单击所选链接后,您将被重新定向到 Apache Derby 的 Distributions 页面。如果您在此观察,derby 提供了名为 db-derby-bin、db-derbylib.zip、db-derby-lib-debug.zip 和 db-derby-src.zip 的发行版。

下载 db-derby-bin 文件夹。将其内容复制到您要安装 Apache Derby 的单独文件夹中。(例如, C:\Derby

现在,要使用 Derby,

  1. 确保您已经通过传递 Java 安装文件夹中 bin 文件夹的位置设置了 JAVA_HOME 变量,并将 JAVA_HOME/bin 包含在 PATH 变量中。

  2. 创建一个新的环境变量 DERBY_HOME ,其值为 C:\Derby。

  3. db-derby-bin 发行版的 bin 文件夹(我们将其更改为 C:\Derby\bin)包含所有必需的 jar 文件。

如前所述,Apache Derby 可以通过以下两种方式安装/部署 −

  1. Embedded mode − 在此模式下,您需要使用嵌入式 Derby JDBC 驱动程序访问数据库。您可以通过 Java 应用程序启动和停止 derby。数据库引擎和您的应用程序都将在同一 JVM 中运行。

  2. Network Server mode − 在此模式下,您可以以典型的客户端服务器方式访问 Derby,其中 Derby 嵌入在服务器系统中。然后,在不同 JVM(服务器的 JVM)中运行的客户端计算机将向服务器发送请求,服务器对这些请求做出响应。

客户端可以是服务器相同系统计算机中的另一个 JVM 或远程系统的 Java 应用程序。

Installing Derby in Embedded Mode

要以嵌入式模式安装 Apache Derby,请在您的 CLASSPATH 中包含 jar 文件 derby.jar

或者,您可以通过运行 setEmbeddedCP 命令设置必需 jar 文件的类路径。浏览 Apache Derby 的 bin 目录,并如下所示运行此文件:

C:\Users\MYUSER>cd %DERBY_HOME%/bin
C:\Derby\bin>setEmbeddedCP.bat
C:\Derby\bin>SET DERBY_HOME=C:\Derby
C:\Derby\bin>set
CLASSPATH=C:\Derby\lib\derby.jar;C:\Derby\lib\derbytools.jar;C:\Derby/lib/derby
optionaltools.jar;C:\Users\Tutorialspoint\Google
Drive\Office\Derby\derby_zip\New folder\db-derby-10.12.1.1-
bin\lib;C:\EXAMPLES_\Task\jars\*;C:\EXAMPLES\jars\mysql-connector-java-5.1.40-
bin.jar;C:\Users\Tutorialspoint\Google Drive\Office\37.Junit
Update\jars;C:\Program Files\Apache Software Foundation\Tomcat
8.5\lib\*;C:\Derby\lib\*;

设置 Apache Derby 后,要访问它,请使用嵌入式驱动运行 Java 程序。

Verification

您可以使用 ij 工具验证设置,如下所示:

C:\Derby\bin>ij
ij version 10.14
ij> connect 'jdbc:derby:SampleDB;create=true';
ij>

Installing Derby in Network Server Mode

要在网络服务器模式下安装 Apache Derby,您需要将 derbynet.jarderbytools.jar 文件包含到 CLASSPATH 中。

或者,您可以通过运行 setNetworkServerCP 命令设置必需 jar 文件的类路径。浏览 Apache Derby 的 bin 目录,并如下所示运行此文件:

C:\Users\MYUSER>cd %DERBY_HOME%/bin
C:\Derby\bin>setNetworkServerCP.bat
C:\Derby\bin>SET DERBY_INSTALL=C:\Derby
C:\Derby\bin>set
CLASSPATH=C:\Derby\lib\derbynet.jar;C:\Derby\lib\derbytools.jar;C:\Derby/lib/de
rbyoptionaltools.jar;C:\Users\Tutorialspoint\Google
Drive\Office\Derby\derby_zip\New folder\db-derby-10.12.1.1-
bin\lib;C:\EXAMPLES_\Task\jars\*;C:\EXAMPLES\jars\mysql-connector-java-5.1.40-
bin.jar;C:\Users\Tutorialspoint\Google Drive\Office\37.Junit
Update\jars;C:\Program Files\Apache Software Foundation\Tomcat
8.5\lib\*;C:\Derby\lib\*;

Starting Derby in Server Mode

您可以通过运行命令 startNetworkServer 启动网络服务器。浏览 Apache Derby 的 bin 目录,并如下所示运行此命令:

C:\Derby\bin>startNetworkServer
Fri Jan 04 11:20:30 IST 2019 : Security manager installed using the Basic
server security policy.
Fri Jan 04 11:20:30 IST 2019 : Apache Derby Network Server - 10.14.2.0 -
(1828579) started and ready to accept connections on port 1527

或者,您可以如下所示使用 derbyrun.jar 启动服务器:

C:\Users\MYUSER>cd %DERBY_HOME%/lib
C:\Derby\lib>java -jar derbyrun.jar server start
Fri Jan 04 11:27:20 IST 2019: Security manager installed using the Basic server
security policy.
Fri Jan 04 11:27:21 IST 2019: Apache Derby Network Server - 10.14.2.0 -
(1828579) started and ready to accept connections on port 1527

Network Client

在客户端中,将 jar 文件 derbyclient.jarderbytools.jar 添加到 CLASSPATH 中。或者,如下所示运行 setNetworkClientCP 命令:

C:\Users\MYUSER>cd %DERBY_HOME%/bin
C:\Derby\bin>setNetworkClientCP
C:\Derby\bin>SET DERBY_HOME=C:\Derby
C:\Derby\bin>set
CLASSPATH=C:\Derby\lib\derbyclient.jar;C:\Derby\lib\derbytools.jar;C:\Derby/lib
/derbyoptionaltools.jar;C:\Derby\lib\derby.jar;C:\Derby\lib\derbytools.jar;C:\D
erby/lib/derbyoptionaltools.jar;C:\Users\Tutorialspoint\Google
Drive\Office\Derby\derby_zip\New folder\db-derby-10.12.1.1-
bin\lib;C:\EXAMPLES_\Task\jars\*;C:\EXAMPLES\jars\mysql-connector-java-5.1.40-
bin.jar;C:\Users\Tutorialspoint\Google Drive\Office\37.Junit
Update\jars;C:\Program Files\Apache Software Foundation\Tomcat
8.5\lib\*;C:\Derby\lib\*;

然后,您可以从该客户端向服务器发送请求。

Verification

您可以使用 ij 工具验证设置,如下所示:

C:\Derby\bin>ij
ij version 10.14
ij> connect 'jdbc:derby://localhost:1527/SampleDB;create=true';
ij>

Apache Derby Eclipse Environment

在使用 Eclipse 时,您需要为所有必需的 jar 文件设置构建路径。

Step 1: Create a project and set build path

打开 Eclipse 并创建一个示例项目。右键单击该项目,然后选择选项 Build Path → Configure Build 路径,如下所示 −

configure build path

Libraries 选项卡的 Java Build Path 框架中,单击 Add External JARs

java build path

并选择 Derby 安装文件夹的 lib 文件夹中的所需 jar 文件,然后单击 Apply and Close

Apache Derby - Tools

Apache Derby 为您提供诸如 sysinfo, ijdblook 等工具。

sysinfo tool

使用此工具,您可以获取关于 Java 和 Derby 环境的信息。

Browse through the bin folder of Derby installation directory and execute the sysinfo command as shown below −

C:\Users\MY_USER>cd %DERBY_HOME%/bin
C:\Derby\bin>sysinfo

执行之后,它会给您关于 java 和 derby 的系统信息,如下所示 −

------------------ Java Information ------------------
Java Version: 1.8.0_101
Java Vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_101\jre
Java classpath: C:\Users\Tutorialspoint\Google
Drive\Office\Derby\derby_zip\New folder\db-derby-10.12.1.1-
bin\lib;C:\EXAMPLES_\Task\jars\*;C:\EXAMPLES\jars\mysql-connector-java-5.1.40-
bin.jar;C:\Users\Tutorialspoint\Google Drive\Office\37.Junit
Update\jars;C:\Program Files\Apache Software Foundation\Tomcat
8.5\lib\*;C:\Derby\lib\derby.jar;C:\Derby\lib\derbyclient.jar;C:\Derby\lib\derb
yLocale_cs.jar;C:\Derby\lib\derbyLocale_de_DE.jar;C:\Derby\lib\derbyLocale_es.j
ar;C:\Derby\lib\derbyLocale_fr.jar;C:\Derby\lib\derbyLocale_hu.jar;C:\Derby\lib
\derbyLocale_it.jar;C:\Derby\lib\derbyLocale_ja_JP.jar;C:\Derby\lib\derbyLocale
_ko_KR.jar;C:\Derby\lib\derbyLocale_pl.jar;C:\Derby\lib\derbyLocale_pt_BR.jar;C
:\Derby\lib\derbyLocale_ru.jar;C:\Derby\lib\derbyLocale_zh_CN.jar;C:\Derby\lib\
derbyLocale_zh_TW.jar;C:\Derby\lib\derbynet.jar;C:\Derby\lib\derbyoptionaltools
.jar;C:\Derby\lib\derbyrun.jar;C:\Derby\lib\derbytools.jar;;C:\Derby/lib/derby.
jar;C:\Derby/lib/derbynet.jar;C:\Derby/lib/derbyclient.jar;C:\Derby/lib/derbyto
ols.jar;C:\Derby/lib/derbyoptionaltools.jar
OS name: Windows 10
OS architecture: amd64
OS version: 10.0
Java user name: Tutorialspoint
Java user home: C:\Users\Tutorialspoint
Java user dir: C:\Derby\bin
java.specification.name: Java Platform API Specification
java.specification.version: 1.8
java.runtime.version: 1.8.0_101-b13
--------- Derby Information --------
[C:\Derby\lib\derby.jar] 10.14.2.0 - (1828579)
[C:\Derby\lib\derbytools.jar] 10.14.2.0 - (1828579)
[C:\Derby\lib\derbynet.jar] 10.14.2.0 - (1828579)
[C:\Derby\lib\derbyclient.jar] 10.14.2.0 - (1828579)
[C:\Derby\lib\derbyoptionaltools.jar] 10.14.2.0 - (1828579)
------------------------------------------------------
----------------- Locale Information -----------------
Current Locale : [English/United States [en_US]]
Found support for locale: [cs]
 version: 10.14.2.0 - (1828579)
Found support for locale: [de_DE]
 version: 10.14.2.0 - (1828579)
Found support for locale: [es]
 version: 10.14.2.0 - (1828579)
Found support for locale: [fr]
 version: 10.14.2.0 - (1828579)
Found support for locale: [hu]
 version: 10.14.2.0 - (1828579)
Found support for locale: [it]
 version: 10.14.2.0 - (1828579)
Found support for locale: [ja_JP]
 version: 10.14.2.0 - (1828579)
Found support for locale: [ko_KR]
 version: 10.14.2.0 - (1828579)
Found support for locale: [pl]
 version: 10.14.2.0 - (1828579)
Found support for locale: [pt_BR]
 version: 10.14.2.0 - (1828579)
Found support for locale: [ru]
 version: 10.14.2.0 - (1828579)
Found support for locale: [zh_CN]
 version: 10.14.2.0 - (1828579)
Found support for locale: [zh_TW]
 version: 10.14.2.0 - (1828579)
------------------------------------------------------
------------------------------------------------------

ijtool

使用此工具,您可以运行 apache Derby 的脚本和查询。

Browse through the bin folder of Derby installation directory and execute the ij command as shown below −

C:\Users\MY_USER>cd %DERBY_HOME%/bin
C:\Derby\bin>ij

这将为您提供 ij shell ,您可在其中执行 derby 命令和脚本,如下所示 −

ij version 10.14
ij>

使用 help 命令,您可以获取此 shell 支持的命令列表。

C:\Derby\bin>cd %DERBY_HOME%/bin
C:\Derby\bin>ij
ij version 10.14
ij> help;
Supported commands include:
 PROTOCOL 'JDBC protocol' [ AS ident ];
 -- sets a default or named protocol
 DRIVER 'class for driver'; -- loads the named class
 CONNECT 'url for database' [ PROTOCOL namedProtocol ] [ AS connectionName ];
 -- connects to database URL
 -- and may assign identifier
 SET CONNECTION connectionName; -- switches to the specified connection
 SHOW CONNECTIONS; -- lists all connections
 AUTOCOMMIT [ ON | OFF ]; -- sets autocommit mode for the connection
 DISCONNECT [ CURRENT | connectionName | ALL ];
 -- drop current, named, or all connections;
-- the default is CURRENT
 SHOW SCHEMAS; -- lists all schemas in the current database
 SHOW [ TABLES | VIEWS | PROCEDURES | FUNCTIONS | SYNONYMS ] { IN schema };
 -- lists tables, views, procedures, functions or
synonyms
 SHOW INDEXES { IN schema | FROM table };
 -- lists indexes in a schema, or for a table
 SHOW ROLES; -- lists all defined roles in the database,
sorted
 SHOW ENABLED_ROLES; -- lists the enabled roles for the current
 -- connection (to see current role use
 -- VALUES CURRENT_ROLE), sorted
 SHOW SETTABLE_ROLES; -- lists the roles which can be set for the
 -- current connection, sorted
 DESCRIBE name; -- lists columns in the named table
 COMMIT; -- commits the current transaction
 ROLLBACK; -- rolls back the current transaction
 PREPARE name AS 'SQL-J text'; -- prepares the SQL-J text
 EXECUTE { name | 'SQL-J text' } [ USING { name | 'SQL-J text' } ] ;
 -- executes the statement with parameter
-- values from the USING result set row
 REMOVE name; -- removes the named previously prepared
statement
 RUN 'filename'; -- run commands from the named file
 ELAPSEDTIME [ ON | OFF ]; -- sets elapsed time mode for ij
 MAXIMUMDISPLAYWIDTH integerValue;
 -- sets the maximum display width for
-- each column to integerValue
 ASYNC name 'SQL-J text'; -- run the command in another thread
 WAIT FOR name; -- wait for result of ASYNC'd command
 HOLDFORCONNECTION; -- sets holdability for a connection to HOLD
 -- (i.e. ResultSet.HOLD_CURSORS_OVER_COMMIT)
 NOHOLDFORCONNECTION; -- sets holdability for a connection to NO HOLD
 -- (i.e. ResultSet.CLOSE_CURSORS_AT_COMMIT)
 GET [SCROLL INSENSITIVE] [WITH { HOLD | NOHOLD }] CURSOR name AS 'SQL-J
query';
 -- gets a cursor (JDBC result set) on the query
-- the default is a forward-only cursor with
holdability
 NEXT name; -- gets the next row from the named cursor
 FIRST name; -- gets the first row from the named scroll
cursor
 LAST name; -- gets the last row from the named scroll
cursor
 PREVIOUS name; -- gets the previous row from the named scroll
cursor
 ABSOLUTE integer name; -- positions the named scroll cursor at the
absolute row number
 -- (A negative number denotes position from the
last row.)
 RELATIVE integer name; -- positions the named scroll cursor relative to
the current row
 -- (integer is number of rows)
 AFTER LAST name; -- positions the named scroll cursor after the
last row
 BEFORE FIRST name; -- positions the named scroll cursor before the
first row
 GETCURRENTROWNUMBER name; -- returns the row number for the current
position of the named scroll cursor
 -- (0 is returned when the cursor is not
positioned on a row.)
 CLOSE name; -- closes the named cursor
 LOCALIZEDDISPLAY [ ON | OFF ];
 -- controls locale sensitive data representation
 EXIT; -- exits ij
 HELP; -- shows this message
Any unrecognized commands are treated as potential SQL-J commands and executed
directly.

dblooktool

此工具用于生成数据定义语言。

浏览 Derby 安装目录的 bin 文件夹,并执行 dblook 命令,如下所示 −

C:\Users\MY_USER>cd %DERBY_HOME%/bin
C:\Derby\bin>dblook -d myURL

其中, myURL 是您需要为其生成 DDL 的数据库的连接 URL。

Apache Derby - Syntax

此章节为您提供所有 Apache Derby SQL 语句的语法。

所有语句均以任何关键字(如 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP、CREATE、USE、SHOW 等)开始,所有语句均以分号 (;) 结束。

Apache Derby 的 SQL 语句大小写敏感,包括表名。

CREATE Statement

CREATE TABLE table_name (
   column_name1 column_data_type1 constraint (optional),
   column_name2 column_data_type2 constraint (optional),
   column_name3 column_data_type3 constraint (optional)
);

DROP TABLE

DROP TABLE table_name;

INSERT Statement

INSERT INTO table_name VALUES (column_name1, column_name2, ...);

SELECT Statement

SELECT column_name, column_name, ... FROM table_name;

UPDATE Statement

UPDATE table_name
   SET column_name = value, column_name = value, ...
   WHERE conditions;

DELETE Statement

DELETE FROM table_name WHERE condition;

DESCRIBE Statement

Describe table_name

SQL TRUNCATE TABLE Statement

TRUNCATE TABLE table_name;

ALTER Statement – Adding column

ALTER TABLE table_name ADD COLUMN column_name column_type;

ALTER Statement – Adding constraint

ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint (column_name);

ALTER Statement – Dropping column

ALTER TABLE table_name DROP COLUMN column_name;

ALTER Statement – Dropping constraint

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

WHERE Clause

SELECT * from table_name WHERE condition;
or,
DELETE from table_name WHERE condition;
or,
UPDATE table_name SET column_name = value WHERE condition;

GROUP BY Clause

SELECT column1, column2, . . . table_name GROUP BY column1, column2, . . .;

ORDER BY Clause

SELECT * FROM table_name ORDER BY column_name ASC|DESC.

Having Clause

SELECT column1, column2 . . . from table_name GROUP BY column having
condition;

Creating Index

CTREATE INDEX index_name on table_name (column_name);

Creating an UNIQUE index

CREATE UNIQUE INDEX index_name on table_name (column_name);

Creating a COMPOSITE index

CREATE INDEX index_name on table_name (column_name1, column_name2);

Displaying the Indexes

SHOW INDEXES FROM table_name;

Dropping Indexes

DROP INDEX index_name;

Apache Derby - Data Types

数据类型是一种属性,用于指定任何对象的数据类型。每个列、变量和表达式都具有相关的类型。您可以在创建表时使用这些数据类型。您可以根据自己的要求为表列选择数据类型。

Derby 服务器提供以下列出的类别的多种数据类型供您使用 −

Integer Numeric Data Types

以下是整数数值数据类型的列表 −

DATA TYPE

SIZE

FROM

TO

SMALLINT

2 bytes

-32768

32767

INTEGER

4 bytes

-2,147,483,648

2,147,483,647

BIGINT

8 bytes

-9223372036854775808

9223372036854775808

Approximate Numeric Data Types

以下是近似数值数据类型的列表 −

DATA TYPE

SIZE

FROM

TO

REAL

4 bytes

-3.40E + 38

3.40E + 38

DOUBLE PRECISION

8 bytes

-1.79E + 308

1.79E + 308

FLOAT

-1.79E + 308

1.79E + 308

Exact Numeric Data Types

以下是精确数值数据类型的列表 −

DATA TYPE

FROM

TO

DECIMAL

-10^38 +1

10^38 -1

NUMERIC

-10^38 +1

10^38 -1

Apache Derby - Create Table

CREATE TABLE 语句用于在 Derby 数据库中创建新表。

Syntax

以下是 CREATE 语句的语法。

CREATE TABLE table_name (
   column_name1 column_data_type1 constraint (optional),
   column_name2 column_data_type2 constraint (optional),
   column_name3 column_data_type3 constraint (optional)
);

在 Apache Derby 中创建表的另一种方式是您可以通过查询指定列名和数据类型。语法如下所示 −

CREATE TABLE table_name AS SELECT * FROM desired_table WITH NO DATA;

Example

以下 SQL 语句创建了一个名为 Student 的表,其中包含四列,其中 id 是主键并且自动生成。

ij> CREATE TABLE Student (
   Id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
   Age INT NOT NULL,
   First_Name VARCHAR(255),
   last_name VARCHAR(255),
   PRIMARY KEY (Id)
);
> > > > > > > 0 rows inserted/updated/deleted

DESCRIBE 命令通过列出列及其详细信息(如果表存在)来描述指定的表。您可以使用此命令验证表是否创建。

ij> DESCRIBE Student;
COLUMN_NAME |TYPE_NAME |DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
ID          |INTEGER   |0   |10  |10    |AUTOINCRE&|NULL      |NO
AGE         |INTEGER   |0   |10  |10    |NULL      |NULL      |NO
FIRST_NAME  |VARCHAR   |NULL|NULL|255   |NULL      |510       |YES
LAST_NAME   |VARCHAR   |NULL|NULL|255   |NULL      |510       |YES
4 rows selected

Create a Table using JDBC Program

本节介绍如何使用 JDBC 应用程序在 Apache Derby 数据库中创建表。

如果您想使用网络客户端请求 Derby 网络服务器,请确保服务器已启动并正在运行。网络客户端驱动的类名为 org.apache.derby.jdbc.ClientDriver ,URL 为 jdbc:derby://localhost:1527/DATABASE_NAME;create=true;user=USER_NAME;passw ord=PASSWORD。

按照以下步骤在 Apache Derby 中创建表 −

Step 1: Register the driver

要与数据库通信,首先,您需要注册驱动。类的 forName() 方法 Class 接受表示类名称的 String 值,并将其加载到内存中,从而自动注册该名称。使用此方法注册驱动。

Step 2: Get the connection

通常,我们与数据库进行通信时执行的第一步就是与数据库连接。类 Connection 表示与数据库服务器之间的物理连接。你可以通过调用类 DriverManager 的方法 getConnection() 创建连接对象。使用此方法来创建连接。

Step 3: Create a statement object

您需要创建一个 StatementPreparedStatement or, CallableStatement 对象以将 SQL 语句发送到数据库。您可以分别使用 createStatement(), prepareStatement() and, prepareCall() 方法创建这些对象。使用相应的方法创建其中任何一个对象。

Step 4: Execute the query

创建该语句后,你需要执行它。类 Statement 提供了多个方法来执行查询,如方法 execute() 以执行返回多个结果集的语句。方法 executeUpdate() 执行诸如 INSERT、UPDATE、DELETE 的查询。方法 executeQuery() 返回返回数据的结果等。使用其中一种方法并执行之前创建的语句。

Example

以下 JDBC 示例演示了如何使用 JDBC 程序在 Apache Derby 中创建表。在此,我们使用嵌入式驱动程序连接到名为 sampleDB 的数据库(如果不存在则创建该数据库)。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class CreateTable {
   public static void main(String args[]) throws Exception {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:sampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Executing the query
      String query = "CREATE TABLE Employees( "
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), "
         + "Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "PRIMARY KEY (Id))";
         stmt.execute(query);
         System.out.println("Table created");
   }
}

Output

执行上述程序后,您将获得以下输出

Table created

Apache Derby - Drop Table

DROP TABLE 语句用于删除现有表,包括其所有触发器、约束和权限。

Syntax

Following is the Syntax of the DROP TABLE statement.

ij> DROP TABLE table_name;

Example

假设你在数据库中有一个名为 Student 的表。以下 SQL 语句删除了一个名为 Student 的表。

ij> DROP TABLE Student;
0 rows inserted/updated/deleted

因为我们已经删除了表,所以如果我们尝试描述它,我们会收到如下错误:

ij> DESCRIBE Student;
IJ ERROR: No table exists with the name STUDENT

Drop Table using JDBC program

本部分教你如何使用 JDBC 应用程序删除 Apache Derby 数据库中的表。

如果您想使用网络客户端请求 Derby 网络服务器,请确保服务器正在运行。网络客户端驱动程序的类名为 org.apache.derby.jdbc.ClientDriver,URL 为 jdbc:derby://localhost:1527/DATABASE_NAME;create=true;user=USER_NAME;passw ord= PASSWORD "

按照以下步骤在 Apache Derby 中删除表:

Step 1: Register the driver

要与数据库通信,首先需要注册驱动程序。类 ClassforName() 方法接受表示类名称的 String 值,将其加载到内存中,这会自动注册它。使用此方法注册驱动程序。

Step 2: Get the connection

通常,我们与数据库进行通信时执行的第一步就是与数据库连接。类 Connection 表示与数据库服务器之间的物理连接。你可以通过调用类 DriverManager 的方法 getConnection() 创建连接对象。使用此方法来创建连接。

Step 3: Create a statement object

您需要创建一个 StatementPreparedStatementCallableStatement 对象才能向数据库发送 SQL 语句。您可以分别使用 createStatement(), prepareStatement() and, prepareCall() 方法创建这些对象。使用相应的方法创建其中一个对象。

Step 4: Execute the query

创建语句后,你需要执行它。 Statement 类提供了多种执行查询的方法,如 execute() 方法执行返回多个结果集的语句。 executeUpdate() 方法执行 INSERT、UPDATE、DELETE 等查询。 executeQuery() 方法用于返回数据的查询等等。使用其中任何一种方法并执行先前创建的语句。

Example

以下 JDBC 示例演示如何使用 JDBC 程序删除 Apache Derby 中的一个表。此处,我们正在使用嵌入式驱动程序连接到名为 sampleDB 的数据库(如果不存在将创建)。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class DropTable {
   public static void main(String args[]) throws Exception {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

      //Getting the Connection object
      String URL = "jdbc:derby:sampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Executing the query
      String query = "DROP TABLE Employees";
      stmt.execute(query);
      System.out.println("Table dropped");
   }
}

Output

执行上述程序时,你将得到以下输出:

Table dropped

Apache Derby - Insert Data

插入查询插入数据: new records ,到表中。

Syntax

以下是 INSERT 语句的基本语法 −

ij>INSERT INTO table_name VALUES (column_name1, column_name2, ...);

其中 column1、column2 是要插入的行中的列值。

Example

以下 SQL INSERT 语句在 Student 表中插入一个新行,其中它插入 id, age, first namelast name 列中的值。

SQL> INSERT INTO Student VALUES (101, 20, 'Zara', 'Ali');

Syntax 2

或者,您可以通过提及列名来插入两个特定的列,如下所示 −

ij>INSERT INTO table_name VALUES (column_name1, column_name2, ...) VALUES
(value1, value2, ...);

Note − Apache Derby 会自动计算生成列的值。例如,不需要传递本教程前面创建的 student 表中 id 列的值。如果您的表生成了列,请使用 syntax2

Example

ij> INSERT INTO Student(Age, First_Name, Last_Name) VALUES (21, 'Sucharitha' , 'Tyagi');
1 row inserted/updated/deleted

此外,您还可以使用以下语句插入两行 −

ij>INSERT INTO Student(Age, First_Name, Last_Name) VALUES (20, 'Amit',
'Bhattacharya'), (22, 'Rahul', 'Desai');
2 rows inserted/updated/deleted

可以使用 SELECT 命令验证表的内容(我们将在本教程的后面讨论此命令)。

Syntax 3

您可以在插入语句中使用另一个查询,如 -

INSERT INTO table_Name Query

Example

假设,我们在数据库中有一个名为 First_Year 的表,其列与 Student 表中的列类似,如下所示 −

ID |AGE |FIRST_NAME |LAST_NAME
-----------------------------------------------------------------
1  |20  |Raju       |Pendyala
2  |21  |Bhargav    |Prayaga
3  |22  |Deepthi    |Yerramilli

您可以使用上述语法插入值到 Student 表:

ij> INSERT INTO Student (Age, First_Name, Last_Name)
 SELECT Age, First_Name, Last_Name FROM First_Year;
> 3 rows inserted/updated/deleted

执行完所有上述插入语句后,Student 表将如下所示:

ID |AGE |FIRST_NAME |LAST_NAME
-------------------------------------------------------------
1  |21  |Sucharitha |Tyagi
2  |20  |Amit       |Bhattacharya
3  |22  |Rahul      |Desai
4  |20  |Raju       |Pendyala
5  |21  |Bhargav    |Prayaga
6  |22  |Deepthi    |Yerramilli

Insert Data using JDBC program

此部分将介绍如何在 Apache Derby 数据库中使用 JDBC 应用程序插入数据到表中。

如果您想使用网络客户端请求 Derby 网络服务器,请确保服务器正在运行。网络客户端驱动程序的类名为 org.apache.derby.jdbc.ClientDriver,URL 为 jdbc:derby://localhost:1527/ DATABASE_NAME;*create=true;user=*USER_NAME;*passw ord=*PASSWORD "

遵循以下步骤将数据插入到 Apache Derby 中的表中:

Step 1: Register the driver

要与数据库通信,首先,您需要注册驱动。类的 forName() 方法 Class 接受表示类名称的 String 值,并将其加载到内存中,从而自动注册该名称。使用此方法注册驱动。

Step 2: Get the connection

通常,我们与数据库进行通信时执行的第一步就是与数据库连接。类 Connection 表示与数据库服务器之间的物理连接。你可以通过调用类 DriverManager 的方法 getConnection() 创建连接对象。使用此方法来创建连接。

Step 3: Create a statement object

您需要创建一个 StatementPreparedStatement or, CallableStatement 对象以向数据库发送 SQL 语句。您可以分别使用 createStatement(), prepareStatement()prepareCall() 方法创建这些对象。使用适当的方法创建这些对象中的任何一个。

Step 4: Execute the query

创建语句后,您需要执行它。 Statement 类提供各种方法来执行查询,例如 execute() 方法,用于执行返回多个结果集的语句。

executeUpdate() 方法执行 INSERT、UPDATE 和 DELETE 之类的查询。 executeQuery() 方法对返回数据等的结果进行处理。使用这两种方法中的任一种,并执行先前创建的语句。

Example

以下 JDBC 示例演示了如何使用 JDBC 程序将数据插入 Apache Derby 中的表。在此处,我们使用嵌入式驱动程序连接到名为 sampleDB(如果不存在则创建)的数据库。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class InsertData {
   public static void main(String args[]) throws Exception {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:SampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Creating a table and populating
      String query = "CREATE TABLE Employees("
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "PRIMARY KEY (Id))";
      //Executing the query
      String query = "INSERT INTO Employees("
         + "Name, Salary, Location) VALUES "
         + "('Amit', 30000, 'Hyderabad'), "
         + "('Kalyan', 40000, 'Vishakhapatnam'), "
         + "('Renuka', 50000, 'Delhi'), "
         + "('Archana', 15000, 'Mumbai'), "
         + "('Trupthi', 45000, 'Kochin'), "
         + "('Suchatra', 33000, 'Pune'), "
         + "('Rahul', 39000, 'Lucknow'), "
         + "('Trupti', 45000, 'Kochin')";
      stmt.execute(query);
      System.out.println("Values inserted");
   }
}

Output

执行上述程序时,你将得到以下输出:

Values inserted

Apache Derby - Retrieve Data

SELECT 语句用于从表中检索数据。这会以称为结果集的表格形式返回数据。

Syntax

下面是 SELECT 语句的语法:

ij> SELECT column_name, column_name, ... FROM table_name;
Or,
Ij>SELECT * from table_name

Example

假设我们在数据库中有一个名为 Employees 的表,如下所示:

ij> CREATE TABLE Employees (
   Id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
   Name VARCHAR(255),
   Salary INT NOT NULL,
   Location VARCHAR(255),
   PRIMARY KEY (Id)
);
> > > > > > > 0 rows inserted/updated/deleted

并且在其中插入了四条记录,如下所示:

ij> INSERT INTO Employees (Name, Salary, Location) VALUES
 ('Amit', 30000, 'Hyderabad'),
 ('Kalyan', 40000, 'Vishakhapatnam'),
 ('Renuka', 50000, 'Delhi'),
 ('Archana', 15000, 'Mumbai');
> > > > 4 rows inserted/updated/deleted

以下 SQL 语句检索表中所有员工的姓名、年龄和工资详细信息;

ij> SELECT Id, Name, Salary FROM Employees;

此查询的输出为:

ID |NAME   |SALARY
------------------------------------------------------------------------
1  |Amit   |30000
2  |Kalyan |40000
3  |Renuka |50000
4  |Archana|15000
4 rows selected

如果您想一次获取此表的全部记录,请使用 * 而非列名称。

ij> select * from Employees;

这会产生以下结果 −

ID |NAME   |SALARY |LOCATION
------------------------------------------------------------------
1  |Amit   |30000  |Hyderabad
2  |Kalyan |40000  |Vishakhapatnam
3  |Renuka |50000  |Delhi
4  |Archana|15000  |Mumbai
4 rows selected

Retrieve Data using JDBC program

本部分将教您如何使用 JDBC 应用程序从 Apache Derby 数据库中的表中检索数据。

如果您想使用网络客户端请求 Derby 网络服务器,请确保服务器正在运行。网络客户端驱动程序的类名为 org.apache.derby.jdbc.ClientDriver,URL 为 jdbc:derby://localhost:1527/ DATABASE_NAME ;create=true;user= USER_NAME ;passw ord= PASSWORD "

按照以下步骤从 Apache Derby 表中检索数据:

Step 1: Register the driver

要与数据库通信,首先需要注册驱动程序。类 ClassforName() 方法接受表示类名称的 String 值,将其加载到内存中,这会自动注册它。使用此方法注册驱动程序。

Step 2: Get the connection

通常,我们与数据库进行通信时执行的第一步就是与数据库连接。类 Connection 表示与数据库服务器之间的物理连接。你可以通过调用类 DriverManager 的方法 getConnection() 创建连接对象。使用此方法来创建连接。

Step 3: Create a statement object

你需要创建 StatementPreparedStatementCallableStatement 对象来向数据库发送 SQL 语句。你可以分别使用 createStatement()prepareStatement()prepareCall() 方法创建这些对象。使用适当的方法创建其中一个对象。

Step 4: Execute the query

创建该语句后,你需要执行它。类 Statement 提供了多个方法来执行查询,如方法 execute() 以执行返回多个结果集的语句。方法 executeUpdate() 执行诸如 INSERT、UPDATE、DELETE 的查询。方法 executeQuery() 返回返回数据的结果等。使用其中一种方法并执行之前创建的语句。

Example

下面的 JDBC 示例演示了如何使用 JDBC 程序从 Apache Derby 中的表格检索数据。在这里,我们使用嵌入驱动程序连接到名为 sampleDB(如果不存在,则创建)的数据库。

方法 executeQuery() 返回 ResultSet 对象,该对象包含该语句的结果。最初,结果集指针将位于第一条记录处,你可以使用其方法 next()getXXX() 打印 ResultSet 对象的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class RetrieveData {
   public static void main(String args[]) throws SQLException,
      ClassNotFoundException {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:sampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      4Statement stmt = conn.createStatement();

      //Creating a table and populating it
      String query = "CREATE TABLE Employees("
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "PRIMARY KEY (Id))";
      String query = "INSERT INTO Employees("
         + "Name, Salary, Location) VALUES "
         + "('Amit', 30000, 'Hyderabad'), "
         + "('Kalyan', 40000, 'Vishakhapatnam'), "
         + "('Renuka', 50000, 'Delhi'), "
         + "('Archana', 15000, 'Mumbai'), "
         + "('Trupthi', 45000, 'Kochin'), "
         + "('Suchatra', 33000, 'Pune'), "
         + "('Rahul', 39000, 'Lucknow'), "
         + "('Trupti', 45000, 'Kochin')";
      //Executing the query
      String query = "SELECT Id, Name, Salary FROM Employees";
      ResultSet rs = stmt.executeQuery(query);
      while(rs.next()) {
         System.out.println("Id: "+rs.getString("Id"));
         System.out.println("Name: "+rs.getString("Name"));
         System.out.println("Salary: "+rs.getString("Salary"));
         System.out.println(" ");
      }
   }
}

Output

执行上述程序后,您将获得以下输出

Id: 1
Name: Amit
Salary: 30000

Id: 2
Name: Kalyan
Salary: 43000

Id: 3
Name: Renuka
Salary: 50000

Id: 4
Name: Archana
Salary: 15000

Id: 5
Name: Trupthi
Salary: 45000

Id: 6
Name: Suchatra
Salary: 33000

Id: 7
Name: Rahul
Salary: 39000

Apache Derby - Update Data

UPDATE 语句用于更新表中的数据。Apache Derby 提供了两种类型的更新(语法),即 searched 更新和 positioned 更新。

要搜索的 UPDATE 语句更新表的全部指定列。

Syntax

以下是 UPDATE 查询的语法 −

ij> UPDATE table_name
 SET column_name = value, column_name = value, ...
 WHERE conditions;

WHERE 子句可以使用比较运算符,例如 =、!=、<、>、⇐ 和 >=,以及 BETWEEN 和 LIKE 运算符。

Example

假设你在数据库中有一个名为 Employee 的表,它包含 4 条记录,如下所示 −

ID |NAME   |SALARY |LOCATION
----------------------------------------------------------
1  |Amit   |30000  |Hyderabad
2  |Kalyan |40000  |Vishakhapatnam
3  |Renuka |50000  |Delhi
4  |Archana|15000  |Mumbai

下面的 SQL UPDATE 语句更新了名为 Kaylan 的员工的位置和薪水。

ij> UPDATE Employees SET Location = 'Chennai', Salary = 43000 WHERE Name =
'Kalyan';
1 rows inserted/updated/deleted

如果你获取 Employees 表的内容,你可以观察到 UPDATE 查询所做的更改。

ij> select * from Employees;
ID |NAME   |SALARY |LOCATION
----------------------------------------------------------
1  |Amit   |30000  |Hyderabad
2  |Kalyan |43000  |Chennai
3  |Renuka |50000  |Delhi
4  |Archana|15000  |Mumbai
4 rows selected

Update Data using JDBC program

本节说明了如何使用 JDBC 应用程序更新 Apache Derby 数据库中现有记录。

如果您想使用网络客户端请求 Derby 网络服务器,请确保服务器正在运行。网络客户端驱动程序的类名为 org.apache.derby.jdbc.ClientDriver,URL 为 jdbc:derby://localhost:1527/ DATABASE_NAME ;create=true;user= USER_NAME ;passw ord= PASSWORD "

按照以下步骤在 Apache Derby 中更新表的现有记录。

Step 1: Register the driver

要与数据库通信,首先需要注册驱动程序。类 ClassforName() 方法接受表示类名称的 String 值,将其加载到内存中,这会自动注册它。使用此方法注册驱动程序。

Step 2: Get the connection

通常,我们与数据库进行通信时执行的第一步就是与数据库连接。连接类表示与数据库服务器之间的物理连接。你可以通过调用类 DriverManager 的方法 getConnection() 创建连接对象。使用此方法来创建连接。

Step 3: Create a statement object

你需要创建 StatementPreparedStatement or, CallableStatement 对象来向数据库发送 SQL 语句。你可以分别使用 createStatement()prepareStatement()prepareCall() 方法创建这些对象。使用适当的方法创建其中一个对象。

Step 4: Execute the query

创建该语句后,你需要执行它。类 Statement 提供了多个方法来执行查询,如方法 execute() 以执行返回多个结果集的语句。方法 executeUpdate() 执行诸如 INSERT、UPDATE、DELETE 的查询。方法 executeQuery() 返回数据。使用其中一种方法并执行之前创建的语句。

Example

以下 JDBC 示例演示了如何使用 JDBC 程序更新 Apache Derby 中表的现有记录。在这里,我们使用嵌入式驱动程序连接到名为 sampleDB(如果不存在将创建)的数据库。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class UpdateData {
   public static void main(String args[]) throws Exception {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:sampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Creating a table and populating it
      String query = "CREATE TABLE Employees("
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "PRIMARY KEY (Id))";
      String query = "INSERT INTO Employees("
         + "Name, Salary, Location) VALUES "
         + "('Amit', 30000, 'Hyderabad'), "
         + "('Kalyan', 40000, 'Vishakhapatnam'), "
         + "('Renuka', 50000, 'Delhi'), "
         + "('Archana', 15000, 'Mumbai'), "
         + "('Trupthi', 45000, 'Kochin'), "
         + "('Suchatra', 33000, 'Pune'), "
         + "('Rahul', 39000, 'Lucknow'), "
         + "('Trupti', 45000, 'Kochin')";
      //Executing the query
      String query = "UPDATE Employees SET Location = 'Chennai', Salary = 43000 WHERE
         Name = 'Kalyan'";
      int num = stmt.executeUpdate(query);
      System.out.println("Number of records updated are: "+num);
   }
}

Output

执行上述程序时,你将得到以下输出:

Number of records updated are: 1

Apache Derby - Delete Data

DELETE 语句用于删除表的行。就像 UPDATE 语句一样,Apache Derby 提供两种类型的 Delete(语法): searched delete 和 positioned delete。

searched delete 语句删除表的所有指定列。

Syntax

DELETE 语句的语法如下 −

ij> DELETE FROM table_name WHERE condition;

Example

我们假设我们有一个名为 employee 的表格,其中包含 5 条记录,如下所示 −

ID |NAME   |SALARY |LOCATION
----------------------------------------------------------------------------
1  |Amit   |30000  |Hyderabad
2  |Kalyan |40000  |Vishakhapatnam
3  |Renuka |50000  |Delhi
4  |Archana|15000  |Mumbai
5  |Trupti |45000  |Kochin
5 rows selected

以下 SQL DELETE 语句可删除名为 Trupti 的记录。

ij> DELETE FROM Employees WHERE Name = 'Trupti';
1 row inserted/updated/deleted

如果您获取 Employees 表格的内容,则可以看到只有四条记录,如下所示 −

ID |NAME   |SALARY |LOCATION
----------------------------------------------------------------------------
1  |Amit   |30000  |Hyderabad
2  |Kalyan |40000  |Vishakhapatnam
3  |Renuka |50000  |Delhi
4  |Archana|15000  |Mumbai
4 rows selected

要删除表中的所有记录,请执行不带 where 子句的相同查询。

ij> DELETE FROM Employees;
4 rows inserted/updated/deleted

现在,如果您尝试获取 Employee 表格的内容,您会得到一个空表格,如下所示 −

ij> select * from employees;
ID |NAME |SALARY |LOCATION
--------------------------------------------------------
0 rows selected

Delete Data using JDBC program

此章节说明了如何使用 JDBC 应用程序删除 Apache Derby 数据库中表的现有记录。

如果您想使用网络客户端请求 Derby 网络服务器,请确保服务器正在运行。网络客户端驱动程序的类名为 org.apache.derby.jdbc.ClientDriver,而 URL 为 jdbc:derby://localhost:1527/ DATABASE_NAME;*create=true;user=*USER_NAME;*passw ord=*PASSWORD ”。

按照下面给出的步骤删除 Apache Derby 中表的现有记录:

Step 1: Register the driver

首先,您需要注册该驱动程序才能与数据库通信。类 ClassforName() 方法接受一个表示类名的 String 值,将其加载到内存中,从而自动注册该类。使用此方法注册该驱动程序。

Step 2: Get the connection

通常,我们与数据库通信的第一步是与数据库连接。 Connection 类表示与数据库服务器的物理连接。您可以通过调用 DriverManager 类的 getConnection() 方法创建一个连接对象。使用此方法创建一个连接。

Step 3: Create a statement object

您需要创建一个 StatementPreparedStatement or, CallableStatement 对象以将 SQL 语句发送到数据库。您可以分别使用 createStatement(), prepareStatement() and, prepareCall() 方法创建这些对象。使用相应的方法创建其中任何一个对象。

Step 4: Execute the query

创建语句后,您需要执行该语句。 Statement 类提供各种方法来执行查询,例如 execute() 方法用于执行返回多个结果集的语句。 executeUpdate() 方法执行诸如 INSERT、UPDATE、DELETE 的查询。 executeQuery() 方法返回结果,返回数据。使用其中任何一种方法并执行先前创建的语句。

Example

以下 JDBC 示例演示了如何使用 JDBC 程序删除 Apache Derby 中表的现有记录。在此,我们使用嵌入式驱动程序连接到名为 sampleDB 的数据库(如果不存在则创建)。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DeleteData {
   public static void main(String args[]) throws Exception {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:sampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();
      //Creating a table and populating it
      String query = "CREATE TABLE Employees("
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "PRIMARY KEY (Id))";
      String query = "INSERT INTO Employees("
         + "Name, Salary, Location) VALUES "
         + "('Amit', 30000, 'Hyderabad'), "
         + "('Kalyan', 40000, 'Vishakhapatnam'), "
         + "('Renuka', 50000, 'Delhi'), "
         + "('Archana', 15000, 'Mumbai'), "
         + "('Trupthi', 45000, 'Kochin'), "
         + "('Suchatra', 33000, 'Pune'), "
         + "('Rahul', 39000, 'Lucknow'), "
         + "('Trupthi', 45000, 'Kochin')";
      //Executing the query
      String query = "DELETE FROM Employees WHERE Name = 'Trupthi'";
      int num = stmt.executeUpdate(query);
      System.out.println("Number of records deleted are: "+num);
   }
}

Output

执行上述程序时,你将得到以下输出:

Number of records deleted are: 1

Apache Derby - Where Clause

WHERE 子句用于 SELECT、DELETE 或 UPDATE 语句,以指定需要对其执行操作的行。通常,此子句后面跟着返回布尔值的条件或表达式,Select、delete 或 update 操作仅对满足给定条件的行执行。

ij> SELECT * from table_name WHERE condition;
or,
ij> DELETE from table_name WHERE condition;
or,
ij> UPDATE table_name SET column_name = value WHERE condition;

WHERE 子句可以使用比较运算符,如 =、!=、<、>、⇐ 和 >=,以及 BETWEEN 和 LIKE 运算符。

Example

假设我们在数据库中有一个名为 Employees 的表,其中有 7 条记录,如下所示:

ID |NAME     |SALARY |LOCATION
-----------------------------------------------------------------------------
1  |Amit     |30000  |Hyderabad
2  |Kalyan   |40000  |Vishakhapatnam
3  |Renuka   |50000  |Delhi
4  |Archana  |15000  |Mumbai
5  |Trupthi  |45000  |Kochin
6  |Suchatra |33000  |Pune
7  |Rahul    |39000  |Lucknow

以下 SQL DELETE 语句获取工资超过 35000 的员工记录:

ij> SELECT * FROM Employees WHERE Salary>35000;

这将产生以下输出 −

ID |NAME   |SALARY |LOCATION
---------------------------------------------------
2  |Kalyan |40000  |Vishakhapatnam
3  |Renuka |50000  |Delhi
5  |Trupthi|45000  |Kochin
7  |Rahul  |39000  |Lucknow
4 rows selected

同样,您还可以使用此子句删除和更新记录。

以下示例更新工资低于 30000 的员工的位置。

ij> UPDATE Employees SET Location = 'Vijayawada' WHERE Salary<35000;
3 rows inserted/updated/deleted

如果您验证表的内容,可以看到更新后的表如下所示:

ij> SELECT * FROM Employees;
ID |NAME    |SALARY |LOCATION
------------------------------------------------------------------------------
1  |Amit    |30000  |Vijayawada
2  |Kalyan  |40000  |Vishakhapatnam
3  |Renuka  |50000  |Delhi
4  |Archana |15000  |Vijayawada
5  |Trupthi |45000  |Kochin
6  |Suchatra|33000  |Vijayawada
7  |Rahul   |39000  |Lucknow
7 rows selected

Where clause JDBC example

本节将教您如何使用 WHERE 子句并在 JDBC 应用程序中对 Apache Derby 数据库中的表执行 CURD 操作。

如果您想使用网络客户端请求 Derby 网络服务器,请确保服务器已启动并正在运行。网络客户端驱动程序的类名称是 org.apache.derby.jdbc.ClientDriver,URL 是 jdbc:derby://localhost:1527/ DATABASE_NAME ;create=true;user= USER_NAME;*passw ord=*PASSWORD "。

按照以下步骤使用 WHERE 子句并在 Apache Derby 中对表执行 CURD 操作:

Step 1: Register the driver

要与数据库通信,首先需要注册驱动程序。类 ClassforName() 方法接受表示类名称的字符串值将其加载到内存中,这会自动将其注册。使用此方法注册驱动程序

Step 2: Get the connection

通常,我们与数据库进行通信时执行的第一步就是与数据库连接。类 Connection 表示与数据库服务器之间的物理连接。你可以通过调用类 DriverManager 的方法 getConnection() 创建连接对象。使用此方法来创建连接。

Step 3: Create a statement object

您需要创建一个 StatementPreparedStatementCallableStatement 对象才能向数据库发送 SQL 语句。您可以分别使用 createStatement(), prepareStatement() and, prepareCall() 方法创建这些对象。使用相应的方法创建其中一个对象。

Step 4: Execute the query

创建语句后,您需要执行该语句。 Statement 类提供各种方法来执行查询,例如 execute() 方法用于执行返回多个结果集的语句。 executeUpdate() 方法执行诸如 INSERT、UPDATE、DELETE 的查询。 executeQuery() 方法返回结果,返回数据。使用其中任何一种方法并执行先前创建的语句。

Example

以下 JDBC 示例演示了如何使用 JDBC 程序在 Apache Derby 中使用 WHERE 子句并在表上执行 CURD 操作。在此,我们使用嵌入式驱动程序连接到名为 sampleDB 的数据库(如果不存在则创建)。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
public class WhereClauseExample {
   public static void main(String args[]) throws Exception {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:sampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Creating a table and populating it
      String query = "CREATE TABLE Employees("
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "PRIMARY KEY (Id))";
      String query = "INSERT INTO Employees("
         + "Name, Salary, Location) VALUES "
         + "('Amit', 30000, 'Hyderabad'), "
         + "('Kalyan', 40000, 'Vishakhapatnam'), "
         + "('Renuka', 50000, 'Delhi'), "
         + "('Archana', 15000, 'Mumbai'), "
         + "('Trupthi', 45000, 'Kochin'), "
         + "('Suchatra', 33000, 'Pune'), "
         + "('Rahul', 39000, 'Lucknow'), "
         + "('Trupti', 45000, 'Kochin')";
      //Executing the query
      String query = "SELECT * FROM Employees WHERE Salary>35000";
      ResultSet rs = stmt.executeQuery(query);
      while(rs.next()) {
         System.out.println("Id: "+rs.getString("Id"));
         System.out.println("Name: "+rs.getString("Name"));
         System.out.println("Salary: "+rs.getString("Salary"));
         System.out.println("Location: "+rs.getString("Location"));
         System.out.println(" ");
      }
   }
}

Output

执行上述程序时,你将得到以下输出:

Id: 2
Name: Kalyan
Salary: 43000
Location: Chennai

Id: 3
Name: Renuka
Salary: 50000
Location: Delhi

Id: 5
Name: Trupthi
Salary: 45000
Location: Kochin

Id: 7
Name: Rahul
Salary: 39000
Location: Lucknow

Apache Derby - GROUP BY Clause

GROUP BY 子句与 SELECT 语句一起使用。它用于在数据相同的情况下形成子集。通常,此子句后面跟着 ORDER BY 子句,并置于 WHERE 子句之后。

Syntax

以下是 GROUP BY 子句的语法:

ij>SELECT column1, column2, . . . table_name GROUP BY column1, column2, . . .;

Example

假设我们在数据库中有一个名为 Employees 的表,其中包含以下记录 −

ID |NAME    |SALARY |LOCATION
------------------------------------------------------------------
1  |Amit    |30000  |Hyderabad
2  |Rahul   |39000  |Lucknow
3  |Renuka  |50000  |Hyderabad
4  |Archana |15000  |Vishakhapatnam
5  |Kalyan  |40000  |Hyderabad
6  |Trupthi |45000  |Vishakhapatnam
7  |Raghav  |12000  |Lucknow
8  |Suchatra|33000  |Vishakhapatnam
9  |Rizwan  |20000  |Lucknow

带 GROUP BY 子句的以下 SELECT 语句基于位置对表分组。它显示给定位置员工获得的总薪水金额。

ij> SELECT Location, SUM(Salary) from Employees GROUP BY Location;

这会产生以下输出 −

LOCATION       |2
-------------------------------------------------------
Hyderabad      |120000
Lucknow        |71000
Vishakhapatnam |93000
3 rows selected

同样,以下查询找到用于为某个位置的员工支付的平均薪水金额。

ij> SELECT Location, AVG(Salary) from Employees GROUP BY Location;

这会产生以下输出 −

LOCATION       |2
-----------------------------------------------------
Hyderabad      |40000
Lucknow        |23666
Vishakhapatnam |31000
3 rows selected

Group By clause JDBC example

本节将教您如何在 JDBC 应用程序中使用 Group By 子句并在 Apache Derby 数据库中的表上执行 CURD 操作。

如果您想使用网络客户端请求 Derby 网络服务器,请确保服务器正在运行。网络客户端驱动程序的类名为 org.apache.derby.jdbc.ClientDriver,URL 为 jdbc:derby://localhost:1527/ DATABASE_NAME;*create=true;user=*USER_NAME;*passw ord=*PASSWORD "

按照以下步骤使用 Group By 子句并在 Apache Derby 中对表执行 CURD 操作:

Step 1: Register the driver

要与数据库通信,首先需要注册驱动程序。类 ClassforName() 方法接受表示类名称的 String 值,将其加载到内存中,这会自动注册它。使用此方法注册驱动程序。

Step 2: Get the connection

通常,我们与数据库进行通信时执行的第一步就是与数据库连接。类 Connection 表示与数据库服务器之间的物理连接。你可以通过调用类 DriverManager 的方法 getConnection() 创建连接对象。使用此方法来创建连接。

Step 3: Create a statement object

您需要创建一个 StatementPreparedStatementCallableStatement 对象才能向数据库发送 SQL 语句。您可以分别使用 createStatement(), prepareStatement() and, prepareCall() 方法创建这些对象。使用相应的方法创建其中一个对象。

Step 4: Execute the query

创建语句之后,你需要执行语句。 Statement 类提供多种方法来执行查询,例如 execute() 方法,用于执行返回多个结果集的语句。 executeUpdate() 方法用于执行诸如 INSERT、UPDATE、DELETE 这类查询。 executeQuery() 方法返回数据。使用其中一种方法并执行之前创建的语句。

Example

以下 JDBC 示例演示如何使用 Group By 子句并使用 JDBC 程序对 Apache Derby 中的表执行 CURD 操作。此处,我们使用嵌入式驱动程序连接到一个名为 sampleDB 的数据库(如果不存在,则创建该数据库)。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
public class GroupByClauseExample {
   public static void main(String args[]) throws Exception {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

      //Getting the Connection object
      String URL = "jdbc:derby:sampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Creating a table and populating it
      stmt.execute("CREATE TABLE EmployeesData( "
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), "
         + "Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "PRIMARY KEY (Id))");
      stmt.execute("INSERT INTO EmployeesData(Name, Salary, Location) "
         + "VALUES ('Amit', 30000, 'Hyderabad'), "
         + "('Rahul', 39000, 'Lucknow'), "
         + "('Renuka', 50000, 'Hyderabad'), "
         + "('Archana', 15000, 'Vishakhapatnam'), "
         + "('Kalyan', 40000, 'Hyderabad'), "
         + "('Trupthi', 45000, 'Vishakhapatnam'), "
         + "('Raghav', 12000, 'Lucknow'), "
         + "('Suchatra', 33000, 'Vishakhapatnam'), "
         + "('Rizwan', 20000, 'Lucknow')");

      //Executing the query
      String query = "SELECT Location, SUM(Salary) from EmployeesData GROUP BY Location";
      ResultSet rs = stmt.executeQuery(query);
      while(rs.next()) {
         System.out.println("Location: "+rs.getString(1));
         System.out.println("Sum of salary: "+rs.getString(2));
         System.out.println(" ");
      }
   }
}

Output

执行上述程序时,你将得到以下输出:

Location: Hyderabad
Sum of salary: 120000

Location: Lucknow
Sum of salary: 71000

Location: Vishakhapatnam
Sum of salary: 93000

Apache Derby - Order By Clause

ORDER BY 子句用于按其使用关键词的顺序排列结果集的内容,ASC 代表升序,DESC 代表降序。如果您不提及这些内容中的任何内容,那么内容将按升序排列(默认设置)。

Syntax

以下为 ORDER BY 子句的语法 −

SELECT * FROM table_name ORDER BY column_name ASC|DESC.

Example

假设我们在数据库中有一个名为 Employees 的表,其中包含以下记录 −

ID |NAME    |SALARY |LOCATION
------------------------------------------------------------------------------
1  |Amit    |30000  |Vijayawada
2  |Kalyan  |40000  |Vishakhapatnam
3  |Renuka  |50000  |Delhi
4  |Archana |15000  |Vijayawada
5  |Trupthi |45000  |Kochin
6  |Suchatra|33000  |Vijayawada
7  |Rahul   |39000  |Lucknow

以下查询按 Employee 名称将表中的内容按升序排列。

ij> SELECT * FROM Employees ORDER BY Name;

这会产生以下输出 −

ID |NAME    |SALARY |LOCATION
---------------------------------------------------------------
1  |Amit    |30000  |Hyderabad
4  |Archana |15000  |Mumbai
2  |Kalyan  |40000  |Vishakhapatnam
7  |Rahul   |39000  |Lucknow
3  |Renuka  |50000  |Delhi
6  |Suchatra|33000  |Pune
5  |Trupthi |45000  |Kochin
7 rows selected

同样,以下查询按 Employee 的薪水将表中的内容按降序排列 −

ij> SELECT * FROM Employees ORDER BY Salary DESC;

这会产生以下输出 −

ID |NAME     |SALARY |LOCATION
---------------------------------------------------------------
3  |Renuka   |50000  |Delhi
5  |Trupthi  |45000  |Kochin
2  |Kalyan   |40000  |Vishakhapatnam
7  |Rahul    |39000  |Lucknow
6  |Suchatra |33000  |Pune
1  |Amit     |30000  |Hyderabad
4  |Archana  |15000  |Mumbai
7 rows selected

Sorting Data using JDBC program

本节将为您讲解如何在 Derby 中使用 JDBC 对表的内容进行排序。您可以使用 ORDER BY 子句和关键词 ASC(表示升序)和 DSC(表示降序)按顺序排列记录。

如果您想使用网络客户端请求 Derby 网络服务器,请确保服务器正在运行。网络客户端驱动程序的类名为 org.apache.derby.jdbc.ClientDriver,而 URL 为 jdbc:derby://localhost:1527/ DATABASE_NAME;*create=true;user=*USER_NAME;*passw ord=*PASSWORD ”。

按照以下步骤在 Apache Derby 中对表的记录进行排序 −

Step 1: Register the driver

要与数据库通信,首先需要注册驱动程序。类 ClassforName() 方法接受表示类名称的 String 值,将其加载到内存中,这会自动注册它。使用此方法注册驱动程序。

Step 2: Get the connection

Step 3: Create a statement object

您需要创建一个 StatementPreparedStatementCallableStatement 对象才能向数据库发送 SQL 语句。您可以分别使用 createStatement(), prepareStatement() and, prepareCall() 方法创建这些对象。使用相应的方法创建其中一个对象。

Step 4: Execute the query

创建该语句后,你需要执行它。类 Statement 提供了多个方法来执行查询,如方法 execute() 以执行返回多个结果集的语句。方法 executeUpdate() 执行诸如 INSERT、UPDATE、DELETE 的查询。方法 executeQuery() 返回数据。使用其中一种方法并执行之前创建的语句。

Example

以下 JDBC 示例演示了如何使用 JDBC 程序对 Apache Derby 中表的记录进行排序。在此处,我们使用嵌入式驱动程序连接到名为 sampleDB(如果不存在则创建)的数据库。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SortData {
   public static void main(String args[]) throws SQLException, ClassNotFoundException {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

      //Getting the Connection object
      String URL = "jdbc:derby:SampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Creating a table and populating it
      String query = "CREATE TABLE Employees("
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "PRIMARY KEY (Id))";
      String query = "INSERT INTO Employees("
         + "Name, Salary, Location) VALUES "
         + "('Amit', 30000, 'Hyderabad'), "
         + "('Kalyan', 40000, 'Vishakhapatnam'), "
         + "('Renuka', 50000, 'Delhi'), "
         + "('Archana', 15000, 'Mumbai'), "
         + "('Trupthi', 45000, 'Kochin'), "
         + "('Suchatra', 33000, 'Pune'), "
         + "('Rahul', 39000, 'Lucknow'), "
         + "('Trupti', 45000, 'Kochin')";
      //Executing the query
      String query = "SELECT Location, SUM(Salary) " + "from Employees GROUP BY Location";
      ResultSet rs = stmt.executeQuery(query);
      while(rs.next()) {
         System.out.println("Salary: "+rs.getString(1));
         System.out.println("Location: "+rs.getString(2));
         System.out.println(" ");
      }
   }
}

Output

执行上述程序时,你将得到以下输出:

Salary: Chennai
Location: 43000

Salary: Delhi
Location: 50000

Salary: Hyderabad
Location: 30000

Salary: Kochin
Location: 45000

Salary: Lucknow
Location: 39000

Salary: Mumbai
Location: 15000

Salary: Pune
Location: 33000

Apache Derby - Having Clause

HAVING 子句允许你指定条件,以便按条件筛选在结果中显示哪些组结果。

WHERE 子句对所选列设置条件,而 HAVING 子句对 GROUP BY 子句创建的组设置条件。

Syntax

以下是 HAVING 子句的语法−

ij> SELECT column1, column2 . . . from table_name GROUP BY column having
condition;

Example

假设我们在数据库中有一个名为 Employees 的表,其中包含以下 13 条记录 −

ID |NAME     |SALARY |LOCATION
------------------------------------------------------------------
1  |Amit     |30000  |Hyderabad
2  |Rahul    |39000  |Lucknow
3  |Kalyan   |40000  |Vishakhapatnam
4  |Renuka   |50000  |Hyderabad
5  |Archana  |15000  |Vishakhapatnam
6  |Krishna  |40000  |Hyderabad
7  |Trupthi  |45000  |Vishakhapatnam
8  |Raghav   |12000  |Lucknow
9  |Radha    |50000  |Delhi
10 |Anirudh  |15000  |Mumbai
11 |Tara     |45000  |Kochin
12 |Sucharita|44000  |Kochin
13 |Rizwan   |20000  |Lucknow

以下查询显示位置中员工的最大工资,其中至少有 3 名员工 −

ij> SELECT Location, MAX(Salary) from Employees GROUP BY Location having
count(Location)>=3;

这将生成以下输出 −

LOCATION       |2
------------------------------------------------------------
Hyderabad      |50000
Lucknow        |39000
Vishakhapatnam |45000
3 rows selected

Sorting Data using JDBC program

本部分将指导你如何使用 JDBC 应用程序在 Apache Derby 数据库中使用 Having 子句。

如果您想使用网络客户端请求 Derby 网络服务器,请确保服务器正在运行。网络客户端驱动程序的类名为 org.apache.derby.jdbc.ClientDriver,URL 为 jdbc:derby://localhost:1527/ DATABASE_NAME;*create=true;user=*USER_NAME;*passw ord=*PASSWORD "

请按照以下步骤在 Apache Derby 中对表的记录进行分类

Step 1: Register the driver

要与数据库通信,首先需要注册驱动程序。类 ClassforName() 方法接受一个表示类名称的字符串值,并将其加载到内存中,这会自动将其注册。使用此方法注册驱动程序。

Step 2: Get the connection

通常,我们与数据库进行通信时执行的第一步就是与数据库连接。类 Connection 表示与数据库服务器之间的物理连接。你可以通过调用类 DriverManager 的方法 getConnection() 创建连接对象。使用此方法来创建连接。

Step 3: Create a statement object

您需要创建一个 StatementPreparedStatement or, CallableStatement 对象以将 SQL 语句发送到数据库。您可以分别使用 createStatement(), prepareStatement() and, prepareCall() 方法创建这些对象。使用相应的方法创建其中任何一个对象。

Step 4: Execute the query

创建该语句后,你需要执行它。类 Statement 提供了多个方法来执行查询,如方法 execute() 以执行返回多个结果集的语句。方法 executeUpdate() 执行诸如 INSERT、UPDATE、DELETE 的查询。方法 executeQuery() 返回数据。使用其中一种方法并执行之前创建的语句。

Example

以下 JDBC 示例演示如何使用 Group By 子句并使用 JDBC 程序对 Apache Derby 中的表执行 CURD 操作。此处,我们使用嵌入式驱动程序连接到一个名为 sampleDB 的数据库(如果不存在,则创建该数据库)。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
public class HavingClauseExample {
   public static void main(String args[]) throws Exception {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

      //Getting the Connection object
      String URL = "jdbc:derby:sampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Creating a table and populating it
      stmt.execute("CREATE TABLE EmployeesData( "
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), "
         + "Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "PRIMARY KEY (Id))");
      stmt.execute("INSERT INTO EmployeesData(Name, Salary, Location) "
         + "VALUES ('Amit', 30000, 'Hyderabad'), "
         + "('Rahul', 39000, 'Lucknow'), "
         + "('Renuka', 50000, 'Hyderabad'), "
         + "('Archana', 15000, 'Vishakhapatnam'), "
         + "('Kalyan', 40000, 'Hyderabad'), "
         + "('Trupthi', 45000, 'Vishakhapatnam'), "
         + "('Raghav', 12000, 'Lucknow'), "
         + "('Suchatra', 33000, 'Vishakhapatnam'), "
         + "('Rizwan', 20000, 'Lucknow')");
      //Executing the query
      String query = "SELECT Location, MAX(Salary) "
         + "from EmployeesData GROUP BY Location having "
         + "count(Location)>=3";
      ResultSet rs = stmt.executeQuery(query);
      while(rs.next()) {
         System.out.println(rs.getString(1));
         System.out.println(rs.getString(2));
         System.out.println(" ");
      }
   }
}

Output

执行上述程序时,你将得到以下输出:

Hyderabad
50000

Lucknow
39000

Vishakhapatnam
45000

Apache Derby - Alter Table Statement

ALTER TABLE 语句允许你更改现有表。使用它可以执行以下操作 −

  1. 添加列,添加约束

  2. 删除列,删除约束

  3. 更改表的行级锁定

让我们假设我们已创建一个名为 Employees 的表,如下所示 −

ij> CREATE TABLE Employees (
   Id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
   Name VARCHAR(255),
   Salary INT NOT NULL,
   Location VARCHAR(255),
   PRIMARY KEY (Id)
);

而且,使用 insert 语句插入四条记录,如下 −

ij> INSERT INTO Employees (Name, Salary, Location) VALUES
 ('Amit', 30000, 'Hyderabad'),
 ('Kalyan', 40000, 'Vishakhapatnam'),
 ('Renuka', 50000, 'Delhi'),
 ('Archana', 15000, 'Mumbai');

Adding a column to a Table

以下是使用 ALTER 语句将列添加到表中的语法。

ALTER TABLE table_name ADD COLUMN column_name column_type;

Example

使用 ALTER 语句,我们尝试使用类型 integer 添加一个名为 Age 的新列。

ALTER TABLE Employees ADD COLUMN Age INT;
0 rows inserted/updated/deleted

使用 Gemini 将此文本翻译成中文:

ALTER TABLE Employees ADD COLUMN Phone_No BIGINT;
0 rows inserted/updated/deleted

在类型为整型的列中添加另一个名为 Phone_No 的列。

ij> DESCRIBE Employees;
COLUMN_NAME |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
ID          |INTEGER  |0   |10   |10   |AUTOINCRE&|NULL      |NO
NAME        |VARCHAR  |NULL|NULL |255  |NULL      | 510      |YES
SALARY      |INTEGER  |0   |10   |10   |NULL      |NULL      |NO
LOCATION    |VARCHAR  |NULL|NULL |255  |NULL      | 510      |YES
AGE         |INTEGER  |0   |10   |10   |NULL      |NULL      |YES
PHONE_NO    |INTEGER  |0   |10   |10   |NULL      |NULL      |YES
6 rows selected

Adding a constraint to a table

DESCRIBE 命令通过列出列とその詳細信息来描述指定表格(如果表存在)。如果您对 Employees 表格执行 DESCRIBE,您可以观察到新添加的列,如下所示:

ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint (column_name);

以下是使用 ALTER 语句向表格列添加约束的语法:

Example

其中 constraint 可以是 NOT NULL、NULL、PRIMARY KEY、UNIQUE、FOREIGN KEY、CHECK。

ij> ALTER TABLE Employees ADD CONSTRAINT New_Constraint UNIQUE(Phone_No);
0 rows inserted/updated/deleted

使用 ALTER 语句,我们尝试向 Phone_No 列添加约束 UNIQUE

一旦您向列添加 UNIQUE 约束,则两个行不能具有相同的值,即每个员工的电话号码应唯一。

ij> INSERT INTO Employees (Name, Salary, Location, Age, Phone_No) VALUES
('Amit', 30000, 'Hyderabad', 30, 9848022338);
1 row inserted/updated/deleted
ij> INSERT INTO Employees (Name, Salary, Location, Age, Phone_No) VALUES
('Sumit', 35000, 'Chennai', 25, 9848022338);
ERROR 23505: The statement was aborted because it would have caused a duplicate
key value in a unique or primary key constraint or unique index identified by
'NEW_CONSTRAINT' defined on 'EMPLOYEES'.

Dropping a constraint from a table

如果您尝试添加两个具有相同电话号码的列,则会收到异常,如下所示:

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

Example

以下是删除列约束的语法:

ij> ALTER TABLE Employees DROP CONSTRAINT New_Constraint;
0 rows inserted/updated/deleted

以下查询在上面创建的列 Phone_No 中删除了约束名称 New_Constraint。

ij> INSERT INTO Employees (Name, Salary, Location, Age, Phone_No) VALUES
('Sumit', 35000, 'Chennai', 25, 9848022338);
1 row inserted/updated/deleted

由于我们已删除列 Phone_No 上的 UNIQUE 约束,因此您可以添加具有相同电话号码的列。

ID |NAME |SALARY |LOCATION |AGE |PHONE_NO
-------------------------------------------------------------------------
1  |Amit |30000  |Hyderabad|30  |9848022338
2  |Sumit|35000  |Chennai  |25  |9848022338
2 rows selected

Dropping a column from a table

您可以通过以下方式验证表格的内容:ij> select * from Employees

ALTER TABLE table_name DROP COLUMN column_name;

Example

以下是删除列的语法的列。

ij> ALTER TABLE Employees DROP COLUMN Age;
0 rows inserted/updated/deleted

以下查询删除名为 age of the employee 的列:

ij> DESCRIBE Employees;
COLUMN_NAME |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
ID          |INTEGER  |0   |10  |10    |AUTOINCRE&|NULL      |NO
NAME        |VARCHAR  |NULL|NULL|255   |NULL      |510       |YES
SALARY      |INTEGER  |0   |10  |10    |NULL      |NULL      |NO
LOCATION    |VARCHAR  |NULL|NULL|255   |NULL      |510       |YES
PHONE_NO    |BIGINT   |0   |10  |19    |NULL      |NULL      |YES

Altering table using JDBC program

如果您描述表格,您只能看到 4 列。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class AlterTableExample {
   public static void main(String args[]) throws Exception {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:sampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Executing the query
      String createQuery = "CREATE TABLE Employees( "
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), "
         + "Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "PRIMARY KEY (Id))";

      stmt.execute(createQuery);
      System.out.println("Table created");
      System.out.println(" ");

      //Executing the query
      String insertQuery = "INSERT INTO Employees("
         + "Name, Salary, Location) VALUES "
         + "('Amit', 30000, 'Hyderabad'), "
         + "('Kalyan', 40000, 'Vishakhapatnam'), "
         + "('Renuka', 50000, 'Delhi'), "
         + "('Archana', 15000, 'Mumbai'), "
         + "('Trupti', 45000, 'Kochin')";

      stmt.execute(insertQuery);
      System.out.println("Values inserted");
      System.out.println(" ");

      //Executing the query
      String selectQuery = "SELECT * FROM Employees";
      ResultSet rs = stmt.executeQuery(selectQuery);
      System.out.println("Contents of the table after inserting the table");
      while(rs.next()) {
         System.out.println("Id: "+rs.getString("Id"));
         System.out.println("Name: "+rs.getString("Name"));
         System.out.println("Salary: "+rs.getString("Salary"));
         System.out.println("Location: "+rs.getString("Location"));
      }
      System.out.println(" ");

      //Altering the table
      stmt.execute("ALTER TABLE Employees ADD COLUMN Age INT");
      stmt.execute("ALTER TABLE Employees ADD COLUMN Phone_No BigINT");
      stmt.execute("ALTER TABLE Employees " + "ADD CONSTRAINT New_Constraint UNIQUE(Phone_No)");

      stmt.execute("INSERT INTO Employees "
         + "(Name, Salary, Location, Age, Phone_No) "
         + "VALUES ('Amit', 30000, 'Hyderabad', 30, 9848022338)");
      ResultSet alterResult = stmt.executeQuery("Select * from Employees");
      System.out.println("Contents of the table after altering "
         + "the table and inserting values to it: ");
      while(alterResult.next()) {
         System.out.println("Id: "+alterResult.getString("Id"));
         System.out.println("Name: "+alterResult.getString("Name"));
         System.out.println("Salary: "+alterResult.getString("Salary"));
         System.out.println("Location: "+alterResult.getString("Location"));
         System.out.println("Age: "+alterResult.getString("Age"));
         System.out.println("Phone_No: "+alterResult.getString("Phone_No"));
      }
   }
}

Output

以下是使用 ALTER 查询来更改表格的 JDBC 程序:

Table created

Values inserted

Contents of the table after inserting the table
Id: 1
Name: Amit
Salary: 30000
Location: Hyderabad
Id: 2
Name: Kalyan
Salary: 40000
Location: Vishakhapatnam
Id: 3
Name: Renuka
Salary: 50000
Location: Delhi
Id: 4
Name: Archana
Salary: 15000
Location: Mumbai
Id: 5
Name: Trupti
Salary: 45000
Location: Kochin

Contents of the table after altering the table and inserting values to it:
Id: 1
Name: Amit
Salary: 30000
Location: Hyderabad
Age: null
Phone_No: null
Id: 2
Name: Kalyan
Salary: 40000
Location: Vishakhapatnam
Age: null
Phone_No: null
Id: 3
Name: Renuka
Salary: 50000
Location: Delhi
Age: null
Phone_No: null
Id: 4
Name: Archana
Salary: 15000
Location: Mumbai
Age: null
Phone_No: null
Id: 5
Name: Trupti
Salary: 45000
Location: Kochin
Age: null
Phone_No: null
Id: 6
Name: Amit
Salary: 30000
Location: Hyderabad
Age: 30
Phone_No: 9848022338

Apache Derby - Derby Indexes

在执行以上程序时,将生成以下输出:

表格中的索引只不过是其数据的指针。这些用于加速从表格中检索数据。

Creating an Index

如果我们使用索引,则 INSERT 和 UPDATE 语句将以较慢的速度执行。而 SELECT 和 WHERE 将在较短的时间内执行。CREATE INDEX 语句用于在 Derby 数据库中表格内创建新索引。

Syntax

以下是 CREATE INDEX 语句的语法。

CTREATE INDEX index_name on table_name (column_name);

Example

假设我们创建了一个名为 Employees 的 Apache Derby 表,如下所示。

CREATE TABLE Emp ( Id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
   Name VARCHAR(255),
   Salary INT NOT NULL,
   Location VARCHAR(255),
   Phone_Number BIGINT
);

以下 SQL 语句在表 Employees 中名为 Salary 的列上创建了一个索引。

ij> CREATE INDEX example_index on Emp (Salary);
0 rows inserted/updated/deleted

Creating a UNIQUE index

在 Apache Derby 中,UNIQUE 索引用于数据集成。一旦在表中的列上创建了 UNIQUE 索引,不允许出现重复值。

Syntax

以下是创建唯一索引的语法。

CREATE UNIQUE INDEX index_name on table_name (column_name);

Example

以下示例在表 Employee 的 Id 列上创建了一个 UNIQUE 索引。

ij> CREATE UNIQUE INDEX unique_index on Emp (Phone_Number);
0 rows inserted/updated/deleted

一旦您在某列上创建了唯一索引,您就不能为该列在另一行中输入相同的值。简而言之,具有 UNIQUE 索引的列不允许出现重复值。

如下所示,在 Emp 表中插入一行。

ij> INSERT INTO Emp(Name, Salary, Location, Phone_Number) VALUES ('Amit',
45000, 'Hyderabad', 9848022338);
1 row inserted/updated/deleted

由于我们在列 Phone_No 上创建了唯一索引,如果您尝试输入与前一个记录中的相同值,它将显示错误。

ij> INSERT INTO Emp(Name, Salary, Location, Phone_Number) VALUES ('Sumit',
35000, 'Chennai', 9848022338);
ERROR 23505: The statement was aborted because it would have caused a duplicate
key value in a unique or primary key constraint or unique index identified by
'UNIQUE_INDEX' defined on 'EMP'.

Creating a COMPOSITE index

您可以在两行上创建单个索引,它称为复合索引。

Syntax

以下是复合索引的语法。

CREATE INDEX index_name on table_name (column_name1, column_name2);

Example

以下索引在列 Name 和 Location 上创建了一个复合索引。

ij> CREATE INDEX composite_index on Emp (Name, Location);
0 rows inserted/updated/deleted

Displaying the Indexes

SHOW INDEXES 查询显示表上的索引列表。

Syntax

以下是 SHOW INDEXES 语句的语法。

SHOW INDEXES FROM table_name;

Example

以下示例 i 显示表 Employees 上的索引。

ij> SHOW INDEXES FROM Emp;

这将产生以下结果。

ij> SHOW INDEXES FROM Emp;
TABLE_NAME |COLUMN_NAME |NON_U&|TYPE|ASC&|CARDINA&|PAGES
----------------------------------------------------------------------------
EMP        |PHONE_NUMBER|false |3   |A   |NULL    |NULL
EMP        |NAME        |true  |3   |A   |NULL    |NULL
EMP        |LOCATION    |true  |3   |A   |NULL    |NULL
EMP        |SALARY      |true  |3   |A   |NULL    |NULL
4 rows selected

Dropping Indexes

Drop Index 语句会删除/放弃某个列上的给定索引。

Syntax

以下是 DROP INDEX 语句的语法。

DROP INDEX index_name;

Example

以下示例放弃了上面创建的 composite_index 和 unique_index。

ij> DROP INDEX composite_index;
0 rows inserted/updated/deleted
ij>Drop INDEX unique_index;
0 rows inserted/updated/deleted

现在,如果您验证索引列表,您可以看到一列上的索引,因为我们删除了剩余的索引。

ij> SHOW INDEXES FROM Emp;
TABLE_NAME |COLUMN_NAME |NON_U&|TYPE|ASC&|CARDINA&|PAGES
----------------------------------------------------------------------------
EMP        |SALARY      |true  |3   |A   |NULL     |NULL
1 row selected

Handling Indexes using JDBC program

以下 JDBC 程序演示如何删除表中一列上的索引。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class IndexesExample {
   public static void main(String args[]) throws Exception {

      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:MYDATABASE;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Creating the Emp table
      String createQuery = "CREATE TABLE Emp( "
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), "
         + "Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "Phone_Number BIGINT )";
      stmt.execute(createQuery);
      System.out.println("Table created");
      System.out.println(" ");

      //Creating an Index on the column Salary
      stmt.execute("CREATE INDEX example_index on Emp (Salary)");
      System.out.println("Index example_index inserted");
      System.out.println(" ");

      //Creating an Unique index on the column Phone_Number
      stmt.execute("CREATE UNIQUE INDEX unique_index on Emp (Phone_Number)");
      System.out.println("Index unique_index inserted");
      System.out.println(" ");

      //Creating a Composite Index on the columns Name and Location
      stmt.execute("CREATE INDEX composite_index on Emp (Name, Location)");
      System.out.println("Index composite_index inserted");
      System.out.println(" ");

      //listing all the indexes
      System.out.println("Listing all the columns with indexes");

      //Dropping indexes
      System.out.println("Dropping indexes unique_index and, composite_index ");
      stmt.execute("Drop INDEX unique_index");
      stmt.execute("DROP INDEX composite_index");
   }
}

Output

执行后,生成以下结果

Table created
Index example_index inserted

Index unique_index inserted

Index composite_index inserted

Listing all the columns with indexes
Dropping indexes unique_index and, composite_index

Apache Derby - Procedures

本节将为您讲解如何在 Derby 中创建和删除过程。

Creating a procedure

您可以使用 CREATE PROCEDURE 语句创建过程。

Syntax

以下是 CREATE PROCEDURE 语句的语法。

CREATE PROCEDURE procedure_name (parameter_type parameter_name1, parameter_type
parameter_name2 . . . .) parameter_style;

Example

假设我们在 Derby 中创建了一个表,如下所示。

CREATE TABLE Emp ( Id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
   Name VARCHAR(255),
   Salary INT NOT NULL,
   Location VARCHAR(255),
   Phone_Number BIGINT
);

并向其中插入了值,如下所示 -

INSERT INTO Employees(Name, Salary, Location) VALUES
('Amit', 30000, 'Hyderabad'),
('Kalyan', 40000, 'Vishakhapatnam'),
('Renuka', 50000, 'Delhi'),
('Archana', 15000, 'Mumbai'),
('Trupthi', 45000, 'Kochin')";

以下示例创建了一个名为 Update_Procedure 的过程,它接受 JAVA 参数。

ij> CREATE PROCEDURE Update_Procedure(IN id INTEGER, IN name VARCHAR(10))
PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME
'ProcedureExample.testProc';
> 0 rows inserted/updated/deleted

ProcedureExample 类的外观如下所示 -

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class ProcedureExample {
   public static void testProc(int salary, String name) throws Exception {
      String connectionURL = "jdbc:derby:MYDATABASE;create=true";
      Connection conn = DriverManager.getConnection(connectionURL);
      String query = "UPDATE Employees SET SALARY = ? WHERE NAME = ?";
      PreparedStatement pstmt = conn.prepareStatement(query);
      pstmt.setInt(1, salary);
      pstmt.setString (2, name);
      pstmt.executeUpdate();
   }
}

您可以使用 SHOW PROCEDURES 查询验证过程列表。

ij> SHOW PROCEDURES;
PROCEDURE_SCHEM |PROCEDURE_NAME        |REMARKS
------------------------------------------------------------------------
APP             |UPDATE_PROCEDURE      |ProcedureExample.te&
SALES           |EXAMPLE_ PROCEDURE    |com.example.sales.c&
SQLJ            |INSTALL_JAR           |org.apache.derby.ca&
SQLJ            |REMOVE_JAR            |org.apache.derby.ca&
SQLJ            |REPLACE_JAR           |org.apache.derby.ca&
SYSCS_UTIL      |SYSCS_BACKUP_DATABASE |org.apache.derby.ca&
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

在此处您可以观察到新创建的过程。

Dropping a procedure

您可以使用 DROP PROCEDURE 语句删除过程。

Syntax

以下是 DROP PROCEDURE 语句的语法。

DROP PROCEDURE procedure_name;

Example

以下示例删除了上面创建的 Update_Procedure 过程。

ij> DROP PROCEDURE Update_Procedure;
> 0 rows inserted/updated/deleted

Apache Derby - Schemas

数据库架构是表示整个数据库的逻辑视图的骨架结构。它定义了数据如何组织以及它们之间的关系如何关联。它制定了将应用于数据的所有约束。

Creating a Schema

您可以使用 CREATE SCHEMA 语句在 Apache Derby 中创建模式。

Syntax

以下是 CREATE SCHEMA 语句的语法。

CREATE SCHEMA schema_name AUTHORIZATION id

Example

以下示例在 Derby 数据库中创建一个名为 my_schema 的模式。

ij> CREATE SCHEMA AUTHORIZATION my_schema;
0 rows inserted/updated/deleted

然后,您可以在此模式中创建表,如下所示。

ij> CREATE TABLE my_schema.Emp ( Id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
   Name VARCHAR(255),
   Salary INT NOT NULL,
   Location VARCHAR(255),
   Phone_Number BIGINT
);
> > > > > 0 rows inserted/updated/deleted

您可以在此处使用 SHOW SCHEMAS 查询来验证模式列表,您可以在此处找到所创建模式的列表。

ij> show schemas;
TABLE_SCHEM
------------------------------
APP
MY_SCHEMA
NULLID
SQLJ
SYS
SYSCAT
SYSCS_DIAG
SYSCS_UTIL
SYSFUN
SYSIBM
SYSPROC
SYSSTAT
12 rows selected

Dropping a Schema

您可以使用 DROP SCHEMA 语句删除现有模式。

Syntax

以下是 DROPS SCHEMA 语句的语法。

DROP SCHEMA my_schema RESTRICT;

Example

只有当架构中没有任何对象时,您才能删除该架构。要删除架构,请删除其中的所有表并删除架构。

ij> DROP TABLE my_schema.Emp;
0 rows inserted/updated/deleted

以下示例删除上面创建的模式。

ij> DROP SCHEMA my_schema RESTRICT;
0 rows inserted/updated/deleted

JDBC Example

以下 JDBC 示例创建并删除名为 my_schema 的模式。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class CreateSchemaExample {
   public static void main(String args[]) throws Exception {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:sampleDB;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      stmt.execute("CREATE SCHEMA AUTHORIZATION my_schema");
      //Executing the query
      String query = "CREATE TABLE my_schema.Employees( "
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), "
         + "Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "PRIMARY KEY (Id))";
      stmt.execute(query);
      System.out.println("Table created in schema");
      stmt.execute("DROP TABLE my_schema.Employees");
      stmt.execute("DROP SCHEMA my_schema RESTRICT");
      System.out.println("Schema dropped");
   }
}

Output

执行后,以上程序生成以下示例。

Table created in schema
Schema dropped

Apache Derby - Triggers

在数据库中,触发器是每当发生事件时执行的语句/代码。一旦您为表上的特定事件创建了触发器,触发器中指定的代码将每次发生事件时执行。您可以在单个表上创建多个触发器。

本章将向您介绍如何使用 Apache Derby 创建和删除触发器。

Creating a trigger

您可以使用 CREATE TRIGGER 语句在 Derby 中创建触发器。

Syntax

以下是 CREATE TRIGGER 查询的语法。

CREATE TRIGGER trigger_name
{ NO CASCADE BEFORE | AFTER }
{INSERT [OR] | UPDATE [OR] | DELETE}[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW]
Statement

Example

假设我们在 Derby 中创建了一个名为 Emp 的表,如下所示。

CREATE TABLE Emp (
   Id INT NOT NULL,
   Name VARCHAR(255),
   Salary INT NOT NULL,
   Location VARCHAR(255)
);

并在其中插入了 5 行。

INSERT INTO Emp(Id, Name, Salary, Location) VALUES
(1, 'Amit', 30000, 'Hyderabad'),
(2, 'Kalyan', 40000, 'Vishakhapatnam'),
(3,'Renuka', 50000, 'Delhi'),
(4, 'Archana', 15000, 'Mumbai'),
(5, 'Trupthi', 45000, 'Kochin');

如果我们有另一个名为 BackUp 的表,我们的目的是存储 Emp 表中的已删除行。

CREATE TABLE BackUp (
   Id INT NOT NULL,
   Name VARCHAR(255),
   Salary INT NOT NULL,
   Location VARCHAR(255)
);

以下查询在 DELETE 查询表中创建了一个名为 Emp 的触发器。它将 Emp 的已删除行存储在 Backup 表中。

ij> CREATE TRIGGER my_trigger
AFTER DELETE ON Emp
REFERENCING OLD AS oldRow
FOR EACH ROW MODE DB2SQL
INSERT INTO BackUp
VALUES (oldRow.Id, oldRow.Name, oldRow.Salary, oldRow.Location);

现在,从 Emp 表中删除一行,如下所示:

ij> Delete From Emp where Name = 'Kalyan';
1 row inserted/updated/deleted
ij> Delete From Emp where Name = 'Amit';
1 row inserted/updated/deleted

如果验证 BackUp 表,你可以在其中观察已删除的行。

ij> select * from BackUp;
ID |NAME   |SALARY |LOCATION
-------------------------------------------------------------------------
2  |Kalyan |40000  |Vishakhapatnam
1  |Amit   |30000  |Hyderabad

2 rows selected

Deleting a trigger

你可以使用 DROP TRIGGER 语句在 Derby 中删除触发器。

Syntax

以下是 DROP TRIGGER 查询的语法:

ij> Drop trigger tigger_name;

Example

以下示例删除了上面创建的触发器 my_trigger:

ij> Drop trigger my_trigger;
0 rows inserted/updated/deleted

JDBC example

以下 JDBC 程序在 Derby 中创建和删除触发器。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Triggers_Example {
   public static void main(String args[]) throws SQLException, ClassNotFoundException {
      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:TestDataBase;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Creating the Emp table
      stmt.execute("CREATE TABLE Emp ( "
         + "Id INT NOT NULL, "
         + "Name VARCHAR(255), "
         + "Salary INT NOT NULL, "
         + "Location VARCHAR(255))");

      //Insert values in to the EMp table
      String query = "INSERT INTO Emp(Id, Name, Salary, Location) VALUES \r\n"
         +"(1, 'Amit', 30000, 'Hyderabad'), "
         + "(2, 'Kalyan', 40000, 'Vishakhapatnam'), "
         + "(3,'Renuka', 50000, 'Delhi'), "
         + "(4, 'Archana', 15000, 'Mumbai'), "
         + "(5, 'Trupthi', 45000, 'Kochin')";
         stmt.execute(query);

      //Creating the BackUp table
      stmt.execute("CREATE TABLE BackUp ( "
         + "Id INT NOT NULL, "
         + "Name VARCHAR(255), "
         + "Salary INT NOT NULL, "
         + "Location VARCHAR(255))");

      //Creating a trigger
      String createTrigger = "CREATE TRIGGER my_trigger "
         + "AFTER DELETE ON Emp "
         + "REFERENCING OLD AS oldRow "
         + "FOR EACH ROW MODE DB2SQL "
         + "INSERT INTO BackUp "
         + "VALUES (oldRow.Id, oldRow.Name, oldRow.Salary, oldRow.Location)";
      stmt.execute(createTrigger);
      System.out.println("Trigger created");

      //Deleting records from Emp table
      stmt.executeUpdate("Delete From Emp where Name = 'Kalyan'");
      stmt.executeUpdate("Delete From Emp where Name = 'Amit'");
      //Getting the contents of BackUp table
      ResultSet rs = stmt.executeQuery("SELECT * from BackUp");
      while(rs.next()){
         System.out.println(rs.getInt("Id"));
         System.out.println(rs.getString("Name"));
         System.out.println(rs.getString("Salary"));
         System.out.println(rs.getString("Location"));
         System.out.println(" ");
      }
   }
}

Output

在执行上述程序时,生成以下输出 −

Trigger created
2
Kalyan
40000
Vishakhapatnam
1
Amit
30000
Hyderabad