ユニコードから文字に変換 NCHAR ( れ ) →文字列 NCHR ( れ ) →文字列 戻り値 文字列 「 NCHAR 」、「 NCHR 」関数は、引数 n で与えられたユニコードを「文字」に変 換します。 SQL server では、「 NCHAR 」を、 Oracle では、「 NCHR 」を使います。 65535 」です。この範囲外の値を NCHAR 、 ュニコードの有効な値は「 0 NCHR に与えると NULL が返されます。 列 a のユニコードを文字に変換します。 SELECT a, NCHAR (a) FROM fO 〇 NCHAR(a) 漢 28450 字 23383 97 98 * NCHAR 関数は SQL server Version 7.0 からの機能です。 *Access では、 CHRW でユニコードから文字に変換することができます。 *PostgreSQL では、 CHR でユニコードから文字に変換することができます。 NCHAR / NCHR 関数 第第 SQL 1 2 3 4 5 6 関数 racl SQC SQLServe 「 Oracle ・数値式 4.2 文字列関数 SQLSewer ・・ P334 UN ℃ ODE 関数・ 参照 CHAR/CHR 関数・・ ・・ P297 313 .
1 3 4 5 シーケンス s ゴ oo の p 日 EV\/AL にアクセスします。 6 SELECT PREVVAL FOR s_ f00 FROM DUMMY コ マ ン ド ロ卩 2 D B2 ・ PostgreSQL PostgreSQL では、関数を使って、シーケンスの値を取得、インクリメントし ます。 「 CURRVAL 関数」は、シーケンスの現在の値を返します。引数には、シーケ ンス名を文字列で与えます。 シーケンス s ー foo の CI_J 日日 \/AL にアクセスします。 SELECT CURRVAL い s_foo 勹 「 NEXTVAL 関数」は、シーケンスの現在の値を返しますが、値を返す前にイ ンクリメントされます。 シーケンス s ゴ oo の NEXTVAL にアクセスします。 SELECT NEXTVAL い s_foo つ PostgreSQL データ定義命令 aa—J PostgreSQL co m れ自動インクリメント列 行に対して、自動的にユニークな番号を振るならは、「自動インクリメント列」を使 用することも可能です。もちろん、シーケンスを使っても良いのですが、自動イン クリメント列の方が簡単です。 POStg 「 eSQL では、自動インクリメント列を定義すると、シーケンスも作成されま す。自動インクリメント列の値は、シーケンスから採番されるようになります。 しかしながら、シーケンスは必要ないか、というとそうでもなく、複数のテーブル に使用する ID を生成したり、システム全体でユニークな旧が欲しいときにはシーケ ンスを使います。 参照 DROP SEQUENCE ・・ ・・ P169 ・・ PI 1 0 CREATE TABLE ・・ 1 68 .
REGEXP COUNT 関数 Access 1 2 racl 4 正規表現にマッチする部分文字列数を返す REGEXP COUNT ( s, な [ , os い 0 川Ⅱ ) 5 6 関数 ・ソースとなる文字列 ・正規表現で書かれたバターン ・マッチングを開始する位置 ・マッチングオプション 0 い 戻値 マッチした回数 「 REGEXP_COUNT 」関数は、文字列 s 中からパターン t と一致する文字列を検 索し、一致した回数を返します。 t には、正規表現によるメタ文字を使用するこ 文 とができます。使用できるメタ文字については、 REGEXP 演算子を参照して下さ p 。 s と叩 t は省略することができます。 P 。 s を指定した場合、検索を開始する位 数 置が、 pos からになります。叩 t は、マッチングを行う際のオプションです。使用 できるオプションについては、 REGEXP ー LIKE 演算子を参照して下さい。 文字列中のバターン出現回数を計算します SELECT REGEXP_COUNT い asai atsushi ー REGEXP COUNT 5 4.2 、 [ai] 、 ) FROM DUAL 文字列が何文字あるかを計算します SELECT REGEXP_COUNT ( , 朝井淳 , REGEXP COUNT 4 つ F ROM DUAL REGEXP_COUNT では、グループ化を行う ( ) による括弧は無視されます。 REGEXP 凵 KE 演算子・・・・・・ P270 参照 REGEXP 演算子・・・・・・ P269 319 .
1 2 3 4 5 6 コマンド命令 商品 WHERE 単価 10 0 SELECT * FROM 番号商品名 単価 ガム 100 あめ 1 00 1 2 ・結合 一般的なデータベースシステムは複数のテープルから構成されているのが普通 です。テープル同士は設計者が決めた任意の列によって関係が定義されているは すです。それはプライマリキーや外部キーなどと呼ばれているかもしれません。 SQL では複数のテープルから結果を得るために FROM 句に複数のテープルを記 述することができるようになっています。 FROM 句に記述した、それらのテーブ ルの関係は WHERE 句に条件として記述します。図表 2-3 の例は、テープル f 。 0 と bar からそれぞれの列 a が同じであるという関係 ( 結合条件 ) で、 foo と bar のす タ べての列を得るというクエリーです。列 a はテープル f00 と bar の両方に存在して いますので、ただ単に a と記述すると、どちらのテープルの列なのかが、あいま ロ卩 いになります。このような場合には「テープル名 . 列名」と記述することによって 問題を回避することが可能です。例でも f 。。 . a や bar. a と記述しています。 図表 2-3 複数のテーブルを結合する例 1 f00 bar 2 簡単 プロ用 bar . a SELECT * FROM f00 ′ bar WHERE f00. a = bar 、 C bar. b bar. a f00. b f00. a 2 簡単 プロ用 -1- つ」 CO 57
検索しなければなりません ( 本来はこのように、別の意味を持っ列は、別個に 作成しておいた方が便利です ) 。検索するには、主に 2 通りのやり方があります。 SELECT * FROM 製品 WHERE 製品コード LIKE ー NK% ー SELECT * FROM 製品 WHERE LEFT ( 製品コード . 2 ) ー NK ー どちらでも目的の機能は果たしますし、大差ないような気がします。しかし、 製品テープルが大きくなれば、なるほど、違いが発生します。製品テープルが 何万、何百万行のように大きくなると、検索効率を高めるために、インデック スを作成するようになります。一般的に考えて、製品コードはユニークであり、 そのデータ行を特定するのに都合の良い列であると思えますので、プライマリ キーとなっている可能性もあります。 LIKE は先頭にメタ文字がない場合のみに限り、インデックスを使用すること ができます。一方、 LEFT 関数にかけると、インデックスは使用できなくなり ます。 列に何か演算を行ったものや、関数の戻り値は、いくら列にインデックスが 付いていても、そのインデックスを利用した高速な検索はできなくなってしま います。よって、インデックスを付けた列は、そのまま利用することを考えた 方が良いといえます。例の場合では LIKE の方が高速です。 ただし、関数インデックスを作成できる環境では、状況が異なってきます。 適切な関数インデックスを作成しておくことで、関数を使った条件式でもイン デックスを利用した高速な検索を行うことができます。関数インデックスにつ いては、「 CREATE INDEX 」を参照して下さい。 Appendix U)O—I テクニック ビューを作成するには ? ビューとインデックス 前の項で例とした「製品テープル」の設計者が、やはり製品種別と製品コー ドは分けるべきだと思い直しました。しかし、このテープルから SELECT や INSERT を行うプログラムが多くあり、列の変更は危険であると考え、製品ビ ーを作ることにしました。 ビューにすれば、オリジナルの製品テープルには変更する必要がありません ので、安心です。例のように列に別名を付けておけば、ビューの列名になります。 CREATE V 工 EW ▽ー製品 AS SELECT 製品コード , 名称 , 単価 ,SUBSTR ( 製品コード靆′ 2 ) 製品種別 FROM 製品 このビューを見ると次頁の図表 A -24 のようになります。 595.
SQLÉ 1 2 3 4 5 6 コマンド命令 DB2 racl ostgre Mys SQLO CREATE VIEW MS ANSI 標準 CCe ビューの作成 CREATE [ OR REPLACE 】 VIEW 夜むコ襯 e ー ( co 襯 7 日 , co 襯・・・】 ) 】 AS select s 厄 t 夜れ夜 CREATE VIEW 夜 ( ) - れ佖襯 e [ ( co 襯れ [ , co 襯れ ... ] ) 】 AS select s 阨こ夜れ夜 バ弖区三ダ ・・作成するビュー名 CO 社 ~ れ・ ・ SELECT 命令 se ー $ 阨川 . 夜・・ 「 CREATEVIEW 」によりビューを作成することができます。 ビュー v ゴ oo を作成します。 CREATE V 工 EW v f 〇 0 AS SELECT a ′ b FROM f00 タ 定 作成された v ー f 。。の列情報は、「 AS 」以降に記述された SELECT 文に依存しま 義 す。例では a と b という 2 つの列が結果として得られるので、 v-foo の列も a と b に なります。作成した v ー f 。 0 は多くの個所でテープルと同じように扱うことができます。 ビュ—v_foo を SELECT します。 SELECT * FROM v f00 ・列名の指定 ヒュー名に続けて列名を ビューの列名は、 SELECT 命令と同じになりますが、 明示的に指定することも可能です。 ZÄCREATE Ⅵ EW 時に列名を指定します。 CREATE V 工 EW v_foo (viewcolumnl ′ viewc01umn2 ) AS bar . a SELECT foo . a,bar . b FROM foo,bar WHERE f00 . a * Access では、ビューは「クエリ」として作成されます。 OracIe PostgreSQL DB2 MySQL MS Access SQLServer ロ卩 ・・ P140 参照 DROPVIEW•• . 139 ..
SQL erve 1 2 3 4 5 6 関数 ASCII 関数 0 日 2 racl 文字からコードに変換 ASCII ( c ) →数値 ostg ySQ SQW り値 文字コード 文字を「 ASC コード」に変換します。逆に ASC Ⅱコードを文字に変換するに は「 CHR 」、「 CHAR 」関数を使用します。引数には、文字列を与えることができ ますが、文字列の先頭の文字に対するコードが返される点に注意して下さい。 列 a を ASC Ⅱにより文字コードに変換します。 SELECT a ′ ASC 工工 (a) FROM fo 〇 ASCII(a) 97 b 98 A 65 *Access では ASC 関数を使用します。 ・文字式 4.2 文字列関数 参照 CHAR/CHR 関数・・ ・・ P297 296
Appendix A SQ しテクニック こでは、実際に開発する上で役に立っと思われる、 いろいろなテクニックを 紹介します。 ■ Appe コ dix 列の最大値、最小値を得るには ? 集計クエリ—MAX 、 MIN の使用方法 あるテープルのある列の最大値と最小値を求めるには、「 MAX 」と「 MIN 」集 計関数を使用します。 MAX と MIN 関数は文字列の最大と最小を取得すること も可能です。その大小関係は文字コードとなります。また、 NULL 値は無視さ れます。 SELECT MAX ( a ) FROM f00 SELECT M 工 N (a) FROM f00 集計関数は GROUP BY の指定なしに使用することが可能です。この場合、グ ループ化されすに、テープル全体が 1 つのグループとして扱われます。 集計関数の結果はグループの数分だけのデータセットとなります。 GROUP BY の指定がないときに得られる行は 1 つだけとなります。このようなことから、 集計関数と通常の式を混在することは許されません。 cna—l テクニック 列の合計値、平均値を得るには ? 集計クエリ—SUM 、 AVG の使用方法 あるテープルのある列の合計値と平均値を求めるには、「 SUM 」と「 AVG 」 集計関数を使用します。 SUM と AVG は、数値型のみを計算することが可能で す。文字列型の合計と平均は計算できません。また、 NULL 値は無視されます。 SELECT SUM ( 土 ) FROM f00 SELECT AVG ( 土 ) FROM f00 SUM と AVG には「 DISTINCT 」を指定することができます。 DISTINCT を 指定すると、重複する行を 1 つにまとめてから合計と平均を計算しますので値 が違ってきます。次の例を参考にして下さい。 572 .
1 3 4 5 コ マ ド ロ卩 タ D 2 ることが可能になります。この場合、テープル同士の関係を FROM または、 WHERE に条件式として記述することになります。このようなテクニックを結合 と呼びます。結合には、「内部結合」、「外部結合」、「自己結合」などのテクニッ クが存在します。 テーブル foo と ba 「を a 列によって内部結合します。 SELECT * FROM f00 ′ bar WHERE f00. a = bar . a ・ GROUP BY による集計 SELECT では、「 GROUP BY 」を使うことによって、グループ別による集計を 行うことが可能です。この部分を「 GROUP BY 句」と呼びます。 GROUP BY に は列名または式を指定します。指定された列または、式の内容が同じものを 1 つ のグループとみなして、グループ別に合計や平均を計算することになります。合 計や平均は「集計関数」によって計算することが可能です。集計関数は、 GROUP BY 句の指定なしで使用できます。この場合にはグループ化は行われま せんので、全体が 1 つのグループとして扱われます。 テーブル foo を列 a によってグループ化し、列 b の合計を計算します。 SELECT SUM (b) FROM f 〇 0 GROUP BY a ・ ORDERBY によるソート ORDER BY を指定すると、ソートされた結果を得ることが可能になります。 ORDER BY を指定しない場合には、選択される結果の行の順番は不定になりま す。同じ順番を期待するならば、 ORDERBY を指定するべきです。 ていきます。 SELECT 命令は、 SQL の基本であり、細かい文法も多いので、句ごとに説明し SELECT * FROM f00 ORDER BY a テーブル foo を列 a によってソートした結果を得ます。 50
4 列 a の文字列から、先頭の O を取り除きます。 SELECT a ′ TR 工 M (LEAD 工 NG ーØ・ FROM a) FROM f 〇 0 TRIM(LEADING 0 FROM a) 1234 001234 列氏名の文字列から、両端の丑を取り除きます。 SELECT 氏名 , TRIM ( ' 田 ' FROM 氏名 ) FROM 住所録 TR Ⅳ ( ・田・ FROM 氏名 ) 山田 山 高橋 田中 中 鈴木 鈴木 中田山 中田山 * T 印 M 関数は、 Oracle8i からの機能です。 *Access では LEADING 、 TRAILING 、 BOTH の指定、および FROM によって変換文字を 指定することはできません。 5 6 関数 文 字 関 数 RTRIM 関数・・ ・・ P324 参照 LTRIM 関数・・ ・・ P312 333 .