LoginSignup
5
2

More than 5 years have passed since last update.

新卒が書いたSQLおさらい

Last updated at Posted at 2018-06-04

概要

研修のまとめ。普段何気なく使っているけれど、そもそもそれ自体に色々と種類とかあるよね?というおさらい。MySQLを前提に書く。

DBの基本的な考え方

狭き門が良き。あとで変更するかもしれないな・・・と思って制限をゆるくするのはよろしくない。変更することが確実にわかっているのであれば、場合によってはよし。

SQLのコマンド種別

  • データを操作するための言語(データ操作言語:DML)
  • データを定義するための言語(データ定義言語:DDL)
  • データを制御するための言語(データ制御言語:DCL)

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

  • INSERT INTO (行データもしくは表データの挿入)
  • SELECT 〜 FROM 〜 WHERE (表データの検索、結果集合の取り出し)
  • UPDATE 〜 SET (表を更新)
  • DELETE FROM (表から特定行の削除)

INSERT

INSERT INTO テーブル名(カラム名1,カラム名2) VALUES(1,2)

バルクインサート

1回のINSERT文で復数のデータを登録する方法。
1個1個INSERT文でデータを挿入していくよりも、データを挿入できる速度が高速になる。

INSERT INTO users (name, password, email, created_at, updated_at)
VALUES
    ('name_sample1', 'PassW0rd!','sample1@gmail.com', NOW(), NOW()),
    ('name_sample2', 'paSs-WoRd','sample2@gmail.com', NOW(), NOW()),
    ('name_sample3', 'paSS_W0rd!','sample3@gmail.com', NOW(), NOW()),
    ('name_sample4', 'paSS_Word!', 'sample4@gmail.com', NOW(), NOW())

PHP/MySQL でレコードを N 件ずつバルクインサート - Born Too Late
http://blog.yuyat.jp/archives/2018

バルクインサートとインサートで処理速度を比較してみた | ニクニクドットミー
http://nikuniku.me/?p=306

UPDATE

UPDATE テーブル名
 SET カラム名2=2, カラム名3=3
 WHERE カラム名1=1

DELETE

DELETE FROM テーブル名
 WHERE カラム名1=1

物理削除と論理削除

データベースのデータ削除として、物理削除 と 論理削除 の2つの方法がある。

物理削除

物理削除とは、SQLのDELETE文を使ってデータベース上からデータを削除してしまう方法。
データベースを触ったことがある人は、この方法でデータを削除していることが多かったのでは?

論理削除

論理削除とは、レコードに削除フラグを用意して、削除する際にフラグを有効にすることで、データベース上には 存在するが、システム的にデータが存在しないことにする方法。

論理削除を利用する場合のメリットとしては、データ自体は残っているため、何か問題が発生した際にデータを戻すことができる。逆にデメリットとしては、データが残り続けてるため、データベースのパフォーマンスが低下したり、データを参照する際にフラグを確認するなどがある。

物理削除?論理削除?どっちを利用する?

どちらを利用するかは、状況によるので、絶対的な正解はない。
大事なのは、それぞれのメリット・デメリットを理解して、何故そっちを選ぶのかを説明出来ること。

DELETE_FLAG を付ける前に確認したいこと。@Jxck_

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

  • CREATE (データベースオブジェクト(表、インデックス、制約など)の定義)
  • DROP (データベースオブジェクトの削除)
  • ALTER (データベースオブジェクトの定義変更)

昨今のフレームワークで "マイグレーション" と呼ばれているものはこの部分を扱うユーティリティ!

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

  • GRANT (特定のデータベース利用者に特定の作業を行う権限を与える)
  • REVOKE (特定のデータベース利用者からすでに与えた権限を剥奪する)
  • BEGIN (トランザクションの開始)
  • COMMIT (トランザクションの確定)
  • ROLLBACK (トランザクションの取り消し)
  • SAVEPOINT (任意にロールバック地点を設定する)

WHEREの指定で便利な奴ら

LIKE(部分一致)

SELECT *
 FROM テーブル名1
 WHERE カラム名1 LIKE '文字列%'
    AND  カラム名2 LIKE '%文字列'
    AND  カラム名2 LIKE '%文字列%'
 ORDER BY カラム名1

IN(OR条件でまとめて値を指定して比較)

SELECT *
 FROM テーブル名1
 WHERE カラム名1 IN(1, 2, 3)

BETWEEN(範囲指定)

SELECT *
FROM テーブル名
WHERE カラム名 BETWEEN 2 AND 3

GROUP BYとHAVING
行のグループ化とグループ化したものに対する条件

SELECT カラム名1
 FROM テーブル名1
 WHERE カラム名1 = '値1'
GROUP BY カラム名1
SELECT カラム名1, COUNT(カラム名1)
 FROM テーブル名1
 WHERE カラム名1 = '値1'
GROUP BY カラム名1, カラム名2
HAVING COUNT(カラム名1) > 2

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2