電脳ヨーグルト

プログラミングの備忘録と私生活を

【入門】PostgreSQLの概要と使い方の基本的なところ

f:id:at25250410:20180619073943p:plain

この記事はデータベースってなんか聞いたことがあるけどイマイチ良くわからないという方に向けて
ざっくりとした説明と、postgreSQLを使って簡単にデータの操作をしてみるといった感じの内容となっております。

なお使用するデータベースのデータは
速水 治夫先生の
リレーショナルデータベースの実践的基礎
を使用しています。

データの提供はしていないので、もし試したかったら自分で作ったり、どこかからとってきてください。

基本的に「こんな流れかぁ~」くらいに流し見して貰う感じで書いています。

データベースとSQL

というかそもそもデータベースとはなにかというと
データベースとはコンピュータによって、書き込みや読み出しを⾏えるように 構成されたデータの集まりです。

ファイルとの違いは、ファイルのあるデータに変更があった場合、同じデータを含むファイルをすべて変更しなければならないのですが、データベースだとデータを一括で管理しているのでデータの管理が簡単になります。

SQLとはざっくりいうとデータベースにアクセスするためのプログラミング言語です。
MySQL PostgreSQL SQLiteなどが有名です。

MySQLもPostgreSQLもSQLiteも基本的に文法はほとんど変わらないのですが
若干違うところもあったりしますので、そこは都度ネットなどで調べたりする必要があります。

標準語と関西弁の違いみたいなものですね。

今回はPosgreSQLを使用します。

Postgresqlについてのまとめ

PostgreSQL(ポストグレスキューエル)は、オープンソースソフトウェアとして開発されている
リレーショナルデータベース管理システム (RDBMS) です。
多機能で高性能な RDBMS であることやライセンスなどの面から、
特に Web システムのバックエンドデータベースを中心として利用が拡大しています。

まあざっくりいうと、無償で誰でも使えてデータベースを操作できる便利なやつです。


  • PostgreSQL は機能性と堅牢性重視
  • MySQL はシンプルでスピード重視

データベース: ⼀連の表を定義,格納する単位


データベースの定義

データベースといえばこの円筒型のアイコンなのですが、
f:id:at25250410:20180619075802p:plain
データベースの定義とは、色々なデータの集合である表(テーブル)をいれるための容器であるこの円筒を作成することです。

CREATE DATABASE データベース名;

【例】
CREATE DATABASE orderdb;

データベースを表示するコマンド

PostgreSQL: ¥list

このコマンドはDBMS に依存

MySQL: show databases;
実行例
f:id:at25250410:20180619064558p:plain


データベースの指定

データベースは何個でも作れます。
例えばA社の情報が詰まったものや、B大学の情報が詰まったものなど
その中で自分が操作したいデータベースを選択するのが以下のコマンドです。

PostgreSQL: ¥connect orderdb

このコマンドもDBMS に依存

MySQL: use orderdb;


データベースの削除

要らなくなったデータベースや間違えて作ったデータベースを消すときのコマンドです。

DROP DATABASE データベース名;

DROP DATABASE orderdb;





表の定義

さて、データベースを作ったらそのデータベースの中に実際のデータを入れるために表(テーブル)を
定義します。

表とテーブルは同じ意味です。

表「CorpT」(会社)を定義します。
CREATE TABLE CorpT (
CorpID CHAR(4) PRIMARYKEY,
CorpName VARCHAR(20) NOT NULL,
CorpAddr VARCHAR(100));

上記を確認するコマンドです。
PostgreSQL: ¥d CorpT
(MySQL: show columns from CorpT;)
f:id:at25250410:20180619064612p:plain

以下同様にOrderT(注文)とDetailTテーブルを定義します。

CREATE TABLE OrderT(
OrderID CHAR(5) PRIMARY KEY,
ODate DATE NOT NULL,
OCorpID CHAR(4) NOT NULLREFERENCES CorpT(CorpID));

ちなみに
PRIMARY KEYはこの場合、「おんなじIDが被っちゃだめだよ~」という制約で
NOT NULLは「NULL文字が入ってたらだめだよ~」という制約です。

PostgreSQL: ¥d OrderT
(MySQL: show columns from OrderT;)
f:id:at25250410:20180619064636p:plain


CREATE TABLE DetailT(
OrderID CHAR(5) NOT NULL REFERENCES OrderT(OrderID),
Item VARCHAR(20) NOT NULL,
Price INTEGERNOT NULL,
Qty INTEGERNOT NULL,
PRIMARY KEY (OrderID, Item));

PostgreSQL: ¥d DetailT
(MySQL: show columns from DetailT;)
f:id:at25250410:20180619064645p:plain





データロード

手動でもテーブルにデータを入れることはできるのですが、
実際の現場ではCSVファイルなどにまとまったデータを読み込んで入れることが多いそうです。

ちまちまデータを入れてたら大変ですしね。

