Apache Derby 快速指南



Apache Derby - 簡介

Apache Derby 是一個完全基於 Java 程式語言的關係資料庫管理系統 (RDBMS)。它是由 Apache 軟體基金會開發的開源資料庫。

Oracle 釋出了 Apache Derby 的等效產品,名為 JavaDB。

Apache Derby 的特性

以下是 Derby 資料庫的顯著特性:

  • 平臺無關性 - Derby 使用基於磁碟的資料庫格式,其資料庫儲存在磁碟上與資料庫同名的目錄中的檔案中。

  • 無需修改資料 - 正因為如此,您可以將 Derby 資料庫移動到其他機器而無需修改資料。

  • 事務支援 - Derby 完全支援事務,確保資料完整性。

  • 包含資料庫 - 您可以將預構建/現有資料庫包含到您當前的 Derby 應用程式中。

  • 佔用空間小 - Derby 資料庫佔用空間小,易於使用和部署。

  • 嵌入到 Java 應用程式中 - Derby 提供一個嵌入式資料庫引擎,可以嵌入到 Java 應用程式中,並在與應用程式相同的 JVM 中執行。只需載入驅動程式即可啟動資料庫,並隨應用程式停止。

Apache Derby 的限制

以下是 Apache Derby 的限制:

  • Derby 不支援 BLOB 和 LONGVARCHAR 等資料型別的索引。

  • 如果 Derby 沒有足夠的磁碟空間,它將立即關閉。

資料儲存

在儲存資料時,Apache Derby 遵循一個稱為聚集 (conglomerate) 的概念。其中,表的將儲存在單獨的檔案中。同樣,表的每個索引也儲存在單獨的檔案中。因此,資料庫中每個表或索引都將有一個單獨的檔案。

Apache Derby 庫/元件

Apache Derby 發行版提供了各種元件。在您下載的 Apache 發行版的 lib 資料夾中,您可以看到表示各種元件的 jar 檔案。

Jar 檔案 元件 描述
derby.jar 資料庫引擎和 JDBC 驅動程式

Apache Derby 的資料庫引擎是一個嵌入式關係資料庫引擎,支援 JDBC 和 SQL API。

它也充當嵌入式驅動程式,您可以使用它透過 Java 應用程式與 Derby 通訊。

derbynet.jar derbyrun.jar 網路伺服器

Apache Derby 的網路伺服器提供客戶端伺服器功能,客戶端可以透過網路連線到 Derby 伺服器。

derbyclient.jar 網路客戶端 JDBC 驅動程式
derbytools.jar 命令列工具 此 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 - 部署模式

您可以以兩種模式部署 Apache Derby,即嵌入模式和伺服器模式。

嵌入模式

您可以使用 Java 應用程式(使用嵌入式驅動程式)在嵌入模式下執行 Derby。如果您在嵌入模式下部署 Derby,則資料庫引擎將在與 Java 應用程式相同的 JVM 中執行。它隨應用程式啟動和停止。您只能透過此應用程式訪問資料庫。

Embedded Mode

伺服器模式

在伺服器模式下,Derby 將在應用程式伺服器的 JVM 中執行,您可以向伺服器傳送請求以訪問它。與嵌入模式不同,多個應用程式(Java)可以向伺服器傳送請求並訪問資料庫。

Server Mode

Apache Derby - 環境設定

下一章將解釋如何下載和安裝 Apache Derby。

下載 Apache Derby

訪問 Apache Derby 主頁 https://db.apache.org/derby/。點選“下載”選項卡。

Home page of Apache Derby

選擇並點選 Apache Derby 最新版本的連結。

Latest version of Apache Derby

點選所選連結後,您將被重定向到 Apache Derby 的發行版頁面。在這裡您可以看到,Derby 提供的發行版包括 db-derby-bin、db-derbylib.zip、db-derby-lib-debug.zip 和 db-derby-src.zip。

下載db-derby-bin 資料夾。將其內容複製到您想要安裝 Apache Derby 的單獨資料夾中(例如,C:\Derby)。

現在,要使用 Derby,

  • 確保您已透過傳遞 Java 安裝資料夾的 bin 資料夾的位置設定了JAVA_HOME 變數,並將JAVA_HOME/bin 包含在 PATH 變數中。

  • 建立一個新的環境變數DERBY_HOME,其值為 C:\Derby。

  • db-derby-bin 發行版的 bin 資料夾(我們將其更改為 C:\Derby\bin)包含所有必需的 jar 檔案。

