Derby リファレンスマニュアル
Version 10.4
Derby Document build:
April 22, 2008, 12:29:37 AM (JST)




Version 10.4   Derby リファレンスマニュアル
   
Contents
Copyright    
License    
この文書について    
この文書の目的    
この文書の読者    
この文書の構成    
SQL言語のリファレンス    
大文字小文字と特殊文字    
SQLの識別子    
SQL92識別子の規則    
SQL92識別子    
列名    
相関名    
新しい表名    
スキーマ名    
単純列名    
別名    
表名    
ビュー名    
索引名    
制約名    
カーソル名    
TriggerName    
認証識別子    
   
依存関係    
ALTER TABLE 文    
CALL (手続き) 文    
CREATE 文    
DECLARE GLOBAL TEMPORARY TABLE 文    
DELETE 文    
DROP文    
GRANT 文    
INSERT 文    
LOCK TABLE 文    
RENAME 文    
REVOKE 文    
SET 文    
SELECT 文    
UPDATE文    
SQL 節    
CONSTRAINT 節    
FOR UPDATE 節    
FROM 節    
GROUP BY 節    
HAVING 節    
ORDER BY 節    
WHERE 節    
WHERE CURRENT OF 節    
SQL式    
選択式    
TableExpression    
VALUES式    
式に関する優先順位    
真偽式    
動的パラメータ    
JOIN 演算    
INNER JOIN 演算    
LEFT OUTER JOIN演算    
RIGHT OUTER JOIN 演算    
SQL 問い合わせ    
問合せ    
スカラー副問合せ    
表副問合せ    
組み込み関数    
標準組込み関数    
集約 (集合関数)    
ABSとABSVAL関数    
ACOS 関数    
ASIN 関数    
ATAN 関数    
AVG関数    
BIGINT関数    
CASE 式    
CAST 関数    
CEILおよびCEILING関数    
CHAR 関数    
Concatenation    
COS 関数    
COUNT 関数    
COUNT(*) 関数    
CURRENT DATE 関数    
CURRENT_DATE関数    
CURRENT ISOLATION 関数    
CURRENT SCHEMA関数    
CURRENT TIME    
CURRENT_TIME関数    
CURRENT TIMESTAMP関数    
CURRENT_TIMESTAMP関数    
CURRENT_USER関数    
DATE関数    
DAY 関数    
DEGREES 関数    
DOUBLE関数    
EXP関数    
FLOOR関数    
HOUR関数    
IDENTITY_VAL_LOCAL関数    
INTEGER関数    
LCASEあるいはLOWER関数    
LENGTH関数    
LNあるいはLOG関数    
LOG10 関数    
LOCATE関数    
LTRIM関数    
MAX関数    
MIN関数    
MINUTE 関数    
MOD関数    
MONTH関数    
NULLIF式    
PI 関数    
RADIANS 関数    
RTRIM関数    
SECOND関数    
SESSION_USER関数    
SIN 関数    
SMALLINT関数    
SQRT関数    
SUBSTR関数    
SUM関数    
TAN 関数    
TIME 関数    
TIMESTAMP関数    
TRIM 関数    
UCASE関数およびUPPER関数    
USER関数    
VARCHAR関数    
XMLEXISTS 演算子    
XMLPARSE演算子    
XMLQUERY演算子    
XMLSERIALIZE 演算子    
YEAR関数    
組込みシステム関数    
SYSCS_UTIL.SYSCS_CHECK_TABLEシステム関数    
SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTYシステム関数    
SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS システム関数    
組み込みシステム手続き    
SYSCS_DIAG 診断表および関数    
データ型    
SQL予約語    
DerbyのサポートするSQL-92の機能    
Derbyのシステム表    
SYSALIASES システム表    
SYSCHECKSシステム表    
SYSCOLPERMS システム表    
SYSCOLUMNSシステム表    
SYSCONGLOMERATES システム表    
SYSCONSTRAINTS システム表    
SYSDEPENDS システム表    
SYSFILESシステム表    
SYSFOREIGNKEYSシステム表    
SYSKEYSシステム表    
SYSROUTINEPERMS システム表    
SYSSCHEMAS システム表    
SYSSTATISTICSシステム表    
SYSSTATEMENTSシステム表    
SYSTABLEPERMS システム表    
SYSTABLES システム表    
SYSTRIGGERSシステム表    
SYSVIEWS システム表    
Derbyの例外メッセージとSQL state    
SQLのエラーメッセージと例外    
JDBC リファレンス    
java.sqlにある、JDBCの主なクラス、 インターフェイス、メソッド    
java.sql.Driverインターフェイス    
java.sql.DriverManager.getConnection メソッド    
java.sql.Connection インターフェイス    
java.sql.DatabaseMetaData インターフェイス    
java.sql.Statementインターフェイス    
java.sql.CallableStatement インターフェイス    
java.sql.SQLException クラス    
java.sql.PreparedStatementインターフェイス    
java.sql.ResultSet インターフェイス    
java.sql.ResultSetMetaData インターフェイス    
java.sql.SQLWarning クラス    
java.sql.SQLXMLインターフェイス    
SQL型とjava.sql.Typesの対応    
JDBC 2.0 の機能    
java.sql.Connection インターフェイス: JDBC 2.0で利用可能なメソッド    
java.sql.DatabaseMetaData インターフェイス: 利用可能なJDBC 2.0のメソッド    
java.sql.PreparedStatementインターフェイス: JDBC2.0で提供されるメソッド    
java.sql.ResultSet    
java.sql.ResultSetMetaData インターフェイス: JDBC 2.0で利用可能なメソッド    
java.sql.Statement インターフェイス: 利用可能なJDBC 2.0のメソッド    
java.sql.BatchUpdateException クラス    
Connected Device ConfigurationおよびFoundation Profile向けのJDBCパッケージ(JSR169)    
JDBC 3.0の機能    
java.sql.Connectionインターフェイス: JDBC3.0にて利用可能なメソッド    
java.sql.DatabaseMetaData インターフェイス: JDBC 3.0で利用可能なメソッド    
java.sql.ParameterMetaDataインターフェイス:JDBC3.0で利用可能なメソッド    
java.sql.PreparedStatementインターフェイス: JDBC3.0で利用可能なメソッド    
java.sql.Savepoint インターフェイス    
java.sql.Statementインターフェイス: JDBC 3.0で利用可能なメソッド    
JDBC 4.0の機能    
洗練されたSQLExceptionのサブクラス    
java.sql.Connectionインターフェイス:JDBC4.0で提供される機能    
java.sql.DatabaseMetaDataインターフェイス: JDBC4.0の機能    
java.sql.Statementインターフェイス: JDBC 4.0で利用可能な機能    
javax.sql.DataSource インターフェイス: JDBC 4.0の機能    
JDBCエスケープの構文    
呼び出し文のJDBCエスケープキーワード    
JDBCエスケープ構文    
LIKE節のJDBCエスケープ構文    
fnキーワードを使ったJDBCエスケープ構文    
外部結合のJDBCエスケープ構文    
時刻書式のJDBCエスケープ構文    
日付書式のJDBCエスケープ構文    
タイムスタンプ書式のJDBCエスケープ構文    
データベース接続URLに属性を指定する。    
bootPassword=key属性    
collation=collation 属性    
create=true 属性    
createFrom=Path属性    
databaseName=nameofDatabase属性    
dataEncryption=true属性    
encryptionKey=key属性    
encryptionProvider=providerName属性    
encryptionAlgorithm=algorithm 属性    
logDevice=logDirectoryPath 属性    
newEncryptionKey=key 属性    
newBootPassword=newPassword 属性    
password=userPassword    
restoreFrom=path属性    
rollForwardRecoveryFrom=path 属性    
shutdown=true属性    
territory=ll_CC 属性    
traceDirectory=path 属性    
traceFile=path 属性    
traceFileAppend=true 属性    
traceLevel=value 属性    
upgrade=true attribute    
user=userName 属性    
ssl=sslMode 属性    
属性を指定せずにデータベースに接続する    
J2EEへの準拠:Java Transaction APIとjavax.sql インターフェイス    
JTA API    
製品に関する但し書き    
javax.sql:JDBCインターフェイス    
Derby API    
スタンドアローンのツールとユーティリティ    
JDBCの実装クラス    
JDBC driver    
データソースのクラス    
ユーティリティ的なインターフェイス    
利用可能な地域情報    
Derbyの制限事項    
データベース設定値の制限    
DATE、TIMEとTIMESTAMPの制限    
識別子の長さ制限    
数値の制限    
並びの制限    
XMLの制限    
Trademarks    


Derby リファレンスマニュアル
Apache Software FoundationDerby リファレンスマニュアルApache Derby
Copyright
Copyright 2004-2008 The Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
Related information
License
The Apache License, Version 2.0
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
この文書について
Derbyの文書については、はじめてのDerbyを参照してください。文書の一覧や、文書の体裁上の取り決め、詳細が書かれています。
この文書の目的
このDerby リファレンスマニュアルは、Derbyのリファレンスです。 この文書には、DerbyのSQL言語や、DerbyにおけるJDBCの実装、Derbyのシステムカタログ、Derbyのエラーメッセージ、Derbyの属性や、SQLのキーワードの説明があります。
この文書の読者
この文書は、Derbyを使う人のためのリファレンスです。特にアプリケーションの開発者に向けて書かれています。 SQLの標準やJavaというプログラミング言語に慣れていないDerbyのユーザは、このリファレンスの対応する項目を読めば得られる情報があるでしょう。
Derbyで、こういうことをするにはどうすればよいのか」とか、Derbyの概念とかを知りたいならば、Derby ディベロッパーズ ガイドを読むと良いでしょう。
この文書の構成
この文書には以下の節があります。
 
SQL言語のリファレンス
DerbyのSQL言語のリファレンスです。 文、関数、そのほかの構文上の情報が書かれています。
 
SQL予約語
SQL-92標準外の、SQLのキーワードを説明します。
 
DerbyのサポートするSQL-92の機能
SQL-92の機能のうち、Derbyが実現しているものと実現していないものを一覧します。
 
Derbyのシステム表
Derbyのシステムカタログのリファレンスです。
 
Derbyの例外メッセージとSQL state
Derbyの例外メッセージについての情報が書かれています。
 
JDBC リファレンス
Derbyが実装するJDBCのインターフェイスの情報がJDBC 2.0 の機能も含めて書かれています。
 
データベース接続URLに属性を指定する。
DerbyのJDBCデータベース接続URLにおいて、実現されている属性の情報が書かれています。
 
J2EEへの準拠:Java Transaction APIとjavax.sql インターフェイス
Java Transaction APIにおいて、Derbyが実現している機能について書かれています。
 
Derby API
Derby独自のAPIについての説明があります。
SQL言語のリファレンス
DerbyはSQL-92のうち主要な機能のサブセットおよび、幾つかのSQL-99の機能を実現しています。
この節では、文、組み込み関数、データ型、式、特殊文字などの説明を通して、SQL言語の概観を紹介します。
大文字小文字と特殊文字
JDBCのクラスやメソッドにSQL文の文字列を渡して、DerbyにSQLを発行することができます。 SQL文の文字列に可能な文字セットはUnicodeです。この文字列には、次の規則が適用されます。
 
二重引用符でSQL-92に定義されている特殊識別子をデリミトして、デリミトされた識別子とすることができます。
 
一重引用符で文字の列を区切ることができます。
 
文字の列にて一重引用符またはアポストロフィーをあらわすには、一重引用符を2つ並べます。(言い方を変えれば、一重引用符は一重引用符のエスケープ文字です。)
二重引用符にはエスケープ文字が必要ではありません。二重引用符をあらわすには、単に二重引用符を使ってください。ただし、Javaのプログラムでは、二重引用符はバックスラッシュによるエスケープが必要であることを気に留める必要があります。
例:
-- 一重引用符はエスケープ文字です-- 一重引用符に対して VALUES 'Joe''s umbrella' -- ijでは二重引用符はエスケープされません。 VALUES 'He said, "hello!"' n = stmt.executeUpdate( "UPDATE aTable setStringcol = 'He said, \"hello!\"'");
 
SQLのキーワードは大文字小文字を区別しません。例えば、SELECTというキーワードは、SELECT、Select、select、sELECTのいずれでも書くことができます。
 
SQL-92の書き方による識別子は大文字小文字を区別しません。(SQL92識別子を参照してください。)ただしデリミトされた識別子はそうではありません。
 
Javaの書き方による識別子は常に大文字小文字を区別します。
 
*は、SelectExpression.にてワイルドカード文字です。ワイルドカードの*を参照してください。 この文字は同時に情報演算子でもあります。そのほかの場合この文字は、0回以上の繰り返しを表す、構文のメタ文字です。
 
%と_は、LIKE演算子に続く文字の列にて使われると、ワイルドカード文字となります。(これはエスケープされなかった場合です。)詳細は真偽式を参照してください。
 
SQL-92の仕様に沿って一行あるいは複数行のコメントを書くことができます。一行のコメントは二つのダッシュ(--)で始まり改行文字で終わります。複数行の改行は前後を囲う書き方で、スラッシュ・スター(/*)で始まり、スター・スラッシュ(*/)で終わります。この書き方では入れ子となる場合があることを留意してください。コメントの開始文字と終了文字の間にある、あらゆる文字は無視されます。
SQLの識別子
識別子とは、ある言語においてキーワードやコマンドとは異なる、ユーザが作成した情報をあらわすものです。識別子は表、ビュー、索引、列、制約のような、ユーザがデータベースに作成したディクショナリの情報をあらわすことがあります。ここで、これらの情報をディクショナリの情報とわれわれが呼ぶのは、Derbyがデータディクショナリとも呼ばれる、システム表にこれらの情報を記録するからです。 SQLの仕様は、こういった情報を特定の文で別名により扱う方法を用意しています。
識別子は、その種類に応じてそれぞれの規則にそっていなければなりません。ディクショナリの情報の識別子の場合、SQL-92が定義する識別子の規則に沿わなければなりません。このことより、ディクショナリの情報の識別子のことをSQL92識別子と呼びます。.
SQL92識別子の規則
通常の識別子は二重引用符によって囲われていません。デリミトされた識別子は二重引用符によって囲まれています。
通常の識別子は文字で始まり、文字、アンダースコア(_)、0-9の数字しか含みません。ここで文字と0-9の数字とは、Unicodeの全文字と0-9の数字を含みますが、Derbyは、識別子を構成する文字がデータベースのロケールで利用可能であることを保障するものではありません。
デリミトされた識別子は二重引用符の間にどのような文字でも持つことができます。 また識別氏を囲う二重引用符は、識別子の始まりと終わりを明示しているだけであり、それ自身は識別子とみなされません。またデリミトされた識別子の最後にある空白文字列は、無視されて切り捨てられます。Derbyはデリミトされた識別子にある連続した二つの二重引用符を、ひとつの二重引用符とみなします。このみなされた二重引用符はデリミトされた識別子の一部として扱われます。
デリミトされた識別子の中のピリオドはディクショナリの情報をあらわす識別子の一部であり、識別子の間の区切りではありません。
ですから、次の例にて、
"A.B"
は、ディクショナリの情報ですが、
"A"."B"
は、他のディクショナリの情報で限定されたディクショナリの情報です。(つまり、A表のB列としてあらわされた情報であるということです。)
SQL92識別子
SQL92識別子とは、SQL-92に沿ってディクショナリの情報をあらわす識別子です。SQL-92では、ディクショナリの情報をあらわす識別子は、128文字以内かつ(二重引用符によりデリミトされていなければ)システムにより大文字への変換が行われるため、大文字小文字が区別されないことになっています。また、デリミトされない限り識別子とはできない予約語があります。もし128文字以上の名前を使おうとすると、SQLException X0X11が挙がります。
Derbyには、SQL-92で定められている以外にもキーワードがあります。(SQL予約語を参照。)
-- この例ではシステムカタログに格納されビュー名は -- ANIDENTIFIERです。 CREATE VIEW AnIdentifier (RECEIVED) AS VALUES 1 -- この例ではシステムカタログに格納されたビュー名の -- 大文字小文字は損なわれません。 CREATE VIEW "ACaseSensitiveIdentifier" (RECEIVED) AS VALUES 1
以降の節にて、SQL92識別子によりディクショナリの情報をあらわす時の規則を説明します。
ディクショナリの情報を名前で限定する
ディクショナリの情報は、他のディクショナリの情報の一部となることがあり、そのとき情報をそれぞれのディクショナリの名前で限定できます。このとき構成は次の構成との間で、ピリオドで区切られます。SQL92識別子ははドットで区切られます。名前で限定することにより、ディクショナリの情報名があいまいになることを防ぐことができます。
列名
SQLの構文ではさまざまな文脈で、列の名前を表名相関名により限定することができます。
一方で文脈によっては列名表名相関名で限定できず、単純列名を使わなければならない場合もあります。 そのような文脈とは、
 
表の作成(CREATE TABLE 文)
 
カーソルの更新可能な列の特定
 
SELECT式にある列の相関名(選択式を参照)
 
TableExpressionにある列の相関名 (TableExpressionを参照)
更新可能な列には相関名を使うことができません。仮に使えば、SQL例外が起きます。たとえば、
SELECT c11 AS col1, c12 AS col2, c13 FROM t1 FOR UPDATE of c11,c13
という例にて、相関名をc11のcol1に使えません。なぜなら、 c11はFOR UPDATE に存在するからです。一方で相関名をc12に使うことができます。なぜなら、これはFOR UPDATEに存在しないからです。
-- C.Country は 相関名により限定された --列名です。 SELECT C.Country FROM APP.Countries C
相関名
相関名はFROM句にあるテーブルについて与える事ができ、新しい名前、別名となります。相関名スキーマ名で限定することはできません。
相関名は更新可能な列に使うことはできません。仮に使えばSQL例外が発生します。 例えば、
SELECT c11 AS col1, c12 AS col2, c13 FROM t1 FOR UPDATE of c11,c13
という例では、相関名をc11のcol1に使うことはできません。なぜなら、c11はFOR UPDATEにある列だからです。 それに対して相関名をc12に使うことはできます。これはFOR UPDATEにないからです。
-- Cは相関名です。 SELECT C.NAME FROM SAMP.STAFF C
新しい表名
新しい表名は、新しく名前のついた表をあらわします。新しい表名スキーマ名で限定することはできません。
-- FlightBooks は新しい表名です。スキーマ名はありません。 RENAME TABLE FLIGHTAVAILABILITY TO FLIGHTAVAILABLE
スキーマ名
スキーマ名スキーマをあらわします。スキーマにはそのほかのディクショナリの情報があります。これには表や索引が含まれて居ます。スキーマによりデータベースにある表等のディクショナリの情報の部分集合に名前を与えることができます。
スキーマは明示的に作成、破棄できます。デフォルトのユーザースキーマはAPPというスキーマです。(これは接続時にユーザ名が与えられなかったときに使われます。) SYSで始まるスキーマには情報を作成することができません。
スキーマ名により表への参照を限定することができます。スキーマ名が指定されなければ、暗黙のうちにデフォルトのスキーマ名により表が限定されます。 システム表を参照するには、SYSで限定しなければなりません。システム表についてのより詳細な情報については、Derbyのシステム表を参照してください。
スキーマはディクショナリの情報が持つ階層構造において最も上位に位置します。したがって、スキーマ名を限定することはできません。
Syntax
SQL92識別子
-- SAMP.EMPLOYEE はスキーマ名で限定された表名です。 SELECT COUNT(*) FROM SAMP.EMPLOYEE -- システムカタログの名前は、そのスキーマであるSYSで限定しなければなりません。 SELECT COUNT(*) FROM SYS.SysColumns
単純列名
表名相関名で限定できない文脈で列をあらわすとき、単純列名が使われます。 このような文脈は、CREATE TABLE文の列定義のような、限定の必要が無い場合が当てはまります。
-- country は単純列名です。 CREATE TABLE CONTINENT (COUNTRY VARCHAR(26) NOT NULL PRIMARY KEY, COUNTRY_ISO_CODE CHAR(2), REGION VARCHAR(26))
別名
表やビューは別名であらわす事ができます。 別名スキーマ名で限定することができます。
表名
表名は表をあらわします。表名スキーマ名で限定することができます。
-- SAMP.PROJECT はスキーマ名のある表名です。 SELECT COUNT(*) FROM SAMP.PROJECT
ビュー名
ビュー名は表またはビューをあらわします。ビュー名スキーマ名で限定することができます。
Example
-- これはスキーマ名のあるビュー名です。 SELECT COUNT(*) FROM SAMP.EMP_RESUME
索引名
索引名は索引をあらわします。索引はスキーマにあるので、その名前をスキーマ名で限定することができます。システム表の索引はSYSスキーマにあります。
DROP INDEX APP.ORIGINDEX; -- OrigIndexはスキーマ名のない索引名です。 CREATE INDEX ORIGINDEX ON FLIGHTS (ORIG_AIRPORT)
制約名
制約名は限定できません。
-- country_fk2 は制約名です。 CREATE TABLE DETAILED_MAPS (COUNTRY_ISO_CODE CHAR(2) CONSTRAINT country_fk2 REFERENCES COUNTRIES)
カーソル名
カーソル名はカーソルをあらわします。SQL言語によりカーソルに名前を割り当てることはできません。その代わり、JDBC APIによってカーソルに名前を割り当てたり、システムが命名した名前を取得することができます。より詳細については、Derby ディベロッパーズ ガイドを参照してください。 カーソルに名前を割り当てれば、SQL文にてその名前を使うことができます。
カーソル名は限定できません。
stmt.executeUpdate("UPDATE SAMP.STAFF SET COMM = " + "COMM + 20 " + "WHERE CURRENT OF " + ResultSet.getCursorName());
TriggerName
トリガ名によりユーザが作成したトリガを参照することができます。
DROP TRIGGER TRIG1
認証識別子
Derbyのシステムではユーザ名を、認証識別子と呼びます。接続の要求にて認証識別子が記述されている場合、これはユーザ名を表します。ユーザの既定のスキーマは、その認証識別子と同じです。 認証の仕組みでは、ユーザ名の大文字小文字を区別することができますが、Derbyの認証の仕組みではデリミトされない限りは、大文字小文字は区別されません。 より詳細な情報は、Derby ディベロッパーズ ガイドを参照してください。
Example
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY( 'derby.database.fullAccessUsers', 'Amber,FRED')
本節は言語の高レベルな構造と、それから言語の部分について、マニュアルを提供します。 たとえばCREATE INDEX文は高レベルの文です。これをユーザはJDBCのインターフェイスを通して直接実行することができます。本節にはSQLの節についても書かれています。これは、高レベルの文ではなく、直接実行することはできませんが、高レベルの文の一部となることができます。例えばORDER BY節やWHERE節は節です。最後に本節には、式について書かれています。式は文に置くことができる複雑な構文です。例えば、Select式表副問い合わせ等が式です。 これらの節や式には、リファレンスとして使いやすいよう、それぞれにマニュアルの頁が用意されています。
特に何も書かれていなければ、と記された全ての高レベルの文は、JDBCのインターフェイスを介して、実行する事あるいは用意して実行することが可能です。 一方、個々の式について、高レベルの文として実行可能か否かこのマニュアルにて書かれています。
本節では文の利用についての一般的な情報や、個々の文についての説明が書かれています。
依存関係
Derby は準備済み文の依存関係を追跡します。準備済み文とは実行前にコンパイルされたSQL文の事です。典型的なシナリオとして、これらは準備(プレコンパイル)された後、複数回実行されます。
準備済み文はディクショナリの情報や、それ自身から参照する他の文に依存します。(ディクショナリの情報とは、表・列・制約・索引・ビュー・トリガのことです。) 準備済み文が依存しているディクショナリの情報や文が、破棄されたり変更されたりすると、内部的に準備済み文は無効となり、Derbyは準備済み文が実行されるとき、自動的に再コンパイルを行おうとします。 もしこのとき、準備済み文の再コンパイルが失敗すると、実行は失敗します。 しかしながら、もし何らかの対応を行って(無くなった表を復活させるなどして)失われた依存性を元に戻せるのなら、失敗した準備済み文を成功裏に実行することができます。これは、Derbyが再実行が要求されたとき、再コンパイルを自動的に行うからです。
お互いに依存した文-UPDATE WHERE CURRENT文は参照する文に依存します。依存する文を破棄すると、UPDATE WHERE CURRENT文は無効になります。
さらに準備済み文の結果がオープンしている場合、ある種のDDL文の実行を妨げます。
それぞれの文に対応したマニュアルの頁には、その文が準備された場合、どのようなことをすると無効になるのかが書かれています。
ここにDerbyのijというツールを使って例を示します。
ij> CREATE TABLE mytable (mycol INT); 0 rows inserted/updated/deleted ij> INSERT INTO mytable VALUES (1), (2), (3); 3 rows inserted/updated/deleted -- この例ではijのprepareコマンドを使います。 -- このコマンドにより文が準備されます。 ij> prepare p1 AS 'INSERT INTO MyTable VALUES (4)'; -- p1はmytableに依存します; ij> execute p1; 1 row inserted/updated/deleted -- Derbyは再コンパイルせずに文を実行します。 ij> CREATE INDEX i1 ON mytable(mycol); 0 rows inserted/updated/deleted -- 新しい索引のため、p1は一時的に無効となります。 ij> execute p1; 1 row inserted/updated/deleted -- Derbyは自動的にp1を再コンパイルして、実行します。 ij> DROP TABLE mytable; 0 rows inserted/updated/deleted -- Derbyでは以下のように表を破棄することができます。 -- これはp1の結果が閉じているからです。 -- しかしながらp1は一時的に無効となります。 ij> CREATE TABLE mytable (mycol INT); 0 rows inserted/updated/deleted ij> INSERT INTO mytable VALUES (1), (2), (3); 3 rows inserted/updated/deleted ij> execute p1; 1 row inserted/updated/deleted -- p1は無効となっているので、Derbyは実行の前に再コンパイルを行います。 -- 再コンパイルは成功して、文は実行できます。 ij> DROP TABLE mytable; 0 rows inserted/updated/deleted -- p1は無効です。 -- 今度は最コンパイルしようとしても失敗するので、 -- 実行も失敗です。 ij> execute p1; ERROR 42X05: Table/View 'MYTABLE' does not exist.
ALTER TABLE 文
The ALTER TABLE 文により次のことが可能です。
 
