第11章. SQL によるデータベースの操作

ネットワークプログラミング論 平成 27 年 12 月 14 日
第11章.SQL によるデータベースの操作
【学習のねらい】
① SQL を用いて、データベースの編集(挿入・変更・削除)や検索などを行う方法を学
習する。
② Java アプリケーションから SQL を用いてデータベース編集・検索を行う方法を学習
する。
<先週の復習>
講義で示された【基礎課題 11-1】に解答して下さい。
11-1.SQL によるデータベースの基本操作
SQL(Structured Query Language)はリレーショナルデータベースの操作を行うため
の言語の一種です。ここでは、SQL を使ってデータベースの作成や編集などの基本操作を
行う方法を学習します。
最初に次の MySQL サービスの起動確認を行ってから【基礎課題 11-2】を行ってくださ
い。
<My SQL サービスの起動・停止>
① MySQL が Windows サービスとして起動しているかどうかを確認します。これが停止
していると MySQL を使用できないからです。
Windows7 の場合、「スタート」→「コンピュータ」メニューを右クリックし下のよう
に「管理」を選択してください。
Windows8 の場合、画面左下隅を、マウスを右クリック
してください。そこで現れる「管理メニュー」から右の
ように「コンピュータの管理」を選択します。
② 次の「コンピュータの管理」画面で「サービスとアプリケーション」を選択します。
153
ネットワークプログラミング論 平成 27 年 12 月 14 日
③ 次の画面で「サービス」を選択します。
④ すると、Windows サービスのリストが表示されるので、その中から「MySQL57」を
選択します。
⑤ 次の画面で、
[開始]を選択します。すでに開始となっている場合はこの画面を閉じて
結構です。
なお、MySQL サービスを停止
する場合は、ここで[停止]
を選択します。パソコンに余
計な負荷をかけないようにす
るため、MySQL を使用しない
場合は、停止させておいた方
が良いです。
154
ネットワークプログラミング論 平成 27 年 12 月 14 日
【基礎課題 11-2】
データベースおよびテーブル(表)の作成
① 【基礎課題 10-2】でやった要領で MySQL を起動してください。起動後、次のように
「create database SampleDB;」と入力して[Enter]キーを押してください(大
文字小文字の個別はありません)。
「create database データベース名;」の形で指定したデータベースを作成するこ
とができます。
② きちんと作成できたかどうかを確認するために、次のように「show databases;」
を入力し[Enter]キーを押してください。すると、今作成したデータベースがリス
トに表示されているはずです。これから、このデータベース「sampleDB」の中にテー
ブル(表)を作成します。
③ 次に(これからの)操作対象となるデータベースを「sampledb」に指定します。
「use
sampldb;」と入力して[Enter]キーを押してください。
④ 続いて次のように入力してテーブル(表)を作成します。
改行しながら 1 行ずつ入力する。
155
ネットワークプログラミング論 平成 27 年 12 月 14 日
※ もしタイプミスなどにより途中で誤って入力した場合は、
「¥c」を入力して[Enter]
キーを押すと、入力が取り消されます。そこで、もう一度最初から入力をやり直
してください。
これにより次のような形のテーブル(の枠組み)が作成されます。
ID
Name
Money
Integer(整数型)
Varchar(100)(文字型:100 文字) Integer(整数型)
口座番号 主キー
氏名
預金額
・・・
・・・
・・・
主キーとは、レコード(表の 1 行分)を特定するためのキーで、これにより表の中で
重複するレコードがないようにします。
⑤ 作成したテーブルを確認してみましょう。「show tables;」と入力して[Enter]キ
ーを入力してください。すると次ページのように「account」が存在している事が分か
ります。
⑤の結果を確認できたら、
「
「sampledb」というデータベース内に「account」というテー
ブルを作成しました。
」と記述して提出してください。
【基礎課題 11-3】
レコードの追加と全件検索
上で作成したテーブルはまだ空っぽの状態です。そこで、このテーブルにレコードを追
加しましょう。
① 次のように「insert into account values(1,’伊達直人’,10000);」と入力
し、
[Enter]キーを押してください。
一般に「insert into テーブル名 values(列1の値,列2の値,・・・);」の形で、
指定したテーブルに、レコード(1行分のデータ)を入力することができます。上の
例では、「ID=1、Name=’伊達直人’、Money=10000」が1行目のデータとして入力さ
れたことになります。
156
ネットワークプログラミング論 平成 27 年 12 月 14 日
② 続いて次の通りレコードを追加してください
(命令を 2 行分入力しています)
。これで、
3 レコード(3 行)になりました。
③ ここで、テーブルのデータを確認しましょう。「select * from account;」と入
力し[Enter]キーを押してください。次のように表示されます。
一般に「select * from テーブル名;」の形で、当該テーブルの全レコードが取り
出され表示されます。
③の表示を確認できたら、
「テーブル「account」に3つのレコードを追加しました。
」と
記述して提出してください。
【基礎課題 11-4】
部分検索(条件検索)
上の③では、テーブル内のレコードを全て取り出しましたが、今度は一部分、あるいは
条件を満たすものだけを抽出してみましょう。
① 特定の列の値のみを取り出しましょう。次のように「select Name from account;」
と入力し[Enter]キーを押してください。すると Name 欄のみが表示されます。
157
ネットワークプログラミング論 平成 27 年 12 月 14 日
② 今度は Name 欄と Money 欄を抽出しましょう。「 select Name,Money from
account;」と入力し[Enter]キーを押してください。このように、select 文を使
えば指定した列を取り出すことができます。
③ 今度は、ある条件を満たすレコードのみを取り出してみましょう。各結果を確認して
ください。
<完全一致>「select * from account where Name=’鮎原こずえ’;」
<前方一致>「select * from account where Name like ’鮎原%’;」
「鮎原・・・」という名前のレコードを抽出。
158
ネットワークプログラミング論 平成 27 年 12 月 14 日
<後方一致>「select * from account where Name like ’%こずえ’;」
「・・・こずえ」という名前のレコードを抽出。
<部分一致>「select * from account where Name like ’%原%’;」
氏名に「原」と言う文字が含まれるレコードを抽出。
<大小の条件>「select * from account where Money>10000;」
預金額が 10000 円を超えるレコードを抽出。
上の検索結果を確認できたら、
「完全一致、前方一致、後方一致、部分一致、大小の条件
による検索結果を確認しました。
」と記述して提出してください。
【基礎課題 11-5】
データの更新
今度はテーブルの中のデータを更新してみましょう。
① Money(預金額)を 1000 に変更します。「update account set Money=1000;」
と入力し、
[Enter]キーを押してください。
159
ネットワークプログラミング論 平成 27 年 12 月 14 日
一般に「update テーブル名 set 列 1=値 1, 列 2=値 2,・・・;」の形で、指定した
列の値を変更できます。
② ここで「select * from account;」を入力して[Enter]キーを押すと次のよう
に、Money 欄の変更を確認できます。
③ 次に「ID=3」の人のみの預金額を変更してみましょう。「 update account set
Money=2000 where ID=3;」と入力して[Enter]キーを押してください。
④ 変更を確認してみましょう。「 select * from account;」と入力し[Enter]キ
ーを押すと、次ページのように、ID=3(鮎原こずえ)の Money が 2000 に変わってい
ることを確認できます。
上の結果を確認できたら、
「update 文を使って、テーブル内のデータを変更できることを
確認しました。
」と記述して提出してください。
160
ネットワークプログラミング論 平成 27 年 12 月 14 日
【基礎課題 11-6】
レコードの削除
最後に、レコードの削除の仕方を確認しましょう。
① 「delete from account where Name=’鮎原こずえ’;」と入力して[Enter]
キーを押してください。これにより、「鮎原こずえ」さんのレコードが削除されます。
② その後、
「select * from account;」と入力し、
[Enter]キーを押してください。
すると、下のように「鮎原こずえ」さんのレコードが削除されていることを確認でき
ます。
削除できたことを確認したら「delete 文により、レコードを削除できることを確認しま
した。
」と記述して提出してください。
161
ネットワークプログラミング論 平成 27 年 12 月 14 日
11-2.Java プログラムからのデータベース操作
上で作成したデータベース「sampledb」内のテーブル「account」に対する(SQL を用
いた)操作を、Java アプリケーションから行いましょう。
① 10-3 節で作成した DBManager.java を次のように修正してください。修正箇所は下線
部で示した通り、接続するデータベースを「sampledb」に変更した部分のみです。
<DBManager.java>
package dbsample;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBManager {
10-1 節 で 指 定 し た
public static Connection getConnection() {
try{
MySQL のパスワード
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(
"jdbc:mysql://localhost/sampledb","root","*****" );
return con;
修正部分
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
public static void main(String[] args) throws Exception {
Connection con=getConnection();
System.out.println("con="+con);
con.close();
}
}
② パッケージ「dbsample」内に、新しいクラスをクラス
名「DBOperate.java」として作成してください。
162
ネットワークプログラミング論 平成 27 年 12 月 14 日
③ 「DBOperate.java」を次のように作成してください。これは、テーブル「account」
内のデータをコンソール画面に表示するプログラムです。
<DBOperate.java>
package dbsample;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBOperate {
public static void main(String[] args) throws Exception{
① Connection con =DBManager.getConnection();
② Statement smt=con.createStatement();
String sql;
sql="select * from account";
③ ResultSet rs= smt.executeQuery(sql);
④ while(rs.next()) {
⑤
System.out.println("ID="+rs.getInt("ID")
+", 氏名="+rs.getString("Name")
+", 貯蓄額="+rs.getInt("Money") );
}
⑥ smt.close();
con.close();
※ ①などの番号部分に対する説明は、下の解説参照
}
}
④ 作成したこのプログラムを実行してください。コンソール画面に次のように、テーブ
ル「account」の全レコード(今の場合 2 件)が表示されます。
【解説】
① この部分で、データベース「sampledb」に接続した Connection オブジェクトを取得
する。データベースの利用は、当該データベースに接続した Connection オブジェクト
を得ることから始まる。
② 当該 Connection オブジェクト
(ここでは con)にある Statement オブジェクトを得る。
Statement オブジェクトは SQL 命令を発行する際に必要になる。
③ Statement オブジェクト(ここでは smt)にある executeQuery(SQL 文)メソッドに
163
ネットワークプログラミング論 平成 27 年 12 月 14 日
より、「select」命令を発行することが可能になる。今の場合、「select * from
account」という SQL 文を発行していることになる。
その SQL を(当該データベースに対して)発行した場合の結果が、ResultSet オブジ
ェクトに格納される。今の場合 ResultSet オブジェクト「rs」には、
【基礎課題 11-6】
の②で表示させた結果が格納されていると思えば良い。
④ while(rs.next()) {
・・・
}
の形で、当該 ResultSet オブジェクト内のレコードの数だけ「・・・」部分の処理を行
う。つまり、next()メソッドが実行される毎に表を 1 行ずつ下って行く。
ID
Name
Money
1
伊達直人
1000
2
金田正太郎
1000
ResultSet オブジェ
クト(rs)の中身
⑤ レコード(行)毎に、各列の値を取得している。その値が整数型であれば getInt(“列
名”)、文字列型であれば、getString(“列名”)というように、型に合わせてメソッドを
用いるようになっている。
⑥ Connection オブジェクトを閉じる前に、必ず Statement オブジェクトも閉じなければ
ならない。
【基礎課題 11-7】
上の結果を確認できたら、
「Java アプリケーションからデータベース「sampledb」に接
続し、テーブル「account」内のデータを表示させることができました。」と記述して提出
してください。
【基礎課題 11-8】
データの追加
今度は、テーブルにレコードを追加しましょう。「DBOperatet.java」に次のように点線
枠内を追加してください。
164
ネットワークプログラミング論 平成 27 年 12 月 14 日
<DBOperate.java>
package dbsample;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBOperate {
public static void main(String[] args) throws Exception{
Connection con =DBManager.getConnection();
Statement smt=con.createStatement();
String sql;
sql="insert into account values(3,'早川みどり',3000)";
smt.executeUpdate(sql);
sql="select * from account";
ResultSet rs= smt.executeQuery(sql);
while(rs.next()) {
System.out.println("ID="+rs.getInt("ID")
+", 氏名="+rs.getString("Name")
+", 貯蓄額="+rs.getInt("Money") );
}
smt.close();
con.close();
}
}
【解説】
smt.executeUpdate(sql);
データベースを更新する命令(insert,update,delete など)を含む SQL を発行する場合、
executeUpdate()メソッドを用います。
作成したら実行してください。今度は次のようにコンソールに表示されるはずです。
上の実行結果を確かめたら、
「Java アプリケーションからレコードを追加することができ
ました。
」と記述して提出してください。
165
ネットワークプログラミング論 平成 27 年 12 月 14 日
【基礎課題 11-9】
レコードの修正
今度は、レコードを修正してみましょう。具体的には、結果表示が次のようになるよう
に、3 番目のレコードを修正しましょう。
「DBOperate.java」を次のように修正してください。修正箇所は下線部で示した SQL
文の定義部分です。
<DBOperate.java>
package dbsample;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBOperate {
public static void main(String[] args) throws Exception{
Connection con =DBManager.getConnection();
Statement smt=con.createStatement();
String sql;
sql="update account set Name='金田一耕助', Money=5000 where
ID=3";
smt.executeUpdate(sql);
sql="select * from account";
ResultSet rs= smt.executeQuery(sql);
while(rs.next()) {
System.out.println("ID="+rs.getInt("ID")
+", 氏名="+rs.getString("Name")
+", 貯蓄額="+rs.getInt("Money") );
}
smt.close();
con.close();
}
}
作成し結果を確認したら、
「Java アプリケーションから、レコードを修正することができま
した。
」と記述して提出してください。
166
ネットワークプログラミング論 平成 27 年 12 月 14 日
【応用課題 11-A】
テーブルに、上の【基礎課題 11-9】で示したような 3 名のレコードが格納されている状
態で、DBOperate.java を修正して実行すると次のような結果が表示されました。
このとき、空欄にはどのような SQL が入りますか?それを記述して提出してください。
package dbsample;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBOperate {
public static void main(String[] args) throws Exception{
Connection con =DBManager.getConnection();
Statement smt=con.createStatement();
String sql;
sql="
";
ResultSet rs= smt.executeQuery(sql);
while(rs.next()) {
System.out.println("ID="+rs.getInt("ID")
+", 氏名="+rs.getString("Name")
+", 貯蓄額="+rs.getInt("Money") );
}
smt.close();
con.close();
}
}
167