SQL(3) データの検索
テーブルのレストア
前回までに作成したテーブルを .restore
でレストアしましょう.
また,.table
で【学生リスト】,【学部リスト】,【テニス部】,【サッカー部】があることを確認しましょう.
sqlite> .restore db2.sqlite
sqlite> .table
サッカー部 テニス部 学生リスト 学部リスト
学籍番号 | 氏名 | 学年 | 学部 | よみがな |
---|---|---|---|---|
A001 | 岩城隼人 | 2 | 工学部 | いわきはやと |
A002 | 岩村優 | 1 | 工学部 | いわむらゆう |
B003 | 杉江弘子 | 3 | 人文学部 | すぎえひろこ |
C004 | 仙波あすか | 1 | 国際関係学部 | せんばあすか |
【学生リスト】
学部 | キャンパス | 教員数 |
---|---|---|
工学部 | 春日井 | 30 |
人文学部 | 春日井 | 20 |
国際関係学部 | 名古屋 | 25 |
【学部リスト】
学籍番号 | 氏名 | 学年 | 学部 | よみがな |
---|---|---|---|---|
A002 | 岩村優 | 1 | 工学部 | いわむらゆう |
B003 | 杉江弘子 | 3 | 人文学部 | すぎえひろこ |
C004 | 仙波あすか | 1 | 国際関係学部 | せんばあすか |
【テニス部】
学籍番号 | 氏名 | 学年 | 学部 | よみがな |
---|---|---|---|---|
A001 | 岩城隼人 | 2 | 工学部 | いわきはやと |
B003 | 杉江弘子 | 3 | 人文学部 | すぎえひろこ |
A005 | 内田弘 | 3 | 工学部 | うちだひろし |
【サッカー部】
レコードの取得
検索の理解を助けるために .header
でヘッダーを表示する設定にしておきます.
sqlite> .header on
sqlite> select * from 学生リスト;
学籍番号|氏名|学年|学部|よみがな
A001|岩城隼人|2|工学部|いわきはやと
A002|岩村優|1|工学部|いわむらゆう
B003|杉江弘子|3|人文学部|すぎえひろこ
C004|仙波あすか|1|国際関係学部|せんばあすか
テーブルからレコードを取得するには SELECT文 を用います. テーブル名 は対象のテーブルの名前です. 属性名 を指定して,特定の列だけを取得することができます. 属性名は複数指定することも可能です. また,属性名に「*(アスタリスク)」を指定すると,全てのレコードを取得します(これまでに何度も登場しています).
/* SELECT文 レコードの取得 */
SELECT 属性名 FROM テーブル名;
/* SELECT文 全レコードの取得 */
SELECT * FROM テーブル名;
それでは,【学生リスト】からレコードを取得してみましょう.
sqlite> select 氏名 from 学生リスト;
氏名
岩城隼人
岩村優
杉江弘子
仙波あすか
sqlite> select 氏名,学部 from 学生リスト;
氏名|学部
岩城隼人|工学部
岩村優|工学部
杉江弘子|人文学部
仙波あすか|国際関係学部
レコードの検索
次は検索条件を満足するレコードのみを取得してみましょう. SELECT文 に WHERE句 を組み合わせます. ここで,条件式 とは,比較演算子を用いて表現した検索条件のことです. 比較演算子には,等号($=$),不等号($<>$),より小さい($<$),より大きい($>$),以下($<=$),以上($>=$)などを用いることができます.
/* WHERE句 */
SELECT 属性名 FROM テーブル名 WHERE 条件式;
それでは,【学生リスト】から1年生のレコードを取得してみましょう.
sqlite> select * from 学生リスト where 学年=1;
学籍番号|氏名|学年|学部|よみがな
A002|岩村優|1|工学部|いわむらゆう
C004|仙波あすか|1|国際関係学部|せんばあすか
同様に,2年生以上のレコードを取得してみます.
sqlite> select * from 学生リスト where 学年>=2;
学籍番号|氏名|学年|学部|よみがな
A001|岩城隼人|2|工学部|いわきはやと
B003|杉江弘子|3|人文学部|すぎえひろこ
課題1
【学部リスト】から,キャンパスが春日井のレコードを取得し,その出力結果を提出しなさい.
課題2
下記の【商品リスト】を新規に作成しなさい. また,赤字のレコードを取得し,その出力結果を提出しなさい.
商品ID | 商品名 | 仕入れ値 | 売値 |
---|---|---|---|
C01 | テレビ | 50000 | 65000 |
C02 | エアコン | 60000 | 70000 |
C03 | 冷蔵庫 | 80000 | 55000 |
C04 | 電卓 | 3000 | 2000 |
C05 | 炊飯器 | 20000 | 25000 |
算術演算子を利用した検索
SELECT文で取得したレコードに対し, 和や差などの算術演算子を利用して加工することができます. 算術演算子には,和($+$),差($-$),乗算($*$),除算($/$)などがあります.
それでは,【商品リスト】から,商品名と 利益(売値と仕入れ値の差額) を取得してみましょう.
sqlite> select 商品名,売値-仕入れ値 from 商品リスト;
商品名|売値-仕入れ値
テレビ|15000
エアコン|10000
冷蔵庫|-25000
電卓|-1000
炊飯器|5000
次に,【商品リスト】から,商品名と 税込みの売値(10%) を取得してみましょう.
sqlite> select 商品名,売値*1.1 from 商品リスト;
商品名|売値*1.1
テレビ|71500.0
エアコン|77000.0
冷蔵庫|60500.0
電卓|2200.0
炊飯器|27500.0
課題3
【商品リスト】から,利益率が20%以上の商品を検索し,商品名と利益率を表示しなさい. また,その出力結果を提出しなさい.
検索結果のソート
SELECT文で取得したレコードを昇順・降順でソートすることができます. 昇順の場合は ORDER BY 属性名 ,また, 降順の場合は ORDER BY 属性名 DESC と記述します.
/* SELECT文 昇順でソート */
SELECT 属性名 FROM テーブル名 ORDER BY 属性名;
/* SELECT文 降順でソート */
SELECT 属性名 FROM テーブル名 ORDER BY 属性名DESC;
それでは,【学部リスト】を教員数の昇順で並べ替えます.
sqlite> select * from 学部リスト order by 教員数;
学部|キャンパス|教員数
人文学部|春日井|20
国際関係学部|名古屋|25
工学部|春日井|30
次に,【学部リスト」を教員数の降順で並べ替えます.
sqlite> select * from 学部リスト order by 教員数 DESC;
学部|キャンパス|教員数
工学部|春日井|30
国際関係学部|名古屋|25
人文学部|春日井|20
合計や平均の計算
SELECT文で取得したレコードに対し, 合計や平均などの関数を適用することができます. 合計は$SUM(属性名)$,平均は$AVG(属性名)$,件数は$COUNT(属性名)$と記述します.
それでは,【商品リスト】の売値の合計を計算してみましょう.
sqlite> select sum(売値) from 商品リスト;
sum(売値)
217000
次に,【商品リスト】の売値の平均を計算してみましょう.
sqlite> select avg(売値) from 商品リスト;
avg(売値)
43400.0
最後に,【商品リスト】のレコード件数を求めてみましょう.
sqlite> select count(*) from 商品リスト;
5
正規表現
正規表現を利用した検索条件を設定することが出来ます. 正規表現は GLOB句 を用いて表現します.
文字 | 説明 |
---|---|
* | 任意の0文字以上からなる文字列 |
? | 任意の1文字 |
[abc] | a,b,cのいずれかに一致 |
[a-d] | aからdのいずれかに一致 |
[1-4] | 1から4のいずれかに一致 |
/* WHERE句 */
SELECT 属性名 FROM テーブル名 WHERE 属性名(条件) GLOB 正規表現;
それでは,学籍番号がAから始まるレコードを正規表現で検索してみましょう. 正規表現は A* と表します.
sqlite> select * from 学生リスト where 学籍番号 glob "A*";
学籍番号|氏名|学年|学部|よみがな
A001|岩城隼人|2|工学部|いわきはやと
A002|岩村優|1|工学部|いわむらゆう
課題4
【学生リスト】から,正規表現を用いて,氏名が"岩"から始まるレコードを取得しなさい, また,同様に1年生〜2年生のレコードを取得しなさい. また,その出力結果を提出しなさい.
テーブルのバックアップ
作成したテーブルをファイルにバックアップするには,.backup
を用います.
バックアップするファイル名は db3.sqlite としましょう.
sqlite> .backup db3.sqlite