表に列を追加する。
 
表に制約を追加する。
 
表の列を破棄する。
 
表にある制約を破棄する。
 
VARCHAR, CHAR VARYING, and CHARACTER VARYING 列の幅を増やす。
 
表に定義された行レベルのロックを上書きする。(あるいは上書きされた内容を破棄する。)
 
識別子列の増分値や開始値を変更する。
 
列がNull可であるか否か変更する。
 
列の規定値を変更する。
構文
ALTER TABLE 表名 { ADD COLUMN 列定義 | ADD CONSTRAINT節 | DROP [ COLUMN ] 列名 [ CASCADE | RESTRICT ] DROP { PRIMARY KEY | FOREIGN KEY 制約名 | UNIQUE 制約名 | CHECK 制約名 | CONSTRAINT 制約名 } ALTER [ COLUMN ] 列定義変更 | LOCKSIZE { ROW | TABLE } }
列定義
単純列名データ型 [ 列単位制約 ]* [ [ WITH ] DEFAULT 既定制約式 ]
既定制約式の詳細については、列の既定を参照してください。
列定義変更
列名 SET DATA TYPE VARCHAR(integer) | column-name SET INCREMENT BY 定整数 | column-name RESTART WITH 定整数 | column-name [ NOT ] NULL | column-name [ WITH ] DEFAULT 既定値
列定義変更のSET INCREMENT BY 定整数により、識別子列のとる連続した値の間隔が設定されます。識別子列がとる次の値は、最後にとられた値に増分が加算された値となります。この場合列にはあらかじめIDENTITY属性が定義されていなければなりません。
RESTART WITH 定整数により、識別子列がとる次の値が設定されます。RESTART WITHは、GENERATED BY DEFAULTが定義された、一意キーを持つ識別子列のある表に使うと便利です。GENERATED BY DEFAULTは明示的に値を挿入することおよび、暗黙的にシステムが発番した値を挿入することのいずれをも許すため、明示的に挿入された値がシステムが発番する値との間で競合する事がありえます。この競合を回避するために、RESTART WITHにより識別子列で次に発番される値を設定する事ができるのです。自動的に発番された値と手動で挿入された情報がある、次の例について考えてみてください。
CREATE TABLE tauto(i INT GENERATED BY DEFAULT AS IDENTITY, k INT) CREATE UNIQUE INDEX tautoInd ON tauto(i) INSERT INTO tauto(k) values 1,2
システムは自動的に識別子列に対して数値を発番します。しかしながら、あなたは手動で識別子列に幾つかの値を挿入しなければなりませんでした。
INSERT INTO tauto VALUES (3,3) INSERT INTO tauto VALUES (4,4) INSERT INTO tauto VALUES (5,5)
識別子列にはこの時点で1から5の値があります。ここであなたがシステムに値を発番させると、システムは3という値を発番します。この値により一意キー例外が発生します。なぜなら3という値は既に手動で挿入されてしまっているからです。手動で値を挿入したので後処理として、識別子列に対してRESTART WITH 6 のALTER TABLE文を発行します。
ALTER TABLE tauto ALTER COLUMN i RESTART WITH 6
ALTER TABLE は表を参照するいかなるビューにも影響しません。これはSELECT一覧に"*"を持っていても然りです。新しく追加された列がビューから見えるようにする為には、ビューを破棄して作り直さなければなりません。
列の追加
追加する列の列定義は、構文の上でCREATE TABLE文の列と同じです。ですから、列の制約をALTER TABLE ADD COLUMN文の新しい列に書くこともできます。しかしながら、既存のテーブルにNOT NULL制約のある列を追加することは、その列に既定値を与えた場合のみ可能です。さもなければ、ALTER TABLE文が実行されたとき、例外が発生します。
CREATE TABLEと同様、列定義に一意あるいは主キー制約がある場合、列はnull値をとることができません。したがって、NOT NULL属性も必要です。(SQLSTATE 42831)
Note: 表に明示的な列一覧が指定されないUPDATEトリガが定義されていた場合、その表に列を追加すると、追加された列はUPDATEトリガの暗黙的な更新列一覧に追加されます。さらに新しい列を拾うことができるよう、推移変数への全ての参照は無効となります。
制約の追加
ALTER TABLE ADD CONSTRAINTにより表ごとの制約が既存の表に追加されます。あらゆる種類の表ごとの制約がALTER TABLEで追加できます。ただし、既存の表への制約の追加には次の機能上の制限があります。
 
外部キーやチェック制約が既存の表に追加されるときDerbyは既存の行が制約に違反しないか、表を調べます。もしいずれかの行が制約に違反する場合、Derbyは例外を投げて制約は追加されません。
 
主キーに含まれるあらゆる列はnullでない値をとらなければならず、また一意でなければなりません。
ALTER TABLE ADD UNIQUEやPRIMARY KEYは、単一の列による主キーを定義する簡単な方法を提供します。もしPRIMARY KEYがCという列の定義に書かれたされた場合、これはPRIMARY KEY(C)という別の節に書いたのと同じです。列はnullの値をとってはならないので、NOT NULL属性も指定されなければなりません。
制約の構文についての詳細は、CONSTRAINT 節を読んでください。 ADD TABLE ADD CONSTRAINTという書き方にて、制約を追加する場合は、表毎の制約の構文に従ってください。
列の破棄
ALTER TABLE DROP COLUMNにより、表から列を破棄できます。
COLUMNというキーワードは無くてもかまいません。
CASCADEやRESTRICTも、無くてかまいません。どちらも指定しなかった場合、既定はCASCADEです。
RESTRICTの場合、依存しているスキーマの情報が無効になるならば、列の破棄は失敗します。
CASCADEの場合、列の破棄と併せて、無効になるスキーマの情報も破棄されます。
DROP COLUMN RESTRICTが失敗する原因となるスキーマの情報には、次が含まれます。 ビュー、トリガ、主キー制約、外部キー制約、一意キー制約、チェック制約、列権限。破棄する列に依存するいずれかの情報があれば、DROP COLUMN RESTRICTは失敗します。
表にひとつしかない列は、破棄することができません。
sqlAuthorizationが真である場合、列を削除することはできません。(DERBY-1909を参照してください。) )
列が索引にて使われているか否かにかかわらず、列の破棄はCASCADE/RESTRICTのどちらでも同じように行われます。列が破棄されるとき、索引にあるその列が取り除かれます。その列が索引にあるただひとつの列であった場合、索引全体が破棄されます。
制約の破棄
ALTER TABLE DROP CONSTRAINTにより表の制約を破棄できます。名前付けしていない制約を破棄するためには、SYS.SYSCONSTRAINTSに記録されている自動生成された制約の名前をデリミトされた識別子として指定する必要があります。
主キー・一意性・外部キー制約を破棄すると、その制約が機能するために存在している索引が破棄されます。(この索引は支援索引とも呼ばれます。)
列の変更
列定義変更により、名前のある列を変更できます。可能な変更内容は以下のとおりです。
 
VARCHAR列の長さを増やすことができます。VARCHARというキーワードの代わりに、CHARACTER VARYINGやCHAR VARYINGを使うことができます。
これらの列の幅を増やすためには、データ型と新しいサイズを列名の後に書きます。
列の幅を減らしたり、データ型を変更したりする事はできません。主キーの一部や、外部キー制約から参照されている一意キー、外部キー制約の一部である列の幅は変更できません。
 
識別子列のとる連続した値の間隔を指定することができます。
識別子列のとる連続した値の間隔を設定するためには、定整数を与えます。あらかじめ列には識別子属性が与えられていなければなりません。(SQLSTATE 42837)もし表に既に行がある場合、列のSET INCREMENT defaultが加算された値は変更されません。
 
列のNullへの制約の変更 列がNullをとる事への制約を変更できます。
NOT NULL制約を既存の列に与えることができます。これを行う場合、既存のNULL値が表のその列に存在してはなりません。
NOT NULL制約を既存の列から取り除くことができます。これを行う場合、その列がPRIMARY KEYやUNIQUEの制約にて使われている列であってはなりません。
 
列の既定値を変更する
既定値の設定
新規の列に既定値を与えることができます。既定値とは値が指定されなかった場合に列に挿入される値です。もし明示的に既定値が与えられていなかった場合、列の既定値はNULLです。もし新しい列に既定値を与えた場合、表にある既存の行はその新列に既定値をとることとなります。
既定値のより詳細な情報については、CREATE TABLE 文を参照してください。
表のロック粒度の変更
もしあなたのシステムが既定の設定である行毎のロックを行うのであれば、LOCKSIZE節により表の行毎のロックを上書きすることができます。(一方あなたのシステムが表ごとのロックを行うよう設定されている場合、DerbyがLOCKSIZE節に対して例外を投げなかったとしても、ロックの粒度を行単位のロックに変更することはできません。) 表の行毎のロックを上書きするには、表にロックの設定を行います。 もし表が表毎のロックで作成された場合、ALTER TABLE文にてLOCKSIZE節を使うことで、その設定を行毎の設定に戻すことができます。これが便利な場合もあるのですが、その詳細については、Derbyのチューニングを参照してください。
-- 既存の表に列ごとの制約のある列を追加する。 -- 表に既存行があった場合、既存行の新列はNULLをとるので、 -- 例外が発生する。 ALTER TABLE CITIES ADD COLUMN REGION VARCHAR(26) CONSTRAINT NEW_CONSTRAINT CHECK (REGION IS NOT NULL); -- 既存の表に一意性制約を追加する。 -- 重複したキーがあった場合、例外が発生する。 ALTER TABLE SAMP.DEPARTMENT ADD CONSTRAINT NEW_UNIQUE UNIQUE (DEPTNO); -- Cities表に外部キー制約を追加する。 -- 行が制約を満たすか検証されて、 -- もし制約を満たさない行が見つかった場合、 -- 制約は追加されない。 ALTER TABLE CITIES ADD CONSTRAINT COUNTRY_FK Foreign Key (COUNTRY) REFERENCES COUNTRIES (COUNTRY); -- 主キー制約を表に追加する。 -- 最初に表が作成される。 CREATE TABLE ACTIVITIES (CITY_ID INT NOT NULL, SEASON CHAR(2), ACTIVITY VARCHAR(32) NOT NULL); -- もし主キーとした列にnullや重複した値がある場合、 -- この制約を追加することはできない。 ALTER TABLE Activities ADD PRIMARY KEY (city_id, activity); -- もし依存する情報が無ければ、city_id列が破棄される。 ALTER TABLE Cities DROP COLUMN city_id RESTRICT; -- 依存する情報と併せて、city_id列が破棄される。 ALTER TABLE Cities DROP COLUMN city_id CASCADE; -- CITIES表の主キー制約を破棄する。 ALTER TABLE Cities DROP CONSTRAINT Cities_PK; -- CITIES表の外部キー制約を破棄する。 ALTER TABLE Cities DROP CONSTRAINT COUNTRIES_FK; -- 既定値を1にとるDEPTNO列を追加する。 ALTER TABLE SAMP.EMP_ACT ADD COLUMN DEPTNO INT DEFAULT 1; -- VARCHAR型の列幅を増やす。 ALTER TABLE SAMP.EMP_PHOTO ALTER PHOTO_FORMAT SET DATA TYPE VARCHAR(30); -- 表のロック粒度を変更する。 ALTER TABLE SAMP.SALES LOCKSIZE TABLE; -- MANAGER列のNOT NULL制約を破棄する。 ALTER TABLE Employees ALTER COLUMN Manager NULL; -- SSN列にNOT NULL制約を追加する。 ALTER TABLE Employees ALTER COLUMN ssn NOT NULL; -- SALARY列の既定値を変更する。 ALTER TABLE Employees ALTER COLUMN Salary DEFAULT 1000.0
文の結果
ALTER TABLE 文により変更する表に依存する全ての文は、次回の実行にて再コンパイルされます。もし変更する表を参照する、開いたカーソルがある場合、ALTER TABLEは許可されません。
CALL (手続き) 文
CALL (手続き)文により手続きを呼ぶことができます。 手続きへの呼び出しは値を返しません。
構文
CALL 手続名 ( [ [, ]* ] )
CREATE PROCEDURE SALES.TOTAL_REVENUE(IN S_MONTH INTEGER, IN S_YEAR INTEGER, OUT TOTAL DECIMAL(10,2)) PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 'com.acme.sales.calculateRevenueByMonth'; CALL SALES.TOTAL_REVENUE(?,?,?);
CREATE 文
関数、索引、手続き、スキーマ、別名、表、トリガ、ビューのCREATE文が使えます。
CREATE FUNCTION 文
CREATE FUNCTION文により、式で利用できるJava関数を作成できます。
関数の所有者および、データベースの所有者は、自動的に関数へのEXECUTE権限を手に入れます。加えて、他のユーザへの権限付与の権限も手に入れます。関数とデータベースの所有者から、関数の実行権限を剥奪することはできません。
構文
関数名
スキーマ名が与えられなかった場合、デフォルトは現在のスキーマとなります。限定された関数名にて、スキーマ名はSYSで始まってはなりません。
関数の引数
[ 引数名 ] データ型
引数名は関数にて一意である必要があります。
データ型の構文は、データ型に書かれています。
Note: CREATE FUNCTION文のパラメータにできないデータ型があります。それは、BLOB、CLOB、LONG VARCHAR、LONG VARCHAR FOR BIT DATAやXML等です。
返却データ型
表型 | データ型
データ型の構文はデータ型に記述されています。
表型
TABLE( 列要素 [, 列要素 ]* )
表関数の返り値の型です。現在利用できるのはDerbyの表関数の形式のみです。 これらはJDBCのResultSetを返す関数です。 より詳細な情報は、Derby ディベロッパーズ ガイドに記述された「Derbyの表関数のプログラミング」を参照してください。
列要素
SQL92識別子データ型
データ型の構文は、データ型に記述されています。
Note: 表関数から返却する情報の列の型を、XMLとすることはできません。
関数の要素
{ | LANGUAGE { JAVA } | EXTERNAL NAME 文字列 | PARAMETER STYLE パラメータの種類 | { NO SQL | CONTAINS SQL | READS SQL DATA } | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT } }
LANGUAGE
JAVA- 関数はJavaのクラスにあるpublic staticなメソッドとして呼ばれます。
EXTERNAL NAME string
文字列により、関数が実行されたときに呼ばれるJavaのメソッドが記述されます。この文字列は次の書式です。
クラス名.メソッド名
これは空白を含んではなりません。
パラメータの種類
JAVA | DERBY_JDBC_RESULT_SET
関数はJava言語およびSQLルーチンの仕様に沿って、引数を値渡しします。INOUTとOUTの引数は変更後の値を返せるように、要素がひとつの配列として渡されます。さらに結果セットはJavaのメソッドのパラメータを経て、配列に渡したjava.sql.ResultSet[]型の要素により返すことができます。
Derby は長い列の型(これは例えばLong VarcharやBLOB等のことです。)をサポートしません。 これらの長い列の型を使おうとすると、エラーが発生します。
Derbyの表関数の場合、PARAMETER STYLEは常にDERBY_JDBC_RESULT_SETで、これ以外の値とすることはできません。表関数とは表型を返す関数で、JDBCのResultSetを返すメソッドに対応します。 それ以外の場合は、PARAMETER STYLEは常にJAVAです。
NO SQL, CONTAINS SQL, READS SQL DATA
により関数がSQLを発行するか否か。もしするならどのようなSQLを発行するかを記述します。
CONTAINS SQL
関数により変更も更新も行わないSQL文を実行できます。 関数にて許可されていない文が実行された場合、違うというエラーが返ります。
NO SQL
関数はSQLを実行できません。
READS SQL DATA
関数は情報の更新を行わないSQLを実行することができます。 関数にて許可されていない文が実行された場合、違うというエラーが返ります。 これは既定です。
RETURNS NULL ON NULL INPUT or CALLED ON NULL INPUT
入力の引数をnullにして関数が呼ばれるかをあらわします。その場合はnull値と扱います。
RETURNS NULL ON NULL INPUT
入力の引数のうちいずれかがnullであった場合、関数は呼ばれません。そのときの帰り値はnullとなります。
CALLED ON NULL INPUT
関数は入力の引数をnullにして呼ぶことができます。この場合は関数がnullの引数をとっても動作するようにコーディングされていなければなりません。関数はnullあるいはそれ以外の値を返すことができます。これは既定です。
関数の要素はどのような順序で現れてもかまいませんが、それぞれの要素は一回しか現れてはなりません。関数の定義にはこれらの要素が必要です。
 
LANGUAGE
 
PARAMETER STYLE
 
