SQL

SQLとは

SQL・・・『Structured Query Language』
                    リレーショナルデータベースの操作をする言語

命令文の種類

データを定義するDDL(Data Definition Language)
データを操作するDML(Data Manipulation Language)

DDL(データ定義)

Create ・・・ 作成
Alter  ・・・ 更新
Drop   ・・・ 削除
DML(データ操作)
Insert ・・・ 登録
Update ・・・ 更新
Delete ・・・ 削除
Select ・・・ 検索

SQL文

MySQLに接続する
『Mysqlにユーザー名がrootで接続する』という意味
※ SequelPro 使用

mysql -u root

SHOW DATABASES文

データベースを一覧で表示する

show databases;

CREATE DATABASE文

データベースやテーブルを作成する

create database;

USE文

使用するデータベースの指定

use データベース名;

SHOW TABLES文

選択したデータベースに存在するテーブルを一覧で表示する

show tables;

CREATE TABLE文

テーブルの作成

create table テーブル名 (カラム名 カラム名の型, ……); 


例)
create table exmple (id INT, name VARCHAR(255));
カラムの型指定

INT         ・・・ 数値
VARCHAR(X)  ・・・ 最大X文字の文字列

show columns from テーブル名;

テーブルの構造の確認

show columns from テーブル名;

画像1

ALTER TABLE文

カラムの追加、修正、削除

『追加』

alter table テーブル名 add カラム名 カラム型;

複数の場合
alter table テーブル名 add(カラム名 カラム型, ・・・ )

例)
alter table exmple add(nedann int, stock int)

追加後『show columns from テーブル名;』 で テーブルの中確認
『修正』

alter table テーブル名 change 古いカラム 新しいカラム 新しいカラム型;

例)
alter table exmple change nedann price int;
『削除』
alter table テーブル名 drop カラム名;

例)
alter table exmple drop price;

INSERT文

テーブルにデータを登録

全てのカラムに値をいれる時
insert into テーブル名 values(a, b, c);

例)
insert into exmple values(1, "ポテト", 190);


特定のカラムに値をいれる時
insert into テーブル名(カラム名1, カラム名2) values(a, b);

例)
insert into exmple(id, name) values(2, "ナゲット");

『SHOW columns FROM テーブル名;』 で 変更確認

『null』は『default』の設定になる

SELECT文 FROM文

テーブルにある要素を検索する

select 取得したい要素 from テーブル名 

例)
select name from exmple;

『exmple』テーブルの『name』のカラムを取得

例)
select * from exmple;

テーブルにあるレコード(列)を全て取得
『*』 ・・・ アスタリスクという。すえてを取得する

UPDATE文

データの更新をする

update テーブル名 set 変更内容  where 条件;

例)
update exmple set price = 200 where id = 2;

id2のレコードの『price』を200に変更する

DELETE文

データの削除

delete from テーブル名 where 条件;

例)
delete from exmple where id = 2;

Where句

レコードの条件を指定して取得する

where 条件

例)
where id = 1

例)
where name = "爆轟"

例)
where id = id <= 5

AND演算子

条件を指定し、正を取得する

where A and B 

例)
select * 
from exmple
where age <= 20 and group = "麦わらの一味"

ageは20以下 かつ 麦わらの一味 のレコードを取得

OR演算子

条件のどちらかを含むデータを取得する

where A or B

例)
select *
from exmple
where place <= 5000 or color = "黒"

place が 5000 以下もしくは color が黒のレコードを取得

NOT演算子

条件に当てはまらないものを取得する

where not A

例)
select *
from exmple 
where not category = "ヴィラン"

category が ヴィランでないレコードを取得

BETWEEN演算子

上限と下限を指定して、その範囲を取得する

where カラム名 between 下限 and 上限

例)
select *
from exmple 
where age between 20 and 30

age が 20以上 30以下 を 取得

IN演算子

カラムに対して条件を指定して、それに含まれるレコードを取得する

where カラム名 in(a, b, c,・・・・)

例)
select *
from exmple
where village in("木の葉隠れの里","砂隠れの里")