如上所述,Apache Derby 可以透過以下兩種方式安裝/部署:

  • 嵌入模式 - 在此模式下,您需要使用嵌入式 Derby JDBC 驅動程式訪問資料庫。您可以透過 Java 應用程式啟動和停止 Derby。資料庫引擎和您的應用程式都將在同一個 JVM 上執行。

  • 網路伺服器模式 - 在此模式下,您可以以典型的客戶端伺服器方式訪問 Derby,其中 Derby 嵌入在伺服器系統中。然後,在不同 JVM(伺服器的 JVM)中執行的客戶端機器將向伺服器傳送請求,伺服器將響應這些請求。

客戶端可以是伺服器同一系統機器中的另一個 JVM,也可以是來自遠端系統的 Java 應用程式。

在嵌入模式下安裝 Derby

要在嵌入模式下安裝 Apache Derby,請將 jar 檔案derby.jar 包含在您的 CLASSPATH 中。

或者,您可以透過執行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 程式。

驗證

您可以使用ij 工具驗證設定,如下所示:

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

在網路伺服器模式下安裝 Derby

要在網路伺服器模式下安裝 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\*;

在伺服器模式下啟動 Derby

您可以透過執行命令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

網路客戶端

在客戶端中,將 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\*;

然後,您可以從該客戶端向伺服器傳送請求。

驗證

您可以使用ij 工具驗證設定,如下所示:

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

Apache Derby Eclipse 環境

在使用 Eclipse 時,您需要為所有必需的 jar 檔案設定構建路徑。

步驟 1:建立專案並設定構建路徑

開啟 Eclipse 並建立一個示例專案。右鍵單擊專案,然後選擇選項構建路徑 -> 配置構建路徑,如下所示:

Configure Build Path

Java 構建路徑框架的選項卡中,單擊新增外部 JARs

Java Build Path

然後選擇 Derby 安裝資料夾的 lib 資料夾中所需的jar 檔案,然後單擊應用並關閉

Apache Derby - 工具

Apache Derby 提供了sysinfo、ijdblook 等工具。

sysinfo 工具

使用此工具,您可以獲取有關 Java 和 Derby 環境的資訊。

瀏覽 Derby 安裝目錄的 bin 資料夾並執行 sysinfo 命令,如下所示:

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

ij 工具

使用此工具,您可以執行 Apache Derby 的指令碼和查詢。

瀏覽 Derby 安裝目錄的 bin 資料夾並執行 ij 命令,如下所示:

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.

dblook 工具

此工具用於生成資料定義語言 (DDL)。

瀏覽 Derby 安裝目錄的 bin 資料夾並執行dblook 命令,如下所示:

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

其中,myURL 是您需要為其生成 DDL 的資料庫的連線 URL。

Apache Derby - 語法

本章介紹所有 Apache Derby SQL 語句的語法。

所有語句都以 SELECT、INSERT、UPDATE、DELETE、ALTER、DROP、CREATE、USE、SHOW 等關鍵字中的任何一個開頭,所有語句都以分號 (;) 結尾。

Apache Derby 的 SQL 語句不區分大小寫,包括表名。

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)
);

DROP TABLE

DROP TABLE table_name;

INSERT 語句

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

SELECT 語句

SELECT column_name, column_name, ... FROM table_name;

UPDATE 語句

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

DELETE 語句

DELETE FROM table_name WHERE condition;

DESCRIBE 語句

Describe table_name

SQL TRUNCATE TABLE 語句

TRUNCATE TABLE table_name;

ALTER 語句 - 新增列

ALTER TABLE table_name ADD COLUMN column_name column_type;

ALTER 語句 - 新增約束

ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint (column_name);

ALTER 語句 - 刪除列

ALTER TABLE table_name DROP COLUMN column_name;

ALTER 語句 - 刪除約束

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

WHERE 子句

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 子句

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

ORDER BY 子句

SELECT * FROM table_name ORDER BY column_name ASC|DESC.

HAVING 子句

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

建立索引

CTREATE INDEX index_name on table_name (column_name);

建立唯一索引

CREATE UNIQUE INDEX index_name on table_name (column_name);

建立複合索引

CREATE INDEX index_name on table_name (column_name1, column_name2);

顯示索引

SHOW INDEXES FROM table_name;

刪除索引

DROP INDEX index_name;

Apache Derby - 資料型別

資料型別是一種屬性,用於指定任何物件的的資料型別。每個列、變數和表示式都有一個相關的資料型別。在建立表時可以使用這些資料型別。您可以根據需要為表列選擇資料型別。

Derby 伺服器提供以下幾類資料型別:

整數數值資料型別

以下是整數數值資料型別的列表:

資料型別 大小
SMALLINT 2 位元組 -32768 32767
INTEGER 4 位元組 -2,147,483,648 2,147,483,647
BIGINT 8 位元組 -9223372036854775808 9223372036854775808

近似數值資料型別

以下是近似數值資料型別的列表:

