SQL

SQL

DATETIMEとTIMESTAMPの違い:タイムゾーンと選び方

MySQLのDATETIMEとTIMESTAMPについて、扱える範囲・タイムゾーン変換・2038年問題の違いを実行例で確かめ、用途ごとの選び方を表に整理します。MySQL 8.0対応、初心者向けです。
SQL

SQLで中央値・パーセンタイルを求める方法(MySQL 8.0)

MEDIAN関数がないMySQLで中央値を求める書き方と、CUME_DIST・NTILEでパーセンタイルや4分位を出す方法を解説します。偶数件やNULLの扱いもMySQL 8.0の実例つきで紹介します。
SQL

連続ログイン日数をSQLで求める:ROW_NUMBERと日付の引き算

日付からROW_NUMBERを引く定番テクニック(ギャップ&アイランド)で、連続ログイン日数と最長記録を求めます。同じ日の重複ログインの落とし穴や、LAGで途切れた日を探す方法も、MySQL 8.0の実例つきで解説します。
SQL

SQLのWITH ROLLUPで小計・総計を出す方法(MySQL)

GROUP BYにWITH ROLLUPを付けて、小計・総計の行を1本のクエリで出す方法を売上データの実例で解説します。GROUPING()で総計行と元データのNULLを見分けるコツも紹介。MySQL 8.0対応です。
SQL

売上0件の日も表示するSQL:再帰CTEで連続した日付を作る

GROUP BYの日別集計では、注文がない日が結果から消えてしまいます。再帰CTEやカレンダーテーブルとLEFT JOINで日付を補い、0件の日も表示する方法をMySQL 8.0の実例つきで解説します。
SQL

インデックスが効かない7つのパターンと直し方(MySQL)

列に関数をかける、暗黙の型変換、中間一致のLIKE、ORなど、インデックスが使われなくなる7つの書き方と直し方を解説します。MySQL 8.0対応で、EXPLAINの見方も実例つきで紹介します。
SQL

SQLで重複データを1件だけ残して削除する方法(ROW_NUMBER)

GROUP BYとHAVINGで重複データを見つけ、ROW_NUMBERとJOINを使ったDELETEで1件だけ残して消す手順を解説します。エラー1093の回避法や、消す前のバックアップ・確認手順もMySQL 8.0の実例つきで紹介します。
SQL

LAG・LEAD関数で前日比・前月比を出す方法(MySQL 8.0)

MySQLのLAG・LEAD関数で前の行や次の行の値を参照し、前日比・前月比・増減率を出す書き方を実例つきで解説します。欠損日のずれやゼロ除算など、集計で間違えやすい点の対処法も紹介します。
SQL

グループごとの最新1件を取る3つのSQL(ROW_NUMBERほか)

顧客ごとの最新注文のような「グループごとの最新1件」を取るSQLを、ROW_NUMBER・相関サブクエリ・JOINの3通りで比べます。同じ日時が並んだときの扱いと、効くインデックスもMySQL 8.0のサンプルつきで解説します。
SQL

MySQLの複合インデックス設計:左端マッチとカラム順の基本

MySQLの複合インデックスでカラムを並べる順序が、なぜ検索性能を大きく左右するかを解説します。左端マッチの原則、等値条件とレンジ条件の適切な配置、カーディナリティを活かした選択基準をEXPLAINの実例つきで整理します。