前回はManagement Studio を使って SQL Server の基本的な操作方法前編(主にテーブルの操作)を説明しました。今回は、Management Studio のクエリエディタを使ってSQLの実行の仕方を中心に説明していきます。
目次
SQLとクエリについて
前回までは、テーブルを開いて直接データを入力したり削除したりしていました。このようにManagement Studioで行った操作は、SQL Serverが自動的にSQLを実行してくれていますが、今回はそのSQLを自分で実行します。
SQLとは
そもそもSQLとはなんぞや?ってところですが、まず読み方は「エスキューエル」です。これはデータベースを操作するための言語(C言語とかの言語)として、ANSI(American National Standard Institute 米国規格協会)やISO(InterNational Organization for Standardization 国際標準化機構)、JISC(JIS Committee 日本工業標準調査会)などの標準化団体によって規格化されています。
現在市販されているデータベース製品のほとんどは、1992年に標準化された「SQL92」規格に準拠しています。その後1999年に「SQL99」、2003年に「SQL2003」と規格かされていますが、各製品の適用状況はまちまちです。
SQL Server も上記の標準のSQL規格に準拠していますが、SQL Server 独自の拡張も行っており、SQL Server でしか使用できないSQL言語「Transact-SQL」という言語があります。他の製品でも同様に、Oracleの場合は「PL/SQL」、PostgreSQLでは「PL/pgSQL」などがあります。
クエリとは
クエリとは、「問い合わせ」という意味です。Accessにもクエリがありますが、あれと同じ意味です。ACCESSの場合はGUI操作だけで簡単に実行できるような機能が豊富ですが、SQL Serverの場合はSQL等のコマンドを直書きして実行するのがやりやすくなるような機能が豊富です。
Management Studio でSQLを実行しよう
Management Studio を起動するには、「スタート」メニュー → 「すべてのプログラム」 → 「SQLServer 2008」 → 「SQLServer Management Studio」をクリックします。
Management Studio を起動すると、以下の様なログイン画面が現れます。「サーバー名」のところにコンピュータ名(私のマシンだと”PC01”)を入力し、「接続」クリックします。
ログインに成功したら、画面左上の「新しいクエリ」ボタンをクリックします。すると、図のようにクエリエディタが表示されます。この時、左上のドロップダウンには接続先のデータベースが表示されており、図では[master]データベースへ接続していることになります。
[master]データベースは、SQL Server 自身が稼働する為に使用するものであり、ユーザが使用するものではありませんので、適切なデータベース(ここでは[TestDB])へ変更します。
ドロップダウンで接続先データベースを変更すると即反映されます。
USEを使用して接続先データベースを明示する
この状態でSQLを実行すると、左上に表示されているデータベースに接続することになりますが、ソースコードの中で明示的に接続先データベースを指定することもできます。
USE TestDB
USE は、接続先データベースを指定するだけのコマンドです。USE の後に半角スペースを入れて、データベース名を記述することで、そのデータベースへ接続できるようになります。大文字小文字は気にしないので大丈夫ですが、全て半角である必要があります。
記述後は「!実行(X)」ボタンをクリックするか、「F5」キーもしくは「Ctrl + E」をクリックすればSQLが実行できます。なお、この「USE」は消す必要はありませんので、書いたままでもSELECT文等と一緒に実行できます。
SQL Server は、2008からインテリセンス機能が追加されています。これにより、コーディングがぐっと楽になりました。長いデータベース名やテーブルを名を入力する際にも候補が表示される為、入力ミスを防ぐことができるので便利です。
最初から接続先を指定して開く
新しいクエリを開く時に、オブジェクトエクスプローラから接続したいデータベースを選択しておくと、最初からそのデータベースに接続された状態でクエリエディタが開きます。
INSERT文でテーブルにデータを追加する
前回は、テーブルを開いて直接データを入力する方法を紹介しましたが、画面上でユーザが行った操作は、SQL Server 自体がSQLへ置き換えて実行してくれています。データを入力して行方向に移動した際は「INSERT」というSQLが実行され、テーブルにレコードが追加されます。
INSERT文の構文は次のとおりです。
INSERT INTO テーブル名(列名1, 列名2, ・・・) VALUES(値1, 値2, ・・・)
テーブル名の後ろのカッコの中には、列名を記述します。「VALUES」の後ろのカッコの中には、列名に記述した順番と合うように、格納する値を記述します。この時、テーブルの列の定義の順番通りにする必要はありません。下の画像で言うと、一つ目に指定した「列名2」には[値2]が、「列名1」には[値1]が格納されることになります。
ただ、他の人が見たときに混乱を招きやすいので、基本的には列の定義の順番通りにしておいた方がいいです。
さらに、INTO と列名の記述は省略することができます。列名を省略した場合は、どの列に格納すべきか分からないので、格納する値はテーブルの列の定義の順番通りに記述しなければなりません。
列名を省略した場合の構文は次のようになりますが、これも基本的には省略しない方がいいです。
INSERT INTO VALUES(値1, 値2, ・・・)
INSERT文を実行してみよう
前回作成したテーブルがあるものとして話を進めますが、この社員テーブルへレコードを追加しましょう。Management Studio でクエリエディタに以下のSQLを記述して、接続先データベースに気をつけながら実行しましょう。
SQLは、[!実行(X)]ボタンクリック、もしくは「F5」もしくは「Ctrl + E」で実行できます。
INSERT INTO Table_Syain(社員番号, 名前, 年齢, 性別, 生年月日, 給料) VALUES('00006', '六田六子', '36', '女', '1977/05/04', 360000)
SQLの実行が正常に終了した場合は、下の「メッセージ」というころに[○行処理されました]というメッセージが表示されます。テーブルを開いてみると、確かにレコードが追加されています。
SQLを記述する際には、いくつか注意が必要です。
- 1.文字列と日付をは単一引用符(’)で囲む
- 値として文字列と日付を記述する時は、単一引用符(’)シングルコーテーションで囲む必要があります。
- 2.SQLのキーワードや記号は全て半角で記述
- INSERT INTO VALUES , ( スペース などSQLのキーワードや記号はすべて半角で記述する必要があります。
続けてINSERT文を実行する
さらに続けてINSERT文を実行し、レコードを追加しましょう。
INSERT INTO Table_Syain(社員番号, 名前, 年齢, 性別, 生年月日, 給料) VALUES('00007', '七輪 保', '29', '男', '1984/11/20', 240000)
クエリエディタ上に先ほど入力したSQLが残っている場合、そのまま実行すると全部実行されますが、マウスでドラッグして範囲選択した状態で実行すると、選択した部分だけが実行されるので便利です。
INSERT文でNULLを格納した場合は、単一引用符は付けずにそのまま NULL と記述します。
NULLとは、「値が存在しないこと」を表すものです。文字列や日付ではなく、SQLのキーワードとして扱いますので、引用符は付けません。
SELECT文を使用してデータを参照する
INSERT文はテーブルにレコードを追加するSQLでしたが、追加したからには参照できないと意味がありません。テーブルに格納したレコードを参照するには「SELECT」というSQLを使用します。
SELECT文は、SQLの中でも超重要で複雑なのですが、ここでは簡単にだけ説明します。基本的な構文は次のとおりです。
SELECT 列名1, 列名2, ・・・ FROM テーブル名
FROM の後ろにテーブル名を書き、SELECT から FROM までの間に、表示したい(SELECT:選択したい)列をカンマ区切りで指定します。全ての列を表示したい場合は、「*」と書くだけでOKです。
SELECT * FROM テーブル名
ではこれを実際に実行してみましょう。クエリエディタにSELECT文を記述し、[!実行(X)]をクリックして実行します。
下の結果のところにグリッド形式でテーブルの内容が表示されます。
SELECT文で条件を指定する
先の例では、テーブルに存在するレコード全てを表示するものでしたが、特定の条件にヒットするもののみ表示することができます。構文は次のとおりです。
SELECT * FROM テーブル名 WHERE 絞り込む条件
WHERE の後ろに、行を絞り込む為の条件を記述します。条件というのは、例えば「性別が男性のみ」「給料が30万以下の人のみ」といった具合です。では、「性別が男性のみ」という条件を指定してSELECT文を実行してみましょう。
SQLは次のようになります。
SELECT * FROM Table_Syain WHERE 性別 = '男'
このように、条件を指定して結果を絞り込む場合は、WHERE を使用します。
文字列はシングルコーテーション(’)で囲う必要があると言いましたが、ここで実行しているSQLで性別は囲っていません。
SQL Server に存在しているテーブルや列のことをオブジェクトと言いますが、オブジェクトを指定する場合はシングルコーテーションで囲んではダメです。このSQLの場合、「ある列の値が男」という条件指定であり、[性別]列の値が[男]という解釈になります。
もしこれを、「’性別’ = ‘男’」としてしまうと、性別は列名ではなく、単純な文字列だとみなされてしまいます。[Table_SYain]と[性別]の文字の色が薄い緑になっていますが、テーブル名や列名などのオブジェクトを指定した場合、クエリエディタ上で文字の色がこのように薄い緑になります。よって、この場合[性別]がオブジェクトだと解釈されていることが分かります。
SELECT文で列を使用せず値を直接入力する
SELECT文を実行する際は、必ずしも列を使用する必要はありません。さらに、テーブルを指定する必要もありません。どういうことかと言うと、次の図を見てもらうと一目瞭然です。
後のエントリで紹介しますが、関数の結果確認など、主に開発中に利用することが多くなると思います。
上位 N 件の取得
SELECT文を実行した際は、基本的にテーブルに存在するレコード全てが表示されますが、その中から上位 N 件(N は任意)を指定することができます。構文は次のとおりです。
SELECT TOP N 列名1, 列名2, ・・・ FROM テーブル名
SELECT から一つ目の列名(または*)までの間に、「TOP N」を書き、N のところに表示したい件数を記述します。それでは、上位1件だけ取得してみましょう。
SELECT TOP 1 * FROM Table_Syain
テーブルを開く際には上位1000行の選択がされていた
オブジェクトエクスプローラからテーブルを開く際に、デフォルトでは「上位1000行の選択」という右クリックメニューがありましたが、あれは実は新規にクエリエディタを開いて、TOP 1000 を指定した上でSELECT文を実行してくれるコマンドだったんですね。
データベースをバックアップする
これからは、データの更新と削除の操作を行いますので、まずはデータベースのバックアップを取りましょう。SQL Server のバックアップは非常に簡単で、凝った設定にしなければ本当に簡単にできちゃいます。
オブジェクトエクスプローラから対象のデータベースを選択した状態で右クリック、「タスク」 ⇒ 「バックアップ」を選択します。開いた画面では、「バックアップ先」を[ディスク]を選択し、「追加」ボタンをクリックします。
次の画面では、バックアップファイルを指定します。直接入力してもいいのですが、「…」ボタンをクリックして次の画面を表示させましょう。ちなみに、この画面で最初から表示されているパスは、インストールする場所を変えていなければ「C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\」です。
「データベース ファイルの検索」画面では、画面下部の「ファイル名」に、バックアップファイル名を入力します。ここでは、[TestDB_BK]と入力しました。
ファイルを選択して「OK」ボタンをクリックしたら、自動で画面が閉じて行き一番初めの”データベースのバックアップ画面”に戻ってきます。「バックアップ先」には、今選択したファイル名が表示されていることが確認できます。そのまま「OK」ボタンをクリックするとバックアップ処理が始まります。
処理の進捗は、画面左下にパーセンテージで表示されます。今はデータ件数が非常に少ないので、数秒程度で完了すると思います。処理が完了すればメッセージが表示されるので、「OK」をクリックすると画面は自動で閉じられます。
「TestDB_BK」のファイルの中に、テーブルのデータも含めデータベースそのものがバックアップされています。
これで、データベースのバックアップは以上です。
バックアップからの復元(リストア)
バックアップを取ったら、復元(リストア)できなければ意味がありませんので、さっき取得したバックアップからデータベースをリストアしてみましょう。
オブジェクトエクスプローラからデータベースを選択し、右クリック ⇒ 「タスク」 ⇒ 「復元」 ⇒ 「データベース」をクリックします。
「データベースの復元」画面が開きますので、「復元用のソース」を[デバイスから]を選択し、右にある「…」ボタンをクリックします。
バックアップを取得した時と同じように、「追加」をクリックし、「ファイルの種類」を[すべてのファイル]にして、[TestDB_BK]を選択し、「OK」ボタンをクリックします。
「バックアップの場所」に選択したファイルが表示されますので、「OK」ボタンをクリックします。
「復元するバックアップ セットの選択」に、さっき選択したファイルが表示されますので、「復元」にチェックを入れ、「オプション」をクリックします。
「既存のデータベースを上書きする」にチェックを入れ、「OK」をクリックすると、リストアが開始されます。
これで、「TestDB」のデータベースが、バックアップからリストアされました。中身が丸ごと上書きされています。今後、データの内容を戻したい場合は、この手順を実行すれば簡単にリストアができるので便利です。
UPDATE文でデータを更新する
既に登録されているレコードの値を更新するには「UPDATE」というSQLを実行します。構文は次のとおりです。
UPDATE テーブル名 SET 更新する列名1 = 更新する値1, 更新する列名2 = 更新する値2, ・・・ WHERE 更新するレコードを特定する為の条件
UPDATE に続いてテーブル名を記述し、SET の後ろから「更新する列名 = 更新する値」と言う風に、列名と値のセットをカンマ区切りで並べます。テーブルの列の定義の順番通りに書く必要はありません。
それでは、実際にデータの更新をしてみましょう。
社員番号”00001” “田中 一郎”さんの給料を、30万円に更新するとした場合、次のようなSQLになります。クエリエディタを開いて、次のSQLを記述し、「!実行(X)」ボタンをクリックして実行しましょう。
UPDATE Table_Syain SET 給料 = 300000 WHERE 社員番号 = '00001'
テーブルを開くと、ちゃんと更新されていることが確認できます。
WHEREを書かなかった場合
WHEREを書かずにUPDATEを実行した場合は、テーブル内の全レコードが更新されてしまうので注意が必要です。
UPDATE Table_Syain SET 給料 = 400000
このSQLを実行した結果は次のようになります。
DELETE文でレコードを削除する
テーブルに登録されているレコードを削除するには、「DELETE」というSQLを実行します。構文は次のとおりです。
DELETE FROM テーブル名 WHERE 削除するレコードを特定する為の条件
それでは、実際にレコードを削除してみましょう。社員番号”00007”の”七輪 保”さんが退職したので、レコードを削除するとした場合、次のようなSQLになります。クエリエディタを開いて、次のSQLを記述し、「!実行(X)」ボタンをクリックして実行しましょう。
DELETE FROM Table_Syain WHERE 社員番号 = '00007'
テーブルを開いてみると、確かにレコードが削除されていることが確認できます。
WHEREを書かなかった場合
UPDATE文と同様に、WHEREを書かずにDELETEを実行した場合は、テーブル内の全レコードが削除されてしまうので注意が必要です。
DELETE FROM Table_Syain
このSQLを実行した結果は次のようになります。
ビュー(View)の作り方
SQL Server には「ビュー」というものがあります。ビューとは、AccessみたいにSELECT文のクエリを保存しておける機能です。Accessと違うところは、そのクエリそのものをテーブルとして扱えることです。
作成するクエリは「性別が男性のレコードだけを取得」とします
SELECT * FROM Table_Syain WHERE 性別 = '男'
これをクエリエディタで普通に実行した場合は、次のような結果になります。
それでは、この内容でビューを作りましょう。オブジェクトエクスプローラから、「ビュー」というところを選択し、右クリックメニューから「新しいビュー」をクリックします。
ビューの作成では、デフォルトではGUIにより操作ができるような作りになっています。「テーブルの追加」画面も一緒に開きますので、この画面では操作する対象のオブジェクト(テーブルなど)を選択することができます。クエリ作成対象の[Table_Syain]を選択して「追加」ボタンをクリックすると、Management Studio 本体の方に追加されます。
急に画面がリッチになったので、各画面の説明をします。尚、画像の中でオレンジの枠で囲っているエリアのことを「ペイン」と呼びます。
No | 名前 | 説明 |
---|---|---|
1 | ダイアグラム ペイン | 取得したい列をチェックで選択できたり、次回以降で説明するテーブル結合において、テーブルとキーの列の関係が図示されます。 |
2 | 抽出条件 ペイン | 取得した列や条件を、ドロップダウンで簡単に選択することができます。 |
3 | SQL ペイン | No.1 No.2 で操作した内容のSQLを表示するエリアです。ここに直接記述することも可能です。 |
4 | 結果表示 ペイン | No.3 のSQLを実行した結果(このビューの実行結果)を表示するエリアです。おすすめしませんがここから直接データを編集することも可能です。 |
画面左上にあるアイコンをそれぞれクリックすることで、各ペインの表示・非表示を切り替えられます。
それでは、性別が男のレコードだけに絞り込んだSELECTの作り方ですが、やり方はいろいろあるのですが、[抽出条件]ペインから、「列」という見出しの一行目のところをマウスでクリックし、ドロップダウンの一番上にある[dbo.Table_Syain.*]を選択します。そして、二行目に[性別]を選択し、二行目の「フィルタ」という列に[男]と入力します。この時、二行目の「出力」のチェックはオフにしておきましょう。
ここまでできたら、赤い[!]のボタンを押して、SQLを実行してみます。結果は、画面下の[結果表示]ペインに表示されます。
最後に、これを保存すればビューの作成は完了です。
作成したビューを利用する
作成したビューは、テーブルと同じように扱えますので、試しにSQLを実行してみましょう。
SELECT * FROM View_Man
今回はシンプルな例でしたが、毎回同じような条件を指定してテーブルを絞り込むような場合、ビューにしておくとSQLを書く手間が省けて便利です。
クエリエディタ関連の便利テク
一通りクエリエディタを使ってSQLを実行してきましたので、便利な使い方をいくつか紹介したいと思います。
SQLの実行は、「F5」や「Ctrl + E」 で可能
[!実行(X)]や[!]ボタンクリックで実行できますが、「F5」や「Ctrl + E」 (※EはExecuteの略かも)でも実行可能です。F5が便利だと思います。
実行されるのは、選択している範囲のみ
F5を押して実行される時に、マウスで範囲選択している場合は、その選択されている部分だけが実行されます。クエリを2つ書いておいて、使い分けたい時とか、WHEREを書いている場合に、WHEREを指定しなかった場合はどういう結果かを見たいときとかに便利です。
「/* */」でコメント化できる
「/*」から「*/」で囲んだ範囲は、コメントになり、無視されるようになります。非常に便利なので有効活用しましょう。なお、複数行囲むことや、行の途中の部分だけ囲むことも可能です。
行番号の表示
クエリエディタで行番号を表示できます。「ツール」 ⇒ 「オプション」を開き、「テキストエディタ」 ⇒ 「Transact-SQL」 ⇒ 「全般」をクリックし、「行番号」にチェックを入れます。
マウスホイールクリックでタブを閉じられる
クエリエディタはタブ形式でいくつも開けます。画面右側にある「×」ボタンで閉じられますが、マウスのホイールクリックでも閉じられます。地味に便利です。
かなり長くなりましたが、これでManagement Studio を使ったSQL Server の基本的な操作方法(前編・後編)は終了です。ありがとうございました。