SQL-92 以前では、選択リスト、HAVING 条件または ORDER BY リストが GROUP BY 句で指定されていない非集計カラムを参照するクエリーは許可されません。 たとえば、このクエリーは、選択リストの非集計 name カラムが GROUP BY に表示されないため、標準 SQL-92 では無効です: SELECT o.custid, c.name, MAX(o.payment) FROM orders AS o, customers AS c WHERE o.custid = c.custid GROUP BY o.custid; クエリーを SQL-92 で有効にするには、選択リストから name カラムを省略するか、GROUP BY 句で名前を指定する必要があります。 SQL:1999 以降では、GROUP BY カラムに機能的に依存している場合、オプション機能 T30
ORDER BY と組み合わされた DISTINCT では多くの場合に一時テーブルが必要です。 DISTINCT では GROUP BY を使用できるため、MySQL が ORDER BY または HAVING 句内の選択したカラムの部分でないカラムをどのように処理するかを学んでください。 セクション12.20.3「MySQL での GROUP BY の処理」を参照してください。 ほとんどの場合、DISTINCT 句は GROUP BY の特殊な例と考えることができます。 たとえば、次の 2 つのクエリーは同等です。 SELECT DISTINCT c1, c2, c3 FROM t1 WHERE c1 > const; SELECT c1, c2, c3 FROM t1 WHERE c1 > const GROUP BY c1, c2, c3; この同等性のため、GROUP BY クエリ
クライアントはサーバーに書き込むときにエラーを受け取りませんでしたが、問い合わせに対する完全な応答 (または何らかの応答) が得られませんでした。 デフォルトでは、何も発生しなかった場合、サーバーは 8 時間後に接続を閉じます。 この時間制限を変更するには、mysqld を起動するときに wait_timeout 変数を設定します。 セクション5.1.8「サーバーシステム変数」を参照してください。 スクリプトがある場合、クライアントが自動再接続を行うには、クエリーを再発行する必要があるだけです。 これは、クライアントの自動再接続を有効にしている (mysql コマンド行クライアントのデフォルト) ことが前提です。 「MySQL サーバーが存在しなくなりました」というエラーのほかの一般的な原因を次に示します。 ユーザー (またはデータベース管理者) が実行中のスレッドを KILL ステートメ
比較演算の結果は、1 (TRUE)、0 (FALSE)、または NULL の値になります。 これらの演算は、数字と文字列の両方で機能します。 必要に応じて、文字列は数字に、数字は文字列に自動的に変換されます。 次の関係比較演算子を使用すれば、スカラーオペランドだけでなく行オペランドも比較できます。 = > < >= <= <> != これらの演算子の詳細は、このセクションの後半で説明します。 行サブクエリーのコンテキストにおける行比較のその他の例は、セクション13.2.11.5「行サブクエリー」 を参照してください。 このセクションで示す関数の一部では、1 (TRUE)、0 (FALSE)、または NULL 以外の値が返されます。 LEAST() および GREATEST() はこのような関数の例です。セクション12.3「式評価での型変換」 では、これらの関数と同様の関数によって実行される
読みやすさを犠牲にしても、算術演算を高速化するように、クエリーを書き換えたいと考えがちです。MySQL では同様の最適化を自動的に実行するため、多くの場合にこの作業を回避でき、クエリーを理解しやすく、保守しやすい形式のままにしておくことができます。MySQL によって実行される最適化の一部を次に示します。 不要なかっこの削除: ((a AND b) AND c OR (((a AND b) AND (c AND d)))) -> (a AND b AND c) OR (a AND b AND c AND d) 定数畳み込み: (a<b AND b=c) AND a=5 -> b>5 AND b=c AND a=5 定数条件の削除 (定数畳み込みのために必要です): (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6) -> B=5 OR B=6
MySQL がフルテーブルスキャンを使用してクエリーを解決する場合、EXPLAIN からの出力には type カラムに ALL と示されます。これは通常は次の条件で発生します。 テーブルがきわめて小さいため、キールックアップで煩わされるよりもテーブルスキャンを実行する方が速くなります。これは、10 行未満の行や短い行長のテーブルによくあります。 インデックスが設定されたカラムに対して、ON または WHERE 句に使用可能な制限がありません。 インデックスが設定されたカラムと定数値を比較していて、MySQL が (インデックスツリーに基づいて) その定数がテーブルのきわめて大きい部分をカバーしており、テーブルスキャンが高速に行われると計算しました。セクション8.2.1.2「MySQL の WHERE 句の最適化の方法」を参照してください。 別のカラム経由で、カーディナリティーが低い (多数
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く