SQL sample (for sqlite3)
#
# sqlite3 testdb
#
.echo ON
.header ON
.mode column
.width 14 14 14 14 14 14 14 14 14 14
#
# 準備作業(テーブル削除)
#
DROP TABLE t_syain;
DROP TABLE t_syozoku;
DROP TABLE t_tel;
DROP TABLE t_tmp;
#
# 準備作業(テーブル作成:社員テーブル)
#
CREATE TABLE t_syain (
id CHAR(6) PRIMARY KEY, # 社員コード
name CHAR(10), # 氏名
section CHAR(10), # 所属コード
start CHAR(7), # 採用日
end CHAR(7), # 退職日
age INT # 年齢
);
CREATE INDEX i_t_syain_name on t_syain(name);
CREATE INDEX i_t_syain_section on t_syain(section);
#
# 準備作業(テーブル作成:所属テーブル)
#
CREATE TABLE t_syozoku (
section CHAR(10) PRIMARY KEY, # 所属コード
name CHAR(14) # 所属名称
);
CREATE UNIQUE INDEX i_t_syozoku on t_syozoku(name);
#
# 準備作業(テーブル作成:電話番号テーブル)
#
CREATE TABLE t_tel (
tel CHAR(15), # 電話番号
section CHAR(10), # 所属コード
biko CHAR(10), # 備考
PRIMARY KEY (tel, section)
);
#
# 準備作業(データ追加:社員テーブル)
#
INSERT INTO t_syain VALUES(003303,'Yamada',123430000,3470401,9999999,58);
INSERT INTO t_syain VALUES(004197,'Suzuki',123430000,3490501,9999999,54);
INSERT INTO t_syain VALUES(004984,'Nakamura',123430000,3570401,9999999,43);
INSERT INTO t_syain VALUES(005222,'Yokoyama',123430000,3620401,9999999,42);
INSERT INTO t_syain VALUES(005390,'Ito',999999999,4040401,9999999,40);
#
# 準備作業(データ追加:所属テーブル)
#
INSERT INTO t_syozoku VALUES(123400000,'営業第1部');
INSERT INTO t_syozoku VALUES(123410000,'営業1課');
INSERT INTO t_syozoku VALUES(123420000,'営業2課');
INSERT INTO t_syozoku VALUES(123430000,'営業3課');
#
# 準備作業(データ追加:電話番号テーブル)
#
INSERT INTO t_tel VALUES('987-654-7322',123400000,'代表');
INSERT INTO t_tel VALUES('987-654-7322',123410000,'代表');
INSERT INTO t_tel VALUES('987-654-7170',123420000,'代表');
INSERT INTO t_tel VALUES('987-654-7343',123430000,'代表');
INSERT INTO t_tel VALUES('987-654-7354',123430000,'Aグループ');
INSERT INTO t_tel VALUES('987-654-7341',123430000,'Bグループ');
INSERT INTO t_tel VALUES('987-654-7346',123430000,'Cグループ');
INSERT INTO t_tel VALUES('987-654-7344',123430000,'課長');
INSERT INTO t_tel VALUES('987-654-9999',888888888,'');
#
# 検索1(項目指定で、全件検索)
#
# 社員テーブルの全項目を全件検索する場合。
#
SELECT id, name, section, start, end, age FROM t_syain;
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
003303 Yamada 123430000 3470401 9999999 58
004197 Suzuki 123430000 3490501 9999999 54
004984 Nakamura 123430000 3570401 9999999 43
005222 Yokoyama 123430000 3620401 9999999 42
005390 Ito 999999999 4040401 9999999 40
#
# 検索2(項目指定を楽して、全件検索)
#
# 社員テーブルの全項目を全件検索する場合2。
#
SELECT * FROM t_syain;
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
003303 Yamada 123430000 3470401 9999999 58
004197 Suzuki 123430000 3490501 9999999 54
004984 Nakamura 123430000 3570401 9999999 43
005222 Yokoyama 123430000 3620401 9999999 42
005390 Ito 999999999 4040401 9999999 40
#
# 検索3
#
SELECT section FROM t_syain;
section
----------
123430000
123430000
123430000
123430000
999999999
#
# 検索4(同一レコードを1つにまとめる)
#
# 社員テーブルの所属コードを重複データは1件にまとめて検索する場合。
#
SELECT DISTINCT section FROM t_syain;
section
----------
123430000
999999999
#
# 検索5(検索条件:完全一致で検索)
#
# 社員テーブルから 'Nakamura' さんの全項目を検索する場合。
#
SELECT * FROM t_syain WHERE name = 'Nakamura';
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
004984 Nakamura 123430000 3570401 9999999 43
#
# 検索6(検索条件:部分一致で検索)
#
# 社員テーブルから氏名が 'Y' で始まる人の全項目を検索する場合。
#
SELECT * FROM t_syain WHERE name LIKE 'Y%';
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
003303 Yamada 123430000 3470401 9999999 58
005222 Yokoyama 123430000 3620401 9999999 42
#
# 検索7(検索条件:かつ条件で検索)
#
# 社員テーブルから氏名が 'Y' で始まり、かつ、採用が昭和50年より前の人の
# 全項目を検索する場合。
#
SELECT * FROM t_syain WHERE name LIKE 'Y%' AND start < '3500000';
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
003303 Yamada 123430000 3470401 9999999 58
#
# 検索8(検索条件:または条件で検索)
#
# 社員テーブルから氏名が 'Y' で始まるか、または、採用が昭和50年より前の人の
# 全項目を検索する場合。
#
SELECT * FROM t_syain WHERE name LIKE 'Y%' OR start < '3500000';
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
003303 Yamada 123430000 3470401 9999999 58
004197 Suzuki 123430000 3490501 9999999 54
005222 Yokoyama 123430000 3620401 9999999 42
#
# 検索9(並び換え:昇順で検索)
#
# 社員テーブルの全項目を所属コードの昇順に全件検索する場合。
#
SELECT * FROM t_syain ORDER BY section ASC;
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
005222 Yokoyama 123430000 3620401 9999999 42
004984 Nakamura 123430000 3570401 9999999 43
004197 Suzuki 123430000 3490501 9999999 54
003303 Yamada 123430000 3470401 9999999 58
005390 Ito 999999999 4040401 9999999 40
#
# 検索10(並び換え:降順、昇順とりまぜて検索)
#
# 社員テーブルの全項目を所属コードの降順、採用日の昇順に全件検索する場合。
#
SELECT * FROM t_syain ORDER BY section DESC, start ASC;
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
005390 Ito 999999999 4040401 9999999 40
003303 Yamada 123430000 3470401 9999999 58
004197 Suzuki 123430000 3490501 9999999 54
004984 Nakamura 123430000 3570401 9999999 43
005222 Yokoyama 123430000 3620401 9999999 42
#
# 検索11(突き合わせ条件:一致のみで検索)
#
# 社員テーブルの全項目に所属テーブルから所属名称をくっつけて検索する場合。
#
SELECT t_syain.*, t_syozoku.name FROM t_syain, t_syozoku ON t_syain.section = t_syozoku.section;
t_syain.id t_syain.name t_syain.section t_syain.start t_syain.end t_syain.age t_syozoku.name
------------ -------------- ----------------- --------------- ------------- ------------- --------------
003303 Yamada 123430000 3470401 9999999 58 営業3課
004197 Suzuki 123430000 3490501 9999999 54 営業3課
004984 Nakamura 123430000 3570401 9999999 43 営業3課
005222 Yokoyama 123430000 3620401 9999999 42 営業3課
#
# 検索12(突き合わせ条件:一致、不一致合わせて検索)
#
# 社員テーブルの全項目に所属テーブルから所属名称をくっつけて全件検索する場合。
#
SELECT t_syain.*, t_syozoku.name FROM t_syain LEFT JOIN t_syozoku ON t_syain.section = t_syozoku.section;
t_syain.id t_syain.name t_syain.section t_syain.start t_syain.end t_syain.age t_syozoku.name
------------ -------------- ----------------- --------------- ------------- ------------- --------------
003303 Yamada 123430000 3470401 9999999 58 営業3課
004197 Suzuki 123430000 3490501 9999999 54 営業3課
004984 Nakamura 123430000 3570401 9999999 43 営業3課
005222 Yokoyama 123430000 3620401 9999999 42 営業3課
005390 Ito 999999999 4040401 9999999 40
#
# 検索13(突き合わせ+検索条件+並び換え)
#
# 社員テーブルの全項目に所属テーブルから所属名称をくっつけて、採用日が昭和50年より前のデータを
# 社員コードの降順に検索する場合。
#
SELECT t_syain.*, t_syozoku.name FROM t_syain LEFT JOIN t_syozoku ON t_syain.section = t_syozoku.section WHERE t_syain.start < '3500000' OR
DER BY t_syain.id DESC;
t_syain.id t_syain.name t_syain.section t_syain.start t_syain.end t_syain.age t_syozoku.name
------------ -------------- ----------------- --------------- ------------- ------------- --------------
004197 Suzuki 123430000 3490501 9999999 54 営業3課
003303 Yamada 123430000 3470401 9999999 58 営業3課
#
# 検索14(複数テーブルの突き合わせ:社員テーブル←所属テーブル、社員テーブル←電話番号テーブル)
#
# 社員テーブルの全項目に所属テーブルから所属名称を、電話番号テーブルから電話番号と備考をくっつけて、
# 採用日が昭和50年より前のデータを社員コードの降順に検索する場合。
#
SELECT t_syain.*, t_syozoku.name, t_tel.tel, t_tel.biko FROM t_syain LEFT JOIN t_syozoku ON t_syain.section = t_syozoku.section left join t_tel
ON t_syain.section = t_tel.section WHERE t_syain.start < '3500000' ORDER BY t_syain.id DESC;
t_syain.id t_syain.name t_syain.section t_syain.start t_syain.end t_syain.age t_syozoku.name t_tel.tel t_tel.biko
------------ -------------- ----------------- --------------- ------------- ------------- -------------- ------------ ----------
004197 Suzuki 123430000 3490501 9999999 54 営業3課 987-654-7343 代表
004197 Suzuki 123430000 3490501 9999999 54 営業3課 987-654-7354 Aグループ
004197 Suzuki 123430000 3490501 9999999 54 営業3課 987-654-7341 Bグループ
004197 Suzuki 123430000 3490501 9999999 54 営業3課 987-654-7346 Cグループ
004197 Suzuki 123430000 3490501 9999999 54 営業3課 987-654-7344 課長
003303 Yamada 123430000 3470401 9999999 58 営業3課 987-654-7343 代表
003303 Yamada 123430000 3470401 9999999 58 営業3課 987-654-7354 Aグループ
003303 Yamada 123430000 3470401 9999999 58 営業3課 987-654-7341 Bグループ
003303 Yamada 123430000 3470401 9999999 58 営業3課 987-654-7346 Cグループ
003303 Yamada 123430000 3470401 9999999 58 営業3課 987-654-7344 課長
#
# 検索15(サブセレクト:検索結果を別の検索の検索条件にする...)
#
# 氏名が 'Y' で始まる社員が所属する職場の電話番号、所属コード、備考を電話番号テーブルから検索する。
#
SELECT * FROM t_tel WHERE section IN (SELECT section FROM t_syain WHERE name LIKE 'Y%');
tel section biko
------------ ---------- ----------
987-654-7343 123430000 代表
987-654-7354 123430000 Aグループ
987-654-7341 123430000 Bグループ
987-654-7346 123430000 Cグループ
987-654-7344 123430000 課長
#
# 検索16(集計)
#
# 社員テーブルを所属コードごとに集計し、所属コード、件数、最大年齢、最小年齢、平均年齢、年齢合計
# を表示する。またその際に最大年齢の見出しを 'saidai' に変更する。
#
SELECT section, COUNT(*), MAX(age) AS saidai, MIN(age), AVG(age), SUM(age) FROM t_syain GROUP BY section;
section COUNT(*) saidai MIN(age) AVG(age) SUM(age)
-------------- -------------- -------------- -------------- -------------- --------------
123430000 4 58 42 49.25 197
999999999 1 40 40 40 40
#
# 検索17(集計:条件付)
#
# 社員テーブルを所属コードごとに集計し、件数が1件より多い集計行に関して、所属コード、件数、最大年齢、
# 最小年齢、平均年齢、年齢合計を表示する。またその際に最大年齢の見出しを 'saidai' に変更する。
#
SELECT section, COUNT(*), MAX(age) AS saidai, MIN(age), AVG(age), SUM(age) FROM t_syain GROUP BY section HAVING COUNT(*) > 1;
section COUNT(*) saidai MIN(age) AVG(age) SUM(age)
-------------- -------------- -------------- -------------- -------------- --------------
123430000 4 58 42 49.25 197
#
# 追加1(テーブルに定義された全ての項目の値を指定して追加)
#
# 社員テーブルに全項目を指定してデータを追加する場合。
#
INSERT INTO t_syain VALUES(111111,'Ichiro',123430000,4170401,9999999,12);
#
# 追加2(一部の項目を指定して追加)
#
# 社員テーブルに社員コード、氏名を指定してデータを追加する場合。
#
INSERT INTO t_syain (id, name) VALUES(222222,'Jiro');
INSERT INTO t_syain (id, name) VALUES(333333,'Saburo');
INSERT INTO t_syain (id, name) VALUES(444444,'shiro');
INSERT INTO t_syain (id, name) VALUES(555555,'Goro');
#
# 確認
#
SELECT * FROM t_syain WHERE id >= '111111';
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
111111 Ichiro 123430000 4170401 9999999 12
222222 Jiro
333333 Saburo
444444 shiro
555555 Goro
#
# 追加3の準備
#
CREATE TABLE t_tmp (
id CHAR(6) PRIMARY KEY,
name CHAR(10),
section CHAR(10)
);
#
# 追加3(テーブルから検索したデータを別のテーブルに追加)
#
# 社員テーブルから社員コード、氏名、所属コードを社員コードが '111111' 未満で検索し、
# その結果を一時テーブル(t_tmp)に追加する場合。
#
INSERT INTO t_tmp (id, name, section) SELECT id, name, section FROM t_syain WHERE id < '111111';
#
# 確認
#
SELECT * FROM t_tmp;
id name section
---------- ---------- ----------
003303 Yamada 123430000
004197 Suzuki 123430000
004984 Nakamura 123430000
005222 Yokoyama 123430000
005390 Ito 999999999
#
# 後始末
#
DROP TABLE t_tmp;
#
# 更新1(検索条件、値を指定しての更新)
#
# 社員コードが '222222' の社員の所属コード、採用日、退職日、年齢を更新する場合。
#
UPDATE t_syain SET section='123430000', start='4170401', end='9999999', age=22 WHERE id='222222';
#
# 確認
#
SELECT * FROM t_syain WHERE id = '222222';
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
222222 Jiro 123430000 4170401 9999999 22
#
# 更新2(検索条件、式を指定しての更新)
#
# 社員コードが '111111' の社員の年齢を10才進める場合。
#
UPDATE t_syain SET age = age + 10 WHERE id='111111';
#
# 確認
#
SELECT * FROM t_syain WHERE id = '111111';
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
111111 Ichiro 123430000 4170401 9999999 22
#
# 更新3(対象レコードが複数でもOK)
#
# 社員コードが '333333' 以上の社員の所属コード、採用日、退職日を更新する場合。
#
UPDATE t_syain SET section='123430000', start='4170401', end='9999999' WHERE id >= '333333';
#
# 確認
#
SELECT * FROM t_syain WHERE id >= '333333';
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
333333 Saburo 123430000 4170401 9999999
444444 shiro 123430000 4170401 9999999
555555 Goro 123430000 4170401 9999999
#
# 削除1(検索条件を指定して削除)
#
# 社員コードが '444444' 以上の社員データを削除する場合。
#
DELETE FROM t_syain WHERE id >= '444444';
#
# 確認
#
SELECT * FROM t_syain WHERE id >= '111111';
id name section start end age
---------- ---------- ---------- ---------- ---------- ----------
111111 Ichiro 123430000 4170401 9999999 22
222222 Jiro 123430000 4170401 9999999 22
333333 Saburo 123430000 4170401 9999999
.exit
[更新]
[戻る]
m-ito@myh.no-ip.org