footmark

ひよっこエンジニアの足跡

MySQLの基礎を勉強してみた2

前回の続きです。
基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! ) を読んで知らなかったことをまとめるシリーズ!

INを使ったサブクエリ

基本

サブクエリ(副問い合わせ)は、クエリの結果を使ってさらにクエリを実行する、2段階処理のことです。
サブクエリを使ったクエリは内部結合などでも実現できますが、サブクエリを用いた方が分かりやすく、また効率的になります。

書式は以下の通り。

SELECT * FROM テーブル名 WHERE カラム名 IN (1段階目の処理);

例えば、「1段階目の処理」に

SELECT MAX(カラム名) FROM テーブル名

と書くと、特定のカラムにおける最大値を持つレコードを表示できます。
あ、まとめて「テーブル名」と書いてしまいましたが、1段階目のテーブル名と2段階目のテーブル名は別のテーブルを指す想定です。

「=」と置き換えられる?

「IN」の使い方(構文?)が「=」と似ているなと思ったんですが、置き換えることはできるんでしょうか。
答えは、「置き換えることはできるが等しくはない」です。
1段階目の処理で結果が2件以上出力される場合、エラーになってしまいます。
WHEREにおける右辺でどれを比較すればいいか分からないよ!ってことですね。
対して、INがエラーにならないのは、Pythonのin演算子のような処理をするからだと思います。(推測)

ビュー

ビューとは

MySQLには「ビュー」と呼ばれる機能が存在します。
ビューとはSELECTした結果をテーブルのように保持できる機能です。
データをテーブル上のそれのように扱えるが、データそのものを存在しない。
C言語のポインタみたいなイメージです。

メリット

ビューを使うメリットは、任意のテーブルから任意のデータを集められることです。
ビューを作成する際、特定のテーブルからデータを参照するのですが、参照元のデータが変更されると、ビューのデータも更新されます。
逆も然りで、ビューのデータを変更すると参照元のデータにも反映されます。

作成方法

CREATE VIEW ビュー名 AS SELECT文;

閲覧方法

SELECT * FROM ビュー名;

ストアドプロシージャ

ストアドプロシージャとは

ストアドプロシージャとはMySQLにおける関数(のようなもの)です。
複数SQL文を1つにまとめることができます。

作成方法

ストアドプロシージャを作成する際、SQL文の文末に「;」を付けると、その時点で実行されてしまいます。
そこで DELIMITER を使って区切り文字を「;」以外に変更します。
(今回は「//」)

次にストアドプロシージャを作成します。
CREATE PROCEDURE ストアドプロシージャ名(引数名 データ型) の形で宣言した後、BEGIN と END の間にSQL文を記述します。

最後に変更した区切り文字を元に戻します。

mysql> DELIMITER //
       -> CREATE PROCEDURE ストアドプロシージャ名(引数名 データ型)
       -> BEGIN
       -> SQL文;
       -> SQL文;
       -> ...
       -> END
       -> //
mysql> DELIMITER ;

呼び出し方法

mysql> DELIMITER //
       -> CREATE PROCEDURE ストアドプロシージャ名(引数名 データ型)
       -> BEGIN
       -> SQL文;
       -> SQL文;
       -> ...
       -> END
       -> //
mysql> DELIMITER ;

返り値のあるストアドファンクション

ストアドプロシージャには返り値がありませんでしたが、返り値の存在するストアドファンクションという機能もあります。

参考

基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! )

基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! )