---
# System prepended metadata

title: データベース基礎演習(1/3)

---

# データベース基礎演習(1/3)

WEBアプリケーションの開発を行う場合、JavaやC#などの汎用プログラム言語によるプログラム開発と、SQLを用いたデータベース設定・操作をどちらも行っていかなくてはなりません。

SQLによる操作は直感に反することが多く、初学者が正しく理解していくためには実例の体験が重要です。この基礎演習では、ターミナルの操作で直接SQLによる操作を体験してもらい、今後の学習の一助とすることを目的としています。

## ターミナルへの接続

演習ではブラウザからlinuxサーバに接続して操作を行います。
edgeまたはchromeを立ち上げ、urlに`http://app.sofia3dd.net`を入力してください。

`login:`と表示されるので、キーボードからユーザーIDを入力して`enter`キーを押してください。続けて、`Passwqord:`と表示されるので続けてパスワードを入力してください。
ユーザーIDとパスワードは講師から通知されます。

以下のような画面が表示されたら成功です。
この`$`で終わる行をプロンプトと呼びます。

```
1bd3c44dac78 login: [ユーザー名] 
Password: [パスワード]                 
..省略..
eban@1bd3c44dac78:~$        
```

## ターミナル画面の操作

何か不具合が発生してやり直したくなった場合、ブラウザのリロードボタンを
おすか、`ctrl+r`キーを押して画面の再読み込みを行ってください。

再度ログイン画面になるか、中央に白いボタンで`CONNECT`と表示されるので
それを押してください。ログイン直後からやり直すことができます。

## ターミナル画面の設定

画面上で右クリックを押すと、設定メニューを表示させることができます。

現在、`Normal`にチェックマークがついていますが、`Reverse`を選択してみましょう。
画面が黒字に白文字に変更されました。

## その他の注意

文字を入力をする際に日本語入力モードになっていると思わぬ挙動になることがあります。
慌てずに英数モードに切り替えるか、再読み込みをしましょう。

## linuxの基本的なコマンド

英文字でコマンド文字列を入力して、エンターキーを押すことにより、
コマンドを実行することができます。

`[enter]`はエンターキーを押すことを表します。以降の説明では省略します。
`$`の後ろをキーボードで入力してください。

```bash
$ whoami[enter]
[ユーザー名]
$ pwd[enter]
/home/guest
```

`whoami`は現在のユーザーを表示します。
`pwd`は現在のディレクトリを表示します。

