次の方法で共有


第 1 章 「Transact-SQL の基本」~ 初めて学ぶ Transact-SQL ~

NEC

Eラーニング事業部

鈴木 智行

2003 年 1 月 23 日

目次

1. Transact-SQL とは 1. Transact-SQL とは
2. リレーショナルデータベース 2. リレーショナルデータベース
3. データベースオブジェクトの参 3. データベースオブジェクトの参
4. データ操作言語ステートメント 4. データ操作言語ステートメント
5. Transact-SQL の構文要素 5. Transact-SQL の構文要素
  5. Transact-SQL の構文要素5-1 演算子
  5. Transact-SQL の構文要素5-2 式
  5. Transact-SQL の構文要素5-3 組み込み関数
  5. Transact-SQL の構文要素5-4 流れ制御言語

1. Transact-SQL とは

リレーショナルデータベース (RDB) にアクセスする場合には、SQL (Structured Query Language) というプログラミング言語を使用します。SQL Server 2000 の他にもリレーショナルデータベースはたくさんありますが、SQL は ANSI や ISO で規格化されており基本的にはどのリレーショナルデータベースでも操作可能です(図1-1)。

図

1-1 SQL でリレーショナルデータベースを操作する

SQL Server 2000 ももちろん SQL である程度は操作可能なのですが、SQL Server 2000 には他のリレーショナルデータベースにはない様々な優れた機能があります。こういった機能を利用する場合には一般的な SQL だけでは不十分です。そのために SQL Server 2000 専用に拡張された SQL が提供されており、同じ使い勝手で SQL Server 2000 の機能を利用することができます。

このように SQL Server 2000 を操作するためには、他のリレーショナルデータベースでも操作可能である基本的な SQL (SQL Server 2000 は 1992 年に ANSI と ISO によって発表された SQL 規格である SQL-92 に準拠)と、SQL Server 2000 にしか利用できない SQL があり、これを総称して Transact-SQL と呼んでいます (図 1-2)。いろいろ書きましたが、簡単に言えば SQL Server 2000 用の SQL が Transact-SQL であると思っていただいて特に問題ないでしょう。

図

1-2 Transact-SQL SQL Server 2000 用の SQL である

2. リレーショナルデータベース

データベースと一口にいっても、その実装形態は様々です。しかし 「世の中にあるデータベース=リレーショナルデータベース」 といっても過言ではないほど、現状ではリレーショナルデータベースが使用されているケースがほとんどです。Transact-SQL を理解するためにはリレーショナルデータベースの知識が必要なので、ここで簡単にご紹介しておきましょう。

リレーショナルデータベースではデータを 1 つ以上の 2 次元の表形式 (テーブル) で表現します。このとき表に格納される 1 件のデータを行 (レコード) と呼び、データを表す個々の項目のことを列 (フィールド) と呼びます (図 2-1)。

図

2-1 ( テーブル ) は行 ( レコード ) と列 ( フィールド ) で構成される

通常、テーブルは 1 つだけとは限りません。場合によっては複数のテーブルで1つのデータベースを構成する場合もあります。複数のテーブルで構成する場合には、テーブル間に参照関係を設定します。参照関係はあるテーブルのレコードを一意に識別できる列 (主キー) と同じ列 (外部キー) をもった別なテーブルを関係づけることで実現します (図 2-2)。

T-SQL2-2.gif

2-2 参照関係の設定例

例えば、上記の図 2-2 の参照関係によって「商品コード P00002 のこしあんぱん」 は 「会社コードTK001の東京製菓」 が製造会社であることがわかります。

データベースやテーブルをどのように作成するかは設計段階で決定されますが、このコラムでは取り上げません。

3. データベースオブジェクトの参

2 でご紹介したテーブルのようなデータベースを構成する要素をデータベースオブジェクトと呼び、テーブル以外にもインデックス、ビュー、ストアドプロシージャ...etcといった要素があります。Transact-SQL ではデータベースオブジェクトを参照するために以下のような区切られた識別名を使用します。

servername.database.owner.objectname

servername:サーバー名

database:データベース名

owner:所有者名

objectname:オブジェクト名

この 4 つの部分全てを指定するオブジェクト名のことを完全修飾名と呼びます。しかしデータベースオブジェクトを参照するときには必ずしもサーバー名、データベース名、所有者名を指定する必要はなく省略することもできます。省略した場合の既定値は表 3-1 のとおりです。このようにいずれかを省略した場合のオブジェクト名のことを部分指定名と呼びます。