EXTERNAL NAME
Example
CREATE FUNCTION TO_DEGREES(RADIANS DOUBLE) RETURNS DOUBLE PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'java.lang.Math.toDegrees'
CREATE INDEX 文
CREATE INDEX文により表に索引を作成できます。 索引は表のひとつ以上の列に作成できます。
構文
CREATE [UNIQUE] INDEX 索引名 ON 表名 ( 単純列名 [ ASC | DESC ] [ , 単純列名 [ ASC | DESC ]] * )
The Derbyにて索引に可能な列の最大数は16です。
索引名は128文字を超えてはなりません。
同じ列が単一のCREATE INDEX文に2つ以上あってはなりません。なお異なる索引であれば、同じ列をもってかまいません。
Derbyは索引を使って、情報の操作を行う文の効率を向上します。(Derbyのチューニングを参照してください。)。 さらにUNIQUEの索引により、情報が整合性を保っているか検証する事ができます。
索引名はスキーマにて一意です。(データベースシステムによっては、同じスキーマの異なるテーブルに同じ名前の索引を持つことができますが、Derbyは違います。) 索引と表の片方にスキーマ名が明示されて、もう片方に明示されなかった場合、索引と表は同じスキーマにあるものとされます。索引と表の両方にスキーマ名が明示されて、それぞれのスキーマ名が異なっていた場合、例外が発生します。表にも索引にもスキーマ名が明示されなかった場合、現在のスキーマが使われます。
既定でDerbyは索引をそれぞれの列に対して昇順で作成します。列名の後にASCと書いても既定の振る舞いと同じように動作します。 列名の後にDESCと書くと、索引を作るときにDerbyはその列を降順で扱います。 降順を列に指定することで、昇順と降順が混ざった並び順あるいは降順の問い合わせや、索引のある列の最大値や最小値を選択する問い合わせが、効率よく実行されることを期待できます。
限定された索引名を指定する場合、スキーマ名はSYSで始まってはなりません。
索引と制約
一意性・主キー・外部キー制約を作成すると、制約を適用または支援する索引が作成されます。(このような索引のことを支援索引と呼びます。)もし列や列の集合に、UNIQUEないしPRIMARY KEYの制約が存在している場合、それらの列に索引を作成することはできません。Derbyは既にその索引をシステムが決めた名前で作成しています。制約を支援する索引にシステムが与えた名前は、索引の名前でシステム表に問い合わせれば、簡単に見つけることができるでしょう。 既にUNIQUEの索引が存在している列の集合に、主キーまたは一意性制約を追加すると、同じ列の集合に複数の索引が造られることとなります。一つがもともとあったUNIQUEの制約でもう一つが、制約に併せて作成された支援索引です。
FLIGHTS_PKという名前の制約を支援する索引を見つけるには次のようにします。
SELECT CONGLOMERATENAME FROM SYS.SYSCONGLOMERATES, SYS.SYSCONSTRAINTS WHERE SYS.SYSCONGLOMERATES.TABLEID = SYSCONSTRAINTS.TABLEID AND CONSTRAINTNAME = 'FLIGHTS_PK'
CREATE INDEX OrigIndex ON Flights(orig_airport); -- 金額は通常大きな値から小さな値の順で並べられるので、 -- 索引を降順で作成します。 CREATE INDEX PAY_DESC ON SAMP.EMPLOYEE (SALARY); -- 索引をより大きいページサイズで作成します。 call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize','8192'); CREATE INDEX IXSALE ON SAMP.SALES (SALES); call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize',NULL);
ページサイズとキーサイズ
Note: 索引にあるキーの列サイズの合計は、ページサイズの半分以下で無ければなりません。もし既存行に作成しようとしている索引のキー列の合計が索引のページサイズの半分より大きな行があるならば、索引の作成は失敗します。このエラーは索引を作成したとき、表の既存行が基準に合わないときのみ発生します。索引が作成された後は、基準のキーサイズを超えた行の挿入が失敗します。
文の依存
SELECT、INSERT、UPDATE、UPDATE WHERE CURRENT、DELETEやDELETEの準備済み文は、その表がCREATE INDEX文の対象となった場合、索引の作成とともに無効になります。一方表について開いているカーソルは影響を受けません。
CREATE PROCEDURE 文
CREATE PROCEDURE文によりCALL PROCEDUREで実行可能な、Javaの手続きを作成できます。
手続きやデータベースの所有者は自動的にEXECUTE権限を持つものとされ、また他のユーザに権限を付与することができます。EXECUTE権限は手続きやデータベースの所有者から剥奪できません。
構文
スキーマ名が指定されなかった場合、現在のスキーマが既定となります。手続名を限定する場合、スキーマ名はSYSで始まってはなりません。
手続の引数
[ { IN | OUT | INOUT } ] [ 引数名 ] データ型
引数の既定はINです。引数名は手続にて一意である必要があります。
データ型の構文はデータ型に記述されています。
Note: BLOB、CLOB、LONG VARCHAR、LONG VARCHAR FOR BIT DATAやXMLのようなデータ型はCREATE PROCEDURE文にて引数と定義できません。
手続の要素
{ | [ DYNAMIC ] RESULT SETS INTEGER | LANGUAGE { JAVA } | EXTERNAL NAME string | PARAMETER STYLE JAVA | { NO SQL | MODIFIES SQL DATA | CONTAINS SQL | READS SQL DATA } }
DYNAMIC RESULT SETS 数値
手続に見積もられる結果の上限を与えます。既定は結果無し(0)です。
LANGUAGE
JAVA- 手続はJavaのクラスにあるpublic staticなメソッドとして呼ばれます。
EXTERNAL NAME 文字列
文字列 により手続が実施されたときのJavaのメソッドが記述されます。これは次の書式となります。
クラス名.メソッド名
この名前には空白があってはなりません。
PARAMETER STYLE
JAVA - 手続はJavaとSQLルーチンの仕様に沿って、値渡しにより引数を扱います。INOUTおよびOUTの引数は値を呼び出し側に戻せるように、要素を一つだけ持つ配列により渡されます。結果はJavaのメソッドにjava.sql.ResultSet[]の型で追加された、唯一つの要素を持つパラメータにより呼び出し側に戻されます。
Derby は長い列の型(例えばLong Varchar, BLOB等のことです。)をサポートしません。 もしこれらの長い列の型のうちの一つを使うと例外が発生します。
NO SQL, CONTAINS SQL, READS SQL DATA, MODIFIES SQL DATA
手続がSQL文を発行するか否か、またするならばどのようなSQL文を発行するかを表します。
CONTAINS SQL
読み込みも変更も行わないSQL文を手続に持たせることができることを表します。サポートされていない文では異なるというエラーが発生します。これは既定です。
NO SQL
手続ではいかなるSQL文も実行できません。
READS SQL DATA
変更を行わないSQL文を手続に持たせることができることをあらわします。サポートされていない文では異なるというエラーが発生します。
MODIFIES SQL DATA
手続でサポートされていない、あらゆるSQL文を手続から実行できることを表します。
手続の要素はどのような順序でも出現することができますが、それぞれの種類の要素は一度までしか現れてはなりません。手続にはこれらの定義が無ければなりません。
 
LANGUAGE
 
PARAMETER STYLE
 
EXTERNAL NAME
CREATE PROCEDURE SALES.TOTAL_REVENUE(IN S_MONTH INTEGER, IN S_YEAR INTEGER, OUT TOTAL DECIMAL(10,2)) PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 'com.acme.sales.calculateRevenueByMonth'
CREATE SCHEMA 文
スキーマにより情報を論理的に一つの集合に分類すること、および、一意な名前空間を提供する事ができます。
構文
CREATE SCHEMA { [ スキーマ名 AUTHORIZATION ユーザ名 ] | [ スキーマ名 ] | [ AUTHORIZATION ユーザ名 ] }
CREATE SCHEMA 文によりスキーマを作成することができます。スキーマ名は128文字を超えてはなりません。スキーマ名はデータベースの内で一意で無ければなりません。
CREATE SCHEMA文はデータベースないしシステムにおいて、derby.database.sqlAuthorizationtrueとなっている場合、アクセス制御の対象となります。データベース所有者だけが現在のユーザ名とは異なる名前のスキーマを作成することができます。またデータベース所有者だけが現在のユーザ名とは異なる
AUTHORIZATION user-name
を指定できます。 derby.database.sqlAuthorization属性についてのより詳細な情報は、Derbyのチューニングを参照してください。
CREATE SCHEMAの例
飛行機に関連した表をおくスキーマを作成して、anitaという認証識別子にスキーマの全ての情報を操作する権限を与えるには次のようにします。
CREATE SCHEMA FLIGHTS AUTHORIZATION anita
従業員に関連した表をおくスキーマを作成するには次のようにします。
CREATE SCHEMA EMP
takumiというスキーマ名がそのまま認証識別子であるスキーマを作成するには次のようにします。
CREATE SCHEMA AUTHORIZATION takumi
EMPFLIGHTSの各スキーマにavailabilityという表を作成するには次のようにします。
CREATE TABLE FLIGHTS.AVAILABILITY (FLIGHT_ID CHAR(6) NOT NULL, SEGMENT_NUMBER INT NOT NULL, FLIGHT_DATE DATE NOT NULL, ECONOMY_SEATS_TAKEN INT, BUSINESS_SEATS_TAKEN INT, FIRSTCLASS_SEATS_TAKEN INT, CONSTRAINT FLT_AVAIL_PK PRIMARY KEY (FLIGHT_ID, SEGMENT_NUMBER, FLIGHT_DATE))
CREATE TABLE EMP.AVAILABILITY (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL, ROOMS_TAKEN INT, CONSTRAINT HOTELAVAIL_PK PRIMARY KEY (HOTEL_ID, BOOKING_DATE))
CREATE SYNONYM 文
CREATE SYNONYM文によって同じスキーマあるいは異なるスキーマに存在する表やビューに別名を与える事ができます。 さらに別名に別名を与えて、入れ子の別名を作成することもできます。 別名は元の限定された表やビューの名前に代わり、SELECT、INSERT、UPDATE、DELETEやLOCK TABLE文にて利用できます。存在しない表やビューへの別名を作成することも可能ですが、別名を利用する前までに対象の表やビューは存在していなければなりません。
別名は表やビューと同じ名前空間を共有します。同じスキーマに既にある表と同じ名前で別名を作ることはできません。同様に既に存在する別名と同じ名前の表やビューを作成することはできません。
別名は作成時にまだ存在していない表やビューにも作成することができます。もし表やビューが存在していなければ、そのことを警告されます。(SQLSTATE 01522) DML文で別名を使うときには参照する情報は存在していなければなりません。
入れ子になった別名(他の別名への別名)を作成することはできますが、参照関係が循環するような別名を作成しようとするとエラーとなります。(SQLSTATE 42916)
別名はシステムスキーマに定義できません。'SYS'で名前が始まるあらゆるスキーマはシステムスキーマとみなされ、Derbyにおいて予約されています。
一時表への別名は作成できません。一時表に別名を定義しようとするとエラーとなります。(SQLSTATE XCL51)
構文
CREATE SYNONYM 別の名 FOR { ビュー名 | 表名 }
文中の別の名は、対象の表やビューに与える別名です。一方で、ビュー名表名は、対象の表やビューの元の名前です。
CREATE SYNONYM SAMP.T1 FOR SAMP.TABLEWITHLONGNAME
CREATE TABLE 文
CREATE TABLE文により表を作成します。表には列および制約があって、情報が沿うべき規則が決められています。表ごとの制約は列の集合ないしは列を指定します。列にはデータ型が決まっていて、列の制約(列ごとの制約)があります。
表やデータベースの所有者は自動的に以下の権限を持ち、また他のユーザにこれらの権限を与える事ができます。
 
INSERT
 
SELECT
 
REFERENCES
 
TRIGGER
 
UPDATE
これらの権限を表やデータベースの所有者から剥奪することはできません。
制約についての情報は、CONSTRAINT 節を参照してください。
列には既定値を与えることができます。既定値とは値が指定されなかったとき、列に挿入される値です。明示されない場合列の既定値はNULLです。詳細は列の既定値を参照してください。
SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTYというシステムの手続を呼ぶことで、ページサイズのような記録の属性を設定することができます。
表を限定する場合、スキーマ名はSYSで始まってはなりません。
構文
CREATE TABLEには二通りの書き方があります。これは、列の定義と制約を指定しようとするか、問い合わせ式の結果に基づき列を定義するかによります。
CREATE TABLE 表名 ( {列定義 | 表毎制約} [ , {列定義 | 表毎制約} ] * ) | [ ( 列名 [ , 列名 ] * ) ] AS 問い合わせ式 WITH NO DATA }
CREATE TABLE HOTELAVAILABILITY (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL, ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE)); -- 表で主キーを定義することで、2列からなる主キーを定義できます。 PRIMARY KEY (hotel_id, booking_date)) -- 識別子列の属性を、INTEGERの列に与え、 -- さらに列に主キー制約を定義します。 CREATE TABLE PEOPLE (PERSON_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY CONSTRAINT PEOPLE_PK PRIMARY KEY, PERSON VARCHAR(26)); -- 識別子列の属性を、SMALLINTの列に与え、 -- 初期値を5に増分値を5に設定します。 CREATE TABLE GROUPS (GROUP_ID SMALLINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 5, INCREMENT BY 5), ADDRESS VARCHAR(100), PHONE VARCHAR(15));
Note: さまざまな制約を使った、より多くのCREATE TABLE文の例がCONSTRAINT 節にあります。
CREATE TABLE ... AS ...
もう一つのCREATE TABLE文の書き方は、問い合わせで列の名前と/あるいは列のデータ型を指定します。問い合わせ結果の列は、新しい表の各列を作成するときにモデルとして利用されます。
新しい表に列名が指定されなかった場合、問い合わせの結果の全列が、新しい表に同じ名前と対応するデータ型で作成されます。 ひとつあるいはそれ以上の列の名前が新しい表に指定された場合、問い合わせ式の結果には同数の列が無ければなりません。問い合わせ結果の列のデータ型は新しい表の対応する列に引き継がれます。
WITH NO DATA節は問い合わせ結果行のデータは使われず、列の名称と型だけが利用されることを表します。 WITH NO DATAは必ず指定してください。今後のリリースにて、DerbyでもWITH DATAを指定して、問い合わせ式の結果を新規作成された表に挿入するように出来るようになるかもしれません。しかし現在のリリースでは、WITH NO DATAの文しか処理されません。
-- 既存の表の全列とデータ型を使って新しい表を作成する。 CREATE TABLE T3 AS SELECT * FROM T1 WITH NO DATA; -- 列に名前を指定して表を作成する。そのデータ型は既存表の列に沿ったものとする。 CREATE TABLE T3 (A,B,C,D,E) AS SELECT * FROM T1 WITH NO DATA; -- 列に名前を指定して表を作成する。そのデータ型は既存表の指定された列のデータ型に沿ったものとする。 CREATE TABLE T3 (A,B,C) AS SELECT V,DP,I FROM T1 WITH NO DATA; -- この例では問い合わせ式の結果にある列に名前がないが、そのデータ型は新規作成された表にて対応する列のデータ型となる。 CREATE TABLE T3 (X,Y) AS SELECT 2*I,2.0*F FROM T1 WITH NO DATA;
列定義:
単純列名データ型 [ 列毎の制約 ]* [ [ WITH ] DEFAULT 既定制約式 |発番列仕様 ] [ 列毎の制約 ]*
データ型の仕様はデータ型にて説明されています。
列毎の制約表毎の制約は、CONSTRAINT 節にて説明されています。
列の既定値
既定値の定義として、いかなる表への参照もない既定制約式があります。 これに可能であるのは定数、日時の特殊変数、現在のスキーマ、ユーザ、nullです。
既定制約式: NULL | CURRENT { SCHEMA | SQLID } | USER | CURRENT_USER | SESSION_USER | DATE | TIME | TIMESTAMP | CURRENT DATE | CURRENT_DATE | CURRENT TIME | CURRENT_TIME | CURRENT TIMESTAMP | CURRENT_TIMESTAMP | literal
Derbyのリテラル値についての詳細は、データ型を参照してください。
既定制約式におく値は、列と互換性のある型でなければなりません。加えて以下の制約があります。
 
USER、CURRENT_USERやSESSION_USERを指定した場合、列の長さは少なくとも8である必要があります。
 
CURRENT SCHEMAやCURRENT SQLIDを指定した場合、列の長さは少なくとも128である必要があります。
 
列が整数型である場合、既定値は整数のリテラルである必要があります。
 
列が10進の型である場合、既定値の桁数と精度は列のそれぞれの定義の範囲内である必要があります。
発番列仕様:
[ GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( START WITH 定整数 [ ,INCREMENT BY 定整数] ) ] ] ]
識別子列属性
SMALLINT、INT、BIGINT型の列に識別子属性があると、Derbyは自動的に列の値に、増加する整数値をあてます。挿入文で列の値が指定されない場合、識別子列属性は既定値と同様に振る舞い、Derbyは列に自動的に値を与えます。 しかしながら、その値は定数ではありません。Derbyは行に挿入する時、自動的に既定値へ加算してゆきます。
IDENTITYというキーワードは列のデータ型が次のいずれの整数である場合にのみ指定可能です。
 
SMALLINT
 
INT
 
BIGINT
Derbyには二種類の識別子列があります。ひとつはGENERATED ALWAYSで、もう一つはGENERATED BY DEFAULTです。
GENERATED ALWAYS
GENERATED ALWAYSの識別子列は列の既定値を、挿入が行われるときごとに増加させて、その増加された値を列に記録します。他の既定値とは違い、GENERATED ALWAYSの識別子列に値を直接挿入したり、その値を変更したりすることはできません。その代わりに識別子列の値にはDEFAULTというキーワードを与えるか、識別子列を挿入する列の一覧からはずすかします。 例を挙げます。
create table greetings (i int generated always as identity, ch char(50)); insert into greetings values (DEFAULT, 'hello'); insert into greetings(ch) values ('bonjour');
GENERATED ALWAYSな識別子列に自動的に発番された値は一意です。また識別子列を作成しても、列に索引は作られません。
GENERATED BY DEFAULT
GENERATED BY DEFAULTの識別子列は、挿入時に列へ明示的な値が与えられなかった場合のみ、既定値を増加させて使います。GENERATED ALWAYSの列とは違い、挿入文にて明示的な値を既定値の変わりに与えることができます。
生成された既定値を使うためには、挿入時にDEFAULTというキーワードを使うか、識別子列を挿入列リストから外します。挿入する値を指定するには、その値を挿入文に含めます。例を挙げます。
create table greetings (i int generated by default as identity, ch char(50)); -- "1"を指定する: insert into greetings values (1, 'hi'); -- 生成された既定値を使う insert into greetings values (DEFAULT, 'salut'); -- 生成された既定値を使う insert into greetings(ch) values ('bonjour');
GENERATED ALWAYS列とは異なり、GENERATED BY DEFAULTの列では一意性は保障されません。したがって、上記の例ではhiおよびsalutの行はどちらも同じ"1"という識別値を取ります。なぜなら、生成された列の値は"1"から始まり、ユーザが指定した値も"1"だったからです。重複を避けるために、情報のロードやインポートを行うときにテーブルを作成して、システムが自動生成するためのSTART WITHの値を与えてください。このような状況をチェックして、起きないようにするために、主キーや一意性制約をGENERATED BY DEFAULTの識別子列に使うことができます。
既定では識別子列の初期値は1です。さらに増分値は1です。 列を定義するとき、初期値と増分値の両方に、START WITHとINCREMENT BYというキーワードを使って、明示的な値を指定することができます。さらに増分値に負の値を与えると、挿入毎にDerbyは値を減じてゆきます。 もし値が正の値であれば、挿入毎にDerbyは値を増加させてゆきます。 値に0を与えると例外が発生します。
識別子列にて可能な最大値と最小値は、列のデータ型によります。データ型で採ることのできる範囲外の値を挿入しようとすると、例外が発生します。
Table 1. 発番列仕様にて、列でとることが可能な最大値と最小値
データ型
最大値
最小値
SMALLINT
32767 (java.lang.Short.MAX_VALUE)
-32768 (java.lang.Short.MIN_VALUE)
INT
2147483647 (java.lang.Integer.MAX_VALUE)
-2147483648 (java.lang.Integer.MIN_VALUE)
BIGINT
9223372036854775807 (java.lang.Long.MAX_VALUE)
-9223372036854775808 (java.lang.Long.MIN_VALUE)
識別子列にて自動的に生成された値は一意です。主キー制約や一意性制約を列に定義することで、一意性を保障する事ができます。識別子列を定義しても、列の索引は作られません 。
IDENTITY_VAL_LOCAL関数は、非決定性の関数で最後に識別子列に与えられた値を返します。詳細については、IDENTITY_VAL_LOCAL関数を参照してください。
Note: スキーマ・表・列の名前はデリミトされた識別子を使わない限り、常にシステム表にて大文字で記録されます。
Derbyは列に対して最後に発番された値をキャッシュに残しています。また、ディスク上では、SYS.SYSCOLUMNSというシステム表のAUTOINCREMENTVALUEという列に、次の値を記録しています。 トランザクションをロールバックしてもこの値は取り消されません。したがって、トランザクションがロールバックされると、識別子列に挿入される自動生成値には、空きが発生することとなります。 Derby はこのように動作することで、SYS.SYSCOLUMNSの行をトランザクションの期間中ロックし続けることを回避して、高い平行性を保っています。
トリガされたSQL文にて識別子列に値が挿入された場合、そのSQL文で挿入された値は、トリガのコード内でのみConnectionInfoから取得可能です。 また、トリガのコードはトリガをひいた文が挿入した値を取得することもできます。 しかし、トリガをひいた文は、トリガされたSQL文が識別子列に挿入した値を知ることができません。 さらにトリガは入れ子(再帰)の場合も同じようなこととなります。 SQL文によりT1というトリガが発火され、次にT1の実行したSQLによりT2というトリガが発火されたとします。ここでT1もT2も表に識別子列に値がある行を挿入した場合、T1はT2が挿入した値を見ることはできませんが、T2はT1が挿入した値を見ることができます。それぞれの入れ子になったトリガは自分自身と、再帰的なトリガを開始したSQLを含めて、入れ子のレベルが前の処理にて生成された値を見ることができます。 なおトリガの再帰は16まで可能です。
create table greetings (i int generated by default as identity (START WITH 2, INCREMENT BY 1), ch char(50)); -- 1を指定する。 insert into greetings values (1, 'hi'); -- 生成された既定値を使う insert into greetings values (DEFAULT, 'salut'); -- 生成された既定値を使う insert into greetings(ch) values ('bonjour');
CREATE TRIGGER 文
トリガによりデータベースのイベントに応じて実行されるアクションの集合を、表に定義することができます。ここでデータベースのイベントとは削除、挿入、更新処理のことです。 例えば表に削除へのトリガを定義した場合、そのトリガのアクションは表から行が削除されるときに実行されます。
制約と併せて、トリガによる波及的な削除や更新を定義することで、情報の整合性を保つことができます。 トリガで実現できる機能はこのほかにも、警告の呈示や、他の表の更新、e-mailの送信やその他の処理など、多岐にわたります。
ひとつの表に定義可能なトリガの数には、それらのトリガが同じイベントへのトリガであるか否かにかかわらず、上限はありません。
スキーマの所有者であるユーザであれば、そのスキーマにトリガを作成することができます。 所有していない表にトリガを定義するためには、その表にTRIGGER権限を持っていなければなりません。 データベースの所有者であるユーザであれば、どのスキーマのどの表に対してもトリガを作成することができます。
トリガはトリガが定義されている表とは異なるスキーマに定義することも可能です。
限定されたトリガ名のスキーマ名は、SYSで始まってはなりません。
構文
CREATE TRIGGER トリガ名 { AFTER | NO CASCADE BEFORE } { INSERT | DELETE | UPDATE [ OF 列名 [, 列名]* ] } ON 表名 [ 参照節 ] [ FOR EACH { ROW | STATEMENT } ] [ MODE DB2SQL ] トリガされるSQL文
トリガの発火が前か後か
トリガは前のトリガあるいは後のトリガのいずれかとして定義できます。
 
前のトリガは文による変更が適用され制約による検証が行われる前に発火します。 前のトリガは、行のトリガあるいは文のトリガのいずれにもなることができます。(詳細は文のトリガと行のトリガを参照してください。)
 