これ以外にも以下のリンク先にあるような様々なコマンドを利用することができます。
[http://www.multi.k.u-tokyo.ac.jp/lectures/pukiwiki/index.php?Linux%E5%85%A5%E9%96%80](http://www.multi.k.u-tokyo.ac.jp/lectures/pukiwiki/index.php?Linux%E5%85%A5%E9%96%80)


## ユーザーIDの作成

演習に使用する自分のIDを作成します。

```bash=
$ sudo adduser [新しいユーザー名]
[sudo] password for [現在のユーザー名]:
```

現在のユーザーのパスワードを入力します。
ユーザーが作成された後、新しいユーザー用のパスワードの入力が
求められますので、同じものを2回入力します。

```bash
Enter new UNIX password:
Retype new UNIX password:
```

追加情報の入力が5回求められますが、すべて`enter`で構いません。
最後に確認を求められるので、yを押して`enter`キーを押します。

```
    Full Name[]:
    ...
    Other []:
Is the information correct? [Y/n]

$ exit
```

`exit`コマンドでログオフします。
画面中央に`Connect`のボタンが表示されるので、クリックして新しく
作成したユーザーでログインします。

新しいユーザーでログインしているか、コマンドで確認してみましょう。

```
$ whoami
[新しいユーザー]
$ pwd
/home/[新しいユーザー]
$ cat /etc/passwd
...ユーザーの一覧
```

## データベースの作成と接続

SQLiteというデータベースを使用してSQLの操作を練習します。
非常に簡易な構成ながら、基本的なSQLは全て実行できるため学習に適しています。

データベースを新規に作成するには次のように入力します。

`sqlite3 [データベース名]`

例として`my.db`という名前のデータベースを作成します。ターミナルで次の操作を行います。

```
$ sqlite3 my.db
SQLite version 3.27.2 2021-04-04 07:07:07
Enter ".help" for usage hints.
sqlite>
```

`sqlite>`というプロンプトが表示されるので、`.help`などピリオドで始まる操作用のコマンドか、SQLを入力します。

`.tables`コマンドでテーブルの一覧を表示できます。先頭がピリオドで始まるコマンドは、先頭の一部分を入力しても実行できるので、`.ta`でも同じことができます。現在は何も表示されません。


## テーブルの作成

新規にテーブルを作成するには、`create table`文を使用します。
簡単なテーブルを例に取って、操作を一通り行ってみましょう。
これは古書店用の書籍管理テーブルです。

```
sqlite> create table book (title);
sqlite> .tables
book
```

SQL文の末尾には;が必要です。入力を漏らした場合、`...>`が表示されます。
`;`を入力して`enter`することにより実行できます。

## レコードの登録と参照

テーブルに登録されるデータ1行をレコードと呼びます。
レコードの追加は`insert into`文を使用します。

```
sqlite> insert into book(title) values("book of inu");
sqlite> insert into book(title) values("manual of neko");
sqlite> insert into book(title) values("manual of neko");
```

"manual of neko"は2冊在庫があります。

同じコマンドを繰り返す場合、ヒストリ機能が利用できます。
上矢印を何回か押すと、過去の入力がコンソールに表示されるので、
そのまま`enter`を押すか、修正して実行できます。

レコードの参照は`select`文を使用します。

```
sqlite> select * from book;
book of inu
manual of neko
manual of neko
```

また`.head on`コマンドでカラム名を表示できます。

```
> .head on
> select * from book;
title
book of inu
manual of neko
manual of neko
```

## テーブルの変更

価格（price）のカラムを追加してみましょう。テーブルの変更は`alter table`コマンドを利用します。`default`制約を利用して、価格は標準の1000円とします。

```
> alter table book add column price default 1000;
> select * from book;
title|price
book of inu|1000
manual of nako|1000
manual of nako|1000
```

## レコードの更新

"book of inu"は状態が良いため価格を2000円に変更します。レコードの更新は`update`コマンドを利用します。更新する対象は`where`句で指定します。

```
> update book set price = 2000 where title = "book of inu";
> select * from book;
title|price
book of inu|2000
manual of nako|1000
manual of nako|1000
```

次に、"manual of neko"のうちの1冊は状態が悪く、価格を500円に変更したいと思いました。在庫の2冊を見分ける方法がありませんが、`update`は先頭の1レコードのみ更新してくれないでしょうか。

```
> update book set price = 500 where title = "manual of neko";
> select * from book;
title|price
book of inu|2000
manual of nako|500
manual of nako|500
```

"manual of neko"の金額がどちらも更新されてしまいました。`update`文は条件に合致したレコードをすべて更新するので注意が必要です。特に、`where`句が無い場合、テーブル内のすべてのレコードが更新されます。

## 主キー

レコードを区別するため、主キーと呼ばれる番号を付与すると便利です。主キーは省略不可能で（NULLでない）重複を許さない値です。主キーが分かれば、"manual of neko"のようなレコードを必ず区別することができます。

`alter table`で主キーを追加してみましょう。

```
> alter table book add id primary key;
Error: Cannot add a PRIMARY KEY column
```

エラーになってしまいました。
主キーはテーブルの構造と密接に関係しており、あとから追加することができません。

主キーを持つ一時的なテーブルを作成し、データを移したのち、元のテーブルを削除し、
新しいテーブルの名前を変更する方法で実現できます。
一つ一つやっていきましょう。

## 主キーを持つテーブルの作成

主キーを持つ新しいテーブルを作成しましょう。
`;`を入力するまで、`enter`を押しても完了しないため、
以下のように何行かに分割して入力することができます。

```
> create table newbook (
  id integer not null primary key autoincrement,
  title text not null,
  price integer default 1000);
```

いくつか新しいキーワードが出ています。`not null`は入力必須項目を表し、`autoincrement`は数字の連番を自動的に付与することを表します。

## テーブル間のデータの移動

`book`テーブルから`newbook`テーブルにレコードをコピーします。`insert into ~ select`構文を利用します。

```
> insert into newbook(title,price) select * from book;
> select * from newbook;
id|title|price
1|book of inu|2000
2|manual of neko|1000
3|manual of neko|1000
```

無事レコードがコピーされ、2冊の"manual of neko"にも異なる番号（＝主キー）が割り当てられました。

## テーブルの削除

主キーを持たないテーブル`book`を削除します。削除には`drop table`構文を使用します。

```
> .tables
book newbook
> drop table book;
> .tables
newbook
```

## テーブルの名称変更

`newbook`テーブルの名前を`book`に変更します。`alter table ~ rename to`構文を使用します。

```
> alter table newbook rename to book;
> .tables
book
```

## 特定レコードの値の更新

同じ主キーを持つレコードは1レコードであることが保証されます。そのため、`update`文の`where`句で主キーの条件を使用した場合、更新されるのは必ず1レコードのみになります。

ID=3の金額を500円に変更しましょう。

```
> update book set price = 500 where id = 3;
> select + from book;
id|title|price
1|book of inu|2000
2|manual of neko|1000
3|manual of neko|500
```

[次へ](https://hackmd.io/@tamura2004/ryy_WbDBO)