なえT備忘録

何の参考にもならないかもしれませんが、いつかは参考になるようにします

SQL文の基本 テーブル作成, ALTER, SELECT, WHERE, 演算等(PostgreSQL準拠)

はいはいどうもなえ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');

 

●真理表

NOT、AND、ORの3つの演算子を論理演算子とよぶ。

それぞれの組み合わせ結果が真、偽のどちらになるかをリスト化したものを審理表と呼ぶ。

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制約をかけたりするもの

 

>>>>>>>>>>>>>>>>>>>>>>>>>

なんやかんや昨週中ちょろちょろ勉強した内容はまだまだあるけど、一旦ここで区切ります。仕事が始まるので。。。

 

何かを学ぶことより、何かを学ぶための時間を確保する難しさに翻弄される師走であった。コンディションとスケジュール管理は技術力なみにだいじ

 

www.youtube.com

iOSアプリの開発をしてたら、SQLの勉強が始まった

 

いや何言ってるんだという話ですけどね

大体作りたいアプリの仕様が定まってきて、ほんでデータベースいるなと

userdefaultsはデータ増えると重くなるらしいし、Firebaseも実務じゃ使うだろうけどあんまDBの練習って感じでもなさそうだろうと

ほいだらライブラリの運用練習にもなるし、Realm使ってデータ管理しようかと

で、そもそもデータベースの操作方法、テーブルの作り方等々全然わからんやないかと

 

Realmに備え付けられたメソッドでDB操作を覚えてもいいけど、それなら最初からSQLを多少は覚えてから触ったほうが後々潰しもきくし良いなと(そもそもDBがわからない人にむけて作られたRealmのリファレンスが無い)

 

というわけで、本買って勉強してます

 

Amazon.co.jp: SQL 第2版 ゼロからはじめるデータベース操作 eBook : ミック: 本

 

 

今日覚えたこと

RDBMS: リレーショナルデータベースマネジメントシステム

⇨二次元テーブルでデータを保存するデータベースの管理システム、SQL亜種等々がこれ

●テーブルの列:カラム 

テーブルに保管するデータ項目(型指定あり)  

●テーブルの行:レコード

1件のデータに相当する。RDBMSでは、必ず行単位でデータの読み書きをする。

 

SQL文の種類

DDL(データ定義言語) Data Definition Language

データベース、テーブルの作成、削除を行う命令

例:

CREATE DB/テーブル作成

DROP  DB/テーブル削除

ALTER  DB/テーブルの構成変更

 

DML(データ操作言語)Data Manipulation Language

テーブルの行を検索したり変更したりする。

例:

SELECT テーブル内の行を検索

INSERT テーブル内に行を追加

UPDATE テーブル内の行を更新

DELETE テーブル内の行を削除

 

DCL(データ制御言語)Data Control Language

データベースに対して行なった変更の確定、取消や、RDBMSの各ユーザに対し、DB内のデータの操作権限の設定など行える。(Gitみたいなもんか)

例:

COMMIT DBに対して行なった変更の確定

ROLLBACK DBに対して行なった変更の取消

GRANT ユーザーへの操作権限付与

REVOKE ユーザーへの操作権限剥奪

 

SQL分は、文の終わりに;(セミコロン)をつける。PHPとおんなじだ

 コマンドに対して、大文字小文字の区別はない。文字リテラルは''(シングルクォーテーション)

 

今週中には本全部読んで、何ができるかだけでも整理しておくぞ

横道にそれるけど、いつかは通る道なので、このタイミングである程度勉強しとくんだ

 

 

このブログのネタ、古臭いな インターネットジジイ臭がする

これでも27歳です

 

 

キリ番踏んだらコメください!

Swift アクセス修飾子について

これも人のコードを読んでる時に出てくるので、良い加減意味をおぼえないといけない。

 

 

swift.tecc0.com

 

とりあえず上記サイトを見ればわかる。けど念の為Swift実践入門も参照。

 

open:

モジュール内外のすべてのアクセスを許可

public:

モジュール内外のすべてのアクセスを許可、ただしモジュール外ではクラスの継承、オーバーライドが不可

internal:

同一モジュール(プロジェクト)内のアクセスのみ許可 (デフォルト値)

fileprivate:

同一ソースファイルないのアクセスのみ許可

private:

対象の要素が属しているスコープ内のアクセスのみ許可

 

こうみると、モジュールの定義をちゃんと分かってなかったので、確認する。※スコープは前の記事でかいたはず

 

モジュール:

複数のソースコードを含む配布可能なプログラムの単位。他のプログラムにインポート可能。詳しく調べていないが、.swiftファイル上にPackageDesctription というフレームワークをインポートし、モジュール化したい対象を選択すれば、以後外部のプロジェクトでも対象(クラス)が呼出可能となる。

 

⇨つまり、2つ以上の連続したプログラム作成を想定しない限り、モジュールに関するアクセス可否を検討する必要はない。(internal, fileprivate, privateのみでOK)

ほか3つについては、internal: 同一プロジェクト内、fileprivate: 同一swiftファイル内、private:同一スコープ内(クロージャやグローバルスコープ内)でのみ呼び出し可能、と考えればOK

 

open, publicは、会社や個人開発でチャットアプリを作成した⇨チャット機能を別アプリ(マッチングアプリ)のチャット欄に流用したい...みたいな感じで使うことになるのだろう。実際毎回あんなの書いてられんわ!という気持ちもわかる。

また、外部利用についても継承、オーバーライド可否をしっかり分けてるところ、変にいじってバグ起こすな、というAppleの強い品質管理意識を感じる。型指定やNilの処理に異常に厳しいのも、Appleの性格がでてるなぁと思いながらSwiftの勉強をしているのである。

 

良くも悪くも厳しいおかげで、ソフトの品質もいいんだろうなあ。(ちなみにAppleがハードの製造元に要求する品質管理レベルはガチでイカれているが、それは別のお話)

 

www.youtube.com

Frame for "Hogehoge" will be different at run time. の解決法 + .frame プロパティについて

AutoLayoutでConstraintsを付与したオブジェクトを、ちょっとマウスで動かしたり引っ張っちゃったりしたとき、こういうエラーでませんか?※あるいは、Constraints付与前から自分でつくったサイズがあんまり合ってない?時

 

エラーメッセージ見る限り、HogehogeのFrame(たてよこ座標、サイズ情報)は実行時、いま描写している形と変わってしまいますよ、と言っているとはわかる。

 

じゃあどうするのか、という所で、さっきまで手動で動かしたり引っ張ったりして直そうとしてたんですが、エラーが出てるオブジェクトをクリックして、"command", "option",  "="キーを同時押ししたら一発で直してくれるみたいです。

 

stackoverflow.com

 

ずらしちゃったときは、その場でCommand + Zで戻せば良いんだけどね。動画で学習とかしてると次の話にポンポン進むから、ついていくために後回しにしちゃって...みたいなこと、あると思います。

 

 

ちなみに、frameはUIViewのサブクラスが持っているプロパティで、CGRectをかえす。

CGRectは縦横の寸法を返す構造体 で、frameの場合だと要素自身を基準とした座標を返す。これ他にもboundsというプロパティもあって、こっちは要素の親を基準とした相対的な座標、大きさを返す  とのこと。下記ブログにて参照しました。

 

qiita.com

 

UIKitに付随するサブクラスとそのメソッド、プロパティ 多すぎませんか?どうやって覚えればいいんでしょうか(激怒)

 

 

 

Swift クラスの継承、override

Swiftでアプリ作成しているとき、ViewController上などであたり前にやっているので気にしたことがなかったけど、おさらいとして

 

親(スーパー)クラスに定義されているメソッド、プロパティを、その子(サブ)クラスに引き継げることをクラスの継承と呼ぶ

 

UIKitを使ったアプリ開発の場合、StoryBoardないしxibファイルを動かすために作ったクラスに対し、UIViewControllerなりUITableViewControllerなりを読み込んでから処理を書いているけど、これが継承

>>>>>>>>>>>>>>>>>

class HogeViewController: UIViewController{

    //何かしらの処理

}

>>>>>>>>>>>>>>>>>

 

UIKit内のいろんなクラスのメソッドを引き継がせ、クロージャ内で自由に処理を設定することができる。

書き方が型アノーテーションと同じなので混ざるけど、こっちはクラスの継承。

 

そして、親クラスがもつメソッド/プロパティの中身を上書きして使用したい場合はoverrideを使い、メソッドの中の一部のみを上書きするときはクロージャ内の最初で"super.メソッド名もしくはプロパティ名"と記載すればよい。※superはスーパークラス、つまり親クラスの意味。親クラスのメソッド、もしくはプロパティを読み込みますよ という宣言

 

つまり、アプリ制作時にoverride func Hogehoge()の中身で定義している内容、あれはもともと親クラス内に定義が存在するメソッドの中身を書き換えているということ。

 

>>>>>>>>>>>>>>>>>

// UITableViewのインスタンス

@IBOutlet weak var hogeTableView: UITableView

 