後のトリガは変更が適用され制約による検証が満たされた後に発火します。 後のトリガは、行のトリガあるいは文のトリガのいずれにもなることができます。(詳細は文のトリガと行のトリガを参照してください。)
挿入、削除、更新のいずれによりトリガは発火されるのか
トリガはどのように定義されたかに従って、次のいずれかのデータベースのイベントにより発火します。(上記の構文を参照してください。
 
INSERT
 
UPDATE
 
DELETE
表のイベントごとに定義できるトリガの数に上限はありません。さらに更新へのトリガであれば、対象となる列を明示することができます。
古い値を参照するのか、新しい値を参照するのか:参照節
発火の原因となったイベントで現在変更された情報をトリガされるSQL文から参照することは良くあることです。 また、トリガされるSQL文が参照しなければならないのは新しい値(変更後、後の値、と言うこともできます)である場合があります。
Derbyにて、発火した原因となったイベントにより変更された情報をトリガから参照する方法はひとつだけではありません。変更された情報はトリガされるSQL文から、遷移変数あるいは遷移表で参照することができます。 参照節にて遷移変数への相関名や別名を、OLD/NEW AS 相関名という書式で記述できます。
例えば、次のような節をトリガの定義に記述した場合。
REFERENCING OLD AS DELETEDROW
トリガされるSQL文でこの相関名を参照できます。
DELETE FROM HotelAvailability WHERE hotel_id = DELETEDROW.hotel_id
遷移変数はOLDかNEWのいずれかに関わらず、単一の行を持つjava.sql.ResultSetにマップされます。
Note: 遷移変数を使えるのは、行のトリガだけです。(文のトリガと行のトリガを参照してください。) また、挿入イベントの行のトリガではOLDの行を参照できません。削除イベントの行のトリガではNEWの行を参照できません。
文のトリガでは、遷移をトリガされるSQL文やトリガの資格で参照可能です。 参照節にて参照表への相関名や別名を、OLD_TABLE/NEW_TABLE AS 相関名という書式で記述できます。
例えば、
REFERENCING OLD_TABLE AS DeletedHotels
と書くことで識別子(DeletedHotels)をトリガされるSQL文で使うことができます。
DELETE FROM HotelAvailability WHERE hotel_id IN (SELECT hotel_id FROM DeletedHotels)
遷移表は古いか新しいかに関わらず、トリガが着火した原因のイベントで影響を受けた行の数と同じ基数をもつjava.sql.ResultSetにマップされます。
Note: 文のトリガ(文のトリガと行のトリガを参照してください。)でのみ遷移表は利用可能です。 INSERT文へのトリガでは、OLDの表は参照できません。DELETE文へのトリガでは、NEWの表は参照できません。
参照節では、新しいものと古いものにそれぞれ一つまで、相関名あるいは識別子を定義できます。 また、行のトリガには遷移表の識別子を定義できない一方で、文のトリガには遷移変数の相関名を定義できません。
文のトリガと行のトリガ
トリガには、文のトリガ行のトリガがあります。 CREATE TRIGGER文のFOR EACH節にて、どちらのトリガであるか明示されなかった場合の既定は、文のトリガです。
 
文のトリガ
文のトリガはトリガのイベント毎に一回発火します。トリガの発火に挿入・更新・削除にて何行が変更されたかは関係ありません。
 
行のトリガ
行のトリガはトリガのイベントが影響する行毎に一回発火します。影響が一行にも及ばなかった場合、トリガは発火しません。
Note: 列の値を元の値と等しい値に変更した場合(例えば、UPDATE T SET C = Cという文を考えてください。)、トリガのイベント前と後で列の値に変化が無くても、行のトリガは発火します。
トリガされるSQL文
トリガで定義されるアクションのことを、トリガされるSQL文と呼びます。(上記、構文の最終行をを参照してください。) トリガされるSQL文には以下の制限があります。
 
動的な引数(?)があってはなりません。
 
トリガが定義されている表の作成や、変更、破棄を行ってはなりません。
 
トリガが定義されている表への索引の作成や破棄を行ってはなりません。
 
トリガが定義されている表へのトリガの作成や破棄を行ってはなりません。
 
トランザクションのコミットやロールバック、分離レベルの変更を行ってはなりません。
 
前のトリガのアクションにINSERT/UPDATE/DELETE文があってはなりません。
 
前のトリガのアクションで更新を行う手続きを呼び出してはなりません。
トリガされるSQL文ではトリガが定義された表以外のデータベースの情報を参照することができます。それらのデータベースの情報が破棄されていた場合、トリガは無効となります。 次回の実行にてトリガの再コンパイルが失敗した場合、呼び出しは例外を投げて、トリガを発火させた文はロールバックされます。
トリガされるSQL文の詳細については、Derby ディベロッパーズ ガイドを参照してください。
実行の順序
トリガを発火させるデータベースのイベントが起きると、Derbyは処理を次の順で行います。
 
最初にNo Cascade Beforeなトリガのアクションを実行します。
 
次に、制約(主キー、一意キー、外部キー)の検証を行います。
 
続いて、更新、変更、削除などの処理を行います。
 
最後にAfterなトリガを発火します。
同じ表に対して、同じイベントの、発火する時(トリガが前か後かという意味です。)が同じトリガが複数定義されていた場合、トリガは作成された順に実行されます。
-- 文とトリガ CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x FOR EACH ROW MODE DB2SQL values app.notifyEmail('Jerry', 'Table x is about to be updated'); CREATE TRIGGER FLIGHTSDELETE AFTER DELETE ON FLIGHTS REFERENCING OLD_TABLE AS DELETEDFLIGHTS FOR EACH STATEMENT DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID IN (SELECT FLIGHT_ID FROM DELETEDFLIGHTS); CREATE TRIGGER FLIGHTSDELETE3 AFTER DELETE ON FLIGHTS REFERENCING OLD AS OLD FOR EACH ROW DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;
Note: Derby ディベロッパーズ ガイドにはより多くの例が書かれています。
トリガの再帰
トリガの再帰は最大16までです。
関連する情報
現在の時刻や現在のユーザを返す特殊システム関数は、トリガを作成したときではなく、トリガが発火したときに評価されます。このような関数には以下のものがあります。
参照節:
REFERENCING { { OLD | NEW } [ ROW ] [ AS ] correlation-Name [ { OLD | NEW } [ ROW ] [ AS ] correlation-Name ] | { OLD TABLE | NEW TABLE } [ AS ] Identifier [ { OLD TABLE | NEW TABLE } [AS] Identifier ] | { OLD_TABLE | NEW_TABLE } [ AS ] Identifier [ { OLD_TABLE | NEW_TABLE } [AS] Identifier ] }
Note: OLD_TABLE | NEW_TABLEは、後方互換性及びDB2との互換性のための構文です。これはSQL標準に沿っていないので非推奨です。
CREATE VIEW 文
ビューとはクエリにより定義された仮想的な表です。表は破棄するまで利用可能なディクショナリの情報です。ビューは更新できません。
限定されたビューの名前にて、スキーマ名はSYSで始まってはなりません。
ビューの所有者は自動的にSELECT権限を得ます。ビューの所有者からSELECT権限を剥奪することはできません。データベースの所有者は自動的にビューへのSELECT権限を持ち、SELECT権限を他のユーザに付与することができます。データベースの所有者からSELECT権限を剥奪することはできません。
ビューの所有者はビューが参照する情報を所有する場合のみ、他のユーザにSELECT権限を付与することができます。
ビューの所有者が、ビューが参照する情報を所有していない場合、ビューの所有者は適切な権限を付与されていなければなりません。例えば、user2という認証識別子がuser1.t1という表とuser1.f_abs()という関数を参照する、user2.v2というビューを作成する場合、user2user1.t1へのSELECT権限とuser1.f_abs()へのEXECUTE権限を持たなければなりません。.
SELECT権限を付与する権限は剥奪できません。ビューが参照する情報への必要な権限が剥奪された場合、ビューは破棄されます。
構文
ビューの定義にビューの列一覧を書くことで、ビューの列に明示的な名前を与えることができます。 ビューの列一覧がない場合、ビューの列名は元となる問い合わせの列名を引継ぎます。ビューの全列は一意な名前を持たなければなりません。
CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF) AS SELECT COMM + BONUS, COMM - BONUS FROM SAMP.EMPLOYEE; CREATE VIEW SAMP.VEMP_RES (RESUME) AS VALUES 'Delores M. Quintana', 'Heather A. Nicholls', 'Bruce Adamson'; CREATE VIEW SAMP.PROJ_COMBO (PROJNO, PRENDATE, PRSTAFF, MAJPROJ) AS SELECT PROJNO, PRENDATE, PRSTAFF, MAJPROJ FROM SAMP.PROJECT UNION ALL SELECT PROJNO, EMSTDATE, EMPTIME, EMPNO FROM SAMP.EMP_ACT WHERE EMPNO IS NOT NULL;
文の依存
ビューの定義は参照する表やビューに依存します。 ビューを参照するDML(data manipulation language)文は、ビューが依存するのと同様に、そのビューに依存します。 ビューを参照する文は、ビューが利用する索引に依存します。この索引は問い合わせがどのように最適化されるかに応じて文毎に異なります。 例を以下に挙げます。
CREATE TABLE T1 (C1 DOUBLE PRECISION); CREATE FUNCTION SIN (DATA DOUBLE) RETURNS DOUBLE EXTERNAL NAME 'java.lang.Math.sin' LANGUAGE JAVA PARAMETER STYLE JAVA; CREATE VIEW V1 (C1) AS SELECT SIN(C1) FROM T1;
文とそれが依存するデータベースの情報を挙げます。
SELECT * FROM V1
V1というビュー、T1という表、 外部のスカラー関数のSIN
DECLARE GLOBAL TEMPORARY TABLE 文
The DECLARE GLOBAL TEMPORARY TABLE statement defines a temporary table for the current connection.
これらの表はシステムカタログにあるものではなく永続的なものではありません。一時表は作成した接続の期間のみ存在して、他の接続から参照することはできません。接続が閉じるとき、 表中の行は削除され、一時表に関するメモリ上の記述は破棄されます。
一時表は以下のような場合に便利です。
 
表の構造がアプリケーションを使う前では分からない場合
 
他のユーザが同様な構造の表を必要としない場合
 
アプリケーションを使っている場合のみ、一時表の情報が必要な場合
 
システムカタログにロックを持たずに、表の定義と破棄が可能な場合
構文
DECLARE GLOBAL TEMPORARY TABLE 表名 { 列定義 [ , 列定義 ] * } [ ON COMMIT {DELETE | PRESERVE} ROWS ] NOT LOGGED [ON ROLLBACK DELETE ROWS]
表名
一時表の名前です。SESSION以外のスキーマ名が指定された場合、エラーが発生します。(SQLSTATE 428EK) スキーマ名が指定されなかった場合、SESSIONがあてられます。 複数の接続で同じ名前の一時表を作ることができます。なぜならそれぞれの接続は個々に一意な表の記述子を持つからです。
SESSIONを永続的な表のスキーマとして使ってもエラーにはなりませんが推奨しません。 SESSIONというスキーマ名は一時表のスキーマ用に予約されています。
列定義
列定義の詳細については列定義CREATE TABLEを参照してください。 DECLARE GLOBAL TEMPORARY TABLEでは列定義発番列仕様は不可能です。
データ型
可能なデータ型は以下のとおりです。
 
BIGINT
 
CHAR
 
DATE
 
DECIMAL
 
DOUBLE
 
DOUBLE PRECISION
 
FLOAT
 
INTEGER
 
NUMERIC
 
REAL
 
SMALLINT
 
TIME
 
TIMESTAMP
 
VARCHAR
ON COMMIT
COMMITが行われたときのアクションを指定します。
DELETE ROWS
表に開いたカーソルが無ければ、表中の全ての行が削除されます。これはON COMMITの既定です。 もしON ROLLBACK DELETE ROWSを指定した場合は、一時表が使われた場合のみ全ての行が削除されます。 ON COMMIT DELETE ROWSを指定した場合は、一時表が使われなかった場合でも表の行が削除されます(開いたカーソルが無かった場合です。)。
PRESERVE ROWS
表の行は留め置かれます。
NOT LOGGED
トランザクションがロールバックされたとき、一時表に行われるアクションを指定します。 ROLLBACK(あるいはROLLBACK TO SAVEPOINT)が行われると、作業単位(もしくはセーブポイント)にて表が作られていれば、その表は破棄されます。もし作業単位(もしくはセーブポイント)にて表が破棄された場合、行のない表が復元されます。
ON ROLLBACK DELETE ROWS
これはNOT LOGGEDの既定です。NOT LOGGED [ON ROLLBACK DELETE ROWS ]]により、ROLLBACKあるいはROLLBACK TO SAVEPOINTが行われたとき一時表に行われる処理が指定されます。もし表の情報が変更されていれば、全行が削除されます。
set schema myapp; create table t1(c11 int, c12 date); declare global temporary table SESSION.t1(c11 int) not logged; -- 一時表はSESSIONスキーマにしか置かれないので、 -- SESSIONによる限定は冗長です。 declare global temporary table t2(c21 int) not logged; -- 一時表はSESSIONスキーマにしか置かれないので、 -- この例ではSESSIONにより限定しません。 insert into SESSION.t1 values (1); -- 現在のスキーマが"myapp."なので、一時表を使うにはSESSIONによる限定が必須です。 select * from t1; -- 表がSESSIONにより限定されていないので、 -- このselect文の"myapp.t1"は実表を参照します。
Note: 一時表はSESSIONスキーマにのみ定義できます。 ユーザはSESSIONという名前の実スキーマを定義するべきではありません。
次のDB2 UDBにて可能なDECLARE GLOBAL TEMPORARY TABLE関数は、Derbyにて使えません。
 
IDENTITY column-options
 
IDENTITY attribute in copy-options
 
AS (fullselect) DEFINITION ONLY
 
NOT LOGGED ON ROLLBACK PRESERVE ROWS
 
IN tablespace-name
 
PARTITIONING KEY
 
WITH REPLACE
Declared Global Temporary Tablesの制限事項
Derbyでは一時表に次の機能を提供していません。 これらの機能の幾つかは一時表特有のものであり、幾つかはDerby特有のものです。
以下の文では一時表を指定できません。
 
ALTER TABLE
 
CREATE INDEX
 
CREATE SYNONYM
 
CREATE TRIGGER
 
CREATE VIEW
 
GRANT
 
LOCK TABLE
 
RENAME
 
REVOKE
一時表には次の機能を使えません。
 
SESSIONスキーマにある表(実表と一時表を含みます)への別名、トリガ、ビュー
 
SESSIONスキーマにある表を参照する文のキャッシュ
 
一時表は外部キー制約や主キー制約で指定できない。
 
トリガされるSQL文では一時表を参照できません。
 
列のチェック制約
 
発番列仕様
 
一時表へのインポート
一時表への挿入、更新、削除の文にてエラーが起きた場合、一時表の全ての行は削除されます。
一時表にて以下のデータ型は利用できません。
 
BLOB
 
CHAR FOR BIT DATA
 
CLOB
 
LONG VARCHAR
 
LONG VARCHAR FOR BIT DATA
 
VARCHAR FOR BIT DATA
 
XML
DELETE 文
構文
{ DELETE FROM 表名 [WHERE 節] | DELETE FROM 表名 WHERE CURRENT OF }
一つ目の書き方は、検索による削除と呼ばれ、表名とWHERE 節により絞り込まれた行が削除されます。
二つ目の書き方は、位置による削除と呼ばれ、更新可能なカーソルで現在開いている行が削除されます。更新可能なカーソルについてはSELECT 文を参照してください。
DELETE FROM SAMP.IN_TRAY stmt.executeUpdate("DELETE FROM SAMP.IN_TRAY WHERE CURRENT OF " + resultSet.getCursorName());
文の依存
検索による削除では、文が更新する表やそのコングロマリット(ヒープや索引のような記録の単位)に、文が依存します。準備された検索による削除文が対象とする表のCREATEやDROP INDEX文は、その準備された検索による削除文を無効とします。
位置による削除では、文がカーソルやカーソルが参照する表に依存します。たとえまだカーソルが開いてなくても、位置による削除の文はコンパイル可能です。それでも、JDBCのcloseメソッドにより開いたカーソルが取り除かれると、位置による削除の文は無効になります。
準備された位置による削除の文が対象とする表のCREATEやDROP INDEX文は、その準備された位置による削除の文を無効とします。
DROP文
関数、索引、手続、スキーマ、別名、表、トリガ、ビューのDrop文が使えます。
DROP FUNCTION 文
構文
DROP FUNCTION 関数名
破棄する関数を指定します。指定した関数名の関数がスキーマにて一つのみ見つかった場合に有効です。指定された関数はいくつ引数を持っていてもかまいません。指定された名前の関数がスキーマに見つからなかった場合はエラーとなります。(SQLSTATE 42704) 指定された名前やスキーマの関数が複数見つかった場合もエラーとなります。
DROP INDEX 文
DROP INDEX で指定した索引は破棄されます。
構文
DROP INDEX 索引名
DROP INDEX OrigIndex DROP INDEX DestIndex
文の依存
破棄しようとしている索引があるテーブルに、開いているカーソルがある場合、DROP INDEX 文はエラーとなって、索引は破棄されません。索引が破棄された場合には、破棄された索引の表に依存している文は無効となります。
DROP PROCEDURE 文
構文
DROP PROCEDURE 手続名
指定した手続名により破棄する手続がスキーマに一つだけ見つかったとき有効です。 見つかった手続きには引数がいくつあってもかまいません。 指定された名前でスキーマに手続きが見つからなかった場合はエラーとなります。(SQLSTATE 42704) また手続きがスキーマに複数見つかった場合もエラーとなります。
DROP SCHEMA 文
DROP SCHEMA 文によりスキーマを破棄できます。 破棄するスキーマは空で無ければなりません。
APPスキーマ(既定のユーザスキーマです。)やSYSスキーマは破棄できません。
構文
DROP SCHEMA スキーマ名 RESTRICT
RESTRICTキーワードによりデータベースから破棄しようとするスキーマには、情報があってはならないことを指定します。このRESTRICTキーワードは必須です。
-- SAMP スキーマを破棄します。 -- SAMPスキーマをデータベースから削除できるのは、 -- スキーマに情報が定義されていないときのみです。 DROP SCHEMA SAMP RESTRICT
DROP SYNONYM 文
表やビューの別名を破棄します。
構文
DROP SYNONYM 別名名
DROP TABLE 文
DROP TABLE により表を破棄できます。
構文
DROP TABLE 表名
文の依存
表のトリガ、制約(主キー、一意、チェック、破棄する表から参照)や索引は、暗黙裡に削除されます。破棄しようとした表に開いたカーソルがあった場合、DROP TABLEはエラーとなり表は破棄されません。
表を破棄すると、その表に依存する文が無効となります。(無効となった文は次回の実行で再コンパイルされます。依存関係を参照してください。)
DROP TRIGGER 文
DROP TRIGGER removes the specified trigger.
構文
DROP TRIGGER トリガ名
DROP TRIGGER TRIG1
文の依存
表が破棄されたとき、その表のトリガは自動的に破棄されます。(表を破棄する前に表のトリガを破棄する必要はありません。)
DROP VIEW 文
指定したビューを破棄します。
構文
DROP VIEW ビュー名
DROP VIEW AnIdentifier
文の依存
ビューを参照する文は、ビューが破棄されたときに無効になります。ビューに開いたカーソルがある場合、DROP VIEWは実行できません。ビューが依存している情報を破棄する前に、ビューは破棄されなければなりません。
GRANT 文
GRANT 文を使って、データベースにある情報の操作権限を、指定した一人あるいは全ユーザに与えることができます。
次の権限を与えることができます。
 
表からの情報の削除
 
表への情報の挿入
 
表あるいは表にある列の部分集合への外部キー制約の作成
 
表やビュー、表にある列の部分集合からの情報の選択
 
表へのトリガーの作成
 
表あるいは表にある列の部分集合の情報の更新
 
関数あるいは手続きの実行
GRANT文を発行する前に、derby.database.sqlAuthorization属性がtrueであることを確認してください。derby.database.sqlAuthorization属性により、SQL認証が有効になります。
ユーザに権限付与が認められている情報であれば、その情報への権限をユーザは与えることができます。 詳細については、権限を与えようとしている情報に対応したCREATE文の説明文を読んでください。
GRANT文の書き方は、表に対する権限付与なのか、それともプログラムルーチンに対する権限付与なのかにより、その構文が異なります。
表の場合の構文
プログラムルーチンの場合の構文
GRANT EXECUTE ON { FUNCTION | PROCEDURE } プログラムルーチンの指示子 TO 権限を与えられる人
表権限
DELETE | INSERT | REFERENCES [列一覧] | SELECT [列一覧] | TRIGGER | UPDATE [列一覧]
列一覧
( 列識別子 {, 列識別子}* )
ALL PRIVILEGES権限により指定した表へのすべての権限をユーザに付与します。権限の並びを指定して、表への一つ以上の権限を付与することも可能です。
DELETE権限により指定した表から行を削除する権限を付与します。
INSERT権限により指定した表に行を挿入する権限を付与します。
REFERENCES権限により指定した表への外部キー参照を作成する権限を付与します。REFERENCESに合わせて列並びが指定された場合、指定した列への外部キー参照だけが許可されます。
SELECT権限により表あるいはビューでSELECT文を行う権限が付与されます。もしSELECT権限で列の並びが指定された場合、それらの列にのみ権限は有効です。列の並びが指定されなかった場合、表の全列について権限は有効です。
TRIGGER権限により指定した表にトリガを作成する権限が付与されます。
UPDATE権限により指定した表にUPDATE文を使う権限が付与されます。列の並びが指定された場合、権限は指定された列にのみ有効です。WHERE節のある文で行を更新する場合、更新する行にある列へのSELECT権限も必要です。
権限を与えられる人
{ 認証識別子 | PUBLIC } [,{ 認証識別子 | PUBLIC } ] *
特定のユーザまたは全ユーザに権限を与えることができます。 PUBLIC というキーワードは全ユーザをあらわします。PUBLICが与えられた場合、現存するユーザのみならず、以降に作成されたユーザにも権限が与えられます。 PUBLICに与えられた権限と、個々のユーザに与えられた権限は、独立しています。 例えば、tという表へのSELECT権限が、PUBLICとharryという認証識別子に対して与えられているとしましょう。この場合は、harryという認証識別子からSELECT権限が剥奪されたとしても、HarryはPUBLICの権限を通して、tという表を操作可能です。
プログラムルーチンの指示子
{ 関数名 | 手続きの名前 }
tという表へのSELECT権限をmariaharryという認証識別子に与えるには、次のように書きます。
GRANT SELECT ON TABLE t TO maria,harry
tという表へのUPDATEとTRIGGER権限を、anitazhiという認証識別子に与えるには、次のように書きます。
GRANT UPDATE, TRIGGER ON TABLE t TO anita,zhi
s.vという表へのSELECT権限を全てのユーザに与えるには、次のように書きます。
GRANT SELECT ON TABLE s.v to PUBLIC
pという手続きの実行権限を、georgeという認証識別子に与えるには、次のように書きます。
GRANT EXECUTE ON PROCEDURE p TO george
INSERT 文
INSERT文により一つ以上の行を作成して、指定した名前の表に格納できます。 INSERT文で指定された値の数は、指定された列あるいは暗示された列の数と同じでなければなりません。
構文
INSERT INTO 表名 [ (単純列名 [ , 単純列名]* ) ] 問合せ
問合せには以下のいずれかをとることができます。
 
 
VALUES一覧
 