ファイルから表への⼀括挿⼊
⼊⼒にはCSV ファイル(フィールドがコンマで区切られたテキストファイル) がよく⽤いられる

PostgreSQL: ¥copy 表名from 'C:/パス/ファイル名.csv' null 'NULL' csv

表名はテーブル名のことです。

fromのあとに、表に入れたいデータであるcsvファイルのパスを指定します。

パスとは、PC上の住所みたいなもので

f:id:at25250410:20180619071208p:plain

ドキュメントのファイルを右クリックして
プロパティをクリックすると見れます。

f:id:at25250410:20180619071214p:plain



ヘッダー付きのCSV ファイルであれば、最後にheaderを⼊れます。

null 'NULL'の指定は、データ内の⽂字列NULL をNULL として表に挿⼊する ために⽤います。空の⽂字列は、そのまま空の⽂字列として挿⼊されてしまい、 NULL とはなりません。



基本構文

さて、テーブルにデータのセットが
基本的なSQL構文を見ていきましょう。

SELECT{* |列名1,列名2,…,列名n}
FROM表名1[,表名2,…,表名m]
[WHERE探索条件];

【例】
表「DetailT」を全て出⼒したい

SELECT * FROM DetailT;

f:id:at25250410:20180619071432p:plain

*について

(アスタリスク)は全てという意味で、この場合DetailTテーブルの全てのカラム(項目)を表示します。

SELECT item FROM DetailT;
のように書くと、itemの項目だけが表示されます。

また ,  カンマで区切ると複数の項目を出力できます。
f:id:at25250410:20180619082708p:plain


条件指定のWHEREについて

テーブル名の後に書くWHEREですが、WHEREのあとに表示したいデータを絞るための検索条件を書くことで、
テーブルにある膨大なデータから任意のデータにアクセスできます。

【例】
「注⽂明細」で商品名が「パソコン」である注⽂の情報を知りたい

SELECT * FROM DetailT
WHERE Item = 'パソコン';

f:id:at25250410:20180619071854p:plain


【例】
「注⽂明細」で価格が10以下である注⽂の情報を知りたい
SELECT * FROM DetailT WHERE Price <= 10;
f:id:at25250410:20180619072026p:plain

BETWEEN 述語

【例】
⽇付が,2008年5⽉の範囲にある注⽂情報を知りたい
SELECT * FROM OrderT WHERE ODate BETWEEN '2008-05-01' AND '2008-05-31';
OrderTはテーブル名、ODateは項目名(カラム名)です。

f:id:at25250410:20180619072437p:plain

IN述語

【例】
商品名がパソコンかノートパソコンの情報を知りたい

SELECT * FROM DetailT WHERE Item IN ('パソコン', 'ノートパソコン');

以下のように書いてもおなじ出力になります。

SELECT * FROM DetailT WHERE Item = 'パソコン' OR Item = 'ノートパソコン';

f:id:at25250410:20180619073627p:plain

LIKE述語

パーセント「%」は,0個以上の任意⻑の任意⽂字列を表わす
下線「_」は,1個の任意⽂字を表わす

これだけ見てもなんのこっちゃって感じですが、

例えば

第10回AKB48世界選抜総選挙

という文字列があって

LIKE '第10回%';
うしろに%がつくと、文頭に「第10回」とついてれば、後ろの文字列はなんでもいいよっていう意味です。

LIKE '%総選挙';
前に%がつくと、最後が「総選挙」とついてれば、前の文字列はなんでもいいよっていう意味です。

LIKE '%AKB48%'
両側に%がつくと、なんでもいいから「AKB48」が文にはいってる文字列をとってこいという意味です。

LIKE '____'
_ は一文字指定で、どんな文字でもいいのですが、この場合 _ が4つあるので、なんでもいいから4文字のやつ取ってこいという意味になります。


【例】
秦野市にある会社の情報を知りたい.
SELECT * FROM CorpT WHERE CorpAddr LIKE '秦野市%';


f:id:at25250410:20180619073427p:plain

NULL 述語

【例】住所が分からない会社の情報を知りたい
ちなみに
null(ヌル、ナル)は、何もない、という意味で、
プログラミング言語などコンピュータ関係では、「何も示さないもの」を表すのに使われます。

NULLは空白とは区別されています。

SELECT * FROM CorpT WHERE CorpAddr IS NULL;

テーブル名 = NULLとしないように気を付けましょう。

IS NULLです。

f:id:at25250410:20180619073839p:plain


とりあえず、ざっくりとposgreSQLの基礎的な構文を書いたのですが、思ったよりも長くなってしまいました。

今度、もっと複雑な問い合わせ式についての記事も書こうと思いますが、
今回はこの辺で切り上げようと思います。

はてなブログには技術系の方が、沢山いらっしゃるので
初心者の若造のアウトプットにビシバシ突っこんで頂けたら嬉しいです。