プログラミング

SQL

カバリングインデックスで高速化:Using indexの意味と作り方

SELECTする列をすべてインデックスに含めて、テーブル本体を読まずに答えるカバリングインデックスの作り方を解説します。複合インデックスの列の順番や、SELECT *で効かなくなる理由もMySQL 8.0の実行結果つきで紹介します。
SQL

EXPLAIN ANALYZEの使い方:実行時間と実際の行数を読む

MySQL 8.0.18以降のEXPLAIN ANALYZEで、推定値ではなく実際の実行時間と行数を確かめる方法を解説します。actual timeやloopsの読み方、推定とのずれから遅い原因を探す手順まで、サンプルSQLつきで紹介します。
SQL

楽観ロックと悲観ロックの違い:FOR UPDATEとversion列

在庫の二重引き当てや更新の上書きを防ぐ排他制御を、MySQLのSELECT ... FOR UPDATEとversion列の2通りで実装します。NOWAIT・SKIP LOCKEDの使い方と、どちらを選ぶかの判断表つきです。
SQL

MySQLの照合順序とutf8mb4:検索結果が変わる理由と設定

MySQLで「はは」と「パパ」が一致したり、絵文字どうしが同じと判定されたりする原因を、照合順序(collation)の仕組みから解説します。主な照合順序の比較表と、DB・テーブル・列ごとの設定方法つき。
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の見方も実例つきで紹介します。