複数行VALUES式
単一行あるいは複数行の一覧には、DEFAULTというキーワードを含めることができます。列にDEFAULTを指定すると、その列には既定値が挿入されます。列に既定値を挿入する場合、列の一覧にてその列を省略して、表のほかの列に値を挿入することもできます。詳細についてはVALUES式を参照してください。
 
UNION式
問合せの詳細については、問合せを参照してください。
INSERT INTO COUNTRIES VALUES ('Taiwan', 'TW', 'Asia') -- DEPARTMENTという表に新しい部署を挿入します。 -- ただし、新しい部署に新しい管理者は割り当てません。 INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT) VALUES ('E31', 'ARCHITECTURE', 'E01') -- 2つの新しい部署を一つの文で前と同じようにDEPARTMENTという表に挿入します。 -- ただし、新しい部署に新しい管理者は割り当てません。 INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT) VALUES ('B11', 'PURCHASING', 'B01'), ('E41', 'DATABASE ADMINISTRATION', 'E01') -- EMP_ACTと同じ列を持つ、MA_EMP_ACTという -- 一時表を作ります。 -- MA_EMP_ACTにEMP_ACTという表から、 -- プロジェクト番号(PROJNO)が'MA'という文字で始まる行をロードします。 CREATE TABLE MA_EMP_ACT ( EMPNO CHAR(6) NOT NULL, PROJNO CHAR(6) NOT NULL, ACTNO SMALLINT NOT NULL, EMPTIME DEC(5,2), EMSTDATE DATE, EMENDATE DATE ); INSERT INTO MA_EMP_ACT SELECT * FROM EMP_ACT WHERE SUBSTR(PROJNO, 1, 2) = 'MA'; -- LOCATIONという列にDEFAULTの値を挿入します。 INSERT INTO DEPARTMENT VALUES ('E31', 'ARCHITECTURE', '00390', 'E01', DEFAULT)
文の依存
INSERT 文は挿入先の表や、その表の全てのコングロマリット(ヒープや索引などの記録の単位です。)や、文中のその他の表に依存します。準備されたINSERT文の対象表にて、索引や制約を作成したり破棄したりすると、その準備されたINSERT文は無効となります。
LOCK TABLE 文
LOCK TABLE文により明示的に、表に共有あるいは排他のロックをかけることができます。 表へのロックは現在のトランザクションが終了するまでの間、続きます。
表をロックできるのは、データベースの所有者と表の所有者です。
明示的な表へのロックは次の場合に便利です。
 
表の複数行へのロックによるオーバーヘッドを避ける時。(言い換えればユーザ自ら、ロックエスカレーションを行う時。)
 
デッドロックを避ける時
この文でシステム表にロックをかけることはできません。
構文
LOCK TABLE 表名 IN { SHARE | EXCLUSIVE } MODE
いずれのモードであっても、トランザクションは表をロックした後、それ以上の行ごとのロックを得ることはできません。例えば、情報を読むためにトランザクションがFlightsという表の全体を共有モードでロックした後、ある文にて行を更新するために特定の行への排他ロックを必要としたとします。しかしながら、既にFlights表へのロックがあるため、排他ロックも表毎となる必要があります。
他の接続が表に対して既にロックをかけているため、その表へのロックが取得できない場合、デッドロックのタイムアウト時間が経過した後、文への例外が発生します。(SQLState X0X02)
行毎のロックが多量に発生することを避けるため、共有モードでFlightsという表全体へのロックを行うには以下の文を使います。
LOCK TABLE Flights IN SHARE MODE; SELECT * FROM Flights WHERE orig_airport > 'OOO';
複数のUPDATE文を発行するトランザクションが一つあるとします。 個々の文はわずかな行毎のロックしか必要としないので、トランザクションはロックを表毎に変更しません。しかしUPDATE文の数が多いので、取得と開放が行われるロックの延べ数は多くなり、デッドロックになりかねません。 このようなトランザクションでは、最初に排他モードで表をロックします。 例を以下に示します。
LOCK TABLE FlightAvailability IN EXCLUSIVE MODE; UPDATE FlightAvailability SET economy_seats_taken = (economy_seats_taken + 2) WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-03-31'); UPDATE FlightAvailability SET economy_seats_taken = (economy_seats_taken + 2) WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-04-11'); UPDATE FlightAvailability SET economy_seats_taken = (economy_seats_taken + 2) WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-04-12'); UPDATE FlightAvailability SET economy_seats_taken = (economy_seats_taken + 2) WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-04-15');
トランザクションが表を更新する前に、その表をみる必要がある場合、デッドロックを避けるため、表に排他ロックをかけます。 例:
LOCK TABLE Maps IN EXCLUSIVE MODE; SELECT MAX(map_id) + 1 FROM Maps; -- INSERT INTO Maps . . .
RENAME 文
索引や列、表にRENAME 文を使えます。
RENAME COLUMN 文
RENAME COLUMN 文で表にある列の名前を変更できます。
RENAME COLUMN文により全てのスキーマにある既存表の既存列の名前を変更できます。(SYSのスキーマを除きます。)
列の名前を変えることができるのは、データベースの所有者あるいは表の所有者のみです。
表への他の定義変更は可能です。詳細は、ALTER TABLE 文を参照してください。
構文
employeeという表にあるmanagerという列の名前を supervisorに変更するには次のようにします。
RENAME COLUMN EMPLOYEE.MANAGER TO SUPERVISOR
ALTER TABLEとRENAME COLUMNを使って、列のデータ型を変更できます。 tという表にあるc1という列のデータ型をNEWTYPEに変更するためには、次のようにします。
ALTER TABLE t ADD COLUMN c1_newtype NEWTYPE UPDATE t SET c1_newtype = c1 ALTER TABLE t DROP COLUMN c1 RENAME COLUMN t.c1_newtype TO c1
利用上の留意点
Note: 列を参照するビューやトリガ、チェック制約、外部キー制約がある場合、列名の変更は失敗します。
Note: 名称を変更する列を参照する、開いたカーソルがある場合、RENAME COLUMN文は実行できません。
Note: 列への索引があっても、列の名前は変更できます。索引は更新されて、変更後の列名で参照するようになります。
RENAME INDEX 文
この文で、現在のスキーマにある索引の名前を変更できます。 ユーザはSYSスキーマにある索引の名前を変更できません。
構文
RENAME INDEX 索引名 TO 新索引名
RENAME INDEX DESTINDEX TO ARRIVALINDEX
文の依存
開いたカーソルがある索引には、RENAME INDEX を実行できません。
RENAME TABLE 文
RENAME TABLEによりあらゆるスキーマにある既存の表の名前を変更できます。(ただしSYSのスキーマは除きます。)
表の名前を変更できるのはデータベースの所有者と表の所有者です。
構文
RENAME TABLE 表名 TO 新表名
表を参照するビューや外部キーがあった場合、名前を変えようとするとエラーが発生します。 さらに、表にトリガやチェック制約があった場合も、名前を変えようとするとエラーが発生します。
RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT
詳細については、ALTER TABLE 文も参照してください。
文の依存
表に索引が定義されていても、表の名前は変更可能です。
名前を変更しようとする表に、開いたカーソルがあった場合、RENAME TABLE文は失敗します。
REVOKE 文
REVOKE文を使って、指定したユーザあるいは全ユーザから、データベースの情報に対して操作を行う権限を剥奪することができます。
剥奪できる権限には次の種類があります。
 
表から情報を削除する。
 
表に情報を挿入する。
 
表や表にある列の部分集合に対して、外部キー参照を作成する。
 
表やビュー、表の列の部分集合から、情報を選択する。
 
表にトリガを作成する
 
表や表にある列の部分集合にある情報を更新する。
 
関数や手続きなどのプログラムルーチンを実行する。
REVOKE文を発行する前に、derby.database.sqlAuthorization属性がtrueであることを確認してください。derby.database.sqlAuthorization属性により、SQL認証が有効になります。
情報の所有者かデータベースの所有者であれば、その情報への権限を剥奪する事ができます。
REVOKE文の使い方は、表への権限を剥奪するのか、プログラムルーチンへの権限を剥奪するのかにより異なります。
表の場合の使い方
列の一覧を指定せずに権限を剥奪した場合、表の全ての列への権限が剥奪されます。
プログラムルーチンの場合の使い方
REVOKE EXECUTE ON { FUNCTION | PROCEDURE } プログラムルーチンの指示子 FROM 権限を与えられていた人 RESTRICT
プログラムルーチンにREVOKE文を使う場合、RESTRICT節が必要です。RESTRICT節は、実行権限がビューや表、制約からは剥奪されない一方で、ビューや表、制約の所有者からは剥奪されることを表します。
権限タイプ
ALL PRIVILEGES | 各種権限
各種権限
表権限 {, 表権限 }*
表権限
DELETE | INSERT | REFERENCES [列一覧] | SELECT [列一覧] | TRIGGER | UPDATE [列一覧]
列一覧
( 列識別子 {, 列識別子}* )
権限タイプのALL PRIVILEGESは、表への全ての権限をユーザから剥奪する時に使います。各種権限を指定して、表への一つ以上の権限を剥奪することもできます。
DELETEの権限タイプは、表の行を削除する権限を剥奪するために使います。
INSERTの権限タイプは、表に行を挿入する権限を剥奪するために使います。
REFERENCESの権限タイプは、表への外部キー参照を作成する権限を剥奪するために使います。列一覧が指定された場合、その列群への外部キー参照を作成する権限だけが剥奪されます。
SELECTの権限タイプは、表またはビューの情報を選択する権限を剥奪するときに使います。列一覧が指定された場合、その列群への権限だけが剥奪されます。列一覧が指定されなかった場合、表の全列に対して操作が有効です。
TRIGGERの権限タイプは、表にトリガを作成する権限を剥奪するとめに使います。
UPDATEの権限タイプは、表にUPDATE文を実行する権限を剥奪するために使います。列一覧が指定された場合、その列群への権限だけが剥奪されます。
権限を与えられていた人
{ 認証識別子 | PUBLIC } [,{ authorization ID | PUBLIC } ] *
指定したユーザあるいは全ユーザから、権限の剥奪を行うことができます。全ユーザを指定するときは、PUBLICというキーワードを使います。PUBLICで剥奪される権限と、ユーザを指定して剥奪される権限は独立した物です。例を挙げましょう。表tへのSELECT権限が、PUBLICとharryという認証識別子の両方に与えられているとします。 ここで、harryという認証識別子からSELECT権限が剥奪されたとしても、harryという認証識別子はPUBLIC権限を通して、表tを操作可能です。
制約事項: 情報の所有者の権限を剥奪することはできません。
プログラムルーチンの指示子
{ qualified-name [ signature ] }
剥奪された権限に連なる依存関係
剥奪された権限に依存しているビューやトリガ、制約等は自動的に削除されます。このときDerby は、剥奪された権限を他の権限で代替しようとしません。詳しくは、Derby ディベロッパーズ ガイドの"SQL standard authorization"を参照してください。
制限事項
REVOKE文には次の制限事項があります。
表毎の権限に関連した権限
表毎の権限に対応して、SYSTABLEPERMSシステム表に表IDと権限の付与先が記録されます。たとえば、user2に、表user1.t1のSELECTとDELETEの権限が付与された場合、SYSTABLEPERMS表には対応した行がひとつ追加されます。この行にのGRANTEE欄はuser2という値をとって、TABLEID欄はuser1.t1という値をとります。さらにSELECTPRIVとDELETEPRIVのそれぞれの欄の値はYをとります。それ以外の権限に対応した欄の値はNです。
権限を付与されたユーザが表へのいずれかの権限を必要とする情報をデータベースに作成すると、Derby のエンジンは、その情報がSYSTABLEPERMSにある特定の行へ依存していることを理解します。 例えば、user2SELECT * FROM user1.t1という文でv1というビューを作成すると、ビューのv1と、GRANTEE欄がuser2でTABLEID欄がuser1.t1であるSYSTABLEPERMSの行との間に、管理対象となる依存関係があるとプログラムは理解します。ここで、プログラムはビューが特定の行に依存していることを理解しますが、その行にある権限に対応した欄のうち、どの欄に依存しているのかは理解していません。
そのせいで、表毎の権限を剥奪するREVOKE文が発行されると、その権限と同じ表IDとユーザの組み合わせを持つ権限に依存したデータベース上の情報は全て削除されてしまいます。例で説明すると、user1user2から表t1のDELETE権限を剥奪すると、SYSTABLEPERMS表のGRANTEE欄にuser2をとりTABLEID欄にuser1.t1をとる行がREVOKE文により更新されます。このとき依存関係の管理機能により、その行に記録されたDELETE権限には依存していないにもかかわらず、権限の剥奪による無効化のメッセージがuser2.v1にも送信されるので、このビューは削除されてしまいます。
列毎の権限に関連した制限
SYSCOLPERMSシステム表の行毎に、権限の付与先と表IDの組み合わせに許可された権限をひとつだけ記録することができます。たとえば、user2に表user1.t1にあるc12とc13という列のSELECT権限が与えられた場合、SYSCOLPERMSには行がひとつ追加されます。この行はGRANTEE欄の値にuser2をとり、TABLEID欄の値にuser1.t1をとり、TYPE欄の値にSをとり、COLUMNS欄の値にはc12, c13をとります。
表の列の集合に権限を付与されたユーザが、その権限に依存した情報をデータベースに作成した場合、Derbyは、その情報とSYSCOLPERMS表の対応した行の間の依存関係を理解して管理下に起きます。例えばuser2SELECT c11 FROM user1.t1という文により、v1という行を作成すると、プログラムはGRANTEE欄がuser2でTABLEID欄がuser1.t1、TYPE欄がSであるSYSCOLPERMS表の行に、v1が依存することを理解して、その依存関係を管理下に置きます。このとき、プログラムはビューがSELECT権限に依存することは理解しますが、ビューがどのカラムに依存しているかは追跡しません。
REVOKE文がカラムごとの権限に対して発行されると、その権限の権限付与先、テーブルID、権限の種類に依存したデータベース上の情報が削除されます。例で説明すると、user1user2から、表user1.t1の列c12へのSELECT権限を剥奪すると、GRANTEE欄がuser2でTABLEIDがuser1.t1、TYPE欄がSのSYSCOLPERMSにある行が、REVOKE文により更新されます。このとき依存関係の管理機能により、c12 という列には依存していないにもかかわらず、権限の剥奪による無効化のメッセージがuser2.v1というビューにも送信されるので、このビューは削除されてしまいます。
権限剥奪の例
tへのSELECT権限を、mariaharryという認証識別子から剥奪する場合、次のように文を書きます。
REVOKE SELECT ON TABLE t FROM maria,harry
tへのUPDATE、TRIGGER権限をanitazhiという認証識別子から剥奪する場合、次のように文を書きます。
REVOKE UPDATE, TRIGGER ON TABLE t FROM anita,zhi
s.vへのSELECT権限を全ユーザから剥奪する場合、次のように文を書きます。
REVOKE SELECT ON TABLE s.v FROM PUBLIC
s.vc1c2という列へのUPDATE権限を全てのユーザから剥奪する場合、次のように文を書きます。
REVOKE UPDATE (c1,c2) ON TABLE s.v FROM PUBLIC
pという手続きへのEXECUTE権限を、georgeという認証識別子から剥奪する場合、次のように文を書きます。
REVOKE EXECUTE ON PROCEDURE p FROM george RESTRICT
SET 文
Set文で、スキーマと分離レベルを設定できます。
SET ISOLATION 文
SET ISOLATION文により接続の分離レベルを変更することができます。とることのできる分離レベルはSERIALIZABLE、REPEATABLE READ、READ COMMITTED、READ UNCOMMITTEDです。
この文を発行すると現在のトランザクションは常にコミットされます。JDBCのjava.sql.Connection.setTransactionIsolationメソッドは、唯一つの例外を除き、このコマンドとほぼ同じものです。組込みのドライバを使ってjava.sql.Connection.setTransactionIsolationを呼んだ場合、分離レベルを変更しなければ(つまり現在の値を分離レベルとして設定した場合)、現在のトランザクションはコミットされません。
分離レベルについての情報は、Derby ディベロッパーズ ガイドにある、"ロック、同時平行度、分離"を参照してください。JDBCのjava.sql.Connection.setTransactionIsolationメソッドについては、java.sql.Connection.setTransactionIsolation メソッドを参照してください。
構文
SET [ CURRENT ] ISOLATION [ = ] { UR | DIRTY READ | READ UNCOMMITTED CS | READ COMMITTED | CURSOR STABILITY RS | RR | REPEATABLE READ | SERIALIZABLE RESET }
set isolation serializable;
SET SCHEMA 文
SET SCHEMA 文により、接続の既定スキーマを指定したスキーマに設定できます。 接続から発行される文にて対象のスキーマ名を明示的に指定しなかった場合、既定スキーマが対象のスキーマとなります。
SET SCHEMA文を成功裏に実行するためには、設定するスキーマが存在していなければなりません。 スキーマが存在していなければ、エラーとなります。CREATE SCHEMA 文を参照してください。
SET SCHEMA 文はトランザクション処理されません。それゆえSET SCHEMA 文が実行されると、トランザクションがロールバックされても、SET SCHEMA 文により変更されたスキーマのままです。
構文
SET [CURRENT] SCHEMA [=] { スキーマ名| USER | ? | '<文字列定数>' } | SET CURRENT SQLID [=] { スキーマ名| USER | ? | '<文字列定数>' }
スキーマ名は最大で128文字からなる識別子です。スキーマ名は二重引用符で囲まれない限り、大文字小文字を区別しません。(例を挙げると、SYSはsYs、SYs、sysのいずれとも等価です。)
USERは現在のユーザです。現在のユーザが定義されていない場合、現在のスキーマは既定でAPPです。(接続にユーザ名が定義されている場合、そのユーザ名に対応したスキーマがあるなら、それが接続の既定のスキーマとなります。
? は準備された文で利用できる動的な引数です。SET SCHEMA文を準備して、異なるスキーマを値にとって実行することができます。このときスキーマの値は文字列定数と扱われ、大文字小文字が区別されます。例えば、APPを指定するには、"app"ではなく"APP"を使います。
-- 以下の例は全て等価で、 -- HOTELというスキーマがあれば動作します。 SET SCHEMA HOTEL SET SCHEMA hotel SET CURRENT SCHEMA hotel SET CURRENT SQLID hotel SET SCHEMA = hotel SET CURRENT SCHEMA = hotel SET CURRENT SQLID = hotel SET SCHEMA "HOTEL" -- クォートされた識別子 SET SCHEMA 'HOTEL' -- クォートされた文字列--小文字のhotelは存在しないので、 --この例はエラーとなります。 SET SCHEMA = 'hotel' --SQLIDはCURRENTとともに使わなければならないので、 --この例は失敗します。 SET SQLID hotel -- これによりスキーマは現在のユーザIDに設定されます。 SET CURRENT SCHEMA USER // Javaのプログラムでset schemaを使う例です。 PreparedStatement ps = conn.PrepareStatement("set schema ?"); ps.setString(1,"HOTEL"); ps.executeUpdate(); ... do some work ps.setString(1,"APP"); ps.executeUpdate(); ps.setString(1,"app"); //error - string is case sensitive // no app will be found ps.setNull(1, Types.VARCHAR); //error - null is not allowed
SELECT 文
構文
問合せ [ORDER BY 節] [FOR UPDATE 節] WITH {RR|RS|CS|UR}
SELECT文は問合せと、省略可能なORDER BY 節FOR UPDATE 節から構成されます。 SELECT文は、問合せの最初の単語が一般的にSELECTなので、この名前が与えられています。(問合せは選択式以外にも、VALUES式、UNION、INTERSECT、EXCEPT式である場合があります。)
ORDER BY 節により、ResultSetの並び順が明示されます。FOR UPDATE 節により、結果のカーソルを更新可能にすることができます。SELECT文にはFOR EACH ONLY 節を置くことができます。FOR EACH ONLY 節とFOR READ ONLY節は同じものです。
SELECT文にてWITH {RR|RS|CS|UR}という書き方で分離レベルを指定することができます。
-- SAL+BONUS+COMMと名前を並べて、TOTAL_PAYという名前をつけ、 -- その名前で並び替える。 SELECT FIRSTNME, SALARY+BONUS+COMM AS TOTAL_PAY FROM EMPLOYEE ORDER BY TOTAL_PAY -- FOR UPDATE節を指定することで、 -- PROJECTという表にある、開始日時(PRSTDATE)、終了日時(PRENDATE)という列を更新する、 -- 更新可能なカーソルを作成する SELECT PROJNO, PRSTDATE, PRENDATE FROM PROJECT FOR UPDATE OF PRSTDATE, PRENDATE -- この文に限り分離レベルをRRにする。 SELECT * FROM Flights WHERE flight_id BETWEEN 'AA1111' AND 'AA1112' WITH RR
SELECT文はResultSetを返します。 カーソルResultSetにある行へのポインタです。Javaのアプリケーションでは、ResultSetsには対応したSQLのカーソルがあります。カーソルは更新可能とすることができます。したがって、問合せが後に述べる更新可能の条件に適合するのであれば、ResultSetを通して行の更新や削除が可能です。FOR UPDATE 節により、SQLのコンパイル時にSELECT文が更新可能なカーソルの要件に適合するかを確かめる事や、あるいは列を更新可能なもののみに限定する事ができます。
Note: ORDER BY節によりSELECTの結果を並び替えることができます。ORDER BY節がない場合、結果は無作為な並び順です。
更新可能なカーソルおよびResultSetの要件
更新可能なカーソルは、単表への単純なSELECT文によるものでなければなりません。 更新可能なResultSetを得るためのSELECT文は、更新可能なカーソルと同じ制限を受けます。更新可能なカーソルとするためには、:
 
SELECT文にはORDER BY節があってはなりません。
 
問合せ選択式でなければなりません。
 
選択式には以下があってはなりません。
 
DISTINCT
 
集約
 
GROUP BY 節
 
HAVING 節
 
ORDER BY 節
 
問合せのFROM節には以下があってはなりません。
 
二つ目以降の表
 
表以外の名前
 
 
副問い合わせ
Note: 既定でカーソルは読み取り専用です。更新可能なカーソルを得るためには、上記の要件を満たすことに加えて、ResultSetの同時並行モードをResultSet.CONCUR_UPDATABLEとするか、SELECT文のFOR節にFOR UPDATEを記述しなくてはなりません。(FOR UPDATE 節を参照してください。)
SQL言語ではカーソルに名前を与える事ができません。そのかわりにJDBC APIによりカーソルに名前を与えたり、システムがカーソルに与えた名前を取得することができます。詳細についてはDerby ディベロッパーズ ガイドカーソルへの命名および名前の利用を参照して下さい。
文の依存
SELECTは、問合せの表やビュー、それらの表へのアクセスパスにて選択されたコングロマリット(ヒープやインデックスなどの記憶の単位です。)に依存します。 CREATE INDEXでは準備されたSELECT文が無効になることはありません。 DROP INDEX文ではもし破棄される索引が文にてアクセスパスなら、準備されたSELECT文は破棄されます。 もしSELECTにビューが含まれていれば、ビューが依存するディクショナリの情報にも依存します。(CREATE VIEW 文を参照してください。)
SELECTのカーソルに対して、準備されたUPDATE WHERE CURRENTあるいはDELETE WHERE CURRENT文はSELECTに依存します。java.sql.Statement.close によりSELECTを取り除くと、UPDATE WHERE CURRENT および DELETE WHERE CURRENTは無効となります。
SELECTは問合せにあるあらゆる別名に依存します。別名を破棄することにより、もし準備されたSELECT文にて別名が使われているなら、その文は無効になります。
UPDATE文
構文
{ UPDATE 表名 SET 列名 = [ , 列名 = } ]* [WHERE節] | UPDATE 表名 SET 列名 = [ , 列名 = ]* WHERE CURRENT OF }
の定義は以下の通りです。
| DEFAULT
一つ目の書き方は検索による更新といい、WHERE節が真に評価される全行の一つ以上の列を更新します。
二つ目の書き方は位置による更新といい、更新可能な開いたカーソルの現在行の一つ以上の列を更新します。カーソルを作成するSELECT文のFOR UPDATE 節にて列が明示された場合、その列だけが更新可能です。もし列が明示されていないかSELECT文にFOR UPDATE節が無かった場合は、全ての列を更新できます。
更新後の値にDEFAULTを指定すると、表にて定義された既定値に列の値が設定されます。
-- 'E21'の部署(WORKDEPT)にて管理者以外が一時的に再配属されている。 -- このことを、EMPLOYEEという表の彼らの仕事(JOB)をNULLに、 -- 彼らへの支払い(SALARY, BONUS, COMM)を0にしてあらわす。 UPDATE EMPLOYEE SET JOB=NULL, SALARY=0, BONUS=0, COMM=0 WHERE WORKDEPT = 'E21' AND JOB <> 'MANAGER' -- 特定の肩書きを持たない社員を管理者に昇格する。 UPDATE EMPLOYEE SET JOB = 'MANAGER' WHERE JOB IS NULL; // 全てのプロジェクトの人員配置(PRSTAFF)を1.5増やす。 stmt.executeUpdate("UPDATE PROJECT SET PRSTAFF = " "PRSTAFF + 1.5" + "WHERE CURRENT OF" + ResultSet.getCursorName()); -- EMPLOYEEという表にて社員番号(EMPNO)が'000290'の社員の仕事(JOB)を、 -- 既定値であるNULLに更新する。 UPDATE EMPLOYEE SET JOB = DEFAULT WHERE EMPNO = '000290'
文の依存
検索による更新の文は、更新しようとしている表や、そのコングロマリット(ヒープや索引などの記録単位)、その制約、WHERE節やSET式に書かれた表に依存します。検索による更新の準備された文の対象表にCREATE INDEXやDROP INDEX文、ALTER TABLE文が実行されると、その文は無効となります。
位置による更新の文はカーソルやカーソルが参照する全ての表に依存します。カーソルがまだ開いていなくとも、位置による更新の文をコンパイルすることができます。しかしながらJDBCのcloseメソッドにより開いたカーソルをなくすと、位置による更新の文は無効となります。
位置による更新の準備された文の対象表に、CREATE INDEXやDROP INDEX文、ALTER TABLE文が実行されると、その文は無効となります。
別名を破棄すると、その別名を使っている更新の準備された文は無効になります。
更新の対象表にてトリガの破棄や作成が行われると、更新の文は無効になります。
SQL 節
CONSTRAINT 節
CONSTRAINT節は、CREATE TABLE 文ALTER TABLE 文に任意に記述できる構造です。制約とはデータが従わなければならない規則です。制約には必要に応じて名前を与えることができます。
制約は以下のいずれかです。
 
