SQLとは?基本構文の書き方


SQLとは

SQLとは、データベース管理システム(DBMS)を操作するための言語のこと。
上述した通り、SQLには共通規格となっており、DBMSを利用しても共通の構文で操作できることが特徴のひとつ。

SQLでできること

・データの保管、取得、更新、削除
・テーブルの作成、更新、削除
・アプリ開発時にデータベースを操作できる。
・データ分析をしてビジネス活動を改善

用語

テーブル → 表
カラム → 縦の行
レコード → 横の列

主キー

テーブルに登録するレコード(データ行)の全体のうち、ひとつのデータに特定することをデータベースが保証する列のこと。
主キーは1つのみ。
Primary Key(プライマリーキー)やPKとも呼ばれる。

主キー設定のやり方

CREATE TABLE users (
 id int PRIMARY KEY,
 name varchar(10)
);

これで「usersテーブル」を作成、プライマリーキーは「id」に設定することができた。


候補キー

テーブル内で、すべてのレコード(組/行)を一意に識別することができる項目


複合キー

複数のキーを組み合わせたもの(主キーにもなり得る)

複合キーを主キーに設定するやり方

CREATE TABLE users (
 id int,
 name varchar(10),
 PRIMARY KEY (id,name)
);

これで「usersテーブル」を作成、プライマリーキーは「idとname両方」に設定することができた。


SQLの基本

SELECT文

SELECT文はデータベースから情報を出力するための構文のこと。
以下でSELECT文の使いかたを解説します。

  ー 特定の列を抽出する
SELECT 取得するカラム
FROM テーブル名;

 SELECT name, price  //カラム名 
FROM car; //テーブル名

これで「carテーブル」から「name」「price」の情報を取得できる。


 ー カラム名の変更
AS

 SELECT name AS '名前', feature AS '特徴' 
FROM car;

これで「carテーブル」から「name」「price」の情報を取得できる。


ー すべてのデータを出力
*

SELECTのあとの「*」はテーブルのすべてのデータを出力するという意味。

SELECT *
FROM car;

これで「carテーブル」のすべてのデータが出力できる。


ー 重複なしでデータを出力
DISTINCT

SELECT DISTINCT(price)
FROM car;

これで重複なしで「carテーブル」から「priceカラム」を取り出すことができる。


ー 条件で絞り込む
WHERE

SELECT name
FROM car
WHERE speed > 90;

これで「carテーブル」からスピードが90より速い車のみ指定して「nameカラム」を取得することができる。
つまり条件に一致したレコードのみを取得できる。


 ー WHEREとHAVINGの違い

WHEREとHAVINGはどちらも「抽出条件を指定」する同じ役割を持ちますが、その違いは呼び出しのタイミング

実行順序 「WHERE」→「GROUP BY」→「HAVING」なので
「GROUP BY」を使ってグループ化するときに

「WHERE」・・・「GROUP BY」の影響の前に条件が適応される
「HAVING」・・・「GORUP BY」の影響のあとに条件が適応される

という違いがある。

SELECT name, SUM(speed) 
FROM car
GROUP BY speed
HAVING speed > 300

このように書くことで、「carテーブル」の「speedカラム」をグルーピングした後にHAVINGの条件(speed> 300)を実行してくれる。

WHERE句だと、先にspeedが300以下のものはすべて除外された後に
グルーピングされてしまう。


ー 条件を両方満たす
AND

SELECT *
FROM car
WHERE speed > 90 AND price < '100万円';

これで「carテーブル」からスピードが90より速く、料金が100万円未満のレコードのみを取得できる。


ー 条件をどちらか満たす
OR

SELECT *
FROM car
WHERE speed > 90 OR price < '100万円';

これで「carテーブル」からスピードが90より速い、または料金が100万円未満のレコードを取得できる。


ー ~の間のデータを取得する
BETWEEN AND

SELECT *
FROM car
WHERE speed BETWEEM 90 AND 120;

これで「carテーブル」からスピードが90~120のレコードを取得できる。
(この時、90と120も含まれる。)


ー 条件をまとめて指定
IN ( )

SELECT *
FROM car
WHERE speed IN ('90', '120');

これで「carテーブル」からスピードが90と120のレコードを取得できる。

まとめて否定したいときは「NOT IN」を使う。



 ー あいまい検索
LIKE  % / LIKE  _

SELECT *
FROM car
WHERE name LIKE 'ab%';

%(ワイルドカード文字)は0文字以上すべての文字という意味で、
上記の場合、「carテーブル」の「name」カラムから「ab」で始まる文字列のレコードを取得できる。(abのみの名前の含まれる。)