資料型別 大小
REAL 4 位元組 -3.40E + 38 3.40E + 38
DOUBLE PRECISION 8 位元組 -1.79E + 308 1.79E + 308
FLOAT -1.79E + 308 1.79E + 308

精確數值資料型別

以下是精確數值資料型別的列表:

資料型別
DECIMAL -10^38 +1 10^38 -1
NUMERIC -10^38 +1 10^38 -1

Apache Derby - 建立表

CREATE TABLE 語句用於在 Derby 資料庫中建立一個新表。

語法

以下是 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;

示例

以下 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

使用 JDBC 程式建立表

本節介紹如何使用 JDBC 應用程式在 Apache Derby 資料庫中建立表。

如果要使用網路客戶端請求 Derby 網路伺服器,請確保伺服器正在執行。網路客戶端驅動程式的類名為 org.apache.derby.jdbc.ClientDriver,URL 為 jdbc:derby://:1527/DATABASE_NAME;create=true;user=USER_NAME;password=PASSWORD。

按照以下步驟在 Apache Derby 中建立表:

步驟 1:註冊驅動程式

要與資料庫通訊,首先需要註冊驅動程式。Class 類的 forName() 方法接受一個表示類名的字串值,將其載入到記憶體中,這會自動註冊它。使用此方法註冊驅動程式。

步驟 2:獲取連線

通常,與資料庫通訊的第一步是連線到它。Connection 類表示與資料庫伺服器的物理連線。可以透過呼叫 DriverManager 類的 getConnection() 方法來建立連線物件。使用此方法建立連線。

步驟 3:建立語句物件

需要建立 Statement、PreparedStatement 或 CallableStatement 物件才能將 SQL 語句傳送到資料庫。可以使用 createStatement()、prepareStatement() 和 prepareCall() 方法分別建立這些物件。使用適當的方法建立這些物件中的任何一個。

步驟 4:執行查詢

建立語句後,需要執行它。Statement 類提供各種方法來執行查詢,例如 execute() 方法用於執行返回多個結果集的語句。executeUpdate() 方法執行 INSERT、UPDATE、DELETE 等查詢。executeQuery() 方法用於返回資料的查詢結果等。使用這些方法中的任何一個並執行先前建立的語句。

示例

下面的 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");
   }
}

輸出

執行上述程式後,將獲得以下輸出

Table created

Apache Derby - 刪除表

DROP TABLE 語句用於刪除現有表,包括其所有觸發器、約束和許可權。

語法

以下是 DROP TABLE 語句的語法。

ij> DROP TABLE table_name;

示例

假設資料庫中有一個名為 Student 的表。以下 SQL 語句刪除名為 Student 的表。

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

由於我們已刪除該表,如果嘗試對其進行描述,則會收到如下錯誤

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

使用 JDBC 程式刪除表

本節介紹如何使用 JDBC 應用程式在 Apache Derby 資料庫中刪除表。

如果要使用網路客戶端請求 Derby 網路伺服器,請確保伺服器正在執行。網路客戶端驅動程式的類名為 org.apache.derby.jdbc.ClientDriver,URL 為 jdbc:derby://:1527/DATABASE_NAME;create=true;user=USER_NAME;password=PASSWORD。

按照以下步驟在 Apache Derby 中刪除表

步驟 1:註冊驅動程式

要與資料庫通訊,首先需要註冊驅動程式。Class 類的 forName() 方法接受一個表示類名的字串值,將其載入到記憶體中,這會自動註冊它。使用此方法註冊驅動程式。

步驟 2:獲取連線

通常,與資料庫通訊的第一步是連線到它。Connection 類表示與資料庫伺服器的物理連線。可以透過呼叫 DriverManager 類的 getConnection() 方法來建立連線物件。使用此方法建立連線。

步驟 3:建立語句物件

需要建立 Statement、PreparedStatement 或 CallableStatement 物件才能將 SQL 語句傳送到資料庫。可以使用 createStatement()、prepareStatement() 和 prepareCall() 方法分別建立這些物件。使用適當的方法建立這些物件中的任何一個。

步驟 4:執行查詢

建立語句後,需要執行它。Statement 類提供各種方法來執行查詢,例如 execute() 方法用於執行返回多個結果集的語句。executeUpdate() 方法執行 INSERT、UPDATE、DELETE 等查詢。executeQuery() 方法用於返回資料的查詢結果等。使用這些方法中的任何一個並執行先前建立的語句。

示例

下面的 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");
   }
}

輸出

執行上述程式後,將獲得以下輸出:

Table dropped

Apache Derby - 插入資料

INSERT 查詢插入資料:新記錄到表中。

語法

以下是 INSERT 語句的基本語法:

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

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

示例

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

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

語法 2

或者,您可以透過提及列名來插入兩列,如下所示:

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

