SQL構文(データの検索)

ここでは「データ操作言語(Data Manipulate Language)」のうち、
データを検索するSQL文を説明する。

基本的な記述法

文字列

テーブルやカラム名を指定する際には、
バッククォートで囲むが、必須ではない。

検索対象の文字列を囲む際は、
シングルクォート、もしくはダブルクォートを使用する。

例:

WHERE `goods`.`name` = "定規"

バッククォートは、多くのキーボードの場合、
Shift + @ キーで出るはずである。

テーブル→カラムの指定

多くの場合、テーブル名からカラム名という形で指定する。
このふたつの名前は、ドットでつなげる。

例:「goods」テーブルの「name」カラムを指定する場合

goods.name

使用する文字

すべて半角。

テーブル名とカラム名は小文字とアンダーバーのみが基本。

「SELECT」や「FROM」などのキーワードは、大文字小文字共に使用可能だが、
基本的にキーワードは大文字にしたほうが、見やすさが向上する。

一応、日本語などのマルチバイトも使用可能な場合もあるが、
プログラマー視点からすると、それはけっこう気持ち悪いかもしれない。

評価優先順位

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. SELECT
  8. DISTINCT
  9. ORDER BY
  10. TOP(LIMIT)

SQL文は基本、SELECT文から書き始めるため、
SELECTで指定した別名(AS)も、FROMでも使用可能に見えるが、
実際には、FROMの方が先に評価されるため、
SELECTで指定した別名は、参照できない時点にある。

参考・引用元
Qiita:SELECT文の評価順序の話
評価の順序以外にも、よく読んでいくと、
SQLの動作の大まかな仕組みがわかる記事。すごい!

SELECT

出力表示したいテーブルを指定する。

カラム名単体でも指定可能だが、
後にJOINで結合することも考えて、テーブル名とカラム名で記述したほうがよい。

例:「goods」テーブルの「price」カラムを指定する場合・・・

SELECT goods.price

「*」はワイルドカードの意味で、すべてのカラムを指定できる。
しかし、出力するデータ量を絞ったり、
実際に使われているカラムを、わかりやすくするという意味で、
最終的には、カラム名を指定したほうがよい。

ちなみに、SQL文で真っ先に書くため、先に処理するように見えるが、
実際には、けっこう後のほうに処理されている
要するに、SELECT句は最終的に出力する値を書く部分と考えるとよい。

FROM

テーブルの指定。

カンマ区切りで複数テーブルを指定する事も可能だが、
その場合、基本的にJOINを使用するので、複数テーブル指定の機会は、あまりない。

WHERE

条件指定。

例:商品の中で、種類(goods.type)が「おもちゃ」のものを検索する場合

SELECT goods.name 
FROM goods 
WHERE goods.type = `おもちゃ`

HAVING

条件指定。

極端な話、WHERE句とほぼ同様で、WHEREの代わりに使う事もできる。
違いは、こちらがGROUP BYの後に実行される事になる程度。

記述する順番も、WHERE → GROUP BY → HAVING でなければならない。

後のほうに処理されるSELECTは先に書くのに・・・

JOIN

他のテーブルと、条件を指定して結合する。

続く「ON」により、結合条件を指定する。

例:商品(goods)の分類表が別にある場合、それと結合する。

SELECT goods_category.name
FROM goods
JOIN ON goods.category_id = goods_category_id

ちなみに「ON」を指定せずにJOINすると、
最も行の多い出力結果に合わせて、結合対象が繰り返し出力されるだけなので、
一応データは出力できるが、合理的ではない。

INNER JOIN

普段行うJOINが、内部結合である。
正式には「INNER JOIN」だが、「INNER」は略す事が可能。

表として見ると、右側に追加で結合される形となる。

「ON」区により、条件指定を行い、
これにより、ふたつのテーブルのカラムの値が一致したもの同士で、
結合する事ができる。

ただし、どちらか一方でも一致する値がなかった場合、
出力結果からレコードごと除外される

LEFT JOIN

外部結合と呼ばれる結合方法。

表として見ると、左側に結合される。

結合対象に、条件に一致する値がなくても、
出力結果にレコードごと除外される事がない

結合対象に条件に見合うデータはなかったが、
それまでのデータは、保持しておきたいという場合に、使うとよい。

値の計算

主にSELECT句の中で使う、計算用の構文である。

SUM

値の計算を行う。
列を指定した場合は、列の合計値を求める。
WHEREで条件指定などを行ったうえで使うとよい。

例:「goods」テーブルの「price」カラムの合計値を求める場合

SELECT SUM(goods.price) FROM goods

じつは、こんな使い方もできる。
例:結果として6が帰ってくる

SELECT SUM(1 + 2 + 3)

FROM句で、テーブルやカラムを指定しなくても、
SELECT句のみでも、値の計算ができるが、
もちろん、単なる計算機のためにSQLを発行するのは愚策なので、
こういう計算はアプリで行い、
SQL文は、ちゃんとデータベースの中身を使った計算を行うようにしよう。

MAX

指定した列の、最大の値を求める。

MIN

指定した列の、最小の値を求める。

COUNT

出力された結果の行数を求める。
フィールドの値は関係ないので、指定する値は「*」でもよい。

AVG

列の平均値を求める。
ちなみに平均値は、合計数を数で割った数値である。

対象の値がNullの場合は、平均値計算の「数」から除外される
本当に値はないが、もし平均値計算の対象に入れたい場合は、
Nullではなく0を挿入しておく必要がある。

副問合せ

サブクエリとも言う。
丸カッコの中にクエリを記述し、
その結果を元に、表側のクエリの算出条件とする。
ちなみに、丸カッコで囲まれていない表側のクエリは、
「主問合せ」や「メインクエリ」と言う。

SELECT句で使う場合

副問合せで出力される値は、必ず1件にする必要がある

SELECT句で使用する副問合せは、主問合せのFROM句で指定した、
テーブルの値を使用することができる。

FROM句で使う場合

副問合せの出力結果そのものを、テーブルとして使用する事ができる。

FROM句は処理の順番は、他の句に比べて先になるため、
主問合せで指定および算出された値を、
FROM句の副問合せで使う事はできない。

WHERE句で使う場合

主に、副問合せの中の条件に合った行の出力可否に使う。

主な使い方としては、主問合せでカラムを指定し、
演算子でサブクエリを比較する。

GROUP BY

選択したカラムの値が同じものでグループを作り、1行に固めてしまう。
「GROUP BY」だけで使うと、選択したカラムの最初の要素しか出力されないため、
SELECT句で使う「SUM」関数などと組み合わせて、
グループごとの集計を行うというのが、基本的な使い方。

例:商品の種類(goods.type)ごとの合計金額を算出する場合

SELECT goods.type, SUM(goods.price)
FROM goods
GROUP BY goods.type

AS

「エイリアス」の略。つまり別名である。

テーブル名およびカラム名の次に、「AS」で指定する事で、
そのテーブルおよびカラムに対し、その別名で指定する事ができる。

いちいちテーブルやカラム名を記入するのが面倒であったり、
JOINなどで、同じカラム名が発生してしまう可能性のある場合に、使用するとよい。

例:「goods.name」カラムを「gn」で指定する事が可能。

SELECT goods.name AS gn
FROM goods

あくまでも、「gn」が「goods.name」という文字列を持っているのではなく、
「goods.name」カラムそのものを示している点に注意。

別名は、副問合せでも使用可能だが、
FROM句で使う副問合せ内から、主問合せの別名を指定する事はできないので注意。