SQLBoltを解きながら覚えるクエリ文

commits4 min read読了の目安(約4200字

この記事はSQLBolt👈 のサイト順に構成されています。
備忘録です。

クエリ言語とは・・・データベースへ問い合わせする(操作)際に用いいられる言語、SQLで用いいられる際はSQL文という

処理順序

処理は単純に上から下に走ってるのではなく、決められた順序がある

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

基礎

//データベースの取得
SHOW DATABASES;

//テーブルのカラム取得
SELECT カラム FROM テーブル;

//テーブルの全てのカラム
SELECT * FROM テーブル; 

//テーブルの複数カラム(カラム1,カラム2)
SELECT カラム1,カラム2 FROM テーブル; 

//テーブルのカラム1と期待値が同じデータ(*ならレコード)を取得、(他にも!=,<=,>等)
SELECT * FROM テーブル
WHERE カラム1 = 期待値; 

//上記と同じ意味、テーブルを明示的に表現することもできる
SELECT * FROM テーブル
WHERE テーブル.カラム1 = 期待値; 

//カラム1が期待値1か期待値2どちらかに当てはまるデータ(*ならレコード)を取得
//カラム1 = 期待値1 OR カラム1 = 期待値2と同義
SELECT * FROM テーブル
WHERE カラム1 IN(期待値1,期待値2); 

//テーブルのカラム1が期待値1〜期待値2の間のデータ(*ならレコード)を取得
//NOT BETWEENなら期待値1〜期待値2間以外のデータ
SELECT * FROM テーブル
WHERE カラム1 (NOT) BETWEEN 期待値1 AND 期待値2; 

//LIKEは大文字小文字を区別しない文字列を検索
//%を後方につけることで文字列が途中まで一致してるものを検索でき、部分一致にしたい時は前後につける 
SELECT * FROM テーブル
WHERE カラム1(文字列) LIKE "文字列%";

制限と並び替え

//DISTINCTを使用するとカラムが一致するデータを取得しない
//ORDER BYはカラムの昇降順でデータを取得、文字列ならアルファベット順
//LIMITはデータをいくつまでを取得できるかを制限でき、OFFSETははじめのデータX個分をスキップし、次のデータから取得する(ここでいうなら5個分)
SELECT DISTINCT カラム FROM テーブル
ORDER BY カラム ASC(DESC)
LIMIT 4 OFFSET 5;

//多重ソート
カラム1でソートその中で重複してるデータの中をカラム2でソートする
SELECT DISTINCT * FROM テーブル
ORDER BY カラム1,カラム2 ASC(DESC);

テーブルの結合

テーブルとテーブルを結合させてからデータを取得するやり方
SQL素人でも分かるテーブル結合(inner joinとouter join)👈 詳しくはこちらの超優良記事を参考にしてください

//内部結合、INNERは省略可能
//片方のテーブルにNULLのカラムがある場合そのデータは取得しない
//条件は テーブル1.PK 条件(=,<=,!=など) テーブル2.FK という書き方をする
//条件がないと意図した結びつき方をしない
SELECT * FROM テーブル1
JOIN テーブル2 ON 条件

//外部結合、OUTERは省略可能
//LEFTで左テーブルを基準テーブルに、RIGHTで右テーブルを基準テーブルに
//基準テーブルのNULLカラムのデータを取得し、基準でないテーブルのNULLカラムは取得しない
SELECT * FROM テーブル1
LEFT(RIGHT) JOIN テーブル2 ON 条件

NULL

//カラムがNULLのデータを取得
//IS NOT NULLでNULL以外のデータを取得
SELECT * FROM テーブル
WHERE カラム IS (NOT) NULL;

別名

//ASをつけることで別名としてカラムを扱える
SELECT カラム AS カラム(別名) FROM テーブル;

//条件結果をひとまとめにしたい時などに使う
SELECT カラム = 200 AS カラム(別名) FROM テーブル;

//複雑な条件結果でも楽に運用できる
SELECT (カラム1+カラム2) * 100 > 20 AS カラム(別名) FROM テーブル名;

グループに分割

//()内から検索してくれる
//MAXなら最大値、AVGなら平均値、SUMなら合計値、COUNTならカラム数など
SELECT MAX(カラム1,カラム2) FROM テーブル;

//カラム1にデータを分割し、カラム2の合計値をそれぞれに持たせる
SELECT カラム1SUM(カラム2) FROM テーブル
GROUP BY カラム1;

抽出条件を指定

//WHEREと結果は同じ、抽出を行うだけ
SELECT * FROM テーブル
HAVING カラム1 = 期待値;

//グループに分割後、抽出を行える
//WHEREはGROUP BYより前に実行されるので再現できない👉処理順序
SELECT * FROM テーブル
GROUP BY カラム1
HAVING カラム1 = 期待値;

データの編集

//データをテーブルに追加する
INSERT INTO テーブル VALUES (,'文字列');

//データを更新する
//テーブルのカラムに値を入れ、更新している、複数操作可能
UPDATE テーブル SET カラム1=, カラム2 = 値・・・

//テーブルの中で条件を使って絞り込みカラム1に値を入れ、更新している
UPDATE テーブル SET カラム1 =WHERE 条件;

//条件で絞り込めない共通項目のないものを複数選択する
UPDATE テーブル SET カラム1 =WHERE 条件 IN(レコード1,レコード2・・・);

//条件に当てはまるテーブル内のデータを削除
DELETE FROM テーブル WHERE 条件;

テーブルの編集

//テーブルの作成
CREATE TABLE テーブル(
    PRIMARY KEY (id)//プライマリキーを作成、カラム名はほとんど場合id
    カラム1 データ型を指定 オプション
    カラム2 INT AUTO_INCREMENT, //自動で整数が入る
    カラム3 VARCHAR(可変数) DEFAULTNOT NULL,//可変数分の文字列、値がデフォルトで入り、NULLを許可しない
    );
    
//テーブル名変更
ALTER TABLE  テーブル名 RENAME  新テーブル名;

//テーブルにカラム追加
ALTER TABLE テーブル ADD カラム データ型指定;

//カラム名変更
ALTER TABLE テーブル CHANGE カラム名 新カラム名 データ型指定;

//カラム削除
ALTER TABLE テーブル DROP カラム;

//テーブルを削除
DROP TABLE IF EXISTS テーブル;

単一行関数

//小数点を四捨五入
SELECT ROUND(数値);

サブクエリ

//テーブル内の、カラム1の中で、(全てのカラム1の平均より下)のカラム1,カラム2を抽出
SELECT カラム1,カラム2
FROM テーブル AS テーブル1 //テーブルに別名をつけてテーブル2との違いを出してる
WHERE テーブル1.カラム1 < (SELECT AVG(カラム1) AS 平均カラム //カッコ内がサブクエリ
                     FROM テーブル AS テーブル2 //テーブルに別名をつける、上記理由と同じ
                     WHERE テーブル1.カラム2 = テーブル2.カラム2); //条件
		     //条件はWHEREだから先に行われる👉処理順序
		     //テーブル1をサブ(子)クエリ内で出している👉相関サブクエリ
		     //もし親クエリ関係なくサブクエリ内で完結してるいると非相関サブクエリになる

トランザクション

//途中でエラーが起こらない限り処理を一括して行なってくれる
//もし処理中エラーが起こった場合、トランザクションの処理をしてなかったことにしてくれる👉ROLLBACK
BEGIN; //トランザクション開始
INSERT INTO データ SELECT * FROM テーブル WHERE 条件; //👉成功
DELETE FROM テーブル WHERE 条件;//👉失敗、成功した上記を無かったことにしてくれる👉ROLLBACK
COMMIT; //トランザクション終了
//自動でROLLBACKを行うが、明示的に表示することもできる
//トランザクションとは"完全に成功した結果"or"処理が走ってなかったことにする"かの2択しか返さない