SQLコードの意味がわからない…不思議なSQLコードサンプル集
  • facebookページ
  • twitterページ
  • 2019.08.20

    SQLコードの意味がわからない…不思議なSQLコードサンプル集

    「何このSQL、意味がわからない…」

    マニュアルを見ればすぐわかるものではなく、何のためにこんなコードを書いたのか、意図がわからないSQLを集めました。

    「先輩、このSQLどういう意味ですか?」と、会社の後輩に聞かれて、あなたは答えられるでしょうか?

    ※以下、MySQL用のSQLをサンプルコードとして紹介しています。データベースは、MySQLのサンプルデータベースEmployees、SQL実行結果の表示にはphpMyAdminを使用しています。

    count(1)の意味は、count(*)と同じ

    count(*)ならわかるけど、count(1)ってどういうことなんでしょう?

    実は、count(1)の実行結果は、count(*)と同じ。

    その昔、count(*)の代わりにcount(1)を使うと、処理が少し速くなるという時代があっとようです。

    今は、最適化エンジンが進化して特に実行速度は変わらなくなりました。

    count(1)の意味は、

    select 1 from テーブル名で抽出できるデータの件数になります。

    select 1 from テーブル名の実行結果

    なお、count(カラム名)とすると、指定したカラムがNULL以外の値のものをカウントします。

    where 1=1の意味は、「常に真」 where句が可変のとき役立つ

    一見意味のない、where 1=1(常に真)という条件ですが、プログラムと連携するときに少し役立ちます。(where 1 でも同様) 例えば、データ検索用の条件入力用画面からSQLを組み立てる場合。

    通常なら、条件がない場合はwhere句なし、一番最初の条件には「and」を入れない、という微妙に面倒な処理を書かなければなりません。

    where 1=1を決め打ちで入れておくと、検索条件が入力されたフィールドを「and 項目=条件」でつないでいくことでSQLが完成します。

    プログラマーのちょっとした工夫なのですが、「エッ、なんだこれ」というコードを書いてしまうのは、メンテナンス等の面では問題あるかも知れません。

    SQLでのコロンの意味は2種類ある

    「SQLのコロンの意味ってなんですか?」

    と聞かれたとしたら、2つのケースがあります。

    MySQLで代入を表す明示的な書き方の場合と、Oracleでのバインド変数を表す場合です。

    MySQLで代入を表す「:=」

    MySQLでは、コロン・イコール(「:=」)と、イコール(「=」)は、ほぼ同じ意味です。

    MySQLでのイコール(「=」)は、値の評価(比較)と、値の代入という2つの動きをします。ただし、set文以外での=は「値の評価」という動きになります。

    そこで、select文などで、ユーザ定義変数に値の代入をする場合は、=ではなく、:=を使います。

    = は SET 以外のステートメントでは比較演算子 = として扱われるので、割り当て演算子にはこちらではなく、:= を使用する必要があります。

    MySQL :: MySQL 5.6 リファレンスマニュアル :: 9.4 ユーザー定義変数より

    Oracleでバインド変数を表す「:変数名」

    SQL内で:変数名と表記した部分に、C言語やPHPなどから渡される値が入ります。「:変数名」の部分をバインド変数と言います。

    SQLの構造自体は変えられないという制限があるため、バインド変数を使うことで、SQLインジェクション対策になります。

    SQLインジェクションは、検索画面に入力した文字列をそのままSQLとして発行した場合、予期せずdelete文などのデータベースを破壊するSQLを発行してしまうこと。

    例えば、検索画面にて「0;delete from usertable;」という値を入れた場合、入力値をそのままSQLのwhere句として発行する仕組みだと、内部でdelete文が発行されてしまう脆弱性が出来てしまうんですね。

    また、実行計画(最適化)を使いまわせるので、わずかながらSQLのレスポンスがあがるのもメリット。大量のSQLを発行する問い合わせ画面などに向いていると言えるでしょう。

    ただし、バッチ処理など1つのSQL文で大量のデータ処理をするケースで使うと、処理の最適化が出来ないため、逆に大きくパフォーマンスが落ちるケースもあるため、注意が必要です。

    バインド変数は、データベースによって表記方法が違います。はてなマーク「?」で表記するデータベースもあります。

    DELIMITER //の意味は、MySQLの仕様回避

    上記は、MySQLのストアドプロシジャ(またはファンクション)を定義する場合の書き方です。

    しかし、初見では「DELIMITER //」で、「エッ?」と思うこと必至。

    DELIMITERは、区切り文字を変更するのですが、なぜ区切り文字を変更する必要があるのか直感ではわからないんですよね。

    答えは、MySQLはセミコロン「;」が出現すると、定義文の途中であろうとSQLを実行してしまうという仕様のため。

    DELIMITERの行を抜いて実行すると、「return ‘Hello world’;」のところでSQLを発行してしまい、「ENDがない」ため、Syntax Errorになります。

    SQLのカッコの意味は、サブクエリを表す

    SQL初見の人が、カッコの部分を「どういう意味だろう?」と疑問に思うのは、サブクエリ(副問い合わせ)のことを指しているケースが多いと思います。

    カッコはサブクエリを表します。select文の実行結果を、別のselect文の条件に使うことです。

    あ上記は、employeesテーブルを自己連結して、誕生日が最も古い社員を抽出しています。

    実行結果は以下のとおりです。

    employeesテーブルに、「a」と「b」という別名をつけて、サブクエリとしています。

    サブクエリが複雑化すると、可読性が落ち、実行速度も遅くなる傾向があるため、使いどころには注意ですが、ぜひともマスターしたいテクニックですね。

    outer joinとinner joinの意味は、ベン図で直感で理解できる

    プログラマーとして、outer joinとinner joinは体で覚えていても、会社の後輩に「何が違うんですか?」と聞かれたとき、説明が難しいと思います。

    同様に、right joinとleft joinも説明しずらいもの。

    実は、ベン図を書いて説明すると比較的伝わりやすいんですよね。

    こちらの記事を参考になさってください。

    SQL Joinサンプル集 Joinで遅いSQLの原因を調べる方法


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!フリーエンジニアになりたい方向けのコンテンツも盛りだくさんです。

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。年収800万円以上のハイスペック転職をご希望の方は「ポテパンプロフェッショナル」もご用意しておりますのでご利用下さいませ。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料25万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテクラバナー ポテプロバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE

    ポテパンおすすめ案件