部分名

省略した場合の既定値

サーバー名

現在ログインしているサーバー
(名前付きインスタンスの場合は servername\instancename になる)

データベース名

現在位置づけられているデータベース

所有者名

自分自身あるいは dbo (database owner) のいずれか

3-1 部分名を省略した場合の既定値

例えば商品テーブルからデータを取得したい場合には、完全修飾名ではなく部分指定名で商品テーブルを指定することも可能ですが、省略値の意味をしっかり掴んでいないと画面 3-2 のようにエラーが発生します。

画面

画面 3-2 部分指定名の指定でエラーが発生

スペルミスや実際にテーブルが存在していないなどの単純なエラーも考えられますが、特に部分指定名のエラーで多く見受けられるのはデータベース名の省略値の問題です。SQL Server 2000 では、業務で扱うデータベースを設計段階で複数作成するように決定する場合があります。したがってテーブルなどのデータベースオブジェクトを部分指定名で指定するためにはテーブルが格納されているデータベースに位置づける必要があります。現在位置づいているデータベースを認識することも大事なのですが、部分指定名を指定する場合には use ステートメント (命令) を併用することを覚えてください。use ステートメントでデータベース名を指定することによって、指定されたデータベースに位置付けることができます (画面 3-3)。

画面

画面 3-3 部分指定名は use ステートメントと併用する

4. データ操作言語ステートメント

Transact-SQL のステートメント (命令) には様々な種類がありますが、ここでは皆さんが主に使うデータベースのデータを操作するステートメントを紹介します。

種類

意味

SELECT

データを行/列単位で取得(選択)する

INSERT

データを行単位で追加する

UPDATE

データを行/列単位で更新する

DELETE

データを行単位で削除する

4-1 データ操作言語ステートメント

データ操作言語ステートメントの中でも SELECT が一番重要です。まずは真っ先に以下の構文を覚えてください。これだけではありませんが、これらの構文が後々の基本となります。

SELECT * FROM テーブル名

*は全ての列を取得することを意味し、FROM の後にテーブル名を完全修飾名あるいは部分指定名で指定します。この結果指定されたテーブルの内容が全行全列、テーブル形式で取得できます。

SELECT 列名,列名, ..... FROM テーブル名

*の代わりに列名を指定した場合は、全列ではなく指定した列のみを取得することができます。SELECT の後に記述する複数の列名のことを列リストと呼ぶ場合もあります。

画面

画面 4-2 商品テーブルから商品コード列と商品名列を取得

例えば画面 4-2 は商品テーブルから商品コード列と商品名列を取得した例です。

SELECT * FROM テーブル名 WHERE 条件

WHERE の後に条件を指定した場合は、全行ではなく条件にあった行のみを取得することができます。

画面

画面 4-3 商品テーブルから会社コードが TK001 である商品を取得

例えば画面 4-3 商品テーブルから会社コードが TK001 である商品を取得した例です。

SELECT ステートメントの詳細や他のステートメントについては第3章以降で見ていきます。

5. Transact-SQL の構文要素

Transact-SQL はプログラミング言語ですから、いろいろな構文要素を用いてプログラミングが可能です。

5-1 演算子

演算子を使用すると数学的な計算や文字の連結、列/定数間の比較などが可能になります。SQL Server は以下の種類の演算子をサポートします (表 5-1-1)。

種類

演算子

意味

算術

+

加算

算術

-

減算

算術

*

乗算

算術

/

除算

算術

%

剰余(除算による余りの整数で返す)

比較

=

等しい

比較

>

より大きい

比較

<

より小さい

比較

>=

以上

比較

<=

以下

比較

<>

等しくない

論理

AND

全ての条件が正しいとき TRUE を返す

論理

BETWEEN

範囲内にあるとき TRUE を返す

論理

EXISTS

値が存在するとき TRUE を返す

論理

IN

値が一覧にある場合に TRUE を返す

論理

LIKE

値がパターンに一致する場合に TRUE を返す

論理

NOT

値を反転します

論理

OR

いずれかの条件が正しいとき TRUE を返す

文字列連結

+

文字を連結する

5-1-1 SQL Server でサポートする演算子 ( 抜粋 )