列レベルの制約
列レベルの制約は表にある単一の列を参照します。列名を指定するわけではなりません。(ただしチェック制約は除きます。)この制約は対象の列を参照しています。
 
表レベルの制約
表レベルの制約は表にある一つあるいはそれ以上の列を参照します。表レベルの制約は適用する列の名前を参照します。表レベルのチェック制約は0以上の列を参照します。
列制約には以下があります。
 
NOT NULL
この列の値はNULLにできないことを指定します。(この種類の制約には名前を与えることができません。)
 
PRIMARY KEY
列により表中の行が一意に識別されることを指定します。列の値はNOT NULLと定義されなければなりません。
Note: ALTER TABLEにより主キーを追加しようとして、空の値を持つ列をその主キーに含めようとした場合、エラーとなって主キーは追加されません。より詳細な情報は、ALTER TABLE 文を参照してください。
 
UNIQUE
列の値が一意でなければならないと指定します。NULLの値は不可です。
 
FOREIGN KEY
列の値が、参照先の主キー、一意キーあるいはNULLでなければならないことを指定します。
 
CHECK
列の値の規則を指定します。
表制約には以下があります。
 
PRIMARY KEY
一つ以上の列により表の行が一意に識別されることを表します。NULLの値は不可です。
 
UNIQUE
列群の値が一意であると指定します。列はNOT NULLと定義されなければなりません。
 
FOREIGN KEY
列群の値が参照先の主キー、一意列あるいはNULLでなければならないことを指定します。
Note: 外部キーが複数の列から構成されている場合、何れかの列がNULLであるならキーはNULLと見なされます。NULLでない列にどのような値があっても、挿入することができます。
 
CHECK
表の値に適用される様々な規則を指定します。
列制約と表制約は同じ機能を持ちますが、何に対して指定できるかが違います。表制約では一つ以上の列に対して、PRIMARY KEY、UNIQUE、CHECK、FOREIGN KEY制約を定義できます。列レベルの制約では(チェック制約を除いて)、一つの列への参照しか定義できません。
構文
主キーと一意性制約
主キーでは表の行を一意に指定する列の集合が定義されます。
主キー制約を定義しした場合、主キーに含まれる何れの列の値もNULLであってはなりません。つまり何れの列もNULL値をとることができなくなります。
あらかじめNOT NULLと定義されているなら、既存の列をALTER TABLE ADD PRIMARY KEY という文で主キーに加えることができます。NULLの値は不可です。もし列にNULL値があれば、システムは主キー制約の追加を行いません。詳細な情報はALTER TABLE 文を参照してください。
表にはPRIMARY KEY制約を一つまでしか定義できません。しかし複数のUNIQUE制約を定義することはできます。
外部キー制約
外部キー制約により、データベースの参照整合性を強制することができます。外部キーとは他の表のキーを参照する列あるいは列群です。(時によってはあまり多いことではありませんが、同じ表を参照することもあります。)外部キーは参照先の主キー制約・外部キー制約に一致するデータ型を持つ列を持たなければなりません。
表レベルの外部キー制約では、表の列を指定して制約を定義します。このとき同じ列を一回より多く使うことはできません。
参照定義(参照される表の列の一覧です。)に列が定義される場合、それは参照先の表にある一意性制約あるいは主キー制約に対応していなければなりません。 もし表に一意性制約があるなら、参照定義では列の一覧を省くことができます。
もし参照定義にて列の一覧が指定されておらず、参照先の表に主キーも定義されていないならば、例外が挙がります。(この例外は、もし参照先の表に一意性制約しかないならば、その列の一覧を参照定義に含めなければならない、という意味です。)
参照先の一意性制約あるいは主キー制約に一致する値があれば、外部キー制約は守られているものとされます。もし外部キー制約が複数の列で定義されており、いずれかの列がNULLであるなら、外部キーの値はNULLとみなされます。
Note: SQL-92標準にて言及があるように、複数の列で定義された外部キー制約では、制約された列が参照先の列にない値をとることが可能な場合があります。この状況を回避するために外部キーの全列にはNOT NULL制約を定義するべきです。
外部キー制約とDML
有効になっている外部キー制約が定義された表に挿入や更新が行われるとき、Derbyはその行が外部キー制約を破っていないか知るために、参照先の表で対応する参照キーの値を調査します。 もし制約が守られていなければ、Derbyは例外を挙げて、挿入ないし更新を却下します。
参照されたキー(外部キーにより参照される、主キー制約あるいは一意制約)のある表の行を、更新または削除した場合、Derbyはそのキーを参照するすべての外部キー制約を調べて、行の削除や変更が制約違反を引き起こさないか調査します。 もし行への削除や変更が制約違反を引き起こすのであれば、変更や削除は許可されずDerbyは例外を挙げます。
Derbyが制約のチェックを行うのは文が実行される時です。トランザクションがコミットされる時ではありません。
支援する索引
UNIQUE、PRIMARY KEY、FOREIGN KEYの各制約は制約を強制あるいは支援するための索引を生成します。(これは支援索引と呼ばれることがあります。) UNIQUE制約とPRIMARY KEY制約は一意索引を生成します。FOREIGN KEY索引は非一意な索引を作成んします。したがって、列や列の集合にUNIQUE制約やPRIMARY KEY制約、FOREIGN KEY索引が定義されている場合は、パフォーマンス向上のための索引をそれらの列に作成する必要はありません。Derbyが代わりに作成してくれています。索引と制約も参照してください。
問い合わせを最適化される時にオプティマイザはこれらの索引を利用できます。(CREATE INDEX 文を参照してください。)またこれらの索引はシステムが自動的に生成した名前を持ちます。
支援索引はDROP INDEX文では破棄できません。制約を破棄するか、表を破棄する必要があります。
チェック制約
チェック制約は表の内容に関する様々な規則を指定するために利用することができます。チェック制約には(真偽式で記述される)検索条件を指定できます。表中の全行について、この検索条件は満たされていなければなりません。INSERTやUPDATEにより行が変更される時、検索条件は変更される行に対して適用されます。何れかのチェック制約に違反すると、文全体が中断されます。
検索条件の要件
チェック制約が列定義の一部として指定された場合、制約は同じ列のみ参照できます。 表の定義の一部として指定されたチェック制約は、CREATE TABLE文にて先立って定義された列を参照することができます。
検索条件は同じ値に適用された場合、常に同じ値を返す必要があります。したがって、以下のいずれも検索条件には置くことができません。
 
動的なパラメータ (?)
 
日時関数 (CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP)
 
副問い合わせ
 
ユーザー関数 (例えばUSER、SESSION_USER、CURRENT_USER)
参照先に従う動作
外部キーの定義にて、動作(CASCADE、RESTRICT、SET NULLおよびNO ACTION)が適切に書かれたON DELETE節や/とON UPDATE節を記述できます。 これらの節は、表の主キーが更新ないし削除されたときに、外部キーの関係が損なわれないように、対応する外部キーを変更したり、操作を拒絶したりする事を記述します。
参照性の制約の定義を行うとき、併せて更新または削除の規則を定義できます。
更新の規則は、親あるいは依存する表の行が更新されたときに適用されます。指定できるのは、NO ACTIONあるいはRESTRICTです。
親表の主キーの値が更新され、更新の規則がRESTRICTであった場合、Derbyは依存する表の外部キー制約を調べます。もし依存表の何れかの行が外部キー制約違反となるなら、トランザクションは巻き戻されます。
もし更新の規則がNO ACTIONであったなら、Derbyは更新が全て終わったからトリガが実行されるに、依存する表の外部キー制約をチェックします。もし何れかの行が外部キー制約違反であるなら、文の実行は却下されます。
依存する表にある列の値が変更され、その値が外部キーの一部であった場合、更新の規則は暗黙裡にNO ACTIONとなります。NO ACTIONであるということは、外部キーが空ではない値に更新された時、更新後の値は親表の主キーと一致しなければならないことを意味します。もし親表の主キーと一致しないのであれば、文は却下されます。
削除の規則は親表の行が削除され、その行に依存する行が参照性制約の依存表にある場合に適用されます。このとき依存表の行も削除されることがあり、これを親表の削除が依存表に伝播したといいます。もし依存表が親表でもあるならば、今度はそこに定義された動作がその依存表に適用されます。
指定できる値は、NO ACTION、RESTRICT、CASCADE、それとSET NULLです。SET NULLは外部キーの何れかの列がnullの値を持つことができる場合のみ指定できます。
もし削除の規則が、
NO ACTIONならDerbyは依存表の外部キー制約を、削除が全て終わったからトリガが実行されるにチェックします。もし依存表の何れかの行が外部キー制約に違反するなら文は却下されます。
RESTRICTなら、Derbyは依存表の外部制約を調べ、依存表の何れかの行が外部キー制約に違反する場合、トランザクションを巻き戻します。
CASCADEなら、削除が依存表に伝播されます。(適用可能な伝播先の依存表にも伝播します。)
SET NULLなら、依存表の外部キーにて空にできる列の値が空になります。(この場合も、依存表に依存する表にある外部キーの空にできる列の値は空になります。)
表を親とする参照性の制約には、個々の削除の規則があります。そして適用される全ての削除の規則によって、削除処理の結果が決まります。 したがって依存先がRESTRICTやNO ACTIONの参照性制約をもつなら、行は削除できません。 同様に削除が伝播してゆく場合でも、伝播先の依存行の参照性制約にて削除の規則がRESTRICTやNO ACTIONで定義されていれば、行を削除できません。
親の表から行を削除すると、ほかの表への影響があります。親表の削除により影響を受けるすべての表を、親表と削除の関係があるといいます。削除によりこれらの表の行に対して次のような影響が及びます。
 
もし削除の規則がRESTRICTあるいはNO ACTIONであれば、依存表は処理に関連しますが、処理の影響は受けません。(つまりDerbyは表の値を検証しますが、削除はしません。)
 
もし削除の規則がSET NULLであれば、親表の行が削除されたり、削除が伝播された場合、依存表の行の値は更新の対象となります。
 
もし削除の規則がCASCADEであれば、親表にて削除が行われた場合、依存表の行も削除されます。
 
