
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.
• | 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-92に定義されている特殊識別子をデリミトして、デリミトされた識別子とすることができます。 | |
• | 一重引用符で文字の列を区切ることができます。 | |
• | 文字の列にて一重引用符またはアポストロフィーをあらわすには、一重引用符を2つ並べます。(言い方を変えれば、一重引用符は一重引用符のエスケープ文字です。) 二重引用符にはエスケープ文字が必要ではありません。二重引用符をあらわすには、単に二重引用符を使ってください。ただし、Javaのプログラムでは、二重引用符はバックスラッシュによるエスケープが必要であることを気に留める必要があります。 例:
| |
• | SQLのキーワードは大文字小文字を区別しません。例えば、SELECTというキーワードは、SELECT、Select、select、sELECTのいずれでも書くことができます。 | |
• | SQL-92の書き方による識別子は大文字小文字を区別しません。(SQL92識別子を参照してください。)ただしデリミトされた識別子はそうではありません。 | |
• | Javaの書き方による識別子は常に大文字小文字を区別します。 | |
• | *は、SelectExpression.にてワイルドカード文字です。ワイルドカードの*を参照してください。
この文字は同時に情報演算子でもあります。そのほかの場合この文字は、0回以上の繰り返しを表す、構文のメタ文字です。 | |
• | %と_は、LIKE演算子に続く文字の列にて使われると、ワイルドカード文字となります。(これはエスケープされなかった場合です。)詳細は真偽式を参照してください。 | |
• | SQL-92の仕様に沿って一行あるいは複数行のコメントを書くことができます。一行のコメントは二つのダッシュ(--)で始まり改行文字で終わります。複数行の改行は前後を囲う書き方で、スラッシュ・スター(/*)で始まり、スター・スラッシュ(*/)で終わります。この書き方では入れ子となる場合があることを留意してください。コメントの開始文字と終了文字の間にある、あらゆる文字は無視されます。 |
"A.B"
"A"."B"
• | 表の作成(CREATE TABLE 文) | |
• | カーソルの更新可能な列の特定 | |
• | SELECT式にある列の相関名(選択式を参照) | |
• | TableExpressionにある列の相関名 (TableExpressionを参照) |
という例にて、相関名をc11のcol1に使えません。なぜなら、 c11はFOR UPDATE に存在するからです。一方で相関名をc12に使うことができます。なぜなら、これはFOR UPDATEに存在しないからです。SELECT c11 AS col1, c12 AS col2, c13 FROM t1 FOR UPDATE of c11,c13
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.
• | 表に列を追加する。 | |
• | 表に制約を追加する。 | |
• | 表の列を破棄する。 | |
• | 表にある制約を破棄する。 | |
• | 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 } }
列名 SET DATA TYPE VARCHAR(integer) | column-name SET INCREMENT BY 定整数 | column-name RESTART WITH 定整数 | column-name [ NOT ] NULL | column-name [ WITH ] DEFAULT 既定値
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)
ALTER TABLE tauto ALTER COLUMN i RESTART WITH 6
• | 外部キーやチェック制約が既存の表に追加されるときDerbyは既存の行が制約に違反しないか、表を調べます。もしいずれかの行が制約に違反する場合、Derbyは例外を投げて制約は追加されません。 | |
• | 主キーに含まれるあらゆる列はnullでない値をとらなければならず、また一意でなければなりません。 ALTER TABLE ADD UNIQUEやPRIMARY KEYは、単一の列による主キーを定義する簡単な方法を提供します。もしPRIMARY KEYがCという列の定義に書かれたされた場合、これはPRIMARY KEY(C)という別の節に書いたのと同じです。列はnullの値をとってはならないので、NOT NULL属性も指定されなければなりません。 |
• | VARCHAR列の長さを増やすことができます。VARCHARというキーワードの代わりに、CHARACTER VARYINGやCHAR VARYINGを使うことができます。
これらの列の幅を増やすためには、データ型と新しいサイズを列名の後に書きます。 列の幅を減らしたり、データ型を変更したりする事はできません。主キーの一部や、外部キー制約から参照されている一意キー、外部キー制約の一部である列の幅は変更できません。 | |
• | 識別子列のとる連続した値の間隔を指定することができます。
識別子列のとる連続した値の間隔を設定するためには、定整数を与えます。あらかじめ列には識別子属性が与えられていなければなりません。(SQLSTATE 42837)もし表に既に行がある場合、列のSET INCREMENT defaultが加算された値は変更されません。 | |
• | 列のNullへの制約の変更
列がNullをとる事への制約を変更できます。
NOT NULL制約を既存の列に与えることができます。これを行う場合、既存のNULL値が表のその列に存在してはなりません。 NOT NULL制約を既存の列から取り除くことができます。これを行う場合、その列がPRIMARY KEYやUNIQUEの制約にて使われている列であってはなりません。 | |
• | 列の既定値を変更する |
-- 既存の表に列ごとの制約のある列を追加する。 -- 表に既存行があった場合、既存行の新列は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
{ | LANGUAGE { JAVA } | EXTERNAL NAME 文字列 | PARAMETER STYLE パラメータの種類 | { NO SQL | CONTAINS SQL | READS SQL DATA } | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT } }
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);
{ | [ DYNAMIC ] RESULT SETS INTEGER | LANGUAGE { JAVA } | EXTERNAL NAME string | PARAMETER STYLE JAVA | { NO SQL | MODIFIES SQL DATA | CONTAINS SQL | READS SQL DATA } }
CREATE SCHEMA { [ スキーマ名 AUTHORIZATION ユーザ名 ] | [ スキーマ名 ] | [ AUTHORIZATION ユーザ名 ] }
を指定できます。 derby.database.sqlAuthorization属性についてのより詳細な情報は、Derbyのチューニングを参照してください。AUTHORIZATION user-name
CREATE SCHEMA FLIGHTS AUTHORIZATION anita
CREATE SCHEMA EMP
CREATE SCHEMA AUTHORIZATION takumi
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))
• | INSERT | |
• | SELECT | |
• | REFERENCES | |
• | TRIGGER | |
• | UPDATE |
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));
-- 既存の表の全列とデータ型を使って新しい表を作成する。 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;
既定制約式: 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
• | USER、CURRENT_USERやSESSION_USERを指定した場合、列の長さは少なくとも8である必要があります。 | |
• | CURRENT SCHEMAやCURRENT SQLIDを指定した場合、列の長さは少なくとも128である必要があります。 | |
• | 列が整数型である場合、既定値は整数のリテラルである必要があります。 | |
• | 列が10進の型である場合、既定値の桁数と精度は列のそれぞれの定義の範囲内である必要があります。 |
• | SMALLINT | |
• | INT | |
• | BIGINT |
GENERATED ALWAYSな識別子列に自動的に発番された値は一意です。また識別子列を作成しても、列に索引は作られません。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の列では一意性は保障されません。したがって、上記の例ではhiおよびsalutの行はどちらも同じ"1"という識別値を取ります。なぜなら、生成された列の値は"1"から始まり、ユーザが指定した値も"1"だったからです。重複を避けるために、情報のロードやインポートを行うときにテーブルを作成して、システムが自動生成するためのSTART WITHの値を与えてください。このような状況をチェックして、起きないようにするために、主キーや一意性制約をGENERATED BY 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');
データ型 | 最大値 | 最小値 |
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) |
CREATE TRIGGER トリガ名 { AFTER | NO CASCADE BEFORE } { INSERT | DELETE | UPDATE [ OF 列名 [, 列名]* ] } ON 表名 [ 参照節 ] [ FOR EACH { ROW | STATEMENT } ] [ MODE DB2SQL ] トリガされるSQL文
• | 前のトリガは文による変更が適用され制約による検証が行われる前に発火します。
前のトリガは、行のトリガあるいは文のトリガのいずれにもなることができます。(詳細は文のトリガと行のトリガを参照してください。) | |
• |
• | INSERT | |
• | UPDATE | |
• | DELETE |
REFERENCING OLD AS DELETEDROW
DELETE FROM HotelAvailability WHERE hotel_id = DELETEDROW.hotel_id
REFERENCING OLD_TABLE AS DeletedHotels
DELETE FROM HotelAvailability WHERE hotel_id IN (SELECT hotel_id FROM DeletedHotels)
• | 文のトリガ 文のトリガはトリガのイベント毎に一回発火します。トリガの発火に挿入・更新・削除にて何行が変更されたかは関係ありません。 | |
• | 行のトリガ 行のトリガはトリガのイベントが影響する行毎に一回発火します。影響が一行にも及ばなかった場合、トリガは発火しません。 |
• | 動的な引数(?)があってはなりません。 | |
• | トリガが定義されている表の作成や、変更、破棄を行ってはなりません。 | |
• | トリガが定義されている表への索引の作成や破棄を行ってはなりません。 | |
• | トリガが定義されている表へのトリガの作成や破棄を行ってはなりません。 | |
• | トランザクションのコミットやロールバック、分離レベルの変更を行ってはなりません。 | |
• | 前のトリガのアクションにINSERT/UPDATE/DELETE文があってはなりません。 | |
• | 前のトリガのアクションで更新を行う手続きを呼び出してはなりません。 |
• | 最初に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;
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 ] }
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;
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
• | 表の構造がアプリケーションを使う前では分からない場合 | |
• | 他のユーザが同様な構造の表を必要としない場合 | |
• | アプリケーションを使っている場合のみ、一時表の情報が必要な場合 | |
• | システムカタログにロックを持たずに、表の定義と破棄が可能な場合 |
DECLARE GLOBAL TEMPORARY TABLE 表名 { 列定義 [ , 列定義 ] * } [ ON COMMIT {DELETE | PRESERVE} ROWS ] NOT LOGGED [ON ROLLBACK DELETE ROWS]
• | BIGINT | |
• | CHAR | |
• | DATE | |
• | DECIMAL | |
• | DOUBLE | |
• | DOUBLE PRECISION | |
• | FLOAT | |
• | INTEGER | |
• | NUMERIC | |
• | REAL | |
• | SMALLINT | |
• | TIME | |
• | TIMESTAMP | |
• | VARCHAR |
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"は実表を参照します。
• | 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 |
• | 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 FROM SAMP.IN_TRAY stmt.executeUpdate("DELETE FROM SAMP.IN_TRAY WHERE CURRENT OF " + resultSet.getCursorName());
DROP PROCEDURE 手続名
DROP SCHEMA スキーマ名 RESTRICT
• | 表からの情報の削除 | |
• | 表への情報の挿入 | |
• | 表あるいは表にある列の部分集合への外部キー制約の作成 | |
• | 表やビュー、表にある列の部分集合からの情報の選択 | |
• | 表へのトリガーの作成 | |
• | 表あるいは表にある列の部分集合の情報の更新 | |
• | 関数あるいは手続きの実行 |
{ 認証識別子 | PUBLIC } [,{ 認証識別子 | PUBLIC } ] *
GRANT SELECT ON TABLE t TO maria,harry
GRANT UPDATE, TRIGGER ON TABLE t TO anita,zhi
GRANT SELECT ON TABLE s.v to PUBLIC
GRANT EXECUTE ON PROCEDURE p TO george
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)
• | 表の複数行へのロックによるオーバーヘッドを避ける時。(言い換えればユーザ自ら、ロックエスカレーションを行う時。) | |
• | デッドロックを避ける時 |
LOCK TABLE 表名 IN { SHARE | EXCLUSIVE } MODE
LOCK TABLE Flights IN SHARE MODE; SELECT * FROM Flights WHERE orig_airport > 'OOO';
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 COLUMN EMPLOYEE.MANAGER TO SUPERVISOR
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
RENAME TABLE 表名 TO 新表名
• | 表から情報を削除する。 | |
• | 表に情報を挿入する。 | |
• | 表や表にある列の部分集合に対して、外部キー参照を作成する。 | |
• | 表やビュー、表の列の部分集合から、情報を選択する。 | |
• | 表にトリガを作成する | |
• | 表や表にある列の部分集合にある情報を更新する。 | |
• | 関数や手続きなどのプログラムルーチンを実行する。 |
REVOKE 権限タイプ ON [ TABLE ] { 表名 | ビュー名 } FROM 権限を与えられていた人
REVOKE EXECUTE ON { FUNCTION | PROCEDURE } プログラムルーチンの指示子 FROM 権限を与えられていた人 RESTRICT
{ 認証識別子 | PUBLIC } [,{ authorization ID | PUBLIC } ] *
REVOKE SELECT ON TABLE t FROM maria,harry
REVOKE UPDATE, TRIGGER ON TABLE t FROM anita,zhi
REVOKE SELECT ON TABLE s.v FROM PUBLIC
REVOKE UPDATE (c1,c2) ON TABLE s.v FROM PUBLIC
REVOKE EXECUTE ON PROCEDURE p FROM george RESTRICT
-- 以下の例は全て等価で、 -- 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
-- 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
式 | 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'
• | 列レベルの制約 列レベルの制約は表にある単一の列を参照します。列名を指定するわけではなりません。(ただしチェック制約は除きます。)この制約は対象の列を参照しています。 | |
• | 表レベルの制約 表レベルの制約は表にある一つあるいはそれ以上の列を参照します。表レベルの制約は適用する列の名前を参照します。表レベルのチェック制約は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 表の値に適用される様々な規則を指定します。 |
• | 動的なパラメータ (?) | |
• | 日時関数 (CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP) | |
• | 副問い合わせ | |
• | ユーザー関数 (例えばUSER、SESSION_USER、CURRENT_USER) |
• | もし削除の規則が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 );
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
-- 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 検索条件
-- SELECT COUNT(*) -- FROM SAMP.STAFF -- GROUP BY ID -- HAVING SALARY > 15000
• | SELECT DISTINCTが指定されたり、SELECT文にGROUP BY節があった場合、ORDER BYする列はSELECTされる項目になければなりません。 | |
• | ORDER BY節があると、SELECT文を更新可能カーソルとすることができません。より詳細な情報は、更新可能なカーソルおよびResultSetの要件を参照してください。
例えば、もしINTEGERの列に整数があると、ソートのときNULLは1より大きいと見なされます。言い換えれば、NULLの値は、より上の位置にソートされます。 |
SELECT CITY_NAME, COUNTRY AS NATION FROM CITIES ORDER BY NATION
WHERE 真偽式
-- ビジネスクラスの席が予約されていない -- 便を見つける。 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
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");
• | ||
• | ||
• | UPDATE文 (SETの部分) | |
• | ||
• |
式の種類 | 説明 | |
列参照式 | ||
定数 | 多くの組込みのデータ型には関連した定数があります。(これはデータ型に記述されます。) | |
NULL | NULLは不明な値を表す、型のない定数です。 CAST式やINSERTのVALUES一覧およびUPDATEのSET節におくことができます。CAST式で利用することで、指定したデータ型を与えることができます。 | |
' | 動的パラメータ | |
CAST 式 | NULLや動的パラメータの型を特定したり、値を他の型に変換することができます。
CAST 関数を参照してください。 | |
スカラー副問合せ | 一列のみの一行だけを返す副問合せです。
スカラー副問合せを参照してください。 | |
表副問合せ | 副問合せからは、一列以上、一行以上を返すことができます。
表副問合せを参照してください。
FROM句やEXISTS、INや定量比較の表式として置くことができます。 |
• | BIGINT | |
• | DECIMAL | |
• | DOUBLE PRECISION | |
• | INTEGER | |
• | REAL | |
• | SMALLINT |
条件式 | 条件式では、ブーリアン値に基づいて評価する式を選ぶことができます。 |
式の種類 | 説明 |
-、*、/、単一の+と-の式 | 評価されると、オペランドに対して期待される演算処理が行われます。もし両方のオペランドが同じ型であれば、結果の型が昇格されることはありません。従って整数に除算演算子が適用されると、実際の計算結果に切捨て処理が行われて整数となった値が結果となります。
もし型が混在していた場合は、データ型の記述に従い、型の昇格が行われます。 単一の+で行われる処理はありません。(例えば+4は4と同じです。)単一の-は、-1をかけることと同じで、その結果符号が反転します。 |
AVG | 数値の集合から平均を返します。AVG関数 |
SUM | 数値の集合から合計を返します。SUM関数 |
LENGTH | 文字列やビット列から、文字数を返します。
LENGTH関数を参照してください。 |
LOWER | LCASEあるいはLOWER関数を参照してください。 |
COUNT | 値集合の個数を返します。COUNT 関数、COUNT(*) 関数を参照してください。 |
式の種類 | 説明 |
ワイルドカードのあるCHARやVARCHARの値 | ワイルドカードの%や_を使って、LIKE演算子が一致する情報を探すパターン文字列を作ります。 |
連結式 | 連結式にて、連結演算子の"||"は、右辺のオペランドを左辺のオペランドの末尾に連結します。これは文字列やビット列に対して利用できます。
Concatenationを参照してください。
|
組込みの文字列関数 | 組込みの文字列関数は文字列に作用して、文字列を返します。
LTRIM関数、LCASEあるいはLOWER関数、RTRIM関数、TRIM 関数、SUBSTR関数それとrrefsqlj29930を参照してください。 |
USER関数 |
式の種類 | 説明 |
CURRENT_DATE | 現在の日付を返します。CURRENT_DATE関数を参照してください。 |
CURRENT_TIME | 現在の時刻を返します。CURRENT_TIME関数を参照してください。 |
CURRENT_TIMESTAMP | 現在のタイムスタンプを返します。CURRENT_TIMESTAMP関数を参照してください。 |
SELECT [ DISTINCT | ALL ] 選択項目 [ , 選択項目]* FROM 節 [ WHERE 節] [ GROUP BY 節 ] [ HAVING 節 ]
-- 員数、部署番号(WORKDEPT)、部の平均賃金(SALARY)、 -- をEMPLOYEEという表にある全ての部署毎に一覧する。 -- 結果は部の平均賃金ごとに昇順で並べられる。 SELECT WORKDEPT, AVG(SALARY) FROM EMPLOYEE GROUP BY WORKDEPT ORDER BY 1
• | FROM 節 | |
• | WHERE 節 | |
• | GROUP BY (または暗黙のGROUP BY) | |
• | HAVING 節 | |
• | SELECT 節 |
VALUES CURRENT_TIMESTAMP
• | 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
• | ResultSetを返す文 | |
• | 副問い合わせを置ける式や文 | |
• | INSERT文の値(INSERT文では通例的に選択式ではなくVALUES式を用います。) |
VALUES ( 値 {, 値 }* ) [ , ( 値 {, 値 }* ) ]* | VALUES 値 [ , 値 ]* }
式 | DEFAULT
-- 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)
演算子 | 説明と例 | 構文 |
AND, OR, NOT | オペランドにとる真偽式を評価します。
|
|
比較演算子 | <, =, >, <=, >=, <> は、全ての組み込みの型に適用することができます。
|
|
IS NULL, IS NOT NULL | 式の結果が空かそうでないかを判定します。
|
|
LIKE | 文字式が文字パターンと一致するかを判定します。文字パターンには一つ以上のワイルドカードが含まれます。
%は最初の文字式にて、該当する位置の任意の文字数(0文字以上)の文字列に一致します。 _は文字式にて、該当する位置の一文字に一致します。 それ以外の文字は、文字式にて該当する位置の同じ文字に一致します。
%や_をワイルドカードではない文字とするには、ESCAPE節で指定するエスケープ文字を使って文字をエスケープします。
Note:
LIKEによる比較ではDerbyは、個々の文字を非メタ文字と比較します。これはDerbyが=による比較のとき行う処理とは違います。=による比較では左辺の文字列全体が、=演算子の右辺の文字列全体と比較されます。より詳細な情報については、Derby ディベロッパーズ ガイドのDerbyにおける文字の照合を参照してください。 |
|
BETWEEN | 最初のオペランドが二つ目と三つ目のオペランドの間の値であるかを判定します。二つ目のオペランドは三つ目のオペランドより小さな値でなければなりません。
この演算子は<=と>=が適用できる型に対してのみ適用できます。
|
|
IN | 表副問合せや値の並びに作用します。左辺の式の値が表副問合せや値の並びに含まれるならば、真を返します。なお、表副問合せは複数行を返してかまいませんが、列は一つでなければなりません。
|
|
EXISTS | 表副問合せに作用して、その表副問合せが行を返すならば真を返し、行が返らないならば偽を返します。表副問合せは複数の列(*を使った場合に限ります。)や行を返すことができます。
|
|
定量比較 | 定量比較はALL、ANY、SOMEの何れかが適用された比較演算子
(<,=, >, <=, >=, <>)となります。
これは表副問合せに作用します。表副問合せは複数の行を返すことができますが、単一の列しか返せません。 ALLが指定された場合、表副問合せが返す全ての値に対して、比較の結果が真でなければなりません。ANYないしSOMEが指定された場合、表副問合せが返す何れかの値に対して、比較の結果が真である必要があります。ANYとSOMEは同じ意味です。
|
|
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では、二つ目と三つ目のオペランドのどちらかが動的パラメータでなければ、最初のオペランドを動的パラメータとすることができます。
一つ目のオペランドの型は、残りの二つが動的パラメータでなければ、それら動的ではないパラメータの型もしくはそれらを統合した型とみなされます。
| |
2.
| BETWEENの二つ目、三つ目のオペランドを動的パラメータとすることができます。
これらの型は左辺のオペランドと同じ型とみなされます。
| |
3.
| INでは一覧のうち一つでも動的パラメータではない項目があれば、左辺のオペランドを動的パラメータとすることができます。
左辺のオペランドの型は一覧にある動的でないパラメータの項目の型を統合した型とみなされます。
| |
4.
| INでは、最初のオペランドが動的パラメータではないか前掲のルールによりその型が決まる場合、INの述部の一覧に動的パラメータを置くことができます。
値の一覧に置かれた動的パラメータの型は、左辺のオペランドの型と同じものとみなされます。
| |
5.
| オペランドを2つ持つ演算子の、+・-・*・/・AND・OR・<・>・
=・<・>・<=と>=では、片方のオペランドを動的パラメータとすることができますが、両方を動的パラメータとすることはできません。
動的パラメータの型はもう片方のオペランドの型となります。
| |
6.
| CASTでは常に動的パラメータを利用できます。これにより動的パラメータに型を与えることができます。
| |
7.
| LIKE演算子の片方あるいは両方のオペランドを動的パラメータとすることが可能です。
左辺を動的パラメータとした場合、その型は右辺のオペランドと同じものとみなされます。なお最大長は型の最大長となります。右辺を動的パラメータとした場合、左辺のオペランドの長さと型が適用されます。
(LIKEではCHARとVARCHARの型を利用する事が可能です。詳細はConcatenationを参照してください。)
| |
8.
| 動的パラメータの?は、||演算子の片方の側にのみ置くことができます。
すなわち"? || ?"は不可能です。||演算子の片側にある?パラメータの型は、その反対側にある||演算子のオペランドの式の型によって決まります。もし反対側の式の型がCHARあるいはVARCHARであれば、動的パラメータの型はその型の最大長のVARCHARです。
もし反対側の式の型がCHAR FOR BIT DATAあるいはVARCHAR FOR BIT DATAであれば、動的パラメータの型はその方の最大長のVARCHAR FOR BIT DATAです。
| |
9.
| 条件式では?で表される動的パラメータの利用が可能です。式の最初のオペランドに置かれた動的パラメータの型は真偽型とみなされます。
式の二つ目あるいは三つ目のうち、片方だけを動的パラメータとすることができます。動的パラメータの型は、もう片方の型と同じものとみなされます。(つまり対応するのは三つ目と二つ目のオペランドとなります。)
| |
10.
| INSERT文のvaluesの一覧やselectの一覧に、動的パラメータを置くことができます。
動的パラメータの型は対象列の型と同じ型とみなされます。
| |
11.
| 副問合せと比較される?パラメータは、副問合せで選択された式の型をとります。
例を挙げます。
| |
12.
| UPDATE文の値に対して動的パラメータを置くことができます。動的パラメータの型は、対照表の列の型と同じものとみなされます。
| |
13.
| 単一オペランドをとる-や+の演算子にて、動的パラメータを利用可能です。
例を挙げます。
| |
14.
| LENGTHにて、動的パラメータを利用可能です。その型は最大長のVARCHARとみなされます。
| |
15.
| 定量比較
| |
16.
| IS式の左辺に動的パラメータを置くことができ、その型は真偽型とみなされます。 |
JOIN式
• | INNER JOIN 演算 join節により2表の間の結合を明示的に指定します。INNER JOIN 演算を参照してください。 | |
• | LEFT OUTER JOIN演算 join節により2表の間の結合を明示的に指定します。また最初の表にて一致行が二つ目の表にない行も残ります。LEFT OUTER JOIN演算を参照してください。 | |
• | RIGHT OUTER JOIN 演算 join節により2表の間の結合を明示的に指定します。また二つ目の表にて一致行が最初の表にない行も残ります。RIGHT OUTER JOIN 演算を参照してください。 |
SELECT * FROM SAMP.EMPLOYEE INNER JOIN SAMP.STAFF ON EMPLOYEE.SALARY < STAFF.SALARY
-- 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
--都市に対応するアジアの国 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'
-- 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
-- 都市のない国を含めた、 -- 全ての国と都市の一覧を得ます。 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'
• | 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', '