演算子には優先順位があり実行の順序を決定するため、指定の仕方によっては結果の値に影響を及ぼす可能性があります。優先順位は以下のとおりです。

( ) → 算術演算子(*,/,% → +,-) →文字列連結演算子 → 比較演算子 → 論理演算子 (NOT → AND → BETWEEN,EXISTS,IN,LIKE,OR)

SQL Server では( )によって最も深くネストした式が最初に処理され、優先順位が同じ場合には左から右に処理されます。

5-2 式

列名や定数、演算子を組み合わせて式を構成することができます。式は単一の値として評価され、SELECTステートメントの列リストや条件で使用することができます(画面 5-2-1)。

画面

画面 5-2-1 式を使用した SELECT ステートメントの例

5-3 組み込み関数

式が許可されている場所には関数を使用することができます。関数にはあらかじめ用意されている組み込み関数とユーザーが作成できるユーザー定義関数がありますが、その中でも今回のコラムでは 1 つの値を返す組み込み関数をご紹介します (表5-3-1)。関数の中には入力パラメータ必要とするものとしないものがあるので注意してください。

関数の分類

関数(抜粋)

説明

日付、時刻

GETDATE,YEAR,MONTH,DAY,DATEADD

日付、時刻に対する操作を行う

メタデータ

DB_NAME,DATABASEPROPERTYEX

データベースやデータベースオブジェクトの情報を返す

文字列

SUBSTRING,LTRIM,RTRIM

文字列に対する操作を行う

システム

CAST,CONVERT,@@ERROR

値、オブジェクト、SQL Serverの設定値に対する操作を行う

5-3-1 SQL Server でサポートする組み込み関数 ( 抜粋 )

例えば商品の原「「合計を取得したい場合にはSUM関数を使用して、画面 5-3-2 のように記述します。

画面

画面 5-3-2 集計関数を使用した SELECT ステートメントの例

5-4 流れ制御言語

Transact-SQL にはステートメントのロジックを制御する流れ制御言語が用意されています (表 5-4-1)。この流れ制御言語を使用すればいろいろな条件に応じて異なる Transact-SQL ステートメントを実行することが可能になります。SQL Server は以下の流れ制御言語をサポートします(表5-4-1)。

キーワード

説明

BEGIN...END

複数のステートメントをブロック化します

IF...(ELSE....)

指定された条件が TRUE の場合と FALSE の場合の二分岐選択を実現します

CASE

指定された条件に対して多分岐選択を実現します

WHILE

指定された条件繰り返し構造を実現します

RETURN

無条件に終了します

表 5-4-1 SQL Server でサポートする流れ制御言語(抜粋)

この中での一番の注意点は BEGIN...END キーワードの使い方です。例えば IF...ELSE... キーワードは二分岐選択が可能なのですが、指定された条件がFALSEの場合にのみ複数のステートメントを実行しようとしても、画面 5-4-2 のように Transact-SQL を記述しても実際にはうまく動作しません。

画面

画面 5-4-2 複数のステートメントがある場合にはうまく動作しない ( 条件が TRUE の場合 )

これは IF ステートメントで指定した条件の適用範囲がそれぞれ TRUE の場合も FALSE の場合も 1 ステートメントしか実行できないことに起因しています。したがってこういった場合には BEGIN...END キーワードを使用して、複数のステートメントをブロック化する必要があります (画面 5-4-3)。

画面

画面 5-4-3 BEGIN..END を利用した IF...ELSE ( 条件が TRUE の場合 )

もちろん IF...ELSE.. キーワードだけではなく、CASE キーワードや WHILE キーワードにおいて使用する場合にも必要な知識ですからしっかり押さえてください。

次回はクエリアナライザを中心にご紹介します。

dts.jpg

鈴木   智行: NEC Eラーニング事業部に所属。入社以来、インストラクタとして教育業務に従事。汎用機、UNIX を経て、1994 年より マイクロソフト認定トレーナー (MCT) として、管理者向け教育を担当。SQL Server は 4.21a から携わっており、現在は主に SQL Server 2000 に関わるデータベース教育を中心に担当。 Windows 2000 および SQL Server 2000 での MCSE,MCDBA を取得しており、情報処理技術者試験のテクニカルエンジニア(データベース)も取得済。 SQL Server の優位性をアピールできるように Oracle Gold も取得した。今後 Oracle Plutinum を取得予定し、日々データベースを極めることに努力している。