SQL(3) データの検索
データベースの復元
前回までに作成したデータベースを読み込むには,[File]→[Open DB]をクリックし, 保存した sqlite2.db を選択します. 復元したデータベースに【学生リスト】,【学部リスト】,【テニス部】,【サッカー部】があることを確認しましょう.
学籍番号 | 氏名 | 学年 | 学部 | よみがな |
---|---|---|---|---|
A001 | 岩城隼人 | 2 | 工学部 | いわきはやと |
A002 | 岩村優 | 1 | 工学部 | いわむらゆう |
B003 | 杉江弘子 | 3 | 人文学部 | すぎえひろこ |
C004 | 仙波あすか | 1 | 国際関係学部 | せんばあすか |
【学生リスト】
学部 | キャンパス | 教員数 |
---|---|---|
工学部 | 春日井 | 30 |
人文学部 | 春日井 | 20 |
国際関係学部 | 名古屋 | 25 |
【学部リスト】
学籍番号 | 氏名 | 学年 | 学部 | よみがな |
---|---|---|---|---|
A002 | 岩村優 | 1 | 工学部 | いわむらゆう |
B003 | 杉江弘子 | 3 | 人文学部 | すぎえひろこ |
C004 | 仙波あすか | 1 | 国際関係学部 | せんばあすか |
【テニス部】
学籍番号 | 氏名 | 学年 | 学部 | よみがな |
---|---|---|---|---|
A001 | 岩城隼人 | 2 | 工学部 | いわきはやと |
B003 | 杉江弘子 | 3 | 人文学部 | すぎえひろこ |
A005 | 内田弘 | 3 | 工学部 | うちだひろし |
【サッカー部】
レコードの取得
テーブルからレコードを取得するには SELECT文 を用います. テーブル名 は対象のテーブルの名前です. 属性名 を指定して,特定の列だけを取得することができます. 属性名は複数指定することも可能です. また,属性名に「*(アスタリスク)」を指定すると,全てのレコードを取得します(これまでに何度も登場しています).
/* SELECT文 レコードの取得 */
SELECT 属性名 FROM テーブル名;
/* SELECT文 全レコードの取得 */
SELECT * FROM テーブル名;
それでは,【学生リスト】からレコードを取得してみましょう.
/* 【学生リスト】から氏名を取得 */
SELECT 氏名 FROM 学生リスト;
/* 【学生リスト】から氏名と学部を取得 */
SELECT 氏名,学部 FROM 学生リスト;
レコードの検索
次は検索条件を満足するレコードのみを取得してみましょう. SELECT文 に WHERE句 を組み合わせます. ここで,条件式 とは,比較演算子を用いて表現した検索条件のことです. 比較演算子には,等号($=$),不等号($<>$),より小さい($<$),より大きい($>$),以下($<=$),以上($>=$)などを用いることができます.
/* WHERE句 */
SELECT 属性名 FROM テーブル名 WHERE 条件式;
それでは,【学生リスト】から1年生のレコードを取得してみましょう.
/* 【学生リスト】から1年生のレコードを取得 */
SELECT * FROM 学生リスト WHERE 学年=1;
同様に,2年生以上のレコードを取得してみます.
/* 【学生リスト】から2年生以上のレコードを取得 */
SELECT * FROM 学生リスト WHERE 学年>=2;
例題2
下記の【商品リスト】を新規に作成しなさい. また,赤字(売値が仕入れ値より安い)のレコードを取得しなさい.
商品ID | 商品名 | 仕入れ値 | 売値 |
---|---|---|---|
C01 | テレビ | 50000 | 65000 |
C02 | エアコン | 60000 | 70000 |
C03 | 冷蔵庫 | 80000 | 55000 |
C04 | 電卓 | 3000 | 2000 |
C05 | 炊飯器 | 20000 | 25000 |
算術演算子を利用した検索
SELECT文で取得したレコードに対し, 和や差などの算術演算子を利用して加工することができます. 算術演算子には,和($+$),差($-$),乗算($*$),除算($/$)などがあります.
それでは,【商品リスト】から,商品名と 利益(売値と仕入れ値の差額) を取得してみましょう.
/* 【商品リスト】から商品名と利益(売値-仕入れ値)を取得 */
SELECT 商品名,売値-仕入れ値 FROM 商品リスト;
このとき,列名には「売値-仕入れ値」が表示されてしまいます. 列名に別名を付ける場合は AS句 を利用します.
/* 【商品リスト】から商品名と利益(売値-仕入れ値)を取得 */
SELECT 商品名,売値-仕入れ値 AS 利益 FROM 商品リスト;
次に,【商品リスト】から,商品名,売値,税込(売値の10%を加算) を取得してみましょう.
このとき,cast()
を利用して,計算結果のデータ型を INTEGER に変換することで,小数以下を切り捨てていることに注意してください.
/* 【商品リスト】から商品名と税込みの売値を取得 */
SELECT 商品名, 売値, CAST(売値 * 1.1 AS INTEGER) AS 税込 FROM 商品リスト;
合計や平均の計算
SELECT文で取得したレコードに対し, 合計や平均などの関数を適用することができます. 合計は$SUM(属性名)$,平均は$AVG(属性名)$,件数は$COUNT(属性名)$と記述します.
それでは,【商品リスト】の売値の合計を計算してみましょう.
/* 【商品リスト】の売値の合計 */
SELECT SUM(売値) from 商品リスト;
次に,【商品リスト】の売値の平均を計算してみましょう.
/* 【商品リスト】の売値の平均 */
SELECT AVG(売値) from 商品リスト;
最後に,【商品リスト】のレコード件数を求めてみましょう. どの属性を選んでもレコード数は同じであるため,$*$を用いることが多いです.
/* 【商品リスト】のレコード数 */
SELECT COUNT(*) from 商品リスト;
グループ集計
特定の列でグループ化して,グループごとの合計や平均などの関数を適用することが出来ます. グループ化したい列は GROUP BY句 で指定します.
それでは,【学部リスト】のキャンパスでグループ化して,教員数の合計を計算してみましょう.
/* 【学部リスト】のキャンパスでグループ化 */
SELECT キャンパス,SUM(教員数) FROM 学部リスト GROUP BY キャンパス;
次に,【学生リスト】の学部でグループ化して,レコード件数を求めてみましょう.
/* 【学生リスト】の学部でグループ化 */
SELECT 学部, COUNT(*) FROM 学生リスト GROUP BY 学部;
検索結果のソート
SELECT文で取得したレコードを昇順・降順でソートすることができます. 昇順の場合は ORDER BY 属性名 ,また, 降順の場合は ORDER BY 属性名 DESC と記述します.
/* SELECT文 昇順でソート */
SELECT 属性名 FROM テーブル名 ORDER BY 属性名;
/* SELECT文 降順でソート */
SELECT 属性名 FROM テーブル名 ORDER BY 属性名 DESC;
それでは,【学部リスト】を教員数の昇順で並べ替えます.
/* 【学部リスト】を教員数の昇順で並べ替え */
SELECT * FROM 学部リスト ORDER BY 教員数;
次に,【学部リスト】を教員数の降順で並べ替えます.
/* 【学部リスト】を教員数の降順で並べ替え */
SELECT * FROM 学部リスト ORDER BY 教員数 DESC;
正規表現
正規表現を利用した検索条件を設定することが出来ます. 正規表現は GLOB句 を用いて表現します.
文字 | 説明 |
---|---|
* | 任意の0文字以上からなる文字列 |
? | 任意の1文字 |
[abc] | a,b,cのいずれかに一致 |
[a-d] | aからdのいずれかに一致 |
[1-4] | 1から4のいずれかに一致 |
/* WHERE句 */
SELECT 属性名 FROM テーブル名 WHERE 属性名(条件) GLOB 正規表現;
それでは,学籍番号がAから始まるレコードを正規表現で検索してみましょう. 正規表現は A* と表します.
/* 学生リストから学籍番号がAから始まるレコードを取得 */
SELECT * FROM 学生リスト where 学籍番号 glob 'A*';
データベースの保存
作成したデータベースを保存するには,[File]→[Save DB]をクリックします. 保存したファイルは sqlite3.db とファイル名を変更してから,提出してください.
情報処理技術者試験・過去問
下記リンクは ITパスポート試験ドットコム, 基本情報技術者試験ドットコム, 応用情報技術者試験ドットコムに掲載されている問題です.