はいはいどうもなえTです。
先週は現職のラッシュ、季節の変わり目によるふにゃふにゃ等でほぼ稼働できず、お勉強もおざなりになってしまい、激しい自己嫌悪の渦に飲み込まれていました。
が、もう今週は始まっています。過ぎたことを気にする暇があったら技術書を開いてコード書いてブログもついでに書きましょう。前向きなアラサーはモテるぞ
前回の記事では、データベースの概念っぽいことばかり並べたので、今回はSQL文の初歩を書き残しておきます。iOSアプリの作成において、SQL文がかける必要性がいかほどあるのかは疑問ですが、基本的な動作だけでも覚えておくことに越したことはないでしょう。
実装に使う機会があれば覚えれるでしょうが、そのときスッと頭に入れるためのおまじないとして。
●DB 接続方法 (MAC ターミナル準拠)
psql <DB名>
●DB内テーブルの作り方
CREATE TABLE <テーブル名>
( <列名1> <型(字数制限)> <制限(NOT NULL, DEFAULT X 等)> ,
<列名2> <型(字数制限)> <制限(NOT NULL, DEFAULT X 等)> ,
<列名3> <型(字数制限)> <制限(NOT NULL, DEFAULT X 等)> ,
PRIMARY KEY (任意の列名));
●テーブル内 列の追加、削除方法
ALTER TABLE <テーブル名> ADD COLUMN <列名>
ALTER TABLE <テーブル名> DROP COLUMN <列名>
●テーブルへのレコード追加方法(トランザクション利用、後でまた解説)
整数型は直接記入、ほか 文字型、DATE型は''で囲う
BEGIN TRANSACTION;
BEGIN
INSERT INTO <テーブル名> VALUES('列1', '列2', '列3', 列4, 列5);
INSERT INTO <テーブル名> VALUES('列1', '列2', '列3', 列4, 列5);
INSERT INTO <テーブル名> VALUES('列1', '列2', '列3', 列4, 列5);
COMMIT;
●テーブル内の任意の列を表示
SELECT 列1, 列2, 列3
FROM <テーブル名>;
※SELECTの後ろに*(ワイルドカード)を記載すると、全列表示(全表示)
●表示した列に任意の別名をつける(その場限り)
英語の場合は不要だが、日本語の別名には""(ダブルクォーテーション)が必要。
シングルじゃないので注意
SELECT 列1 AS "別名1",
列2 AS "別名2",
列3 AS "別名3"
FROM <テーブル名>;
●既存のテーブルに任意の列を追加する(その場限り)
SELECT 今回だけ使う列名①(新規) AS "一意の名前1",
今回だけ使う列名②(新規)AS "一意の名前2",
列3
FROM <テーブル名>;
出力結果
今回だけ使う列名① | 今回だけ使う列名② | 列3
--------------------+--------------------+-------
一意の名前1 | 一意の名前2 | 行1
一意の名前1 | 一意の名前2 |行2
一意の名前1 | 一意の名前2 | 行3
一意の名前1 | 一意の名前2 | 行4
一意の名前1 | 一意の名前2 | 行5
一意の名前1 | 一意の名前2 | 行6
一意の名前1 | 一意の名前2 | 行7
一意の名前1 | 一意の名前2 | 行8
●指定した列のうち、重複した要素を省略して表示 DISTINCT
DISTINCTは、複数の列を対象にできる。その場合、組み合わせが全く同じ行が一つにまとめられる。
要素の中にNULLが入っていた場合は、NULLも省略した要素の1つとして含まれる。
shop=# SELECT DISTINCT 列1,
shop-# FROM <テーブル名>;
*出力結果
列1
--------------
⇦これがNULL
320
50
280
500
790
(6 rows)
●SELECT FROM の下にWHEREをつけることで、列から出力する行に条件を与えることができる。
shop=# SELECT 列1, 列2
FROM <テーブル名>
WHERE 列1 = '衣服';
⇨こう書くと、列1に衣服という要素がある行のみ表示される。
検索条件として指定する列は、必ずSELECTに含めて表示する必要はない。(表示しない列の要素を条件とすることも可能)
●SQL文のコメントの付け方 LOGを見た時に何がしたかったかわかるので、積極的に記載しよう
-- ⇨1行コメント
/* 複数行コメント*/
>>>>>>>>>>>>>>>>>>>>>>>>>
●SQL分中での演算
SQL文中では演算ができる。下記、四則演算の利用例(倍数を別名表示)
shop=# SELECT name, price, price * 2 AS "price_x2"
shop-# FROM iniventory;
四則演算子は、+ - * / とセオリー通り
比較演算子は、 = > < "<>:不等号" となる。
<> を使うと、等しくないという意味で使える。(!= は使えないSQLがある)
shop=# SELECT name, attibute
shop-# FROM inventory
shop-# WHERE price <> 500;
比較演算子は日付(DATA型)にも使える。 下記、2019-01-07より前の行を表示
shop=# SELECT name, attribute, register_date
shop-# FROM inventory
shop-# WHERE register_date < '2010-01-07';
比較演算子を文字型に使うと、辞書順でのソートが可能。
下記、名前がbananaより辞書順で後ろの行を表示
shop=# SELECT name, attribute, register_date
shop-# FROM inventory
shop-# WHERE name > 'banana';
比較演算子の表示結果からは、NULLが除外される。
NULLのみを表示するんは、制約としてIS NULL をWHERE句に記載すると良い。
shop=# SELECT name, price
FROM inventory
WHERE price IS NULL;
WHERE の後ろに NOT を入れると、逆の条件の行が表示される
shop=# SELECT shohin_mei, shohin_bunrui, hanbai_tanka
FROM Shohin
WHERE NOT hanbai_tanka >= 1000;
WHERE条件行の下に、AND条件行を足すと、指定条件を追加できる。(両方の条件を満たす行を表示)
shop=# SELECT name, price
shop-# FROM inventory
shop-# WHERE attribute = 'キッチン用品'
shop-# AND price >= 3000;
OR条件行を足すと、指定条件を追加できる。(いずれかの条件を満たす行を表示)
shop=# SELECT name, price
FROM inventory
WHERE attribute = 'キッチン用品'
OR price >= 3000;
AND, OR 条件は組み合わせることが可能。ただし優先順位はANDの方が強いため、
A AND B OR C とかくと、 AかつB、もしくはCと処理される。
Aかつ、BもしくはCと検索したい場合は、A AND (B OR C)と記載するといい
shop=# SELECT name, attribute, register_date
FROM inventory
WHERE attribute = '日用品'
AND ( register_date = '2009-09-11'
OR register_date = '2009-09-20');
●真理表
それぞれの組み合わせ結果が真、偽のどちらになるかをリスト化したものを審理表と呼ぶ。
P, Q, P&Q (論理積, 1と0の掛け算と一緒)
真,真,真
真,偽,偽
偽,真,偽
偽,偽,偽
P,Q,PorQ(論理和, 1と0の足し算と一緒)
真,真,真
真,偽,真
偽,真,真
偽,偽,偽
P notP
真,偽
偽,真
論理演算子の計算内容にNULLが含まれていると、真でも偽でもない結果 不明(Unknown)が追加される。
真、偽、Unknownの3つが存在する論理演算を3論理という。これはSQL特有のもの
P, Q, P&Q (論理積, 1と0の掛け算と一緒)
真,真,真
真,偽,偽
真,不,不
偽,真,偽
偽,偽,偽
偽,不,偽
不,真,不
不,偽,偽
不,不,不
値段が500、品名がNULLのデータ行に対し、下記WHERE条件で検索した場合の結果
(値段が500(真)かつ品名がA(NULL)⇨結果 NULL),
(値段が700(偽)かつ品名がA(NULL)⇨結果 不)
P,Q,PorQ(論理和, 1と0の足し算と一緒)
真,真,真
真,偽,真
真不真
偽,真,真
偽,偽,偽
偽不不
不真真
不偽不
不不不
値段が500、品名がNULLのデータ行に対し、下記WHERE条件で検索した場合の結果
(値段が500(真)または品名がA(NULL)⇨結果 真),
(値段が700(偽)または品名がA(NULL)⇨結果 NULL)
NULLが存在する場合の条件判定は大変複雑となり、明らかに人々の感覚と反する動作を行うため、
データベースに慣れた人は「なるべくNULLを使うべきでない」という共通認識がある。
そのため、いくつかの列にはNOT NULL制約をかけたりするもの
>>>>>>>>>>>>>>>>>>>>>>>>>
なんやかんや昨週中ちょろちょろ勉強した内容はまだまだあるけど、一旦ここで区切ります。仕事が始まるので。。。
何かを学ぶことより、何かを学ぶための時間を確保する難しさに翻弄される師走であった。コンディションとスケジュール管理は技術力なみにだいじ