注意 - Apache Derby 自動計算生成列的值。例如,無需為本教程前面建立的 student 表中的 id 列傳遞值。如果您的表具有生成列,請使用語法 2

示例

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 命令驗證表的內容(我們將在本教程的後面部分討論此命令)。

語法 3

您可以在 insert 語句中使用另一個查詢,如下所示:

INSERT INTO table_Name Query 

示例

假設資料庫中有一個名為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

執行所有上述 insert 語句後,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 

使用 JDBC 程式插入資料

本節介紹如何使用 JDBC 應用程式在 Apache Derby 資料庫中將資料插入表中。

如果要使用網路客戶端請求 Derby 網路伺服器,請確保伺服器正在執行。網路客戶端驅動程式的類名為 org.apache.derby.jdbc.ClientDriver,URL 為 jdbc:derby://:1527/DATABASE_NAME;create=true;user=USER_NAME;password=PASSWORD。

按照以下步驟將資料插入 Apache Derby 中的表:

步驟 1:註冊驅動程式

要與資料庫通訊,首先需要註冊驅動程式。Class 類的 forName() 方法接受一個表示類名的字串值,將其載入到記憶體中,這會自動註冊它。使用此方法註冊驅動程式。

步驟 2:獲取連線

通常,與資料庫通訊的第一步是連線到它。Connection 類表示與資料庫伺服器的物理連線。可以透過呼叫 DriverManager 類的 getConnection() 方法來建立連線物件。使用此方法建立連線。

步驟 3:建立語句物件

需要建立 Statement、PreparedStatement 或 CallableStatement 物件才能將 SQL 語句傳送到資料庫。可以使用 createStatement()、prepareStatement() 和 prepareCall() 方法分別建立這些物件。使用適當的方法建立這些物件中的任何一個。

步驟 4:執行查詢

建立語句後,需要執行它。Statement 類提供各種方法來執行查詢,例如 execute() 方法用於執行返回多個結果集的語句。

executeUpdate() 方法執行 INSERT、UPDATE、DELETE 等查詢。executeQuery() 方法用於返回資料的查詢結果等。使用這些方法中的任何一個並執行先前建立的語句。

示例

下面的 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");
   }
}

輸出

執行上述程式後,將獲得以下輸出:

Values inserted

Apache Derby - 檢索資料

SELECT 語句用於從表中檢索資料。這將以稱為結果集的表的形式返回資料。

語法

以下是 SELECT 語句的語法:

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

示例

讓我們假設資料庫中有一個名為 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

使用 JDBC 程式檢索資料

本節介紹如何使用 JDBC 應用程式從 Apache Derby 資料庫中的表中檢索資料。

如果要使用網路客戶端請求 Derby 網路伺服器,請確保伺服器正在執行。網路客戶端驅動程式的類名為 org.apache.derby.jdbc.ClientDriver,URL 為 jdbc:derby://:1527/DATABASE_NAME;create=true;user=USER_NAME;password=PASSWORD。

按照以下步驟從 Apache Derby 中的表中檢索資料:

步驟 1:註冊驅動程式

要與資料庫通訊,首先需要註冊驅動程式。Class 類的 forName() 方法接受一個表示類名的字串值,將其載入到記憶體中,這會自動註冊它。使用此方法註冊驅動程式。

步驟 2:獲取連線

通常,與資料庫通訊的第一步是連線到它。Connection 類表示與資料庫伺服器的物理連線。可以透過呼叫 DriverManager 類的 getConnection() 方法來建立連線物件。使用此方法建立連線。

步驟 3:建立語句物件

需要建立 Statement、PreparedStatement 或 CallableStatement 物件才能將 SQL 語句傳送到資料庫。可以使用 createStatement()、prepareStatement() 和 prepareCall() 方法分別建立這些物件。使用適當的方法建立這些物件中的任何一個。

步驟 4:執行查詢

建立語句後,需要執行它。Statement 類提供各種方法來執行查詢,例如 execute() 方法用於執行返回多個結果集的語句。executeUpdate() 方法執行 INSERT、UPDATE、DELETE 等查詢。executeQuery() 方法用於返回資料的查詢結果等。使用這些方法中的任何一個並執行先前建立的語句。

示例

下面的 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(" ");
      }
   }
}

輸出

執行上述程式後,將獲得以下輸出

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 語句用於更新表中的資料。Apache Derby 提供兩種型別的更新(語法),即搜尋更新和定位更新。

搜尋 UPDATE 語句更新表的指定列。

語法

以下是 UPDATE 查詢的語法:

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

WHERE 子句可以使用比較運算子,例如 =、!=、<、>、<= 和 >=,以及 BETWEEN 和 LIKE 運算子。

示例

假設資料庫中有一個 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

使用 JDBC 程式更新資料

