プログラミング

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の実例つきで整理します。
SQL

MySQLスロークエリログの設定と読み方:mysqldumpslowで分析

MySQLのスロークエリログを再起動なしで有効にする2行のSQLと、my.cnfでの設定、ログの各項目の読み方、mysqldumpslowで遅いSQLを集計する方法を解説します。SET GLOBALが今つながっている接続には効かない落とし穴にも触れます。MySQL 8.0対応。
SQL

MySQLのJSON型入門:JSON_EXTRACTとパス記法

MySQLのJSON型カラムの使い方を実例で解説します。JSON_EXTRACTによる値取得と$パス記法、->/->>演算子の違い、JSON_SETでの部分更新、JSON_TABLEでの配列行展開まで。MySQL 8.0対応。
SQL

WITH RECURSIVEで階層構造を取得する再帰CTE入門

MySQLのWITH RECURSIVEで組織図・カテゴリツリーなど階層データを1本のSQLで取得する方法を、動くサンプル付きで解説。無限ループを防ぐcte_max_recursion_depthの設定も紹介します。
SQL

LIMIT OFFSETページングの限界とSEEK方式の使い方

LIMIT OFFSETのページングは、深いページほど遅くなります。100万件のテーブルで実測し、前のページの最後の値で絞るSEEK方式に切り替える書き方と、行の比較(a, b) < (x, y)で遅くなる落とし穴を解説します。MySQL 8.0対応。
SQL

MySQLのCOUNT 4種類:NULL扱いと使い分けを整理

MySQLの COUNT(*) / COUNT(col) / COUNT(DISTINCT) の違いを実例で解説します。NULL除外・重複排除の仕組みと COUNT(DISTINCT) の性能コストを表付きで整理。
SQL

MySQLのDELETE・TRUNCATE・DROPの違いと使い分け

MySQLのDELETE・TRUNCATE・DROPの動作の違いをロールバック・AUTO_INCREMENT・性能の観点から整理します。実例のSQL付きで、どれを使うべきかの判断基準を示します。