SQLの基礎と演算子

(更新 2012.5)

■ 準備

レポートフォルダから、第4回の資料をコピーしておく

セキュリティの設定を修正しておくこと(方法)。

■ SQL 入門

SQL(Structured Query Language; 構造化問い合わせ言語)は、リレーショナル型のデータベースを操作する為の 標準的 な言語です。

一般のプログラミング用言語と異なり、制御構造(IF文による分岐や、FORなどのループ制御など)や変数などといった概念を用いずに、 比較的短いプログラム量で データベースのテーブルを直接操作して 結果を求めることができます。

例)

テーブル(入力) SQLプログラム テーブル(出力)
名簿
名前 学年 性別
小橋
長谷川
横田
 →  select 名前 from 名簿 where 学年=1 ;  → 
名前
小橋
横田

上の例のように、SQLのプログラムは 表を加工して、別の表を出力することが主な目的です。
SQLで出来ること:
 ・テーブルの一部のレコードを「条件を指定」して取り出す
 ・表の一部の列(フィールド)だけを出力する
 ・各レコードごとにフィールドのデータを組み合わせた計算結果を表にまとめて出力する
 ・レコードを並べ替える
 ・レコードを項目で分類する
 ・レコードの分類後に、フィールを集計し、分類ごとに表にまとめて出力する
以上を幾つか組み合わせた操作を、「1つのSQL文」だけで実行できます。
その他、レコードの追加・削除・変更、テーブルの定義、セキュリティの設定などもSQLで行います。
1つのSQL文だけでもかなりの操作を行えますが、SQL文とSQL文を組み合わせたサブクエリーを利用することでより複雑な操作が可能です。

SQLは非手続き型の言語に分類されます。 非手続き型の言語の特徴は、
  何を結果として必要とするのかを直接プログラムで表現し、
  結果を得る為に必要な手順(アルゴリズム)を記述しない
点です。
皆さんにおなじみのCやJava、Basicなどの手続き型の言語のプログラムが、データを加工する手順を順番に書いたものであるので慣れないうちは戸惑うかもしれません。
しかし、結果を得る為の操作はDBMS自体が自動的に行うのでプログラムを書くこと自体はずっと単純になります。


■ SQL の文の種類

SQLのコマンドには、

  データ定義言語(DDL: Data Definition Language)

  データ操作言語(DML: Data Manipulation Language)

の2つのタイプの命令があります。
今回の演習以降しばらくの間は、DMLタイプの命令 SELECT 文を中心に話します。
DDLは、テーブルの作成や、セキュリティの設定などを行う命令で、後の方の回で解説します。


■ データ型

SQLによるデータ型については、テーブルの作成を解説するまで扱いません。
ですが、予め、テーブルの各フィールドにどのようなデータを格納できるのかをAccessの場合について確認しておきます。

Accessでは、以下の様にテーブル設計時に各フィールドのデータ型を決めておくことができる。
データ型を決めることで、フィールドのドメイン(データの範囲)を決めることができ、データに合ったサイズの記憶領域を指定できる。

上記の様に、テーブルの各フィールドのデータの型を決めておく必要がある。
また、数値型には、整数型浮動小数点型(コンピュータが少数を含む数値を記録する方式)があるので注意すること。
例)
年齢、学年 などは 整数型を指定すると良い
身長、体重 などは 浮動小数点型がよい。


■ SQLの入力

前回の演習ではクエリの作成はGUI(マウスなどで操作可能な画面のこと)を利用して、

クエリ→新規作成→デザインビュー

で上記の画面から条件を設定して作成した。

今回は、SQLでクエリーを作成するため、さらに以下の様にする。
上記画面の状態から、
メニュー「表示」→「SQLビュー」

とすると、上記の様に、SQLを入力できるようになる。

※SQLの書き方の注意※

・SQLのキーワード、 SELECT や FROM などは、 小文字(select from)でも大文字で書いてもかまいません。
・キーワードとキーワードやフィールドなどの名前は、 「空白」で区切ります。
・ テーブルや、フィールド名を複数書く場合には 「,」 でそれぞれを区切ります。
・全角文字でキーワードを書いてはいけません。
・SQLの 一番最後にだけ 「;」セミコロンを記して、SQLの文末を示してください。
上の例では、 SQLを2行に分けて書いてありますが、 1行目はまだ文の続きなので、1行目には「;」は書くと誤りになります。
・上の例のように、 適当に見やすいように改行して複数の行に書いてもOKです。
・全角文字のフィールド名はAccessでは「[]」で囲んで使用します。
例) select [漢字のフィールド名] from [漢字のテーブル名]