village が 木の葉隠れの里、もしくは砂隠れの里のレコードを取得

NOT IN演算子

指定した条件を含んでいないレコードを取得する
NULLを指定すると他の情報も正しく取得できない

where カラム名 not in(a, b, c,・・・・)

例)
select *
from exmple
where village not in("木の葉隠れの里","砂隠れの里")

village が 木の葉隠れの里、もしくは砂隠れの里以外のレコードを取得

IS NULL演算子

NULLかどうかを確認する演算子

where カラム名 is null

例)
select *
from one_piece
where devil_fruit is null

『devil_fruit(悪魔の実)』 が NULL(食べてない)を取得する

IS NOT NULL演算子

NULL以外を探す演算子

where カラム名 is not null

例)
select *
from one_piece
where devil_fruit is not null

『devil_fruit(悪魔の実)』 が NULL じゃないの(能力者)を取得する

CONCAT関数

複数の文字列を連結させる関数

concat(文字列1,文字列2,・・・・)

例)
select concat(first_name, last_name)"名前"
from exmple

結果:『first_name → 緑谷』、『last_name → 出久』 が 『緑谷出久』 で連結して取得できる

AS句

カラムに別名付けれる

select 取得するデータ as 別名

例)
select concat(first_name, last_name) as "名前"

『as』は省略できる

LIKE句

カラムに対して文字列検索をする

select カラム名 from テーブル名 where カラム名 like "検索文字"

例)
(完全一致検索)
select name"名前"
from one_piece
where name like "モンキー"

(前方一致検索)
select name"名前"
from one_piece
where name like "モ%"

(後方一致検索)
select name"名前"
from one_piece
where name like "%ィ"

(曖昧検索)
select name"名前"
from one_piece
where name like "%ル%"

(除外検索)
select name"名前"
from one_piece
where name not like "%ヲ%"

(1文字検索)
select name"名前"
from one_piece
where name like "%ル_"

ORDER BY句

昇順、降順にソートする
asc   ・・・ 昇順(デフォルト)
desc ・・・ 降順

select カラム名
from テーブル名
order by カラム名 (昇順、降順を指定);

例)
select *
from exmple
order by id desc;

(複数)
select * 
from exmple
order by id desc, name asc;

(id が 5 より小さい)
select * 
from exmple
where id > 5
order by id desc;

(group by)
select * 
from exmple
group by name
order by id desc;

group by と使う際は order by を後に記述する

DISTINCTキーワード

指定したカラムの値が重複するレコードを除外してデータを取得する

select distinct カラム名

例)
select *
from exmple
where date = 2020-02-22

GROUP BY句

指定したカラムが同じ値を持つデータを1つのグループとしてまとめる

group by カラム名

例)
select *
from exmple
where date = 2020-02-22
group by user_id

COUNT関数

グループ化されたデータに対して使用することができる集計関数

select count(カラム名)

例)
select count(*)

nullであるレコードも取得する

nullを除外したい場合はアスタリスクではなくカラムを指定する

SUBSTRING関数

文字の切り取りを行う関数

select substrinf(カラム名, 切り取り開始文字数, 切り取る文字数 )

例)
select substring(name, 1, 3)
from exmple

nameの1文字目か3文字目までをきりとり出力する

CHAR_LENGHT関数

文字の長さの計算

select char_length(カラム名)
・order by char_length(カラム名) desc;

例)
select name
from cexmple order by char_length(name) desc;

nameの文字列数が多い順に並べ替える

SUM関数

同じデータを持つグループの合計を求める

select sum(カラム名)
from テーブル名

例)
select sum(bounty)"懸賞金"
from one_piece
where group = "麦わらの一味"

例)
select group"一味", sum(bounty)"懸賞金"
from one_piece
group by group

+---------+-------------+
|  一味    |    懸賞金    |
+---------+-------------+
|麦わらの一味|316100100 |
|         |             |
|         |             |

AVG関数

同じデータを持つグループの平均を求める

select avg(カラム名)
from テーブル名

例)
select avg(bounty)"平均"
from one_piece
where group = "麦わらの一味"