もし依存表が親表でもある場合、ここに書かれた処理が今度はその依存表に行われます。
-- OUT_TRAY_PKという名前の列レベルの主キー制約: CREATE TABLE SAMP.OUT_TRAY ( SENT TIMESTAMP, DESTINATION CHAR(8), SUBJECT CHAR(64) NOT NULL CONSTRAINT OUT_TRAY_PK PRIMARY KEY, NOTE_TEXT VARCHAR(3000) ); -- 表レベルの主キー制約では二つの列を -- キーの定義に記述できます。 CREATE TABLE SAMP.SCHED ( CLASS_CODE CHAR(7) NOT NULL, DAY SMALLINT NOT NULL, STARTING TIME, ENDING TIME, PRIMARY KEY (CLASS_CODE, DAY) ); -- 列レベルの制約を算術チェックのために使います。 -- 表レベルの制約を従業員への税金が賞与を超えないようにするため -- 使います。 CREATE TABLE SAMP.EMP ( EMPNO CHAR(6) NOT NULL CONSTRAINT EMP_PK PRIMARY KEY, FIRSTNME CHAR(12) NOT NULL, MIDINIT vARCHAR(12) NOT NULL, LASTNAME VARCHAR(15) NOT NULL, SALARY DECIMAL(9,2) CONSTRAINT SAL_CK CHECK (SALARY >= 10000), BONUS DECIMAL(9,2), TAX DECIMAL(9,2), CONSTRAINT BONUS_CK CHECK (BONUS > TAX) ); -- MEAL列が適切な略字のみとるよう、チェック制約を使います。 CREATE TABLE FLIGHTS ( FLIGHT_ID CHAR(6) NOT NULL , SEGMENT_NUMBER INTEGER NOT NULL , ORIG_AIRPORT CHAR(3), DEPART_TIME TIME, DEST_AIRPORT CHAR(3), ARRIVE_TIME TIME, MEAL CHAR(1) CONSTRAINT MEAL_CONSTRAINT CHECK (MEAL IN ('B', 'L', 'D', 'S')), PRIMARY KEY (FLIGHT_ID, SEGMENT_NUMBER) ); CREATE TABLE METROPOLITAN ( HOTEL_ID INT NOT NULL CONSTRAINT HOTELS_PK PRIMARY KEY, HOTEL_NAME VARCHAR(40) NOT NULL, CITY_ID INT CONSTRAINT METRO_FK REFERENCES CITIES ); -- 表レベルの主キー制約と表レベルの外部キー制約を指定して、 -- 表を作成します。 CREATE TABLE FLTAVAIL ( FLIGHT_ID CHAR(6) NOT NULL, SEGMENT_NUMBER INT NOT NULL, FLIGHT_DATE DATE NOT NULL, ECONOMY_SEATS_TAKEN INT, BUSINESS_SEATS_TAKEN INT, FIRSTCLASS_SEATS_TAKEN INT, CONSTRAINT FLTAVAIL_PK PRIMARY KEY (FLIGHT_ID, SEGMENT_NUMBER), CONSTRAINT FLTS_FK FOREIGN KEY (FLIGHT_ID, SEGMENT_NUMBER) REFERENCES Flights (FLIGHT_ID, SEGMENT_NUMBER) ); -- 列に一意性制約を加える。 ALTER TABLE SAMP.PROJECT ADD CONSTRAINT P_UC UNIQUE (PROJNAME); -- 列レベルの外部キー制約を利用して、 -- city_id列がCities表の主キーを参照する表を作成する。 CREATE TABLE CONDOS ( CONDO_ID INT NOT NULL CONSTRAINT hotels_PK PRIMARY KEY, CONDO_NAME VARCHAR(40) NOT NULL, CITY_ID INT CONSTRAINT city_foreign_key REFERENCES Cities ON DELETE CASCADE ON UPDATE RESTRICT );
文の依存追跡システム
INSERT文やUPDATE文は対象表にある全制約の影響を受けます。 DELETE文は一意性制約・主キー制約・外部キー制約の影響を受けます。 対象表にこれらの制約が追加されたり削除されたりした場合、これらの文は無効となります。
列毎の制約
{ NOT NULL | [ [CONSTRAINT 制約名] { CHECK (検索条件) | { PRIMARY KEY | UNIQUE | REFERENCES 節 } } }
表ごとの制約
[CONSTRAINT 制約名] { CHECK (検索条件) | { PRIMARY KEY ( 単純列名 [ , 単純列名 ]* ) | UNIQUE ( 単純列名 [ , 単純列名 ]* ) | FOREIGN KEY ( 単純列名 [ , 単純列名 ]* ) REFERENCES 節 } }
参照定義
REFERENCES 表名 [ ( 単純列名 [ , 単純列名 ]* ) ] [ ON DELETE {NO ACTION | RESTRICT | CASCADE | SET NULL}] [ ON UPDATE {NO ACTION | RESTRICT }] | [ ON UPDATE {NO ACTION | RESTRICT }] [ ON DELETE {NO ACTION | RESTRICT | CASCADE | SET NULL}]
検索条件
A 検索条件 とは、検索条件の要件にて記述された要件を満たす、真偽式です。
制約名が明示されなかった場合、Derbyは一意性制約名を(列の制約にも表の制約にも)生成します。
FOR UPDATE 節
SELECT文にはFOR UPDATE節を持たせることができます。 既定でカーソルは読み込みしかできません。FOR UPDATE節により、コンパイル中にSELECT文が更新可能なカーソルの必要条件を満たすかを検証して、カーソルを更新可能とします。 更新可能であることの詳細については、更新可能なカーソルの必要条件を参照してください。
構文
FOR { READ ONLY | FETCH ONLY | UPDATE [ OF 単純列名 [ , 単純列名]* ] }
単純列名 により、問い合わせ文のFROM節にある表にて、可視な名前を参照します。
Note: 更新可能なJDBCのResultSetを得るために、必ずしもFOR UPDATE節を使う必要はありません。 JDBCのResultSetの元となる文が、更新可能なカーソルの必要条件を満たしてさえいれば、JDBC Statementから、並行処理モードがResultSet.CONCUR_UPDATABLEのJDBC ResultSetを生成することができます。
索引の列が更新されていても、索引を使った最適化が可能です。索引がどのようにカーソルに影響するかについては、Derbyのチューニングを参照してください。
SELECT RECEIVED, SOURCE, SUBJECT, NOTE_TEXT FROM SAMP.IN_TRAY FOR UPDATE
FROM 節
FROM節は選択式に必要です。この節により、問い合わせ文にある他節の式にて、利用可能な列のある表を参照します。
構文
FROM 表式 [ , 表式 ] *
SELECT Cities.city_id FROM Cities WHERE city_id < 5 -- 他種の表式 SELECT TABLENAME, ISINDEX FROM SYS.SYSTABLES T, SYS.SYSCONGLOMERATES C WHERE T.TABLEID = C.TABLEID ORDER BY TABLENAME, ISINDEX -- 結合順を指定する SELECT * FROM Flights, FlightAvailability WHERE FlightAvailability.flight_id = Flights.flight_id AND FlightAvailability.segment_number = Flights.segment_number AND Flights.flight_id < 'AA1115' -- 表式は結合式とすることができます。 --したがって、FROM句には複数の結合式を置く事ができます。 SELECT COUNTRIES.COUNTRY, CITIES.CITY_NAME, FLIGHTS.DEST_AIRPORT FROM COUNTRIES LEFT OUTER JOIN CITIES ON COUNTRIES.COUNTRY_ISO_CODE = CITIES.COUNTRY_ISO_CODE LEFT OUTER JOIN FLIGHTS ON Cities.AIRPORT = FLIGHTS.DEST_AIRPORT
GROUP BY 節
GROUP BY 節は選択式の一部とすることができます。この節により結果を一列以上の列の間で同じ値を持つ、結果の部分集合にまとめることができます。 それぞれの部分集合には、分類列が同じ値を持つ行はありません。 NULLは部分集合へのまとめを行う場合、同じ値と見なされます。
典型的にいって、GROUP BY節は集約式と併せて使われます。
構文
GROUP BY 列名 [ , 列名 ] *
列名 は問い合わせにて可視でなければなりません。問い合わせにて不可視な列であってはなりません。 例えば、GROUP BY節が副問い合わせにあった場合、その節は副問い合わせの外にある問い合わせの列を参照してはなりません。
GROUP BY節を持つ選択式にある選択項目は集約か分類列でなければなりません。
-- airportで分類されたflightsの、 -- flying_timesの平均を探す。 SELECT AVG (flying_time), orig_airport FROM Flights GROUP BY orig_airport SELECT MAX(city_name), region FROM Cities, Countries WHERE Cities.country_ISO_code = Countries.country_ISO_code GROUP BY region -- smallintによる分類 SELECT ID, AVG(SALARY) FROM SAMP.STAFF GROUP BY ID -- AVGSALARY、EMPCOUNT列と、DEPTNO列をAS節により取得する。 -- さらにOTHERSという相関名で、WORKDEPT列による分類を行う。 SELECT OTHERS.WORKDEPT AS DEPTNO, AVG(OTHERS.SALARY) AS AVGSALARY, COUNT(*) AS EMPCOUNT FROM SAMP.EMPLOYEE OTHERS GROUP BY OTHERS.WORKDEPT
HAVING 節
HAVING節により選択式のGROUP BYの結果が絞り込まれます。WHERE節が選択列一覧に作用するのとは異なり、HAVING節は表から分類された部分集合に対して作用します。もしGROUP BY節がなければ、HAVING節は結果を単独の分類と見なして作用します。 SELECT節にてGROUP BY句のない列を直接参照することはできません。しかし定数や集約、特殊変数を参照することはできます。
構文
HAVING 検索条件
検索条件は特殊な真偽式で、分類列(GROUP BY 節を参照してください。)か、集約式の一部である列のみ含める事ができます。 例えば以下の例では、SALARYという列は分類の列や集約、副問い合わせにある列ではないので、この文は不正です。
-- SELECT COUNT(*) -- FROM SAMP.STAFF -- GROUP BY ID -- HAVING SALARY > 15000
HAVING節の集約はSELECTの一覧になくてもかまいません。 もしHAVING節が副問い合わせを含むならば、その副問い合わせは分類の列についてのみ、外の問い合わせを参照することができます。
-- 2席以上の航路ごとに、エコノミー席の合計を調べる。 SELECT SUM(ECONOMY_SEATS_TAKEN), AIRLINE_FULL FROM FLIGHTAVAILABILITY, AIRLINES WHERE SUBSTR(FLIGHTAVAILABILITY.FLIGHT_ID, 1, 2) = AIRLINE GROUP BY AIRLINE_FULL HAVING COUNT(*) > 1
ORDER BY 節
ORDER BY節はSELECT文の省略可能な要素です。 ORDER BY節にてResultSetにある行の順番を指定できます。
Syntax
ORDER BY { 列名 | ColumnPosition | Expression } [ ASC | DESC ] [ , 列名 | 列位置 | [ ASC | DESC ] ] *
列名
問い合わせのSELECT 文選択項目にて、可視である名前を参照します。 ORDER BYで指定する列名はSELECTされる項目になくとも構いません。
列位置
SELECT 文選択項目の、列の番号を指定する整数です。 列位置は、0より大きくかつ結果表の列数以下でなければなりません。言い換えれば、列で並び変えるために、その列がSELECTされる項目にある必要があります。
並び変えを行うキーの式で、数値や文字列、日付などの式とすることができます。 はスカラー副問い合わせやCASE式などの、行の値における式とすることができます。
ASC
結果を昇順で返すことを指定します。方向が指定されない場合、ASCが既定です。
DESC
結果を降順で返すことを指定します。
但し書き
 
SELECT DISTINCTが指定されたり、SELECT文にGROUP BY節があった場合、ORDER BYする列はSELECTされる項目になければなりません。
 
ORDER BY節があると、SELECT文を更新可能カーソルとすることができません。より詳細な情報は、更新可能なカーソルおよびResultSetの要件を参照してください。 例えば、もしINTEGERの列に整数があると、ソートのときNULLは1より大きいと見なされます。言い換えれば、NULLの値は、より上の位置にソートされます。
相関名を使う例
相関名が選択項目にて指定されていれば、結果セットを相関名で並び変えできます。 たとえばCITIESデータベースから、COUNTRY列にNATIONという相関名を与えて、CITY_NAME列とCOUNTRY列に格納されているすべての情報を返す場合、次のようなSELECT文を書きます。
SELECT CITY_NAME, COUNTRY AS NATION FROM CITIES ORDER BY NATION
数式を使う例
結果セットを数式で並び変えることができます。例を挙げます。
SELECT name, salary, bonus FROM employee ORDER BY salary+bonus
この例では、salaryとbonus列はDECIMALデータ型です。
関数を使う例
結果セットを関数の呼び出し結果を元に並び変えることができます。例を挙げます。
SELECT i, len FROM measures ORDER BY sin(i)
WHERE 節
WHERE節は必要に応じて、選択式DELETE 文UPDATE 文に置くことができます。 WHERE節の真偽式に基づいて行を選択することができます。 式が真と評価された行だけが、結果にて返されます。 もし、DELETE文であれば削除され、UPDATE文であれば更新されます。
構文
WHERE 真偽式
WHERE節には真偽式を置くことができます。一般的な式の表に一覧された一般式のほとんどは、真偽値になることができます。
さらに、より一般的な真偽式もあります。表10に一覧された真偽演算子は、一つあるいはそれ以上のオペランドをとり、その式は真偽値を返します。
-- ビジネスクラスの席が予約されていない -- 便を見つける。 SELECT * FROM FlightAvailability WHERE business_seats_taken IS NULL OR business_seats_taken = 0 -- EMP_ACTとEMPLOYEEという表を結合して、 -- EMP_ACTの全列に、EMPLOYEEより従業員の苗字(LASTNAME)を加えて -- 結果行として返す。 SELECT SAMP.EMP_ACT.*, LASTNAME FROM SAMP.EMP_ACT, SAMP.EMPLOYEE WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO -- 販売代理人の社員番号と給料を、彼らの部署の平均賃金と員数と共に、 --返す。 -- この問合せでは、まず問合せの一部(DINFO)にて、AS節で新しい列名を与えて、 -- AVGSALARYとEMPCOUNT列およびWHERE節で使われているDEPTNOを -- 取得できるようにする必要がある。 SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY, DINFO.AVGSALARY, DINFO.EMPCOUNT FROM EMPLOYEE THIS_EMP, (SELECT OTHERS.WORKDEPT AS DEPTNO, AVG(OTHERS.SALARY) AS AVGSALARY, COUNT(*) AS EMPCOUNT FROM EMPLOYEE OTHERS GROUP BY OTHERS.WORKDEPT )AS DINFO WHERE THIS_EMP.JOB = 'SALESREP' AND THIS_EMP.WORKDEPT = DINFO.DEPTNO
WHERE CURRENT OF 節
WHERE CURRENT OF節はUPDATEやDELETE文にて使うことができます。 これにより更新可能なカーソルの位置による更新や削除が行えます。 更新可能なカーソルの詳細については、SELECT 文を参照してください。
構文
WHERE CURRENT OF カーソル名
Statement s = conn.createStatement(); s.setCursorName("AirlinesResults"); ResultSet rs = conn.executeQuery( "SELECT Airline, basic_rate " + "FROM Airlines FOR UPDATE OF basic_rate"); Statement s2 = conn.createStatement(); s2.executeUpdate("UPDATE Airlines SET basic_rate = basic_rate " + "+ .25 WHERE CURRENT OF AirlinesResults");
SQL式
多くの文や式の構文の語句に、表副問合せのような式の一種があります。 式は文の定められた場所に置くことができます。
場所によっては決められた種類の式や決められた属性を持つ式のみ置くことができます。
特別な指定がなければ、構文にてと書かれている全ての場所に式を置くことができます。 これには以下が含まれます。
 
 
 
UPDATE文 (SETの部分)
 
 
もちろん他にも、これらの要素を構成の一部とする文はあるので、その一部として式を置くことができます。
以下の表ではSQL式と式を置くことのできる場所を示します。
一般的な式
一般的な式とは何らかの型の値となる式のことです。
表 2. 一般的な式の表
式の種類
説明
列参照式
列への参照がある式では、列名で列の値を参照して、式の中で値を扱うことができます。
列が曖昧な場合は、列名を表名あるいは相関名で限定する必要があります。
FROM 節にて表に相関名が与えられていた場合、列名は相関名で限定される必要があります。別名として相関名が与えられている場合、表名で列を限定することはできません。
これは選択式s、UPDATE文やDML文のWHERE節におくことができます。
定数
多くの組込みのデータ型には関連した定数があります。(これはデータ型に記述されます。)
NULL
NULLは不明な値を表す、型のない定数です。
CAST式やINSERTのVALUES一覧およびUPDATEのSET節におくことができます。CAST式で利用することで、指定したデータ型を与えることができます。
 '
動的パラメータ
動的パラメータは、SQL文が作成された時には未だ決まっていない値へのパラメータです。その値の変わりに疑問符(?)がそれぞれの動的なパラメータのプレースホルダとしておかれます。 動的パラメータを参照してください。
動的パラメータは準備された文においてのみ、使うことができます。準備された文が実行される前に、動的パラメータの値は決められなければなりません。 また決めた値は文脈に沿った型でなければなりません。
データ型を問題なく推定できる場所では、どこでも利用することができます。動的パラメータを参照してください。
CAST 式
NULLや動的パラメータの型を特定したり、値を他の型に変換することができます。 CAST 関数を参照してください。
スカラー副問合せ
一列のみの一行だけを返す副問合せです。 スカラー副問合せを参照してください。
表副問合せ
副問合せからは、一列以上、一行以上を返すことができます。 表副問合せを参照してください。
FROM句やEXISTS、INや定量比較の表式として置くことができます。
Boolean式
ブーリアン式はブーリアン値になる式です。多くの式は、ブーリアン値となれます。 一般的にWHERE句で用いられるブーリアン式は、SQL演算子で処理されるオペランドからなります。SQL のブーリアン演算子を参照してください。
数式
数式は数値になる式です。多くの式は、数値となれます。 数値は以下の型のいずれかです。
 
BIGINT
 
DECIMAL
 
DOUBLE PRECISION
 
INTEGER
 
REAL
 
SMALLINT
表 3. 数式の表
条件式
条件式では、ブーリアン値に基づいて評価する式を選ぶことができます。
式の種類
説明
-、*、/、単一の+と-の式
評価されると、オペランドに対して期待される演算処理が行われます。もし両方のオペランドが同じ型であれば、結果の型が昇格されることはありません。従って整数に除算演算子が適用されると、実際の計算結果に切捨て処理が行われて整数となった値が結果となります。 もし型が混在していた場合は、データ型の記述に従い、型の昇格が行われます。
単一の+で行われる処理はありません。(例えば+4は4と同じです。)単一の-は、-1をかけることと同じで、その結果符号が反転します。
AVG
数値の集合から平均を返します。AVG関数
SUM
数値の集合から合計を返します。SUM関数
LENGTH
文字列やビット列から、文字数を返します。 LENGTH関数を参照してください。
LOWER
LCASEあるいはLOWER関数を参照してください。
COUNT
値集合の個数を返します。COUNT 関数COUNT(*) 関数を参照してください。
文字式
文字式は結果がCHARおよびVARCHARの値となる式です。多くの式の結果がCHARおよびVARCHARの値となります。
表 4. 文字式の表
式の種類
説明
ワイルドカードのあるCHARやVARCHARの値
ワイルドカードの%や_を使って、LIKE演算子が一致する情報を探すパターン文字列を作ります。
連結式
連結式にて、連結演算子の"||"は、右辺のオペランドを左辺のオペランドの末尾に連結します。これは文字列やビット列に対して利用できます。 Concatenationを参照してください。
組込みの文字列関数
組込みの文字列関数は文字列に作用して、文字列を返します。 LTRIM関数LCASEあるいはLOWER関数RTRIM関数TRIM 関数SUBSTR関数それとrrefsqlj29930を参照してください。
USER関数
User関数は現在のユーザに関する情報を文字列で返します。CURRENT_USER関数SESSION_USER関数それと USER関数を参照してください。
日付/時刻式
日付/時刻式は、結果がDATE、TIMEやTIMESTAMPの値となる式です。 多くの式の結果が日付/時刻の値となります。
表 5. 日付/時刻式の表
式の種類
説明
CURRENT_DATE
現在の日付を返します。CURRENT_DATE関数を参照してください。
CURRENT_TIME
現在の時刻を返します。CURRENT_TIME関数を参照してください。
CURRENT_TIMESTAMP
現在のタイムスタンプを返します。CURRENT_TIMESTAMP関数を参照してください。
選択式
選択式のSELECT-FROM-WHEREからなる記述に基づいて、射影と絞込みにより表群から新たに表の値を得ることができます。
構文
SELECT [ DISTINCT | ALL ] 選択項目 [ , 選択項目]* FROM 節 [ WHERE 節] [ GROUP BY 節 ] [ HAVING 節 ]
選択項目:
{ * | { 表名 | 相関名 } .* | [AS 単純列名] }
SELECT節には、式の一覧およびFROM節WHERE節の結果に適用される数量詞があります。 DISTINCTが指定された場合、重複は取り除かれ同じ値を持つ行は一つしかありません。ここでNULL値同士は同じ値と扱われます。もし数量詞がないかALLなら、結果にて行の値が重複しても取り除かれません。(既定はALLなのです。)
選択項目により一つ以上の結果の列が、検索式で得られる結果の表に射影されます。
FROM節の記述により、節に書かれた項目の直積が結果として生成されます。さらにWHERE節により、その結果は限定されます。
WHERE節では真偽式に従い、行が絞り込まれます。式が真と評価された行だけが結果として返されます。
GROUP BY節により、一つあるいはそれ以上の列の間で同じ値を持つ行が分類されまとめられます。GROUP BY節は多くの場合、集約が併せて使われます。
GROUP BY節がある場合、SELECT節には集約か分類列だけ置くことができます。もし分類の列以外の列をSELECT節に起きたい場合、その列を集約式の中においてください。例を挙げます。
-- 員数、部署番号(WORKDEPT)、部の平均賃金(SALARY)、 -- をEMPLOYEEという表にある全ての部署毎に一覧する。 -- 結果は部の平均賃金ごとに昇順で並べられる。 SELECT WORKDEPT, AVG(SALARY) FROM EMPLOYEE GROUP BY WORKDEPT ORDER BY 1
GROUP BY節がないにもかかわらず、選択項目に副問い合わせにはない集約がある場合、問合せは暗黙に分類されます。そのとき表全体が一つに分類されます。
HAVING節に書かれた(WHERE節と同様の)検索条件より、分類された表が絞り込まれます。この検索条件は分類列あるいは可視である集約のみ参照することができます。HAVING節は表から分類された後の情報に適用されます。HAVING節が評価されて真であった場合、その行は残って以降の処理が行われます。一方でHAVING節が評価されて偽あるいはNULLであった場合、その行は破棄されます。もしHAVING節があるにもかかわらず、GROUP BY節がない場合、暗黙に表全体が一つに分類されます。
Derby選択式を次の順番で処理します。
 
FROM 節
 
WHERE 節
 
GROUP BY (または暗黙のGROUP BY)
 
HAVING 節
 
SELECT 節
選択式の結果は常に表です。
問合せにFROM節がない場合(表から情報を取得するのではなく、値を構成する場合)、選択式ではなく、VALUES式を使います。 例:
VALUES CURRENT_TIMESTAMP
VALUES式を参照してください。
ワイルドカードの*
*によりFROM節にある表の全列が展開されます。
表名.*相関名.* により、その表の全列が展開されます。その表はFROM節になければなりません。
列への命名
AS節を使って選択項目の列に名前をつける事ができます。もし選択項目が単なる列参照ではないかあるいは、AS節で名前がつけられていない場合、自動生成された名前が与えられます。
こういった列の名前は、さまざまな場合で便利に使うことができます。
 
JDBCのResultSetMetaDataにて利用可能です。
 
FROM節の副問い合わせにて、その選択式が使われた場合、結果表の列名として使われます。
 
ORDER BY節にて並び替えを行う列の名前として使われます。
-- この例はORDER BY節、表への相関名、 -- SELECT-FROM-WHEREを示します。 SELECT CONSTRAINTNAME, COLUMNNAME FROM SYS.SYSTABLES t, SYS.SYSCOLUMNS col, SYS.SYSCONSTRAINTS cons, SYS.SYSCHECKS checks WHERE t.TABLENAME = 'FLIGHTS' AND t.TABLEID = col. REFERENCEID AND t.TABLEID = cons.TABLEID AND cons.CONSTRAINTID = checks.CONSTRAINTID ORDER BY CONSTRAINTNAME -- この例はDISTINCT節の使い方を示します。 SELECT DISTINCT ACTNO FROM EMP_ACT -- この例は式に名前を与える方法を示します。 -- EMPLOYEEという表から、最も高い給料が他の全部署の給料の平均より安い部署の、 -- 部署番号(WORKDEPT)、BOSSという名前を与えた部署の最も高い給料(SALARY)を -- 一覧します。 SELECT WORKDEPT AS DPT, MAX(SALARY) AS BOSS FROM EMPLOYEE EMP_COR GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE WHERE NOT WORKDEPT = EMP_COR.WORKDEPT) ORDER BY BOSS
TableExpression
表式により表、ビューあるいは関数を、FROM 節にて指定します。これより選択式にて結果が選択されます。
列を限定するために、相関名を表式に適用することができます。 相関名が与えられない場合、表名が列名を限定します。 もし表に相関名が与えられた場合、表名により列を限定することはできず、列名を相関名で限定しなければなりません。
FROM節にある項目は、同じ名前の相関名を持つことができません。また相関名はFROM節にある表の限定されない名前と同じ名前であってはなりません。
さらにAS節を使って表の列に名前を与えることができます。これは以下の状況で便利です。
 
VALUES式表副問合せで使われている場合、VALUES式の列に名前を与える方法は、他には無いです。
 
列名が他の表の列名と同じ場合、別の名前を与えることで限定の必要がなくなります。
Fromの項目にある表副問合せの問合せには、複数列を置くことができ、複数行を返すことができます。表副問合せを参照してください。
ユーザが最適化のため何を指定できるかについては、Derbyのチューニングを参照してください。
構文
{ 表やビューあるいは関数式 | 結合式 }
-- 結合式から選択できます。 SELECT E.EMPNO, E.LASTNAME, M.EMPNO, M.LASTNAME FROM EMPLOYEE E LEFT OUTER JOIN DEPARTMENT INNER JOIN EMPLOYEE M ON MGRNO = M.EMPNO ON E.WORKDEPT = DEPTNO
表またはビューあるいは関数式
表関数の呼び出し:
TABLE 関数名( [ [ 関数の引数 ] [, 関数の引数 ]* ] )
但し書き 表関数を呼び出すときは、相関名を割り当てる必要があります。例を挙げます。
SELECT s.* FROM TABLE( externalEmployees( 42 ) ) s
VALUES式
VALUES式により、値から行や表を構築できます。 VALUES式は問い合わせを置ける場所ならどこにでも置くことができ、したがって以下のいずれとしても利用が可能です。
 
ResultSetを返す文
 
副問い合わせを置ける式や文
 
INSERT文の値(INSERT文では通例的に選択式ではなくVALUES式を用います。)
構文
VALUES ( {, }* ) [ , ( {, }* ) ]* | VALUES [ , ]* }
は以下のように定義されます。
| DEFAULT
最初の書き方では複数列の行が構築され、二つ目の書き方では単列の行が、個々の式を行の列値として、構築されます。
VALUES式がINSERT文にある場合のみ、DEFAULTというキーワードを使うことができます。 列にDEFAULTを指定すると、その列には列の既定値が挿入されます。 もう一つ列に既定値を挿入する方法があり、それはINSERT文にて一覧からその列を除いて、表の他の列の値のみ明示的に挿入することです。
-- 1列3行 VALUES (1),(2),(3) -- 1列3行 VALUES 1, 2, 3 -- 3列1行 VALUES (1, 2, 3) -- 2列3行 VALUES (1,21),(2,22),(3,23) -- 表を導出して構築 VALUES ('orange', 'orange'), ('apple', 'red'), ('banana', 'yellow') -- 単文でDEPARTMENTという表に二つの新しい部署を挿入する。 -- ただし新しい部署に管理者は割り当てない。 INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT) VALUES ('B11', 'PURCHASING', 'B01'), ('E41', 'DATABASE ADMINISTRATION', 'E01') -- MAJPROJ列に既定値をあてて、行を挿入する。 INSERT INTO PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP, PRSTDATE, MAJPROJ) VALUES ('PL2101', 'ENSURE COMPAT PLAN', 'B01', '000020', CURRENT_DATE, DEFAULT) -- 組込みの関数を使う VALUES CURRENT_DATE -- 任意の式の値をとる VALUES (3*29, 26.0E0/3) -- 組込みの関数の返す値をとる values char(1)
式に関する優先順位
演算子の優先順位を高いものから低いものに並べて示します。
 
(), ?, 定数 (符号を含む), NULL, 列参照, スカラー副問合せ, CAST
 
LENGTH, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, その他の組込み関数
 
単一のオペランドをとる+および-
 
*, /, || (連結)
 
二つのオペランドをとる+および-
 
比較、 定量比較、 EXISTS, IN, IS NULL, LIKE, BETWEEN, IS
 
NOT
 
AND
 
OR
演算子を括弧の中に書くことにより、優先順位を明示的に指定することができます。括弧の外にある演算子が括弧の中の式に適用される前に、括弧の中の演算子は評価されます。
(3+4)*9 (age < 16 OR age > 65) AND employed = TRUE
真偽式
真偽式はWHERE節やチェック制約に置くことができます。 チェック制約に置く真偽式には、ここで記述されていない制限があります。 詳細はCONSTRAINT 節を参照してください。 WHERE節に置く真偽式の構文は柔軟なものとなっています。具体的な例は、WHERE節を参照してください。
真偽式にはブーリアン演算子を一つ以上置くことができます。 この演算子はSQL のブーリアン演算子に一覧されています。
表 6. SQL のブーリアン演算子
演算子
説明と例
構文
AND, OR, NOT
オペランドにとる真偽式を評価します。
(orig_airport = 'SFO') OR (dest_airport = 'GRU') -- 真を返す。
{ AND | OR | NOT }
比較演算子
<, =, >, <=, >=, <> は、全ての組み込みの型に適用することができます。
DATE('1998-02-26') < DATE('1998-03-01') -- 真を返す。
{ < | = | > | <= | >= | <> }
IS NULL, IS NOT NULL
式の結果が空かそうでないかを判定します。
WHERE MiddleName IS NULL
IS [ NOT ] NULL
LIKE
文字式が文字パターンと一致するかを判定します。文字パターンには一つ以上のワイルドカードが含まれます。
%は最初の文字式にて、該当する位置の任意の文字数(0文字以上)の文字列に一致します。
_は文字式にて、該当する位置の一文字に一致します。
それ以外の文字は、文字式にて該当する位置の同じ文字に一致します。
city LIKE 'Sant_'
%や_をワイルドカードではない文字とするには、ESCAPE節で指定するエスケープ文字を使って文字をエスケープします。
SELECT a FROM tabA WHERE a LIKE '%=_' ESCAPE '='
Note: LIKEによる比較ではDerbyは、個々の文字を非メタ文字と比較します。これはDerbyが=による比較のとき行う処理とは違います。=による比較では左辺の文字列全体が、=演算子の右辺の文字列全体と比較されます。より詳細な情報については、Derby ディベロッパーズ ガイドDerbyにおける文字の照合を参照してください。
文字式 [ NOT ] LIKE ワイルドカードのある文字式 [ ESCAPE 'エスケープ文字']
BETWEEN
最初のオペランドが二つ目と三つ目のオペランドの間の値であるかを判定します。二つ目のオペランドは三つ目のオペランドより小さな値でなければなりません。 この演算子は<=と>=が適用できる型に対してのみ適用できます。
WHERE booking_date BETWEEN DATE('1998-02-26') AND DATE('1998-03-01')
[ NOT ] BETWEEN AND
IN
表副問合せや値の並びに作用します。左辺の式の値が表副問合せや値の並びに含まれるならば、真を返します。なお、表副問合せは複数行を返してかまいませんが、列は一つでなければなりません。
WHERE booking_date NOT IN (SELECT booking_date FROM HotelBookings WHERE rooms_available = 0)
{ [ NOT ] IN 表副問合せ | [ NOT ] IN ( [, ]* ) }
EXISTS
表副問合せに作用して、その表副問合せが行を返すならば真を返し、行が返らないならば偽を返します。表副問合せは複数の列(*を使った場合に限ります。)や行を返すことができます。
WHERE EXISTS (SELECT * FROM Flights WHERE dest_airport = 'SFO' AND orig_airport = 'GRU')
[NOT] EXISTS 表副問合せ
定量比較
定量比較はALL、ANY、SOMEの何れかが適用された比較演算子 (<,=, >, <=, >=, <>)となります。
これは表副問合せに作用します。表副問合せは複数の行を返すことができますが、単一の列しか返せません。
ALLが指定された場合、表副問合せが返す全ての値に対して、比較の結果が真でなければなりません。ANYないしSOMEが指定された場合、表副問合せが返す何れかの値に対して、比較の結果が真である必要があります。ANYとSOMEは同じ意味です。
WHERE normal_rate < ALL (SELECT budget/550 FROM Groups)
比較演算子 { ALL | ANY | SOME } 表副問合せ
動的パラメータ
JDBC APIのPreparedStatementを使うことで、値が決まっていないパラメータを持つ文を準備することができます。これらのパラメータは動的パラメータと呼ばれ、?で表されます。
JDBC APIの文書では動的パラメータはIN、INOUT、OUTの何れかとされており、SQLではINとされています。
New: Derby は、JDBC 3.0で導入されたParameterMetaDataのインターフェイスをサポートします。このインターフェイスにより準備された文にあるパラメータの数・型・属性が記述されます。 より詳細な情報については、Derby ディベロッパーズ ガイドを参照してください。
これらの値は、文が実行される前に指定されなければなりません。また値は文脈に沿った型を持たなければなりません。
動的パラメータの例
PreparedStatement ps2 = conn.prepareStatement( "UPDATE HotelAvailability SET rooms_available = " + "(rooms_available - ?) WHERE hotel_id = ? " + "AND booking_date BETWEEN ? AND ?"); -- このコード例では動的パラメータに -- プログラム変数の値を代入します。 ps2.setInt(1, numberRooms); ps2.setInt(2, theHotel.hotelId); ps2.setDate(3, arrival); ps2.setDate(4, departure); updateCount = ps2.executeUpdate();
動的パラメータを置ける場所
データ型が簡単に決定される場所であれば、式の何処にでも動的パラメータを置くことができます。
1.
 
BETWEENでは、二つ目と三つ目のオペランドのどちらかが動的パラメータでなければ、最初のオペランドを動的パラメータとすることができます。 一つ目のオペランドの型は、残りの二つが動的パラメータでなければ、それら動的ではないパラメータの型もしくはそれらを統合した型とみなされます。
WHERE ? BETWEEN DATE('1996-01-01') AND ? -- 型はDATEとみなされます。
2.
 
BETWEENの二つ目、三つ目のオペランドを動的パラメータとすることができます。 これらの型は左辺のオペランドと同じ型とみなされます。
WHERE DATE('1996-01-01') BETWEEN ? AND ? -- 型はDATEとみなされます。
3.
 
INでは一覧のうち一つでも動的パラメータではない項目があれば、左辺のオペランドを動的パラメータとすることができます。 左辺のオペランドの型は一覧にある動的でないパラメータの項目の型を統合した型とみなされます。
WHERE ? NOT IN (?, ?, 'Santiago') -- 型はCHARとみなされます。
4.
 
INでは、最初のオペランドが動的パラメータではないか前掲のルールによりその型が決まる場合、INの述部の一覧に動的パラメータを置くことができます。 値の一覧に置かれた動的パラメータの型は、左辺のオペランドの型と同じものとみなされます。
WHERE FloatColumn IN (?, ?, ?) -- 型はFLOATとみなされます。
5.
 
オペランドを2つ持つ演算子の、+・-・*・/・AND・OR・<・>・ =・<・>・<=と>=では、片方のオペランドを動的パラメータとすることができますが、両方を動的パラメータとすることはできません。 動的パラメータの型はもう片方のオペランドの型となります。
WHERE ? < CURRENT_TIMESTAMP -- 型はTIMESTAMPとみなされます。
6.
 
CASTでは常に動的パラメータを利用できます。これにより動的パラメータに型を与えることができます。
CALL valueOf(CAST (? AS VARCHAR(10)))
7.
 
LIKE演算子の片方あるいは両方のオペランドを動的パラメータとすることが可能です。 左辺を動的パラメータとした場合、その型は右辺のオペランドと同じものとみなされます。なお最大長は型の最大長となります。右辺を動的パラメータとした場合、左辺のオペランドの長さと型が適用されます。 (LIKEではCHARとVARCHARの型を利用する事が可能です。詳細はConcatenationを参照してください。)
WHERE ? LIKE 'Santi%' --型は最大長がjava.lang.Integer.MAX_VALUEの --CHARとみなされます。
8.
 
動的パラメータの?は、||演算子の片方の側にのみ置くことができます。 すなわち"? || ?"は不可能です。||演算子の片側にある?パラメータの型は、その反対側にある||演算子のオペランドの式の型によって決まります。もし反対側の式の型がCHARあるいはVARCHARであれば、動的パラメータの型はその型の最大長のVARCHARです。 もし反対側の式の型がCHAR FOR BIT DATAあるいはVARCHAR FOR BIT DATAであれば、動的パラメータの型はその方の最大長のVARCHAR FOR BIT DATAです。
SELECT BITcolumn || ? FROM UserTable -- 型はBITcolumnと同じ最大長のCHAR FOR BIT DATAとなります。
9.
 
条件式では?で表される動的パラメータの利用が可能です。式の最初のオペランドに置かれた動的パラメータの型は真偽型とみなされます。 式の二つ目あるいは三つ目のうち、片方だけを動的パラメータとすることができます。動的パラメータの型は、もう片方の型と同じものとみなされます。(つまり対応するのは三つ目と二つ目のオペランドとなります。)
SELECT c1 IS NULL ? ? : c1 -- この例では実行時に既定値を与えることができます。 -- その動的パラメータの型はc1と同じ型とみなされます。 -- :の両側に動的パラメータを置くことはできません。
10.
 
INSERT文のvaluesの一覧やselectの一覧に、動的パラメータを置くことができます。 動的パラメータの型は対象列の型と同じ型とみなされます。
INSERT INTO t VALUES (?) -- 動的パラメータの型は、 -- t表の唯一つの列と同じ型となります。 INSERT INTO t SELECT ? FROM t2 -- これは不可です。
11.
 
副問合せと比較される?パラメータは、副問合せで選択された式の型をとります。 例を挙げます。
SELECT * FROM tab1 WHERE ? = (SELECT x FROM tab2) SELECT * FROM tab1 WHERE ? = ANY (SELECT x FROM tab2) -- 両方の場合において、動的パラメータの型は、 -- tab2.xと同じ型とみなされます。
12.
 
UPDATE文の値に対して動的パラメータを置くことができます。動的パラメータの型は、対照表の列の型と同じものとみなされます。
UPDATE t2 SET c2 =? -- c2と同じ型とみなされます。
13.
 
単一オペランドをとる-や+の演算子にて、動的パラメータを利用可能です。 例を挙げます。
CREATE TABLE t1 (c11 INT, c12 SMALLINT, c13 DOUBLE, c14 CHAR(3)) SELECT * FROM t1 WHERE c11 BETWEEN -? AND +? -– 両方の単一オペランドをとる演算子の型は、文脈に沿ってINTとなります。 -- (すなわち、c11がINTなので、単一オペランドをとる演算子もINTの型をとります。)
14.
 
LENGTHにて、動的パラメータを利用可能です。その型は最大長のVARCHARとみなされます。
SELECT LENGTH(?)
15.
 
定量比較
? = SOME (SELECT 1 FROM t) -- これは有効です。動的なパラメータの型はINTEGERとみなされます。 1 = SOME (SELECT ? FROM t) -- これは有効です。動的なパラメータの型はINTEGERとみなされます。
16.
 
IS式の左辺に動的パラメータを置くことができ、その型は真偽型とみなされます。
動的なパラメータの型が決まる式は一般的に、その動的パラメータを定数に置き換えて、どのような場所にも置くことができます。
JOIN 演算
JOIN演算はFROM 節TableExpressionに置くことができ、2表の間の結合を記述します。(WHERE節にて"WHERE t1.col1 = t2.col2"等と書いて、明示的に等価性の判定式を記述することでも、結合を実現することもできます。)
構文
JOIN式
JOIN演算は、以下のいずれかです。
 
INNER JOIN 演算
join節により2表の間の結合を明示的に指定します。INNER JOIN 演算を参照してください。
 
LEFT OUTER JOIN演算
join節により2表の間の結合を明示的に指定します。また最初の表にて一致行が二つ目の表にない行も残ります。LEFT OUTER JOIN演算を参照してください。
 
RIGHT OUTER JOIN 演算
join節により2表の間の結合を明示的に指定します。また二つ目の表にて一致行が最初の表にない行も残ります。RIGHT OUTER JOIN 演算を参照してください。
どの場合でも、結合された表の片方もしくは両方に、outer join節あるいはWHERE 節で、追加の絞込条件を置くことができます。
JOIN演算と、問い合わせの最適化
結合にどのような最適化が行われるかについては、Derbyのチューニングを参照してください。
INNER JOIN 演算
INNER JOINとは、明示的な結合句を記述することができる、JOIN 演算です。
構文
表式 [ INNER ] JOIN 表式 { ON 真偽式 }
ONに真偽式を記述することで、結合句が記述できます。
ON節にある式では、直接の表および、外部の問い合わせ文から、直接のSELECT文までの間にある表が可視です。 以下の例ではON節は直接の表を参照しています。
SELECT * FROM SAMP.EMPLOYEE INNER JOIN SAMP.STAFF ON EMPLOYEE.SALARY < STAFF.SALARY
ON節では結合されていない表を参照することができます。また結合している表を参照しなくてもかまいません。(一般的には参照します。)
-- EMP_ACTとEMPLOYEEという表を結合します。 -- EMP_ACTという表より全列を選択して、 -- EMPLOYEEという表より従業員の苗字(LASTNAME)をそれぞれの行に -- 加えます。 SELECT SAMP.EMP_ACT.*, LASTNAME FROM SAMP.EMP_ACT JOIN SAMP.EMPLOYEE ON EMP_ACT.EMPNO = EMPLOYEE.EMPNO -- EMPLOYEEとDEPARTMENTという表を結合して、 -- 1930年より前に生まれた(BIRTDATE)全ての従業員の、 -- 従業員番号(EMPNO)、従業員の苗字(LASTNAME)、 -- 部署番号(EMPLOYEEという表のWORKDEPTと、DEPARTMENTという表のDEPTNO)、 -- 部署名(DEPTNAME)を選択する。 SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME FROM SAMP.EMPLOYEE JOIN SAMP.DEPARTMENT ON WORKDEPT = DEPTNO AND YEAR(BIRTHDATE) < 1930 -- VALUES節から選択する問い合わせ(select文の一例)により値を"生成"する別の例 -- この問い合わせにより、一行の情報を持つ"R1"と"R2"という2列の"x"という表を -- どのように導出するのか示す。 SELECT * FROM (VALUES (3, 4), (1, 5), (2, 6)) AS VALUESTABLE1(C1, C2) JOIN (VALUES (3, 2), (1, 2), (0, 3)) AS VALUESTABLE2(c1, c2) ON VALUESTABLE1.c1 = VALUESTABLE2.c1 -- This results in: -- C1 |C2 |C1 |2 -- ----------------------------------------------- -- 3 |4 |3 |2 -- 1 |5 |1 |2 -- 全ての部署を、管理者の苗字と従業員番号と共に一覧する。 SELECT DEPTNO, DEPTNAME, EMPNO, LASTNAME FROM DEPARTMENT INNER JOIN EMPLOYEE ON MGRNO = EMPNO -- 全ての従業員の従業員番号と苗字を、 -- その管理者の従業員番号と苗字と共に一覧する。 SELECT E.EMPNO, E.LASTNAME, M.EMPNO, M.LASTNAME FROM EMPLOYEE E INNER JOIN DEPARTMENT INNER JOIN EMPLOYEE M ON MGRNO = M.EMPNO ON E.WORKDEPT = DEPTNO
LEFT OUTER JOIN演算
LEFT OUTER JOIN演算は、join節を記述できるJOIN演算の一つです。 この演算では最初の(左の)表にて、一致する行が二つ目の(右の)表にない行は、二つ目の表のNULLの行に結合されたものとして、結果に残ります。
構文
表式 LEFT [ OUTER ] JOIN 表式 { ON 真偽式 }
ON節にあるいずれの真偽式も、直接の表と直接の問い合わせ文にあるいかなる表を参照することができます。 ON節は結合されていない表を参照することもできますし、結合されている表を参照しなくともかまいません。(ただし一般的には参照します。)
例 1
--都市に対応するアジアの国 SELECT CITIES.COUNTRY, CITIES.CITY_NAME, REGION FROM Countries LEFT OUTER JOIN Cities ON CITIES.COUNTRY_ISO_CODE = COUNTRIES.COUNTRY_ISO_CODE WHERE REGION = 'Asia' -- LEFT JOINという別の書き方により、前例と同じ結果を -- 実現する。 SELECT COUNTRIES.COUNTRY, CITIES.CITY_NAME,REGION FROM COUNTRIES LEFT JOIN CITIES ON CITIES.COUNTRY_ISO_CODE = COUNTRIES.COUNTRY_ISO_CODE WHERE REGION = 'Asia'
例 2
-- EMPLOYEEとDEPAETMENTという表を結合して、 -- 1930より前に生まれた(BIRTHDATE)全ての社員の、 -- 社員番号(EMPNO)と、 -- 社員の苗字(LASTNAME)と、 -- 部署番号(EMPLOYEEという表のWORKDEPTと、DEPARTMENTという表のDEPTNO)と、 -- 部署名(DEPTNAME)を選択する。 SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME FROM SAMP.EMPLOYEE LEFT OUTER JOIN SAMP.DEPARTMENT ON WORKDEPT = DEPTNO AND YEAR(BIRTHDATE) < 1930 -- 管理者のいない部署を含め全ての部署を、 -- 部署の管理者の社員番号と苗字と共に一覧する。 SELECT DEPTNO, DEPTNAME, EMPNO, LASTNAME FROM DEPARTMENT LEFT OUTER JOIN EMPLOYEE ON MGRNO = EMPNO
RIGHT OUTER JOIN 演算
RIGHT OUTER JOIN演算は、JOIN節に置くことのできるJOIN演算の一種です。 この式では、一つ目(左)の表に合う行がない二つ目(右)の表にある行も結果に残ります。そのとき一つ目の表からの情報はNULLと扱われます。A LEFT OUTER JOIN B は B RIGHT OUTER JOIN Aと、列の順が違う事を除けば同じです。
構文
表式 RIGHT [ OUTER ] JOIN 表式 { ON 真偽式 }
ON節にて可視なのは、直接の表と直接のSELECTによる問合せにある表です。 ON節では結合されていない表を参照することもできますし、結合している表を参照しなくともかまいません。(ただし一般的には参照します。)
例1
-- 都市のない国を含めた、 -- 全ての国と都市の一覧を得ます。 SELECT COUNTRIES.COUNTRY, CITIES.CITY_NAME FROM CITIES RIGHT OUTER JOIN COUNTRIES ON CITIES.COUNTRY_ISO_CODE = COUNTRIES.COUNTRY_ISO_CODE -- 都市のない国を含めた、 -- アフリカの全ての国と都市の一覧を得ます。 SELECT COUNTRIES.COUNTRY, CITIES.CITY_NAME FROM CITIES RIGHT OUTER JOIN COUNTRIES ON CITIES.COUNTRY_ISO_CODE = COUNTRIES.COUNTRY_ISO_CODE WHERE Countries.region = 'Africa' -- RIGHT JOINという同じ内容の記述により、 -- 前の例と同じ結果を得ます。 SELECT COUNTRIES.COUNTRY, CITIES.CITY_NAME FROM CITIES RIGHT JOIN COUNTRIES ON CITIES.COUNTRY_ISO_CODE = COUNTRIES.COUNTRY_ISO_CODE WHERE Countries.region = 'Africa'
例2
-- 演算は表式の一つです。 -- なのでFRON句には複数の演算を置くことができます。 -- 以下の例では全社員の社員番号と苗字を、 -- その社員の管理者の社員番号と苗字と共に一覧します。 SELECT E.EMPNO, E.LASTNAME, M.EMPNO, M.LASTNAME FROM EMPLOYEE E RIGHT OUTER JOIN DEPARTMENT RIGHT OUTER JOIN EMPLOYEE M ON MGRNO = M.EMPNO ON E.WORKDEPT = DEPTNO
SQL 問い合わせ
問合せ
問合せにより、既存表や表に組込みの定数を基にして、仮想的な表が作られます。
Syntax
{ ( Query ) | Query INTERSECT [ ALL | DISTINCT ] Query | Query EXCEPT [ ALL | DISTINCT ] Query | Query UNION [ ALL | DISTINCT ] Query | 選択式 | VALUES式 }
問合せの前後に任意で括弧を置くことができます。また、INTERSECT、EXCEPT、UNION演算子の評価順を括弧を使って変えることができます。INTERSECTを除きこれらの演算子は、括弧がなければ左から右に評価されます。INTERSECTはUNIONあるいはEXCEPTより前に評価されます。
UNION、INTERSECT、EXCEPT ALLにおける結果の重複
ALLとDISTINCTというキーワードにより処理結果から重複を取り除くか否かが決まります。 DISTINCTというキーワードがあれば、結果に重複行はありません。ALLというキーワードがあれば、入力によって結果に重複行がある場合があります。既定はDISTINCTなので、ALLかDISTINCTか指定しなければ重複は取り除かれます。例えばUNIONの場合は、両方の問合せの全行を元に一時的なResultSetを生成したのち、重複行を取り除いてから結果を返します。これがUNION ALLならば、両方の問合せの全行が返されます。
左表にある重複した行の数をL、右表にある左表と同じ内容で重複した行の数をRとすると、どの操作を行うかにより、結果表にある重複した行の数は次のようにきまります。(ALLが指定されたとします。)
 
UNION: ( L + R )。
 
EXCEPT: ( L – R )と0(零)のうち大きいほう
 
INTERSECT: LとRのうち小さいほう
-- 選択式 SELECT * FROM ORG -- 副問合せ SELECT * FROM (SELECT CLASS_CODE FROM CL_SCHED) AS CS -- 副問合せ SELECT * FROM (SELECT CLASS_CODE FROM CL_SCHED) AS CS (CLASS_CODE) -- UNIONにより -- ORGという表にある全行の -- DEPTNUMBとMANAGERという列に加え、 -- (1,2)と(3,4)を返す。 -- なお、DEPTNUMBとMANAGERはsmallint型の列である。 SELECT DEPTNUMB, MANAGER FROM ORG UNION ALL VALUES (1,2), (3,4) -- 値の式 VALUES (1,2,3) -- EMPLOYEEという表にて部署番号(WORKDEPT)が'E'で始まる社員および、 -- EMP_ACTという表にてプロジェクト番号(PROJNO)が -- 'MA2100'、'MA2110'あるいは'MA2112'のプロジェクトにアサインされている社員の -- 社員番号(EMPNO)を一覧する。 SELECT EMPNO FROM EMPLOYEE WHERE WORKDEPT LIKE 'E%' UNION SELECT EMPNO FROM EMP_ACT WHERE PROJNO IN('MA2100', '