複数の条件を指定した抽出
「○○であり、かつ××である」と2つ以上の条件がどちらも成立ことを表すには、ANDという演算子を使います。
「○○または ××である」とどちらか一方の条件が1つでも成立することを表すには、ORという演算子を使います。
これらのANDやORを論理演算子といいます。
ANDとORを組み合わせることもできます。
「○○でない」と否定する場合には、NOTを使います。
論理演算子 | 論理演算 | 意味 |
---|---|---|
AND | 論理積 | すべての条件を満足している(かつ) |
OR | 論理和 | いずれかの条件を満足している(または) |
NOT | 否定 | 条件の否定(~でない) |
それぞれの論理演算子を組み合わせて使用することも可能です。
ただし論理演算子を組み合わせて使用する場合は、演算の優先順位を考える必要があります。
演算子の優先順位
NOT > AND > OR
【ヒント】
優先順位を変更したい場合には、括弧を使って優先順位を変えることができます。
例:WHERE NOT ≪条件X≫ AND ≪条件Y≫ OR ≪条件Z≫
このように記述した場合には、論理演算子の優先順位に従って自動的に、 と括弧内の順番で条件が決まることになります。
【書式】AND演算子を利用する
SELECT 列名1 , 列名2 ・・・ FROM テーブル名 WHERE 条件1 AND 条件2;
【書式】OR演算子を利用する
SELECT 列名1 , 列名2 ・・・ FROM テーブル名 WHERE 条件1 OR 条件2;
【書式】AND演算子とOR演算子を利用する
SELECT 列名1 , 列名2 ・・・ FROM テーブル名 WHERE 条件1 AND(OR) 条件2 AND(OR) 条件3;
【書式】NOT演算子を利用する
SELECT 列名1 , 列名2 ・・・ FROM テーブル名 WHERE NOT 条件;
【書式】条件によって表示する値を指定する
SELECT
CASE
WHEN 条件1 THEN 表示する値
WHEN 条件2 THEN 表示する値
・・・
ELSE すべての条件に当てはまらないときの値
END AS エイリアス名
FROM テーブル名;
SELECT文の列名部分に、「CASE 〜 END」を記述します。
並べ替え
データベースに登録されているレコードは順序を持っていませんので、SELECT文で表示するレコードの表示順は、常に同じとは限りません。
少ないデータであれば問題はありませんが、何千件、何万件のレコードを扱う場合には、表示順が重要になることもあります。
そこで、表示する順序を列を基準に昇順、降順に並べ替えることができます。
(あくまで表示順であり、データベース内では順序情報は持ちません)
レコードを指定した列の値の順で表示させるには、ORDER BYを使います。
昇順はASCを、降順はDESCを指定します。
ASCは省略可能です。
つまり、ASC、DESCを指定しないとデフォルトで昇順に並べ帰られます。
また、「上(下)から何件までを表示」にはLIMITを使います。
「3番目から7番目」のような途中を表示したい場合は、OFFSETを組み合わせます。
【書式】レコードを昇順に表示させる ※「ASC」は省略可能
SELECT 列名 FROM テーブル名 ORDER BY 並べ替えの基準となる列名 [ASC];
【書式】レコードを降順に表示させる
SELECT 列名 FROM テーブル名 ORDER BY 並べ替えの基準となる列名 DESC;
【ヒント】並べ替えを組み合わせる
ORDER BY句の2つ以上の列を指定することで、並べ替えの結果をさらに別の列の基準として並べ替えることができます。
複数の列を指定する場合には、列と列の間をカンマで区切ります。
【書式】上位○件までを表示させる
SELECT 列名 FROM テーブル名 ORDER BY 並べ替えの基準となる列名 DESC または [ASC]
LIMIT 表示したい件数;
【書式】表示するレコードの範囲を決める
SELECT 列名 FROM テーブル名 ORDER BY 並べ替えの基準となる列名 DESC または [ASC]
LIMIT 表示したい件数 OFFSET 表示開始レコードのシフト数;
「表示開始レコードのシフト数」とは「何個移動したところから表示させるのか」を指定する数です。
例えば、「OFFSET 2」とすれば「1番目から表示するところを、2個後ろの3レコード目から表示する」という意味になります。
【ヒント】ふりがなでの並べ替え
氏名などの漢字データが使われている列を基準に並び替えを行うと、意図した順番にならないことがあります。
漢字は読み方が様々あるため、コンピュータはそれに対応できないからです。
そこで、漢字データが使われている列を基準に並べ替えを行うには、「ふりがな」列を別に用意するとよいでしょう。
ふりがな列は、ひらがなもしくはカタカナのどちらかに統一しておけば、コンピュータは、ひらがなもしくはカタカナの並び順を持っているので、それにしたがって並べ替えをしてくれます。
【ヒント】並べ替え時のNull値の扱い
Null値の含まれた列をORDER BYの基準列に指定した場合、MySQLでは、Null値はもっとも小さい値として扱われます。
(並べ替え時のNull値の扱いはRDBMSによって異なります)
テーブル内の列の値がどれだけの種類があるかを調べるにはDISTINCTを使います。
【書式】重複したデータを取り除く(DISTINCT)
SELECT DISTINCT 列名 FROM テーブル名;
DISTINCTを指定すると、指定した表示する列の値が重複する場合には、重複が取り除かれて1行となって表示されます。
このため、列の値の種類を調べることができます。
DISTINCTの後ろに2つ以上の列を指定すると、列の値の組み合わせで重複する値がある場合には、重複する行が取り除かれます。
グループ化と 集計
集約関数
SQLでは、四則演算の演算子を使うことで、1行の中の列と列の値の計算を行うことができましたが、集約関数を使うことで、行方向に対する計算を行うことができます。
集約関数を用いたSELECT文では、少なくとも1行は集約された結果が表示されます。
ここでは、[ensyu_db]データベースの[score_t]テーブルを使用して、集約関数を確認していきます。
sum(列名)
指定された列の値の合計を求めることができます。
引数には、数値型の列を指定します。
次の例は、[ensyu_db]データベースの[score_t]テーブルから、各教科ごとに合計を求めています。
avg(《列の値》)
指定された列の値の平均を求めることができます。
引数には、数値型の列を指定します。
次の例は、[ensyu_db]データベースの[score_t]テーブルから、各教科ごとに平均を求めています。
min(《列の値》)
指定された列の値の最小値を求めることができます。
引数には、数値型の列を指定します。
次の例は、[ensyu_db]データベースの[score_t]テーブルから、各教科ごとに最小値を求めています。
max(《列の値》)
指定された列の値の最大値を求めることができます。
引数には、数値型の列を指定します。
次の例は、[ensyu_db]データベースの[score_t]テーブルから、各教科ごとに最大値を求めています。
count(《列の値》)
指定された列のnull以外の値の個数を結果として返します。
引数には、列名のほか行全体を表す*(アスタリスク)を使用することができます。
【ヒント】
*を指定した場合には、null値も含めた行全体の個数、つまり行数を求めることができます。
次の例は、[ensyu_db]データベースの[score_t]テーブルから、count関数の引数にstudent_nameフィールドを指定して、student_nameフィールドの値の個数を求めています。
次の例は、count関数の引数に*を指定して、null値を含めた行全体の個数(テーブルの行数)を求めています。
グループ化(GROUP BY)
SELECT文にGROUP BY句を指定することで、行をグループ化することができます。
まとめられたグループに対して集約関数を使うことで、同一グループ内における値の合計や平均などを計算することができるようになりま す。
[member_list]テーブルのデータを見てみましょう。
「都道府県ごとにメンバの人数を数える」「男女別の年齢の平均を出したい」など、同じ値のレコードをグループにすることで、そのレコードの合計や平均など、グループ単位での処理が可能です。
グループごとにまとめるには、GROUP BYを使います。
【書式】グループごとに表示する
SELECT 列名 , 《集約結果》 FROM テーブル名 GROUP BY グループ化の基準になる列;
【ヒント】
SELECT句で表示する列には、GROUP BY句で指定された列や、集約結果しか指定することができません。
これは、グループ内で行ごとに固有の値を持っていても、集約して1行にまとめる方法が無いからです。
また、グループ化を行う列は1つだけでなく、複数列を指定することができます。
【ヒント】
グループ化を行うと同じ値をまとめることになるため、自動的にグループ化の基準列で並べ替えが行われます。
(MySQLでは昇順に並べ替えが行われます。)
グループ化と表示条件(HAVING)
グループ化された集約結果をもとに、条件を指定してレコードを抽出した場合には、HAVING句を使います。
レコードの抽出条件というと、WHERE句が思い当たるかもしれませんが、WHERE句はあくまでもSQLがテーブル内のどの行を対象に処理を行うのかを決めるための句になります 。
【書式】グループごとに分けて抽出した結果もとに、条件を指定してレコードを抽出する
SELECT 列名 ,《集約結果》 FROM テーブル名 GROUP BY グループ化の基準になる列
HAVING 表示する行の条件;
【書式】条件を指定して抽出した結果をもとにグループ化する
SELECT 列名 , 《集約結果》 FROM テーブル名
WHERE 行の抽出条件
GROUP BY グループ化の基準になる列
HAVING 表示する行の条件;
上の書式は、GROUP BY句の前にWHERE句があります。
グループ化する前に、全体のレコードに対して条件を指定してグループ化の対象になるレコードを絞った上で、グループ化をします。
そしてHAVING句でグループ化をした結果を基に条件を指定して表示するレコードを抽出します。
【書式】グループ化されたデータを並べ替える
SELECT 列名 , 《集約結果》 FROM テーブル名
WHERE 行の抽出条件
GROUP BY グループ化の基準になる列
HAVING 表示する行の条件
ORDER BY 並べ替えの基準になる列;
GROUP BY句を指定したSELECT文では、ORDER BY句で並べ替えを行う時の記述位置に注意が必要です。
GROUP BY句を使用する場合のSELECT文は、上のような順番で記述するようにします。
《グループ化と集計のまとめ》
グループ化をするとき、SQL文の順番に注意が必要です。
次の順番をおさえておきましょう。
【1】WHERE 条件
【2】GROUP BY グループ化の基準になる列
【3】HAVING 最終的に表示したいレコードの条件
【4】ORDER BY 表示したいレコードの並べ替え基準になる列
【ヒント】
HAVING句によりグループ化した集計値を表示の基準として利用し、同じグループに対しての表示とは別の集計結果を表示することもできます。
【ヒント】
グループ化の基準列は、列そのものでなくても、列の値に対して関数や演算を行った結果であってもかまいません。
参考図書
LINE公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】