■ 練習

レポートフォルダから、演習用資料 「第4回#」を各自コピーして、Accessから開き、 メニューの 作成 から クエリ―デザイン を始める。

クエリの作成では、上記のとおり、 SQLビュー を利用して、SQLコマンドを記述する。

 SELECT * FROM BIKES;

練習として、以下の 1行 を編集画面に記述する。記述後、編集画面を閉じると、クエリ―名を付けて保存するダイアログがでるので、クエリ―名「練習」として保存する。

保存後、「練習」クエリ―を実行(ダブルクリック)し、実行結果を確認する。

■ 編集画面の文字サイズの調整(拡大)方法について

Accessのメニュー(○アイコン)から Accessのオプションメニューを表示し、こちらのように、クエリデザイン画面の文字サイズを調整すると、記述ミスに気が付き易いので設定を推奨します。


■ キーワード・句・文

今日登場するキーワード
キーワードは大文字で書いても小文字で書いても構文上は問題ない。
ただし、半角文字で書くこと。全角文字ではSQLのキーワードとして処理されない。

キーワード 意味 構文
SELECT 表示する列を選択 SELECT 列名1,列名2, .......
SELECT 式1,式2, .......

例)
select * とフィールドとして*を指定すると Fromで指定したテーブルの
全てのフィールドを指定した扱いになる。


「*」について:
 select * と書いたときは、”あるテーブルの全てのフィールドをコンマで区切って列挙する場合”の省略表現になります。
 その他で*を使用するときは、
 select A*B from T;
の様に、フィールドAとフィールドBの値を乗算した結果を表示する為に用います。。
FROM 表をここから指定 FROM 表名1,表名2, ......
WHERE 条件を指定 WHERE 条件式

例)
select A from T where A>5; Aが5より大きなもののレコードのAフィールドを表示する。
DISTINCT 1つ1つが異なっている SELECT DISTINCT とすると、重複したデータは2回目の登場以降表示しないようになる。つまり重複データを1つのデータにまとめることになる。

※注意
select distinct A, B from T;
上のSQLで、distinct の後ろにはコンマ,は不必要。 Aの後ろには、フィールドBと区切るためにコンマ,が必要。
ALL SELECT ALL

ALLを省略しても特に影響は無い。
AS と呼ぶ 列名 AS 別名
式 AS 別名  など、フィールド名を別の名前に付け替える場合に使用する。

例)
select lastname AS name from T;
ASの前にも後ろにもコンマ,は不必要。
AND かつ 条件式1 AND 条件式2

例)
where A>3 and A<5
Aが3〜5の間にある、という条件。
OR または 条件式1 OR 条件式2
NOT ではない NOT 条件式
IS 列名 IS NULL
例)

select name from names where age is null;
LIKE のような 列名 LIKE 'パターン文字列'
文字列がどのようなパターンか判定することができる。
パターンには、
'M*'  Mから始まる文字列 かどうかを判定
'*M*'  Mを含む文字列 かどうかを判定
'*M'  Mで終わる字列 かどうかを判定
'M?'  Mと何か一文字からなる文字列 かどうかを判定
などを指定する。
SQLの規格では%や_を用いることになっているが、
Accessでは%の代わりに*、_の代わりに?を指定する。

※like は where と組み合わせて使用する
例) where name like 'ko*'
例)

select name from names where name like 'k*';
BETWEEN の間の 列名 BETWEEN 数値1 AND 数値2
上記のandを使った条件指定の別のパターン
where A BETWEEN 3 and 5

where A>= 3 and A<=5
と同じ意味
例)

select name from names where age between 20 and 30;'
select name from names where (age >=20) and (age <= 30);'
NULL 空である
IN の中の IN (数値,数値,数値)
IN (文字列,文字列,文字列)
UNION 和集合 SQL文 UNION SQL文

ここで、水色の部分は、これ自体を条件式と考えてよい。だから、WHERE A IS NULL のような書き方を許す。

■ 今日登場する句