SELECT *
FROM car
WHERE name LIKE '%ab';

上記のように指定すると「carテーブル」の「name」カラムから「ab」で終わる文字列のレコードを取得できる。

また、「%」ではなく「_」をつけた場合は、
1文字という意味になる。

SELECT *
FROM car
WHERE name LIKE 'ab_';

この場合は、「carテーブル」の「name」カラムから「ab+1文字」の文字列のレコードを取得できる。
※「_」を2つ付ければ2文字になる。



ー 空のレコードを取得
IS NULL

SELECT *
FROM car
WHERE speed IS NULL;

これで「carテーブル」からスピードが空のレコードを取得できる。

NULLじゃないカラムのみ指定したいときは「IS NOT NULL」を使用する。



 ー NULLの値を指定した値に置換する
IFNULL( )

SELECT IFNULL(id, 9999) 

この場合、「id」がNULLの場合、「9999」と出力される。
※NULLじゃない場合は、入っているデータが出力される。



ー レコードを任意の行のみ取得
LIMIT

SELECT *
FROM car
LIMIT 2;

これで「carテーブル」から2行のみ取得できる。


SELECT *
FROM car
LIMIT 5. 10;

少し応用的な使い方で、
LIMITの後に数字を二つ付けたこの場合だと
6行目から10個分抽出できる。
(ゼロが1行目のため、5は6行目)



ー データを並び替える
ORDER BY

SELECT *
FROM car
ORDER BY speed;

これで「carテーブル」の「speedカラム」を昇順で並び替えることができる。


降順させたい場合は最後に「DESC」をつける。

SELECT *
FROM car
ORDER BY speed DESC;

これで「carテーブル」の「speedカラム」を降順で並び替ることができる。



 ー 桁の切り捨て
TRUNCATE

TRUNCATEはテーブルのデータ削除にも使われるが、引数に指定した値を任にの桁で切り捨てることもできる。

SELECT TRUNCATE(data, 1)

この場合、「dataカラム」に入っている数値を小数点第一位で切り捨てることができる。
(例:513.25 → 513.2)

SELECT TRUNCATE(data, -1)

この場合、「dataカラム」に入っている数値を一桁目で切り捨てることができる。
(例:513.25 → 510)




 ー 文字を結合する
CONCAT( )

SELECT 'My' 'S' 'QL';

これで「MySQL」と出力される。



 ー 日付または時刻を指定したフォーマットで整形する
DATE_FORMAT( )

SELECT DATE_FORMAT(birth, '%Y年%m月%d日') 

この場合は、「birthカラム」が「Y年m月d日」の形に整形される。

Y、m、dとは?
SQLであらかじめ指定されている指定子のこと
Yの意味は、年、数字、4 桁
mの意味は、月、数字 (00..12)
dの意味は、日、数字 (00..31)

%とは?
%(ワイルドカード文字)は0文字以上すべての文字という意味。


 

ー 一部分を切り抜く
SUBSTRING( )

SELECT SUBSTRING(name, 1, 2)
FROM car;

この場合、「carテーブル」の「nameカラム」から「1文字目から2文字」切り抜く


 ー 検索結果(SELECT)を結合する(重複は除外)
UNION

SELECT  userId
FROM  football
UNION
SELECT  userId 
FROM  baseball;

この場合、取り出される情報は「footballテーブル」の「userId」と「baseballテーブル」の「userId」の両方になる。
※ただし、重複分は除外される。
注意点としては、2つのSELECTの列数を同じにしておく必要がある。


 ー 検索結果(SELECT)を結合する(重複も取得)
UNIONALL

SELECT  userId
FROM  football
UNIONALL
SELECT  userId 
FROM  baseball;

この場合、取り出される情報は「footballテーブル」の「userId」と「baseballテーブル」の「userId」の両方になる。
※重複分も取得される。
注意点としては、2つのSELECTの列数を同じにしておく必要がある



 ー 表を結合する

SELECT * from car;
SELECT * from price;
の2テーブルを「同一のid」という条件で結合させたいとき、

SELECT *
FROM car, price
WHERE car.id = price.id;

これで「carテーブル」と「priceテーブル」をid合わせで結合する。



GROUP BY

ー グループ化する
GROUP BY

SELECT COUNT(name)
FROM car 
GROUP BY day;

「GROUP BY day」で同じ値の「day」をまとめる。
上記の場合、「carテーブル」の「day」ごとにまとめてグループを作り、個数を取得できる。

SELECT day, COUNT(name)
FROM car 
GROUP BY day;