// UITableViewクラスが持つ、viewDidLoadメソッド(読み込み時の挙動に係るクラス)内のメソッド/プロパティを書き換える

    override func viewDidLoad() {

        super.viewDidLoad() // viewDidLoadの一部を書き換えるという宣言

        hogeTableView.delegate = self // 通知先は自分のクラス(他でもいい)

        hogeTableView.dataSource = self // 通知先は自分のクラス(他でもいい)

>>>>>>>>>>>>>>>>>

 

要は、単純に【クラスの継承→親元の機能の引き継ぎ】、【override→親元の設定の書き換え(通知先やオブジェクトの色など)】 ということだ。delegateやdataSourceの通知先なんぞスイッチをパチパチして配線をかえてるくらいの感覚でよいのである。

 

 

 

 

 

Swift 型、スコープ、式など

入門書1冊では賄いきれなかったので、SWIFT実践入門をちょびちょびよんでます

なんとなく理解してるけど、名前やちゃんとした仕様がわかってない決め事、定義等を補完しています

 

Swift自体の仕様やdelegateとかは大体理解できるけど、UIKitの各クラスの取扱い、プロパティやメソッドの仕様は量が多すぎてなかなか覚えられない

使うものから順に覚えていけばいいやは思っているけど、さすがにチートシートか逆引き辞書ないときちい

 

 

 

 

 

 ●型アノーテーション

 変数や定数宣言時の型名を表す場所 :Int など

 ●型の確認方法

 type(of:式)

 

 ●ローカルスコープ

 関数や制御構文によって定義されるスコープ メソッド/クロージャの中身 など

 ●グローバルスコープ

 どの関数、型宣言にも含まれないスコープ クラスの中にぽつんと置かれてるようなもの

 ⇨ 同じスコープ中に同じ名前を複数存在させることはできないが、違うスコープだと存在させられる。

 名前が被っている場合、近いスコープの変数/定数が参照される。

 ローカルとグローバルで被ったら、ローカルが優先される

 

 ●式の種類

    変数や定数の値を返却する式: 変数名や定数名のみで構成され、式の評価時に変数や定数に入っている値を返す。

    リテラル式:              1や"abc" といった、値を直接プログラムに表記する書式 値に対する型アノテーションないし型推論が必要

                            配列リテラル、辞書リテラルnilリテラルのように、デフォルトの型を持たないリテラルもある

    let a = 1       こっちがリテラル

    let b = a + 1   こっちが変数や定数の値を返却する式

 

 

    メンバー式:              型のメンバーにアクセスする式

    型のメンバーとは、型の値や型自身に備えついた変数、定数、関数、型などのこと。(属性)

    値に紐づく変数や定数のことをプロパティといい、型に紐づく関数のことをメソッドと呼ぶ。

    メンバー式は、型に備えついたプロパティ/メソッドを使用するための式。式の値は、プロパティやメソッドの返す値。

    多くの方にはプロパティやメソッドが定義されている。

    let a = "Hello Worlld!"

    a.count // 13                      これがプロパティ

    a.starts(with: "Hello") // true    これがメソッド

 

    クロージャ式: 処理をまとめて呼出可能にした式。入力値を引数と言い、出力値を戻り値という。

    処理を即席的に定義して他の処理に渡す際に使う。べんり

    {引数 in 戻り値を返す式}

    代表的な書き方は下記の通り 配列の要素を変換する(map_:)メソッドに、各要素を2倍にするクロージャ式を渡している。

 

    let original = [1, 2, 3]

    let doubled = original.map({value in value * 2}) //入力値originalをvalueに代入して2倍してる

    doubled //[2, 4, 6]

 

 

 ●Any型

 

    Any型 全ての方が暗黙的に準拠してる特別なプロトコル、Any型の変数や定数にはどのような方も代入できるため、代入する値の方が決まっていないときに利用

 let string :Any = "abc"

 let int: Any = 123

Any型は、値を生成するものでなく、他の型の値をAny型として扱う。

しかし、オプショナル同様もとの型では可能だった操作ができなくなる(四則演算など)ので、可能な限りAny型への代入はやめよう。あるいは必要に応じて型キャストを行う。

 

navigationController?.navigationBar.barTintColor なんか動かねえぞ

developer.apple.com

 

>>>>>>>>>>>>>>>>>>>>

I am having similar issue on iOS 13.1 beta 4.

Setting up navigationBar's background color fixes the issue for me. Not sure if this is a correct solution.

navigationController?.navigationBar.backgroundColor = /*tintcolor*/

Posted 3 years ago by 

>>>>>>>>>>>>>>>>>>>>

 

こっちにおきかえろだとさ

 

Microsoftのフォーラムと比べて、知見も民度もダンチで高いぞDeveloper Folums