上記表の、橙色の部分。SELECT FROM WHERE の順に書く。各句は別々の行に書いてもよい。
例)
select F from A where F>5;
は、
select F
from A
where F>5;

と3行に分けて書いてもよい。

その他に、黄色の部分も演習問題を解くために必用。

SQL文の終わりには 必ず ; を書くこと。

SELECT 〜 FROM 〜 WHERE 〜


■ キーワードを書く順序について

 SELECT ○ FROM □ WHERE  △ の順に書く。この順番が入れ替わることは無い。
逆に言うと、先に、SELECT、FROM、WHERE をこの順序で書いておき、後から穴埋めの部分を考えればよい。

その際、SQLは以下の順で表を操作することを覚えておくと、何を書くべきかを見つけやすいので参考にしてほしい。

 SELECT文の実行においては、コンピュータは文の先頭から順に表を操作するのではなく、
1. From で利用するテーブルを決定する
2. Where でテーブルのどのレコードを取り出すかを決定する
3. Select でWhereの条件にあったレコードだけについて、指定したフィールドの表示やフィールドについての計算を行い、結果を表示する。

上の例で言うと、 □、 △、 ○ の順に考えていけばよい。

代表的な キーワードの書き順について:


今日登場する演算子

比較演算子 注意
A < B 数値の比較以外にに文字の順序関係の比較にも使用可能。
ただし、Accessでは、大文字・小文字と全角・半角とカタカナとひらがなの区別をしない。
左の例の場合、 フィールドA の値 が フィールドB の値より小さいという条件を表す。
>  A > B なら、 A は B よりも大きい ことを判定する
<=  A <= B なら、 A は B 以上である(等しくてもよい) ことを判定する
>= 同様
<>  A <> B なら、 A と B は異なることを判定する
=  A = B なら、 A と B は等しいことを判定する
使用例) 比較演算子は今のところ、 WHERE句でのみ使用する。

select □,■ from △ where □< 5;

select □,■ from △ where □ = 5;

select □,■ from △ where □ = ■;

select □ from △ where □ = ▲; 比較演算子の式ではselectで指定していないようなテーブルの中に存在するフィールド名を使用できる。
この場合、同じレコード中の、 □と▲のフィールドについて条件がチェックされる。

select □,■ from △ where □ > ■*4; 比較演算子の左右に 計算式 を用いてもOK。
算術演算子
+ 足す
- 引く
* かける
/ 割る
%  A%B は、AをBで割ったあまりを求める式。
使用例)

select [品名], [単価]*0.9 as [割引価格] from [商品]
文字列結合演算子
SQLの規格

||
Accessでは

& (1文字)
Accessでは、「+」または「&」を使用する。結合する文字列の片方が数値データの時は、「&」を利用した方が安全。
例)
lastname & ' 様' as [お名前] 
とすると、lastnameの後ろに、様 と文字を付け足して表示し、フィールド名を お名前 に変更できる。


select lastname & ' 様' as [お名前] from names
論理演算子
AND where 句で 複数の条件AとBを 「A かつ B」 として指定 
OR where 句で 複数の条件AとBを 「A または B」 として指定
NOT where 句で 条件Aを 「A でないとき」 として指定


select □ from △ where not ( ( □ > 5 and △ >6 ) or ( △ = 0) )

■ 演習課題:

演習用のデータベース、第4回#の中には 7つのテーブルに各種のデータが記録されている。

これらのテーブルのデータをSQL(クエリ―)で処理する、以下の 問題1〜問題8に、取り組んでください。

※クエリーのデザイン画面から、 SQLビュー へ切り替えてからクエリーを作成すること。
※作成したクエリは、全て実行して結果を確認すること。


次の問題4〜8について、クエリー名:「クエリー4」〜「クエリー8」で作成する。
作成したクエリーは実行して結果を確認すること。

注意:AccessのSQLの文法に注意する。
テーブル名 → 名前に特殊文字が含まれる場合、[ ]で囲む。例) [課題#] ←フィールド名を[ ]で囲む

文字の結合 →  を使用する
例) FIRSTNAME & LASTNAME

列名の名前の付け替え → 列名 AS 別名 のASは省略できない。 付け替えた名前には、元の名前は利用できない

■ 提出

ファイル名を「第4回#学籍番号」として、レポートフォルダに提出する。