この場合は、取得する値が、「dayカラム」と「nameカラム」の個数となる。


ー 複数をグループ化する
GROUP BY 対象のカラム1, 対象のカラム2;

SELECT day, size, COUNT(name)
FROM car 
GROUP BY day, size;

「GROUP BY day」で「day」「size」ごとにまとめる。

例)
・day→1/1, size→100
・day→1/1, size→200
・day→1/3, size→200
・day→1/3, size→200
がある場合、上記のコードでまとめると
・day→1/1, size→100 count→1
・day→1/1, size→200 count→1
・day→1/3, size→200 count→2
となる。



集計関数

・COUNT:レコード数
・AVG:平均
・MAX:最大値
・MIN:最小値
・SUM:合計

SELECT AVG(speed), MAX(speed),
FROM car 
GROUP BY day;

この場合「carテーブル」から平均速度(speed)と最大速度(speed)を取得できる。


JOIN

テーブル間で共通するデータを軸にテーブル同士を結合する。

ー テーブルを結合する(内部結合)
INNER JOIN  ON

SELECT *
FROM car AS c
INNER JOIN track AS t ON c.id = t.id;

「carテーブル」を「c」、「trackテーブル」を「t」とテーブル名を変え、
「cテーブル」に「tテーブル」を結合させる。
結合条件(ON以降)は「cのid」と「tのid」

取得データを両方のテーブルから取得したいときは、
SELECT c.○○, t.○○」 と入れる。


ー データのないものも含めテーブルを結合する(外部結合)
LEFT OUTER JOIN  ON

例えばidがない車も含めて出力したくても、「INNER JOIN」を使うと、idがないレコードは出力されない。

そんなときは「LEFT OUTER JOIN」をつけると、データがない箇所は「NULL」をつけて出力してくれる。

SELECT *
FROM car AS c
LEFT OUTER JOIN track AS t ON c.id = t.id;


CREATE文

 ー 新しいデータベースの作成

CREATE DATABASE training;

この場合新規に「taraining」という名前のデータベースを作成することができる。


CASE式

 ー CASE

プログラミングでいうif構文。
条件を指定して、それに合致しているか、
条件1に合致して入れば処理完了、合致していなければ条件2へ、
それにも合致しなければelseへという式。

SELECT CASE WHEN 条件1 THEN 値
    WHEN 条件2 THEN 値
       ELSE 値 END
FROM テーブル名



サブクエリ

 ー サブクエリ

クエリの中にクエリを書く。

例えば下記のような平均価格を出すSQL文があるとき

SELECT AVG(price)
FROM items;
//70,000とする

SELECT *
FROM items
WHERE price >= 70000;

これをSQL一本で書くときに用いるのがサブクエリ。

SELECT *
FROM items
WHERE price >= (SELECT AVG(price)
                  FROM items);


 ー 相関サブクエリ

例えば下記のような平均価格を出すSQL文があるとき、
categoryカラムに複数のカテゴリーが入っており、それぞれのカテゴリーから平均価格を求めたい。

SELECT *
FROM items AS i1
WHERE price >= (SELECT AVG(price)
                  FROM items AS i2
                 WHERE i1.category = i2.category
                 GROUP BY category);

こう書くことで、FROM itemsの「i1」とサブクエリ内の「i2」が同じcategoryだと認識されて、正しい値が返される。





INSERT文

 ー データベースにレコードを追加
INSERT INTO VALUES( )

INSERT INTO users(id,name)
VALUES(1, 'training');

この場合「usersテーブル」の(id,name)にそれぞれ(1,training)を追加する。
idに1、nameにtrainingが追加される。


UPDATE文

 ー レコードの情報を更新する。

UPDATE users
SET name = '田中',birthday = '2000-01-01'
WHERE id = 1;

この場合「usersテーブル」の「id = 1」の情報が「name = 田中、 birthday =  2000-01-01」に更新される。

DELETE / TRUNCATE文

 ー 削除
DELETE

テーブルからレコードを削除する際にはDELETE文を使う。

DELETE FROM car
WHERE id = 1;

この場合「carテーブル」から「id = 1」のレコードを削除する。

 ー 削除した後、再度作り直す
TRUNCATE

テーブル自体を一度削除した後、再度作り直す命令
DELETEのように条件を指定して特定のデータだけを削除することはできない。
テーブル内の全データが一括削除される。

TRUNCATE car;

これで、「carテーブル」を削除できる



DROP TABLE文

 ー テーブルを削除

テーブルを削除する際にはDROP文を使う。

DROP TABLE car;

この場合「carテーブル」を削除する。

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