本節說明如何使用 JDBC 應用程式更新 Apache Derby 資料庫中表中現有記錄。

如果要使用網路客戶端請求 Derby 網路伺服器,請確保伺服器正在執行。網路客戶端驅動程式的類名為 org.apache.derby.jdbc.ClientDriver,URL 為 jdbc:derby://:1527/DATABASE_NAME;create=true;user=USER_NAME;password=PASSWORD。

請按照以下步驟更新 Apache Derby 中表中現有記錄。

步驟 1:註冊驅動程式

要與資料庫通訊,首先需要註冊驅動程式。Class 類的 forName() 方法接受一個表示類名的字串值,將其載入到記憶體中,這會自動註冊它。使用此方法註冊驅動程式。

步驟 2:獲取連線

通常,我們與資料庫通訊的第一步是連線到它。Connection 類表示與資料庫伺服器的物理連線。您可以透過呼叫 **DriverManager** 類的 **getConnection()** 方法來建立連線物件。使用此方法建立連線。

步驟 3:建立語句物件

您需要建立 **Statement** 或 **PreparedStatement** 或 **CallableStatement** 物件來向資料庫傳送 SQL 語句。您可以分別使用 **createStatement()**、**prepareStatement()** 和 **prepareCall()** 方法建立這些物件。使用適當的方法建立其中任何一個物件。

步驟 4:執行查詢

建立語句後,您需要執行它。**Statement** 類提供各種方法來執行查詢,例如 **execute()** 方法執行返回多個結果集的語句。**executeUpdate()** 方法執行 INSERT、UPDATE、DELETE 等查詢。**executeQuery()** 方法返回資料。使用這些方法中的任何一種並執行先前建立的語句。

示例

下面的 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);
   }
}

輸出

執行上述程式後,將獲得以下輸出:

Number of records updated are: 1 

Apache Derby - 刪除資料

DELETE 語句用於刪除錶行。與 UPDATE 語句一樣,Apache Derby 提供兩種型別的 Delete(語法):**searched** 刪除和 **positioned** 刪除。

searched delete 語句刪除表中所有指定的列。

語法

DELETE 語句的語法如下:

ij> DELETE FROM table_name WHERE condition;

示例

假設我們有一個名為 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

使用 JDBC 程式刪除資料

本節說明如何使用 JDBC 應用程式刪除 Apache Derby 資料庫中表中現有記錄。

如果您想使用網路客戶端請求 Derby 網路伺服器,請確保伺服器已啟動並正在執行。網路客戶端驅動程式的類名為 org.apache.derby.jdbc.ClientDriver,URL 為 jdbc:derby://:1527/DATABASE_NAME;create=true;user=USER_NAME;password=PASSWORD"。

請按照以下步驟刪除 Apache Derby 中表中現有記錄:

步驟 1:註冊驅動程式

首先,您需要註冊驅動程式才能與資料庫通訊。**Class** 類的 **forName()** 方法接受一個表示類名的字串值,將其載入到記憶體中,這會自動註冊它。使用此方法註冊驅動程式。

步驟 2:獲取連線

通常,我們與資料庫通訊的第一步是連線到它。**Connection** 類表示與資料庫伺服器的物理連線。您可以透過呼叫 **DriverManager** 類的 **getConnection()** 方法來建立連線物件。使用此方法建立連線。

步驟 3:建立語句物件

需要建立 Statement、PreparedStatement 或 CallableStatement 物件才能將 SQL 語句傳送到資料庫。可以使用 createStatement()、prepareStatement() 和 prepareCall() 方法分別建立這些物件。使用適當的方法建立這些物件中的任何一個。

步驟 4:執行查詢

建立語句後,您需要執行它。**Statement** 類提供各種方法來執行查詢,例如 **execute()** 方法執行返回多個結果集的語句。**executeUpdate()** 方法執行 INSERT、UPDATE、DELETE 等查詢。**executeQuery()** 方法返回資料的結果。使用這些方法中的任何一種並執行先前建立的語句。

示例

下面的 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);
   }
}

輸出

執行上述程式後,將獲得以下輸出:

Number of records deleted are: 1

Apache Derby - WHERE 子句

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 運算子。

示例

讓我們假設資料庫中有一個名為 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 子句 JDBC 示例

本節將教您如何在 Apache Derby 資料庫中使用 WHERE 子句並使用 JDBC 應用程式對錶執行 CURD 操作。

如果您想使用網路客戶端請求 Derby 網路伺服器,請確保伺服器已啟動並正在執行。網路客戶端驅動程式的類名為 org.apache.derby.jdbc.ClientDriver,URL 為 jdbc:derby://:1527/DATABASE_NAME;create=true;user=USER_NAME;password=PASSWORD"。

請按照以下步驟使用 WHERE 子句並對 Apache Derby 中的表執行 CURD 操作

