12.【MySQL】レコードの抽出【SELECT文】

MySQLデータベースのテーブルからレコードを抽出してみましょう。レコードの抽出するためのSELECT文、条件を付けて抽出するためのWHERE句、条件式を書くための比較演算子や論理演算子について解説します。

目次

レコードの抽出

テーブルからレコードを抽出するには次のように記述します。

SELECT * FROM テーブル名;

この * は「すべての」という意味です。

このコードを実行するとテーブル内の全てのレコードが抽出されます。

特定のカラムのみ抽出したい場合は次のように * の代わりにカラム名を指定します。

SELECT カラム名 FROM テーブル名;

抽出結果の並べ替え(ORDER BY句)

MySQLではSELECT文でレコードを抽出する際にORDER BY句を付けることで、レコードを数値の小さい順や大きい順、アルファベット順に並べ替えて取得することができます。

数値の小さい順やアルファベット順に並べ替え

ORDER BY句は次のようにSELECT文に続けて記述します。

-- 指定したカラムの値をもとに並べ替え
SELECT * FROM テーブル名 ORDER BY カラム名;

この時指定したカラムの値が数値なら小さい順に、値が文字列ならアルファベット順に並べ替えて取得します。

逆順に並べ替え

数値の大きい順やアルファベットの逆順に並べ替えたい場合は次のようにORDER BY句に続けてDESCと記述します。

-- 指定したカラムの値の逆順で並べ替え
SELECT * FROM テーブル名 ORDER BY カラム名 DESC;

指定したカラムの値が同じだった時に別のカラムの値をもとに並べ替える

指定したカラムの値が同じだった時にどう並べるかを指定したい場合、カンマ区切りで2つ目のカラムを記述します。

-- 指定したカラムの値の逆順で並べ替え
SELECT * FROM テーブル名 ORDER BY カラム名1 DESC, カラム名2;

このように記述するとカラム名1の逆順で並び替えたうえで、カラム名1の値が同じものはカラム名2の値を参照して順に並べ替えて取得してくれます。

取得するレコードの件数を制限(LIMIT句)

上位何件かのみを抽出

レコードの上位何件かのみ抽出したい場合はLIMIT句を使います。

-- レコードの上位3件のみを抽出
SELECT * FROM テーブル名 LIMIT 3;

LIMIT句には単に希望した件数のレコードを取得する以外にも、膨大なレコードを持つテーブルから数件だけ取得してどのようなレコードが入っているか確認する、という用途もあります。

他の句と併せて使用

LIMIT句は次のようにORDER BY句と併せて使用することもできます。

その場合は次のようにカンマ区切りでLIMIT句を記述します。

-- レコードを逆順に並べ替えて上位3件のみを抽出
SELECT * FROM テーブル名 ORDER BY カラム名 DESC, カラム名 LIMIT 3;

最初の何件かを除外してその後の何件かを抽出

先頭の何件かを除外してその後の何件かを抽出したい場合はLIMIT句に続けてOFFSETというキーワードを使います。

-- レコードの1、2件目を除外して3件目から5件分のレコードを取得
SELECT * FROM テーブル名 LIMIT 5 OFFSET 2;

OFFSETは省略することもできます。

-- レコードの1、2件目を除外して3件目から5件分のレコードを取得
SELECT * FROM テーブル名 LIMIT 2, 5;

この場合も先頭の2件を除外して3件目から5件分のレコードを取得します。

OFFSETを書くかどうかでLIMIT句の直後にくる数字の意味が変わってくるので注意しましょう。

条件付きで抽出(WHERE句)

抽出するレコードに条件を付けたい場合はWHERE句を使います。

SELECT * FROM テーブル名 WHERE 条件式;

比較演算子

SQL文の条件式に使える比較演算子には次のものがあります。

条件 比較演算子
左辺と右辺が等しい =
左辺より大きい <
左辺以上 <=
左辺より小さい >
左辺以下 >=
左辺と右辺が等しくない != または<>
下限値から上限値の範囲に含まれる BETWEEN
~が含まれる IN
SELECT * FROM テーブル名 WHERE カラム名 = 数値;
SELECT * FROM テーブル名 WHERE カラム名 < 数値;
SELECT * FROM テーブル名 WHERE カラム名 <= 数値;
SELECT * FROM テーブル名 WHERE カラム名 > 数値;
SELECT * FROM テーブル名 WHERE カラム名 >= 数値;
SELECT * FROM テーブル名 WHERE カラム名 != 数値;
SELECT * FROM テーブル名 WHERE カラム名 BETWEEN 数値1 AND 数値2;
SELECT * FROM テーブル名 WHERE カラム名 IN (数値1, 数値2);

論理演算子

SQL文の条件式に使える論理演算子には次のものがあります。

AND

条件式1 AND 条件式2

2つの条件式の両方を満たす

OR

条件式1 OR 条件式2

2つの条件式のいずれかを満たす

NOT

条件式 NOT BETWEEN 数値1 AND 数値2
条件式 NOT IN (数値1, 数値2)

続く演算子の否定

文字列の条件付き抽出

完全一致

-- 完全一致
SELECT * FROM テーブル名 WHERE カラム名 LIKE "任意の文字"

0文字以上の任意の文字

-- 前方一致
SELECT * FROM テーブル名 WHERE カラム名 LIKE "任意の文字%"
-- 後方一致
SELECT * FROM テーブル名 WHERE カラム名 LIKE "%任意の文字"
-- 部分一致
SELECT * FROM テーブル名 WHERE カラム名 LIKE "%任意の文字%"

大文字小文字を区別する(BINARY)

SELECT * FROM テーブル名 WHERE カラム名 LIKE BINARY "%任意の文字%"

任意の1文字 _

SELECT * FROM テーブル名 WHERE カラム名 LIKE "__a%";

3文字目がaのレコードを抽出するには1文字目と2文字目にアンダーバー _ を記述し、3文字目に任意の文字(この場合はa)を記述します。

この場合後方は何でもいいので%を付けて前方一致としています。

%と_の文字を対象にする場合

下記のようにすると全てのレコードが抽出されてしまう

SELECT * FROM テーブル名 WHERE カラム名 NOT LIKE "%%%";

%と_自体を対象にしたい場合はその前に\を付ける

SELECT * FROM テーブル名 WHERE カラム名 NOT LIKE "%\%%";
SELECT * FROM テーブル名 WHERE カラム名 NOT LIKE "%\_%";

NULLの抽出

普通に条件を指定しても値がNULLのレコードは該当しません。

値がNULLのレコードも含みたい場合は次のように記述します。

SELECT * FROM テーブル名 WHERE カラム名 IS NULL;
SELECT * FROM テーブル名 WHERE カラム名 条件式1 OR カラム名 IS NULL;

値がNULLのレコードを含みたくない場合は次のように記述します。

SELECT * FROM テーブル名 WHERE カラム名 IS NOT NULL;
SELECT * FROM テーブル名 WHERE カラム名 条件式1 OR カラム名 IS NOT NULL;
このエントリーをはてなブックマークに追加

コメントを残す

頂いたコメントは一読した後表示させて頂いております。
反映まで数日かかる場合もございますがご了承下さい。