Help us understand the problem. What is going on with this article?

Progate無料版をやってみる【SQL】

前回に引き続きProgate無料レッスンをやっていこうと思います。

今回はSQLです。

SQL

公式レッスン

データベースとは

・検索や蓄積が容易にできるよう整理された情報の集まり。
 Wikipedia

・リレーショナルデータベースが今の主流らしい。
 業務ではそれしか触ったことないはず。
 フワフワしてて詳しくはわからないです・・・。
 リレーショナルデータベース

ほぼこれなのでおそらく他のデータベースは覚えなくてよい。

サイトの顧客情報や、銀行残高、店の売り上げ、在庫、等々・・・
世の中のほとんどの情報がすべてデータベースに保存されている。
Qiitaのログイン情報や、この記事も。

環境構築

業務ではSQLServer、Oracle、postgresqlを触っていました。
MySQLやSQLite、MariaDB等は経験がないため、その中でも人気のMySQLを使用したいと思います。

インストール

上記にアクセスし、ダウンロードのリンクをクリック。
image.png
以下のどちらかをインストール。
image.png
上はネットでダウンロードしながらインストールする版(Webインストール)
下は最初に一括でダウンロードする版

ダウンロード後、インストールします。

インストールが完了すると、「MySQL Workbench」なるものが立ち上がりました。
image.png
データベースをGUIで操作するSQLクライアントだと思います。
Object BrowserA5SQLSQL Server Management Studio、OracleのSQL Developerみたいなものかな?

英語なので日本語化しようとしたのですが、どうやら日本語化に必要なファイルがとても古いバージョンのようで(更新が止まっている)、今のバージョン8に適用すると、アプリケーションがうまく動かなくなるそうです。

なので、古いファイルを見ながら、今の該当のファイルを手動で変更していくしかないそうです。変更量もかなり多いとのこと・・・。
既にやっていただいた方がいたので、そのファイルを使用させてもらおうと思います。

MySQL Workbench 8.0のWindowsへのインストールと日本語化

ここで取得した「main_menu.xm」を
C:\Program Files\MySQL\MySQL Workbench 8.0 CE\dataに上書きすれば・・・
※上書きする前に元のファイルはバックアップしておいた方が良いです。動かなった時に戻せるので・・・。

立ち上げられなくなっちゃいました
バージョンが全く一緒ではないし、インストールした際のオプションがことなると、中身も違うのでしょう・・・

なので自分のファイルと、落としてきたファイルをWinMergeで差分見ながらマージしました。

image.png
メニューが日本語になりました。

でもメニューから何かしらの設定を開くと全部英語です・・・。
ダメじゃん・・・。

レッスンに戻ります。

「purchases」というテーブルをレッスンでは使用するようです。
テーブルをworkbenchで作っていこうと思います。

MySQL Connectionを選択し
image.png

schemaタブを開きます。
image.png

sakilaとworldデータベースはデフォルトで用意されているのかな。
テーブル数が少ないworldデータベースにテーブル作っていこうと思います。

Progateを見ると
image.png
らしいので、なんとなく型を予想して、以下のDDLを実行します。

CREATE TABLE world.`purchases` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` char(35) NOT NULL DEFAULT '',
  `price` int DEFAULT '0',
  `character_name` char(35) NOT NULL DEFAULT '',
  `category` char(35) NOT NULL DEFAULT '',
  `purchased_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) 

world(スキーマ).テーブル名
idはオートインクリメント(データ挿入時に自動的に1プラスされて採番されます)
purchased_atはデフォルト値として現在日時を設定します。

上記をQuery1に張り付けて、雷マークを実行します。
image.png

出来てました。
image.png

データを突っ込みます。
idは自動採番されるので0でOKです。