步驟 1:註冊驅動程式

要與資料庫通訊,首先需要註冊驅動程式。**Class** 類的 **forName()** 方法接受一個表示類名的字串值,將其載入到記憶體中,這會自動註冊它。使用此方法註冊驅動程式

步驟 2:獲取連線

通常,與資料庫通訊的第一步是連線到它。Connection 類表示與資料庫伺服器的物理連線。可以透過呼叫 DriverManager 類的 getConnection() 方法來建立連線物件。使用此方法建立連線。

步驟 3:建立語句物件

需要建立 Statement、PreparedStatement 或 CallableStatement 物件才能將 SQL 語句傳送到資料庫。可以使用 createStatement()、prepareStatement() 和 prepareCall() 方法分別建立這些物件。使用適當的方法建立這些物件中的任何一個。

步驟 4:執行查詢

建立語句後,您需要執行它。**Statement** 類提供各種方法來執行查詢,例如 **execute()** 方法執行返回多個結果集的語句。**executeUpdate()** 方法執行 INSERT、UPDATE、DELETE 等查詢。**executeQuery()** 方法返回資料的結果。使用這些方法中的任何一種並執行先前建立的語句。

示例

下面的 JDBC 示例演示瞭如何使用 WHERE 子句並使用 JDBC 程式在 Apache Derby 中對錶執行 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(" ");
      }
   }
}

輸出

執行上述程式後,將獲得以下輸出:

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 子句

GROUP BY 子句與 SELECT 語句一起使用。它用於在資料相同的情況下形成子集。通常,此子句後跟 ORDER BY 子句,並放在 WHERE 子句之後。

語法

以下是 GROUP BY 子句的語法:

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

示例

假設資料庫中有一個名為 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 子句 JDBC 示例

本節將教您如何在 Apache Derby 資料庫中使用 Group By 子句並使用 JDBC 應用程式對錶執行 CURD 操作。

如果要使用網路客戶端請求 Derby 網路伺服器,請確保伺服器正在執行。網路客戶端驅動程式的類名為 org.apache.derby.jdbc.ClientDriver,URL 為 jdbc:derby://:1527/DATABASE_NAME;create=true;user=USER_NAME;password=PASSWORD。

請按照以下步驟使用 Group By 子句並對 Apache Derby 中的表執行 CURD 操作

步驟 1:註冊驅動程式

要與資料庫通訊,首先需要註冊驅動程式。Class 類的 forName() 方法接受一個表示類名的字串值,將其載入到記憶體中,這會自動註冊它。使用此方法註冊驅動程式。

步驟 2:獲取連線

通常,與資料庫通訊的第一步是連線到它。Connection 類表示與資料庫伺服器的物理連線。可以透過呼叫 DriverManager 類的 getConnection() 方法來建立連線物件。使用此方法建立連線。

步驟 3:建立語句物件

需要建立 Statement、PreparedStatement 或 CallableStatement 物件才能將 SQL 語句傳送到資料庫。可以使用 createStatement()、prepareStatement() 和 prepareCall() 方法分別建立這些物件。使用適當的方法建立這些物件中的任何一個。

步驟 4:執行查詢

建立語句後,您需要執行它。**Statement** 類提供各種方法來執行查詢,例如 **execute()** 方法執行返回多個結果集的語句。**executeUpdate()** 方法用於執行 INSERT、UPDATE、DELETE 等查詢。**executeQuery()** 方法返回資料。使用這些方法中的任何一種並執行先前建立的語句。

示例

下面的 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(" ");
      }
   }
}

輸出

執行上述程式後,將獲得以下輸出:

Location: Hyderabad
Sum of salary: 120000

Location: Lucknow
Sum of salary: 71000

Location: Vishakhapatnam
Sum of salary: 93000 

Apache Derby - ORDER BY 子句

ORDER BY 子句用於按其使用的關鍵字排列結果集的內容,ASC 表示升序,DESC 表示降序。如果您沒有提及任何一個,則內容將預設按升序排列。

語法

以下是 ORDER BY 子句的語法:

SELECT * FROM table_name ORDER BY column_name ASC|DESC.

示例

假設資料庫中有一個名為 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 

以下查詢根據員工姓名按升序排列表的內容。

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

同樣,以下查詢根據員工薪水按降序排列表的內容:

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

使用 JDBC 程式排序資料

本節將教您如何在 Derby 中使用 JDBC 對錶的內容進行排序。您可以使用 ORDER BY 子句和關鍵字 ASC(表示升序)和 DSC(表示降序)按順序排列記錄。

如果您想使用網路客戶端請求 Derby 網路伺服器,請確保伺服器已啟動並正在執行。網路客戶端驅動程式的類名為 org.apache.derby.jdbc.ClientDriver,URL 為 jdbc:derby://:1527/DATABASE_NAME;create=true;user=USER_NAME;password=PASSWORD"。