例)
select group"一味", sum(bounty)"平均"
from one_piece
group by group

+---------+-------------+
|  一味    |    平均      |
+---------+-------------+
|麦わらの一味| 3161010  |
|         |             |
|         |             |

MAX関数

同じデータを持つグループの最大値を求める

select max(カラム名)
from テーブル名

例)
select max(bounty)"最大値"
from one_piece
where group = "麦わらの一味"

例)
select name"名前", sum(bounty)"最大値"
from one_piece

+--------------+-------------+
|     名前      |    最大値    |
+--------------+-------------+
| モンキー・D・ルフィ |     15億    |
|              |             |
|              |             |

MIN関数

同じデータを持つグループの最小値を求める

select min(カラム名)
from テーブル名

例)
select min(bounty)"最小値"
from one_piece
where group = "麦わらの一味"

例)
select name"名前", min(bounty)"最小値"
from one_piece

+------------------+-------------+
|        名前       |     最小値   |
+------------------+-------------+
| トニートニー・チョッパー |      100    |
|                  |             |
|                  |             |

JOIN

指定したそれぞれのテーブルのカラムの値が一致するデータを結合すること
FROM句のあとに記述

from テーブル1
join テーブル2 on テーブル1.カラム名1 = テーブル2.カラム名2

例)
select teams.name"所属チーム", players.name"選手名", players.uniform_num"背番号"
from teams
join players on teams.user_id = palyers.id


省略パターン)
select t.name"所属チーム", p.name"選手名", p.uniform_num"背番号"
from teams t
join players p on t.user_id = p.id

別名指定する際は頭文字を指定するのが一般的

・内部結合

それぞれのテーブルの指定したカラムの値が一致するものだけを結合
条件にないレコードは除外する
『join』と『inner join』は同じ

from テーブル1
inner join テーブル2 on テーブル1.カラム名1 = テーブル2.カラム名2

例)
select teams.name"所属チーム", players.name"選手名", players.uniform_num"背番号"
from teams
inner join players on teams.user_id = palyers.id

・外部結合

それぞれのテーブルの指定したカラムの値が一致するものだけでなく条件にないレコードも全て取得する
『left join』と『right join』の二つが存在する
left join ・・・ 左側を優先して出力する
right join ・・・ 右側を優先して出力する

from テーブル1
left(right) join テーブル2 on テーブル1.カラム名1 = テーブル2.カラム名2

例)
select schedules.play_ball"試合開始",teams1.name"チーム1",teams2.name"チーム2"
from schedules
left join teams teams1 on schedules.my_team_id = teams1.id
left join teams teams2 on schedules.enemy_team_id = teams2.id
where schedules.play_ball between "2020-05-01 00:00:00" and "2020-05-31 23:59:59"

"2020-05-01 00:00:00" から "2020-05-31 23:59:59"までの『teams1』と『teams2』の対戦表を取得する

CASE式

条件ごとに表示を変更させる条件分岐式

s

elect 
case when 条件 then 条件に当てはまる時の表示内容 
     else 条件に当てはまらない時の表示内容
end
from テーブル名

例)
select name"Tシャツ", height"身長",
case when 175 <= height then "L"
     when height between 165 and 174 then "M"
     else "S"
end as "サイズ"
from user
where sex = "男性"

・男性の身長に対してサイズを割り当てる



例)
select 
case when sex = "男性" then "男性" 
     else "女性" end as "性別",
sum(case when 170 <= height then 1 end) as "L",
sum(case when height between 160 and 169  then 1 end) as "M",
sum(case when 160 > height then 1 end) as "S"
from user 
group by sex

+-------+----+----+----+
|  性別  |  L |  M |  S |
+-------+----+----+----+
|  男性  | 20 | 30 | 10 |
+-------+----+----+----+
|  女性  |  5 | 20 | 30 |
​

最後に

駆け出せてないエンジニアです。

間違っていたらTwitterのDMにて教えてください。

追加で学んだことがありましたら更新します。


この記事が気に入ったらサポートをしてみませんか?