この記事は、MySQL データベースの SELECT ステートメントを迅速かつ正確にマスターすることを目的としています。
MySQL の SELECT ステートメントの基本構文は次のとおりです。
以下は引用符で囲まれた部分です。
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT]
[SQL_BIG_RESULT] [HIGH_PRIORITY]
[個別|個別|すべて]
選択リスト
[INTO {OUTFILE|DUMPFILE} 'file_name' エクスポート オプション]
[FROM テーブル参照 [WHERE 場所定義]
[GROUP BY 列名,...] [HAVING where_定義]
[ORDER BY {unsighed_integer|col_name|formura} [ASC|DESC],...]
[LIMIT [オフセット,] 行] [PROCEDURE プロシージャ名]]
この基本的な構文から分かるように、最も単純な SELECT ステートメントは SELECT select_list です。実際、この最も単純な SELECT ステートメントを使用して、MySQL でサポートされているあらゆる操作を実行することもできます。例: SELECT 1+1 は 2 を返します。PHP では、SELECT ステートメントのこの関数を使用して、MySQL 関数を自由に使用してさまざまなタスクを実行できます。 PHP プログラムの操作と変数への値の代入。多くの場合、MySQL には PHP よりも強力な機能が多数あることがわかります。
STRAIGHT_JOIN、SQL_SMALL_RESULT、SQL_BIG_RESULT、および HIGH_PRIORITY は、ANSI SQL92 に対する MySQL 拡張機能です。オプティマイザが最適でない順序でテーブルを結合する場合、STRAIGHT_JOIN を使用するとクエリを高速化できます。
SQL_SMALL_RESULT および SQL_BIG_RESULT は、相対キーワードのセットです。これらは、GROUP BY、DISTINCT、または DISTINCTROW と一緒に使用する必要があります。 SQL_SMALL_RESULT は、結果が非常に小さくなり、MySQL がソートを使用する代わりに最終テーブルを格納するために一時テーブルを使用する必要があることをオプティマイザに指示します。逆に、SQL_BIG_RESULT は、結果が非常に小さくなり、MySQL がソートの代わりに使用する必要があることをオプティマイザに指示します。一時テーブルを作成しています。
HIGH_PRIORITY を指定すると、テーブルを更新するステートメントよりも SELECT に高い優先順位が与えられ、優先順位が付けられた高速なクエリを実行できるようになります。
上記の 4 つのキーワードの使用法は実際にはかなりわかりにくいです。幸いなことに、ほとんどの場合、MySQL ではこれら 4 つのキーワードを使用しないことを選択できます。
DISTINCT と DISTINCTROW は、クエリによって返された結果セットに対して最も基本的だが便利なフィルタリングを提供します。つまり、結果セットには個別の行のみが含まれます。ここで注意すべき点は、キーワード DISTINCT と DISTINCTROW では、NULL 値がいくつあっても、NULL 値は 1 つだけ選択されるということです。 ALL の使用は不要です。結果セットの生成には影響しません。
INTO {OUTFILE|DUMPFILE} 'file_name' export_options は、結果セットをファイルに書き込みます。ファイルはサーバー ホスト上に作成されるため、すでに存在することはできません。ステートメントの export_options 部分の構文は、LOAD DATAINFILE ステートメントの FIELDS 句および LINES 句で使用されるものと同じです。これについては、MySQL Advanced_LOAD DATA の記事で詳しく説明します。キーワード OUTFILE と DUMPFILE の違いは、ファイルに 1 行だけが書き込まれ、列や行の終わりが存在しないことです。
select list: 次の内容を 1 つ以上含むことができます:
1. 「*」は、テーブル作成の順序で配置されたすべての列を意味します。
2. ユーザーが必要とする順序で並べられた列名のリスト。
3. 別名を使用して、次の形式で列名を置き換えることができます: 列名としての列見出し。
4. 式 (列名、定数、関数、または算術演算子またはビット演算子で接続された列名、定数、関数の任意の組み合わせ)。
5. 内部関数または集合関数。
6. 上記項目の任意の組み合わせ。
FROM: SELECT コマンドで使用されるテーブルを決定します。通常、この項目は、select_list に列名が含まれていない (たとえば、定数、算術式のみなど) 場合を除き、必須です。テーブル エントリに複数のテーブルがある場合は、それらをカンマで区切ります。 FROM キーワードに続くテーブルの順序は結果に影響しません。
式を明確にするために、テーブル名に関連する別名を付けることができます。ここでの構文は tbl_name [AS] alias_name です。例:
select t1.name,t2.salary fromemployee as t1,info as t2 (t1.name=t2.name) は select t1.name,t2.salary fromemployee t1,info t2 (t1.name=) と同じです。 t2.name 完全に同等です。
where 句や Having 句など、テーブルへの他のすべての参照ではエイリアスを使用する必要があり、エイリアスを数字で始めることはできません。
where 句は検索条件を設定します。insert、update、delete ステートメントでのその適用方法は、select ステートメントでの適用方法とまったく同じです。検索語はキーワード where の後に続きます。ユーザーがステートメント内で複数の検索条件を使用したい場合は、and または or で接続できます。検索条件の基本的な構文は、 [not] 式 比較演算子 式; [not] 式 [not] like "match_string"; [not] 式 は [not] null [not] 式と式の間 [not] です。 ] 列名 join_operator 列名 [not] ブール式。
and: 2 つの条件を接続し、両方の条件が TRUE の場合に結果を返すために使用されます。同じステートメントで複数の論理演算子が使用されている場合、ユーザーが括弧を使用して演算の順序を変更しない限り、常に and 演算子が優先されます。
or: 2 つの条件を接続し、どちらかの条件が TRUE の場合に結果を返すために使用されます。同じステートメントで複数の論理演算子が使用されている場合、通常、演算子 or は演算子 and の後に動作します。もちろん、括弧を使用して操作の順序を変更することもできます。
between: 範囲の下限を識別するために使用されるキーワードと、その後に範囲の上限の値が続きます。 x と y の間の @val の範囲には、最初と最後の値が含まれます。 between の後に指定された最初の値が 2 番目の値より大きい場合、クエリは行を返しません。
column_name: 比較に使用される列名。曖昧な場合は、列が配置されているテーブル名を必ず指定してください。
比較演算子: 比較演算子。以下の表を参照してください。
以下は引用部分です。
記号の意味
= に等しい
> より大きい
< 未満
>= 以上
<= 以下
!= は等しくない
<> は次と等しくない
char 型と varchar 型のデータを比較する場合、「<」はアルファベットの先頭に近いことを意味し、「>」はアルファベットの末尾に近いことを意味します。一般に、小文字は大文字よりも大きく、大文字は数字よりも大きくなりますが、これはサーバー上のオペレーティング システムの比較順序によって異なる場合があります。
比較する場合、末尾のスペースは無視されます。たとえば、「Dirk」は「Dirk」と同じです。
日付を比較する場合、「<」は前を意味し、「>」は後を意味します。
比較演算子を使用して文字データと日時データを比較する場合、すべてのデータを引用符で囲む必要があります。
式: 列名、定数、関数、または列名と定数の任意の組み合わせ、および算術演算子またはビット演算子で接続された関数を指定できます。算術演算子を次の表に示します。
引用されたスニペットは次のとおりです。
記号の意味
+ プラス記号
- マイナス記号
* 乗算記号
/ 除算記号
が null : NULL 値を検索するときに使用されます。
like: キーワードでは、char、varchar、datetime (秒とミリ秒を除く) に like を使用できます。MySQL では、like を数値式にも使用できます。
完全な日時レコードにはさまざまな日付コンポーネントが含まれるため、ユーザーが日時データを検索する場合は、次のようなキーワードを使用するのが最適です。たとえば、ユーザーが到着時間列に値「9:20」を追加しますが、MySQL は入力されたデータを「1,1900 年 1 月 9:20AM」に変換するため、到着時間 = "9:20" の句にはその値が見つかりません。 。ただし、「%9:20%」のような到着時間の句はそれを見つけることができます。
boolean_expression: 「true」または「false」値を返す式。
match_string: 一重引用符または二重引用符で囲まれた文字とワイルドカードで構成される文字列が一致パターンです。ワイルドカードを次の表に示します。
以下は引用符で囲まれた部分です。
記号の意味
% 0 文字以上の文字列
_ 任意の 1 文字
not: 論理式またはキーワードを否定します。
like、null、 between など。
group by 句と Hasting 句は select ステートメントで使用されます。
テーブルをグループに分割し、having 句の条件に一致するグループを返すことができます。
構文: select ステートメントの先頭
[すべて] でグループ化 [aggregate_free_expression] [,aggregate_free_expression]*
[検索条件あり]
select ステートメントの最後の
: テーブルを分割するグループを指定します。select テーブル項目に集計関数が含まれている場合、グループごとに合計値が計算されます。これらの合計の結果は、新しい行ではなく新しい列に表示されます。ユーザーは、having 句でこれらの新しい合計列を参照できます。 avg、count、max、min、sum などの集計関数は、group by の前に select_list で使用できます。テーブルは、列の任意の組み合わせによってグループ化できます。
all: where 句によって除外されたグループも含め、すべてのグループを結果に含める Transact-SQL 拡張機能。同時にhaving句を使用するとallの意味が否定されてしまいます。
aggregate_free_expression: 集計関数を含まない式。Transact-SQL 拡張機能を使用すると、列名でグループ化するときに、集計関数を使用せずに式でグループ化できます。
Has: group by 句の条件を設定します。where が select ステートメントの条件を設定するのと同様です。 have の検索条件には集計関数式を含めることができます。それ以外の検索条件は、where の検索条件と同じです。
order by: 結果を列ごとに並べます。 select によって出力された列は、列名、列の別名、または列の位置によって参照できます。例: select id as myid, name as myname from mytable group by id, select id as myid, name as myname from mytable group by myid, select id as myid, name as myname from mytable group by 1. これら 3 つの文は完全にと同等です。もちろん、プログラムの可読性に悪影響を与える 3 番目の使用法には同意しません。 降順で並べ替えるには、並べ替える列名の前に DESC キーワードを order by 句に追加します。デフォルトは昇順ですが、ASC キーワードを使用して明示的に指定できます。
limit 句: select ステートメントによって返される行数を制限するために使用されます。 limit は 1 つまたは 2 つの数値パラメーターを受け取ります。2 つのパラメーターが指定された場合、最初のパラメーターは返される最初の行のオフセットを指定し、2 番目のパラメーターは返される行の最大数を指定します。最初の行のオフセットは 0 (1 ではありません) です。引数が指定されている場合は、オフセット 0 で返される行の最大数を示します。つまり、リミット 5 とリミット 0,5 は完全に同等です。
プロシージャキーワードの意味については、よくわかりませんが、ストアドプロシージャをサポートしているようで、MySQL 自体は将来の拡張ニーズに備えて予約されているようです。