請按照以下步驟對 Apache Derby 中表的記錄進行排序:

步驟 1:註冊驅動程式

要與資料庫通訊,首先需要註冊驅動程式。Class 類的 forName() 方法接受一個表示類名的字串值,將其載入到記憶體中,這會自動註冊它。使用此方法註冊驅動程式。

步驟 2:獲取連線

通常,與資料庫通訊的第一步是連線到它。Connection 類表示與資料庫伺服器的物理連線。可以透過呼叫 DriverManager 類的 getConnection() 方法來建立連線物件。使用此方法建立連線。

步驟 3:建立語句物件

需要建立 Statement、PreparedStatement 或 CallableStatement 物件才能將 SQL 語句傳送到資料庫。可以使用 createStatement()、prepareStatement() 和 prepareCall() 方法分別建立這些物件。使用適當的方法建立這些物件中的任何一個。

步驟 4:執行查詢

建立語句後,您需要執行它。**Statement** 類提供各種方法來執行查詢,例如 **execute()** 方法執行返回多個結果集的語句。**executeUpdate()** 方法執行 INSERT、UPDATE、DELETE 等查詢。**executeQuery()** 方法返回資料。使用這些方法中的任何一種並執行先前建立的語句。

示例

下面的 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(" ");
      }
   }
}

輸出

執行上述程式後,將獲得以下輸出:

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 子句

HAVING 子句使您可以指定條件,以篩選結果中顯示哪些組結果。

WHERE 子句對選定的列設定條件,而 HAVING 子句對 GROUP BY 子句建立的組設定條件。

語法

以下是 HAVING 子句的語法:

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

示例

假設資料庫中有一個名為 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

使用 JDBC 程式排序資料

本節將教您如何在 Apache Derby 資料庫中使用 Having 子句以及 JDBC 應用程式。

如果要使用網路客戶端請求 Derby 網路伺服器,請確保伺服器正在執行。網路客戶端驅動程式的類名為 org.apache.derby.jdbc.ClientDriver,URL 為 jdbc:derby://:1527/DATABASE_NAME;create=true;user=USER_NAME;password=PASSWORD。

請按照以下步驟對 Apache Derby 中表的記錄進行排序

步驟 1:註冊驅動程式

要與資料庫通訊,首先需要註冊驅動程式。**Class** 類的 **forName()** 方法接受一個表示類名的字串值,並將其載入到記憶體中,這會自動註冊它。使用此方法註冊驅動程式。

步驟 2:獲取連線

通常,與資料庫通訊的第一步是連線到它。Connection 類表示與資料庫伺服器的物理連線。可以透過呼叫 DriverManager 類的 getConnection() 方法來建立連線物件。使用此方法建立連線。

步驟 3:建立語句物件

需要建立 Statement、PreparedStatement 或 CallableStatement 物件才能將 SQL 語句傳送到資料庫。可以使用 createStatement()、prepareStatement() 和 prepareCall() 方法分別建立這些物件。使用適當的方法建立這些物件中的任何一個。

步驟 4:執行查詢

建立語句後,您需要執行它。**Statement** 類提供各種方法來執行查詢,例如 **execute()** 方法執行返回多個結果集的語句。**executeUpdate()** 方法執行 INSERT、UPDATE、DELETE 等查詢。**executeQuery()** 方法返回資料。使用這些方法中的任何一種並執行先前建立的語句。

示例

下面的 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(" ");
      }
   }
}

輸出

執行上述程式後,將獲得以下輸出:

Hyderabad
50000

Lucknow
39000

Vishakhapatnam
45000

Apache Derby - ALTER TABLE 語句

ALTER TABLE 語句允許您修改現有表。使用它,您可以執行以下操作:

  • 新增列,新增約束

  • 刪除列,刪除約束

  • 更改表的行級鎖定

讓我們假設我們建立了一個名為 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');

向表中新增列

以下是使用 ALTER 語句向表中新增列的語法。

ALTER TABLE table_name ADD COLUMN column_name column_type;

示例

使用ALTER語句,我們嘗試新增一個名為Age的新列,型別為整數。

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

新增另一個名為Phone_No的新列,型別為整數。

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

DESCRIBE命令描述指定的表,列出其列和詳細資訊(如果表存在)。如果DESCRIBE Employees表,您可以觀察到如下所示新新增的列:

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

向表中新增約束

以下是使用ALTER語句向表的列新增約束的語法。

ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint (column_name);

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

示例

使用ALTER語句,我們嘗試向Phone_No列新增UNIQUE約束。

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

一旦您向列新增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'.

從表中刪除約束

以下是刪除列約束的語法:

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

示例

以下查詢刪除上面建立的Phone_No列上的約束名New_Constraint。

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

由於我們已刪除Phone_No列上的UNIQUE約束,您可以新增具有相同電話號碼的列。

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

您可以透過以下方式驗證表的內容:`select * from Employees`

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

從表中刪除列

以下是刪除列的語法。

ALTER TABLE table_name DROP COLUMN column_name;

示例

以下查詢刪除名為“員工年齡”的列:

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

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

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

使用JDBC程式修改表

以下是使用ALTER查詢修改表的JDBC程式:

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"));
      }
   }
}

輸出

執行上述程式後,將生成以下輸出:

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 索引

表中的索引只不過是指向其資料的指標。它們用於加快從表中檢索資料的速度。

如果我們使用索引,INSERT和UPDATE語句將以較慢的速度執行。而SELECT和WHERE語句將在較短的時間內執行。

建立索引

CREATE INDEX語句用於在Derby資料庫的表中建立一個新的索引。

語法

以下是CREATE INDEX語句的語法:

CTREATE INDEX index_name on table_name (column_name);

示例

假設我們在Apache Derby中建立了一個名為Employees的表,如下所示。

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

建立UNIQUE索引

在Apache Derby中,UNIQUE索引用於資料整合。一旦您在表的列上建立UNIQUE索引,它就不允許重複值。

語法

以下是建立唯一索引的語法。

CREATE UNIQUE INDEX index_name on table_name (column_name);

示例

以下示例在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'.

建立複合索引

您可以在兩行上建立一個單一索引,這稱為複合索引。

語法

以下是複合索引的語法。

CREATE INDEX index_name on table_name (column_name1, column_name2);

示例

以下索引在Name和Location列上建立複合索引。

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

顯示索引

SHOW INDEXES查詢顯示錶上索引的列表。

語法

以下是SHOW INDEXES語句的語法:

SHOW INDEXES FROM table_name;

示例

以下示例顯示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

刪除索引

Drop Index語句刪除/丟棄列上的給定索引。

語法

以下是DROP INDEX語句的語法。

DROP INDEX index_name;

示例

以下示例刪除上面建立的名為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

使用JDBC程式處理索引

以下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");
   }
}

輸出

執行後,將生成以下結果

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 - 儲存過程

本章將教您如何在Derby中建立和刪除過程。

建立過程

您可以使用CREATE PROCEDURE語句建立過程。

語法

以下是CREATE PROCEDURE語句的語法。

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

示例

假設我們在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&
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 

在這裡您可以觀察到新建立的過程。

刪除過程

您可以使用DROP PROCEDURE語句刪除過程。

語法

以下是DROP PROCEDURE語句的語法。

DROP PROCEDURE procedure_name;

示例

以下示例刪除上面建立的名為Update_Procedure的過程。

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

Apache Derby - 模式

資料庫模式是表示整個資料庫邏輯檢視的骨架結構。它定義了資料的組織方式以及它們之間關係的關聯方式。它制定了要應用於資料的所有約束。

建立模式

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

語法

以下是CREATE SCHEMA語句的語法。

CREATE SCHEMA schema_name AUTHORIZATION id

示例

以下示例在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

刪除模式

您可以使用DROP SCHEMA語句刪除現有模式。

語法

以下是DROPS SCHEMA語句的語法。

DROP SCHEMA my_schema RESTRICT;

示例

只有在模式中沒有任何物件時才能刪除模式。要刪除模式,請刪除其中的所有表,然後刪除模式。

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

以下示例刪除上面建立的模式。

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

JDBC示例

以下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");
   }
}

輸出

執行上述程式後,將生成以下示例。

Table created in schema
Schema dropped

Apache Derby - 觸發器

在資料庫中,觸發器是在發生事件時執行的語句/程式碼。一旦您為表的特定事件建立觸發器,則每次發生事件時都會執行觸發器中指定的程式碼。您可以在單個表上建立多個觸發器。

本章將教您如何使用Apache Derby建立和刪除觸發器。

建立觸發器

您可以使用CREATE TRIGGER語句在Derby中建立觸發器。

語法

以下是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

示例

假設我們在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)
);

以下查詢在名為Emp的DELETE查詢表上建立一個觸發器。它將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

刪除觸發器

您可以使用DROP TRIGGER語句在Derby中刪除觸發器。

語法

以下是DROP TRIGGER查詢的語法:

ij> Drop trigger tigger_name;

示例

以下示例刪除上面建立的觸發器my_trigger:

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

JDBC示例

以下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(" ");
      }
   }
}

輸出

執行上述程式後,將生成以下輸出:

Trigger created
2
Kalyan
40000
Vishakhapatnam
1
Amit
30000
Hyderabad
廣告
© . All rights reserved.