insert into `world`.`purchases` values (0,'スマホケース','1500','にんじゃわんこ','雑費','2017/7/1');
insert into `world`.`purchases` values (0,'お弁当','500','ひつじ仙人','食費','2017/7/1');
insert into `world`.`purchases` values (0,'ワンピース','3000','とりずきん','雑費','2017/7/1');
insert into `world`.`purchases` values (0,'参考書','2000','にんじゃわんこ','雑費','2017/7/1');
insert into `world`.`purchases` values (0,'電車賃','450','ひつじ仙人','交通費','2017/7/1');
insert into `world`.`purchases` values (0,'プリン','150','にんじゃわんこ','食費','2017/7/2');
insert into `world`.`purchases` values (0,'サッカーボール','2500','ベイビーわんこ','雑費','2017/7/2');
insert into `world`.`purchases` values (0,'電卓','700','ひつじ仙人','雑費','2017/7/4');
insert into `world`.`purchases` values (0,'お弁当','1000','にんじゃわんこ','食費','2017/7/4');
insert into `world`.`purchases` values (0,'プリンパフェ','500','にんじゃわんこ','食費','2017/7/4');
insert into `world`.`purchases` values (0,'タクシー代','1200','とりずきん','交通費','2017/7/9');
insert into `world`.`purchases` values (0,'わたあめ','100','ベイビーわんこ','食費','2017/7/10');
insert into `world`.`purchases` values (0,'眼鏡','5000','ひつじ仙人','雑費','2017/7/10');
insert into `world`.`purchases` values (0,'焼きプリン','200','にんじゃわんこ','食費','2017/7/10');
insert into `world`.`purchases` values (0,'ハンドバッグ','8000','とりずきん','雑費','2017/7/15');
insert into `world`.`purchases` values (0,'豆乳クッキー','300','とりずきん','食費','2017/7/15');
insert into `world`.`purchases` values (0,'牛丼','600','にんじゃわんこ','食費','2017/7/15');
insert into `world`.`purchases` values (0,'焼き魚定食','550','ひつじ仙人','食費','2017/7/15');
insert into `world`.`purchases` values (0,'ノート','150','ベイビーわんこ','雑費','2017/7/21');
insert into `world`.`purchases` values (0,'えんぴつ','100','ベイビーわんこ','雑費','2017/7/24');
insert into `world`.`purchases` values (0,'チーク','800','とりずきん','雑費','2017/7/24');
insert into `world`.`purchases` values (0,'駐輪代','200','にんじゃわんこ','交通費','2017/7/28');
insert into `world`.`purchases` values (0,'バター','240','ひつじ仙人','食費','2017/7/28');
insert into `world`.`purchases` values (0,'じゃがいも','50','ひつじ仙人','食費','2017/7/28');
insert into `world`.`purchases` values (0,'牛乳プリン','100','にんじゃわんこ','食費','2017/7/28');
insert into `world`.`purchases` values (0,'バス代','230','ひつじ仙人','交通費','2017/8/2');
insert into `world`.`purchases` values (0,'ふんわりパンケーキ','750','とりずきん','食費','2017/8/2');
insert into `world`.`purchases` values (0,'焼きプリン大福','140','にんじゃわんこ','食費','2017/8/3');
insert into `world`.`purchases` values (0,'電子工作キット','5400','にんじゃわんこ','雑費','2017/8/7');
insert into `world`.`purchases` values (0,'柔軟剤','600','とりずきん','雑費','2017/8/7');

インサート後
image.png

デフォルトスキーマを設定しておくと
クエリを書くときにworldとスキーマを指定しなくても済みます。
image.png
image.png

レッスンの演習のSelect文をworkbenchで試しながら進める・・・。

複数のカラムを選択する

・全カラムの場合は

select * from テーブル名;

特定のデータを取得しよう WHERE、WHERE(2)、比較演算子

・データを特定の条件で絞る場合にはWhere
andで複数条件も可能。
= > < >= <=

LIKE演算子、LIKE演算子(2)

・あいまい検索が行える。LIKE

where カラム名 like '%探したい文字%'

後方一致
%文字

前方一致
文字%

NOT演算子

notで~じゃないを指定する。

SELECT *
FROM purchases
where not character_name = 'にんじゃわんこ';

image.png

LIKEと組み合わせて

SELECT *
FROM purchases
where not name like '%プリン%';

image.png

NULLとは

・Nullのデータを取得するときはIS NULL
 その逆はIS NOT NULL

SELECT *
FROM purchases
where price is null;

SELECT *
FROM purchases
where price is not null;

これを試すときはあらかじめ、priceカラムにNullを設定しておきます。

AND・OR演算子

・かつでAND
・またはでOR

#ANDの場合
SELECT *
FROM purchases
where category = '食費' and character_name = 'ひつじ仙人';

#ORの場合
SELECT *
FROM purchases
where category = '食費' or character_name = 'にんじゃわんこ';

ORDER BY

・並び順
ASCで昇順、DESCで降順。
 なにも指定しなかったら昇順になる。

#降順
SELECT *
FROM purchases
order by price desc;

#条件で絞って昇順
SELECT *
FROM purchases
WHERE character_name = "にんじゃわんこ"
order by price asc;

LIMIT

・必要な数だけ取得。
 あまりにも多い件数だけと処理に時間がかかるときなどに指定したり・・・。先頭の数十件しか必要ないとき等・・・。

SELECT *
FROM purchases
WHERE character_name = "にんじゃわんこ"
limit 10;

総合演習

#purchased_atカラムが「2017-08-01以前」のデータを取得してください
SELECT *
FROM purchases
where purchased_at <= '2017-08-01';

#nameカラムが「プリン」を含むデータを取得してください
SELECT *
FROM purchases
where name like '%プリン%';

#NOT演算子を用いてcharacter_nameカラムが「にんじゃわんこ」でないデータを取得してください。
SELECT *
FROM purchases
where not character_name = 'にんじゃわんこ';

#priceカラムがNULLであるデータを取得してください
SELECT *
FROM purchases
where price is null;

#categoryカラムが「食費」かつcharacter_nameカラムが「ひつじ仙人」であるデータを取得してください
SELECT *
FROM purchases
where category = '食費' and character_name = 'ひつじ仙人';

#priceカラムを基準に「降順に並び替えた」データを、最大で「5件」取得してください
SELECT *
FROM purchases
order by price desc limit 5;

クリアしました
image.png

感想

・基本的な事であった。
・削除(delete)がないのはなぜ?次のレッスンからかな。

何回も言ってますが無料分だから仕方ないすよね。

んー。課金して上級レッスンやらないと意味ない気がしてきた・・・。
時間がもったいない!?

次回はSassをやっていきます。
次回

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした