MySQL表CRUD

目次

1.作成

1.1 単一行データ + 全列挿入

1.2 複数行データ+指定列挿入

1.3 その他の更新を挿入

1.4 置換データ

二、取得

2.1 SELECT列

2.2 WHERE条件

2.3 結果の並べ替え

2.4 ページング結果のフィルタリング

3.アップデート

4. 削除

4.1 データの削除 

4.2 テーブルの切り捨て

5. クエリ結果を挿入する

6. 集計関数

7、グループクエリ

7.1 グループクエリテストテーブル - 従業員情報テーブル

7.2 HAVING 条件


  • テーブルの追加、削除、クエリ、および変更は CRUD と呼ばれます。作成 (新規)、取得 (検索)、更新 (変更)、削除 (削除)
  • CRUDの操作対象はテーブル内のデータであり、代表的なデータ操作言語であるDML(Data Manipulation Language)です。

1.作成

INSERT [INTO] table_name [(column1 [, column2] ...)] VALUES (value_list1) [, (value_list2)] ...;
  • SQL の大文字はキーワードを表し、[ ] はオプションの項目を表します
  • SQL の各 value_list は挿入されたレコードを表し、各 value_list は挿入される複数の列の値で構成されます
  • SQL の列リストは、各 value_list の各列値をテーブル内のどの列に挿入するかを指定するために使用されます。

次に、デモンストレーション用に、自己増加する主キー ID、学生番号、名前、QQ 番号を含む学生テーブルを作成します。

テーブル作成後にテーブル構造を表示する

1.1 単一行データ + 全列挿入

次の例では、insert を使用して Student テーブルにレコードを挿入し、毎回テーブルにレコードを挿入します。レコードを挿入するときに列リストを指定しません。つまり、すべての列がテーブル内のデフォルトの列順序に従って挿入されます。挿入された各レコードの列値は表の順序で順番にリストする必要があります

1.2 複数行データ+指定列挿入

Insert ステートメントを使用すると、テーブルに複数のレコードを一度に挿入することもできます。挿入する複数のレコードはカンマで区切られ、レコードの挿入時に特定の列のみを挿入するように指定できます。

注: レコードを挿入する場合、値を指定せずに挿入できるのは、空であることが許可されている列または自己拡張フィールドのみです。空であることが許可されていない列は、値を指定して挿入する必要があります。そうでない場合は、エラーが報告されます。

1.3 その他の更新を挿入

テーブルにレコードを挿入する際、挿入するレコードに主キーまたは一意キーがすでに存在する場合、主キーの競合または一意キーの競合により挿入が失敗します。

この時点で、オプションで同期更新操作を実行できます。

  • テーブル内に競合するデータがない場合は、データを直接挿入します
  • テーブル内に競合するデータがある場合は、テーブル内のデータを更新します
INSERT ... ON DUPLICATE KEY UPDATE column1=value1 [, column2=value2] ...;
  • SQL の大文字はキーワードを表し、[ ] はオプションの項目を表します
  • SQL の INSERT 後の構文は、前の INSERT ステートメントと同じです
  • UPDATE 後の column=value は、挿入されたレコードに競合がある場合に更新する必要がある列の値を示します。

学生テーブルにレコードを挿入するときに、主キーの競合がない場合はレコードを直接挿入します。主キーの競合がある場合は、テーブル内の競合するレコードの学生番号と名前を更新します。

挿入または更新の SQL を実行した後、影響を受けるデータ行の数によってこのデータの挿入ステータスを判断できます。

  • 影響を受ける行は 0 件です: テーブル内に競合するデータがありますが、競合するデータの値は指定された更新の値と同じです
  • 1 行が影響を受けます: テーブル内に競合するデータはなく、データは直接挿入されます。
  • 2 行が影響を受けます: テーブル内に競合するデータがあり、データは更新されました

1.4 置換データ

  • テーブル内に競合するデータがない場合は、データを直接挿入します
  • テーブル内に競合するデータがある場合は、まずテーブル内の競合するデータを削除してから、データを挿入します。

上記の効果を実現するには、データを挿入するときに SQL ステートメントの INSERT を REPLACE に変更するだけです。

  • 1 行が影響を受けます: テーブル内に競合するデータはなく、データは直接挿入されます。
  • 2 行が影響を受けます: テーブル内に競合するデータがあり、競合するデータは削除され、再挿入されます。

二、取得

SELECT [DISTINCT] {* | {column1 [, column2] ...}} FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...];
  • SQL の大文字はキーワードを表し、[ ] はオプションの項目を表します
  • { } 内の | は、左側のステートメントまたは右側のステートメントを選択できることを意味します

デモンストレーション用のスコア テーブルを作成します。このテーブルには、自己増加する主キー ID、名前、生徒の中国語スコア、数学スコア、英語スコアが含まれます。

テーブル作成後にテーブル構造を表示する

いくつかのテストレコードをテーブルに挿入します

2.1 SELECT列

全列クエリ

データをクエリする場合、*を使用して列リストを置き換えます。これは全列クエリを意味し、フィルタリングされたレコードのすべての列情報が表示されます。

注: 一般に、*フルカラムクエリを実行することは推奨されません。クエリされたデータはネットワークを介して MySQL サーバーからホストに送信される必要があり、クエリされる列が増えると送信されるデータの量も増えるためです。列クエリはインデックスの使用にも影響を与える可能性があります。

指定された列のクエリ

データをクエリする場合、指定した列のみをクエリすることもできますが、このとき、クエリ対象の列を列リストにリストします。

クエリフィールドは式です

データをクエリする場合、列リストに列名をリストするだけでなく、式を列リストにリストすることもできます。式が列リストにリストされている場合、各レコードがフィルターで除外されるときに式が実行され、式の計算結果がこのレコードの列の値として表示されます。

select はデータのクエリだけでなく、特定の式を計算したり、特定の関数を実行したりするためにも使用できるためです。

列リストの式には、テーブル内の既存のフィールドを含めることができます。このとき、レコードがフィルターで除外されるたびに、レコード内の対応する列の値が計算用の式に提供されます。

クエリ結果の別名を指定する

SELECT column [AS] alias_name [...] FROM table_name;

たとえば、成績テーブルのデータをクエリする場合、各レコードの 3 つの成績を加算し、計算結果に対応する列の別名を「合計スコア」に割り当てます。

結果の重複排除

スコア テーブルをクエリするときに、クエリの数学スコアに対応する列を指定すると、数学スコアに繰り返しスコアがあることがわかります。

クエリ結果の重複を排除したい場合は、SQL で select の後に unique を追加できます。

2.2 WHERE条件

where 句を追加する場合の違い:

  • データのクエリ時に where 句が指定されていない場合、テーブル内のすべてのレコードがデータ ソースとして直接使用され、select ステートメントが順番に実行されます。
  • データクエリ時にwhere句を指定すると、データクエリ時にwhere句に従って条件に一致するレコードが絞り込まれ、条件に一致したレコードをデータとしてselect文が順次実行されます。ソース

where 句には 1 つ以上のフィルター条件を指定でき、論理演算子 AND または OR を使用して各フィルター条件を関連付けます。

比較演算子:

論理演算子:

英語で不合格だった生徒とその英語のスコアを問い合わせる

where句でフィルタ条件が英語スコア60未満であることを示し、selectの列リストにクエリ対象の列を名前と英語スコアとして指定します。

中国語のスコアが 80 ~ 90 の学生とその中国語のスコアをクエリします。

where句には、フィルタ条件が言語スコアが80以上90以下であることを示し、selectの列リストにクエリ対象の列を名前と言語スコアとして指定します。

BETWEEN a0 AND a1を使用して言語スコアの範囲を示すこともできます。

数学のスコアが 58 または 59 または 98 または 99 の生徒とその数学のスコアをクエリする

where 句で、フィルター条件を 58 または 59 または 98 または 99 に等しい数学スコアとして指定し、クエリする列を select の列リストの名前と数学スコアとして指定します。

IN(58,59,98,99) を使用して、数学のスコアがスクリーニング要件を満たしているかどうかを判断することもできます。

Sun という姓の学生を検索する

where 句では、あいまい一致を使用して現在のクラスメートの姓が Sun であるかどうかを判断し (%複数の文字と一致する)、クエリする列を select の列リストの名前として指定します。

サン氏について問い合わせる

where句では、現在のクラスメートがSunであるかどうかをあいまい一致で判断し(_厳密に単一の文字と一致する)、クエリする列をselectの列リストのnameとして指定します。

中国語のスコアが英語のスコアよりも優れている学生に質問する

where句で、フィルタ条件が中国語のスコアが英語のスコアより大きいことであることを示し、selectの列リストで、クエリする列を名前、中国語のスコア、英語のスコアとして指定します。

合計スコアが 200 点未満の生徒にクエリを実行する

select の列リストに式クエリを追加します。クエリの式は、中国語、数学、英語のスコアの合計です。観察しやすいように、式に対応する列の別名を「合計スコア」として指定できます。を指定し、where 句でフィルターを指定します。条件は、3 つのサブジェクトの合計が 200 未満であることです。

select で指定されたエイリアスは where 句では使用できません。

  • データをクエリするときは、まず where 句に従って修飾されたレコードを除外します。
  • 次に、修飾されたレコードをデータ ソースとして使用して、select ステートメントを順番に実行します。

つまり、where 句は select ステートメントの前に実行されるため、where 句でエイリアスを使用することはできません。where 句でエイリアスを使用すると、データのクエリ時にエラーが報告されます。

中国語のスコアが 80 を超え、姓が Sun ではない学生に対するクエリ

where 句で、フィルタ条件が中国語スコアが 80 より大きいことであることを示し、あいまい一致を使用し、学生の姓が Sun でないことを確認せず、クエリする列を名前と中国語スコアとして指定します。選択の列リスト

孫さんに問い合わせてください。そうでない場合は、合計スコアが 200 点を超え、中国語のスコアが数学のスコア未満で、英語のスコアが 80 点を超えている必要があります。

このトピックの要件は、結果を確認することです。照会されている人は Sun であるか、合計スコアが 200 点を超え、中国語のスコアが数学のスコア未満で、英語のスコアが 80 点を超えています。ファジー マッチング、クエリには式クエリと論理演算が必要です。

NULL のクエリ

新しく追加されたデータを示した Student テーブルを使用して、NULL クエリを示します。Student テーブルの内容は次のとおりです。

where 句で、フィルタ条件が QQ 番号が NULL ではないことであることを示し、select の列リストで、クエリ対象の列が名前と QQ 番号であることを示し、既知の QQ 番号を使用して学生をクエリできるようにします。

WHERE句にQQ番号がNULLとしてフィルタ条件を指定し、selectの列リストに名前とQQ番号としてクエリ対象の列を指定すると、不明なQQ番号を持つ学生に対してクエリを実行できます

注: NULL 値と比較する場合は<=>演算子を使用する必要があります。=この演算子を使用しても正しいクエリ結果は得られません。

= 演算子は NULL で安全ではありません。= 演算子は任意の値を NULL と比較し、結果は NULL になります。

ただし、<=> 演算子は NULL セーフです。<=> 演算子は、NULL と NULL を比較して TRUE (1) を取得し、非 NULL 値と NULL を比較して FALSE (0) を取得します。

2.3 結果の並べ替え

SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC | DESC] [, ...];
  • SQL の大文字はキーワードを表し、[ ] はオプションの項目を表します
  • ASC と DESC はそれぞれ昇順と降順を表し、デフォルトは ASC です。

注: クエリ SQL に order by 句がない場合、返される順序は未定義です

生徒とその数学のスコアをクエリし、数学のスコアの昇順で表示します

select の列リストで、クエリ対象の列が名前と数学の成績であることを示し、order by 句で数学の成績が昇順でソートされていることを示します。

生徒とその QQ 番号を照会し、QQ 番号の昇順で表示します

select の列リストでは、クエリ対象の列が名前と QQ 番号であることを示し、order by 句では、QQ 番号の昇順でソートされていることを示します。

NULL 値はどの値よりも小さいとみなされ、昇順に並べ替えるときに先頭に表示されます。

さまざまな科目の生徒の成績を照会し、数学の降順、英語の昇順、中国語の昇順で表示します

select の列リストで、クエリする列が名前、数学のスコア、英語のスコア、中国語のスコアであることを示し、order by 節で数学のスコアが降順でソートされることを示し、英語のスコアが降順でソートされることを示します。昇順、中国語スコアは昇順にソートされます

 表示結果は数学のスコアに応じて降順にソートされているのに対し、同じ数学のスコアは英語のスコアに応じて昇順にソートされていることがわかります。

  • order by 句は複数のフィールドによる並べ替えを指定でき、各フィールドは昇順または降順での並べ替えを指定できます。各フィールドはカンマで区切られ、並べ替えの優先順位は書き込み順序と同じです。
  • 上記 SQL のように、2 つのレコードの数学のスコアが同じ場合は英語のスコアに従ってソートされ、2 つのレコードの英語のスコアも同じ場合は引き続き英語のスコアに従ってソートされます。中国の得点など。

生徒とその合計スコアを照会し、合計スコアの降順に表示します

selectの列リストでは、クエリ対象の列が名前と合計スコア(式クエリ)であることを示し、order by句では、列が合計スコアで降順にソートされることを示します

select で指定されたエイリアスは、order by 句で使用できます。

  • データをクエリするときは、まず where 句に従って修飾されたレコードを除外します。
  • 次に、修飾されたレコードをデータ ソースとして使用して、select ステートメントを順番に実行します。
  • 最後に、order by 句を使用して select ステートメントの実行結果を並べ替えます。

つまり、order by 句の実行は select ステートメントの後で行われるため、order by 句でエイリアスを使用できます。

Sun という姓の生徒または Cao という姓の生徒と数学のスコアをクエリし、数学のスコアの降順に表示します。

  • タイトルの前半文はクエリについて説明し、後半文はソートについて説明します。
  • 並べ替えるときにはデータが必要であるため、最初に前のクエリ アクションを完了してから、トピックの要件に従って並べ替えることができます。

データをクエリするときは、where 句でフィルター条件を姓 Sun または姓 Cao (あいまい一致) として指定し、クエリする列を select の列リストで名前と数学スコアとして指定します。

対象データをクエリした後、SQLをクエリした後にorder by句を追加し、そのorder by句で数学スコアに従って降順にソートするように指定します

2.4 ページング結果のフィルタリング

0 番目のレコードから始めて、n 個のレコードを逆方向にフィルタリングします。

SELECT ... FROM table_name [WHERE ..] [ORDER BY ...] LIMIT n;

s 番目のレコードから開始して、n レコードを逆方向にフィルタリングします。

SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;

s 番目のレコードから開始して、n レコードを逆方向にフィルタリングします。

SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
  • SQL の大文字はキーワードを表し、[ ] はオプションの項目を表します
  • クエリ SQL の各ステートメントの実行順序は、where、select、order by、limit です。
  • limit 句でレコードをフィルタリングすると、レコードの添字は 0 から始まります。

提案: 不明なテーブルをクエリする場合は、テーブル全体のデータをクエリするときにテーブル内のデータが大きすぎてデータベースが停止するのを避けるために、SQL のクエリ後に制限を追加することをお勧めします。

ID によるページング、ページごとに 3 レコード、それぞれページ 1、2、および 3 を表示

ここでは、スコア テーブルのデータを使用してページネーション クエリを示します。スコア テーブルの内容は次のとおりです。

ページ 1 のレコードをクエリする場合、テーブル データ全体の SQL をクエリした後、0 番目のレコードから開始して逆方向に 3 レコードをフィルタリングすることを示す制限句を追加します。

ページ 2 のレコードをクエリする場合、テーブル全体のデータの SQL をクエリした後、limit 句を追加して、3 番目のレコードから開始して 3 レコードを逆方向にフィルタリングすることを示します。

3 ページのレコードをクエリするときは、テーブル データ全体の SQL をクエリした後に、limit 句を追加して、6 番目のレコードから開始して 3 レコードを逆方向にフィルタリングすることを示します。

テーブルからフィルタリングされたレコードが n 未満の場合は、フィルタリングした数だけ表示します

3.アップデート

UPDATE table_name SET column1=expr1 [, column2=expr2] ... [WHERE ...] [ORDER BY ...] [LIMIT ...];
  • SQL の大文字はキーワードを表し、[ ] はオプションの項目を表します
  • SQLのcolumn=exprは、レコード内のcolumnという名前の列の値をexprに変更することを意味します。
  • データを変更する前に、最初に変更するレコードを見つける必要があります。更新ステートメントの where、order by、およびlimit は、データを見つけるために使用されます。

孫悟空の数学のスコアを 80 点に修正

update ステートメントで、フィルタリングされたレコードの数学スコアを 80 ポイントに変更することを指定します。

曹孟徳の数学の得点を60点に、中国語の得点を70点に変更

合計得点の下位 3 人の生徒の数学の得点に 30 点を加算します。

データを変更する前に、まず上位 3 人の生徒の数学の得点と下位 3 人の合計得点を確認します。

update ステートメントでは、フィルターされたレコードの数学スコアを 30 ポイント追加するように指定し、変更後にデータを再度チェックして、データが正常に変更されたことを確認します。

注:複合代入演算子 += は MySQL ではサポートされていません。更新されたデータを表示する場合、合計スコアが最も低い上位 3 人の生徒は表示できません。これは、以前の合計スコアが下位 3 位だった 3 人の生徒は、数学のスコアに 30 点を追加すると上位 3 人の生徒ではなくなる可能性があるためです。

4. 削除

4.1 データの削除 

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...];
  • SQL の大文字はキーワードを表し、[ ] はオプションの項目を表します
  • データを削除する前に、削除するレコードを見つける必要があります。削除ステートメントの Where、order by、およびlimit を使用してデータを見つけます。

孫悟空のテストスコアを削除する

データを削除する前に、まず孫悟空の関連情報を確認してから、削除ステートメントで猿王に対応するレコードを削除するように指定し、削除後に再度確認してデータが削除されていることを確認してください。

テーブルデータ全体を削除する

自己増加する主キー ID と名前を含むテスト テーブルを作成する

削除するテーブルにテスト データを挿入します

delete文では、データを削除するテーブル名のみを指定し、where、order by、limitなどのフィルタ条件を指定しないと、テーブル全体のデータが削除されます。

テーブルに再度データを挿入し、データを挿入するときに自己拡張フィールドの値を指定しないでください。このとき、挿入されたデータに対応する自己拡張 ID の値が以前のデータから増加し続けていることがわかります。基礎

テーブルの作成時に関連情報を参照してください。AUTO_INCREMENT=n のフィールドがあります。これは、次回データを挿入するときに自己拡張フィールドの値を n にする必要があることを示します。

delete ステートメントを使用してテーブル データ全体を削除しても、AUTO_INCREMENT=n フィールドはリセットされません。そのため、テーブル データ全体を削除してデータを挿入した後、対応する自動インクリメント ID 値は元の基準に基づいて増加し続けます。

4.2 テーブルの切り捨て

TRUNCATE [TABLE] table_name;
  • SQL の大文字はキーワードを表し、[ ] はオプションの項目を表します
  • Truncate はテーブル全体に対してのみ操作でき、delete のような部分的なデータに対しては操作できません。
  • truncate は実際にはデータを操作しないため、delete よりも高速です。
  • truncate はデータを削除するときに実際のトランザクションを経由しないため、ロールバックできません
  • truncate は AUTO_INCREMENT=n フィールドをリセットします

自己増加する主キー ID と名前を含むテスト テーブルを作成する

削除するテーブルにテスト データを挿入します

truncate 文には、データを削除するテーブル名のみを指定します。このとき、テーブル全体のデータが削除されます。ただし、truncate はデータに対して操作を行いませんので、truncate 文の実行後に、影響を受ける行の数が 0 であることを確認します。

次に、テーブルにデータを挿入し、データを挿入するときに自己拡張フィールドの値を指定しないと、挿入されたデータに対応する自己拡張 ID の値が再び 1 から増加していることがわかります。

テーブルの作成時に関連情報を見ると、AUTO_INCREMENT=n フィールドがあることもわかります。これは、次回データを挿入するときに自己拡張フィールドの値を n にする必要があることを示しています。

truncate ステートメントを使用してテーブル データ全体を削除すると、AUTO_INCREMENT フィールドがリセットされるため、テーブルが切り捨てられた後に挿入されたデータに対応する自動インクリメント ID 値が再び 1 から増加します。

5. クエリ結果を挿入する

INSERT [INTO] table_name [(column1 [, column2] ...)] SELECT ... [WHERE ...] [ORDER BY ...] [LIMIT ...];
  • SQL の大文字はキーワードを表し、[ ] はオプションの項目を表します
  • SQL の役割は、フィルタリングされたレコードを指定されたテーブルに挿入することです。
  • SQL の列は、フィルターされたレコードの各列をテーブル内のどの列に挿入するかを示します。

テーブル内の重複レコードを削除します。重複データのコピーは 1 つだけ存在できます。

テーブル内に ID と名前を使用してテスト テーブルを作成します

いくつかのテスト データをテスト テーブルに挿入すると、データ内に重複レコードが存在します。

ここで、テスト テーブル内の重複データを削除する必要があります。考え方は次のとおりです。

  • テストテーブルと同じ構造の一時テーブルを作成します。
  • 重複排除された方法でテストテーブル内のデータをクエリし、クエリ結果を一時テーブルに挿入します。
  • テスト テーブルの名前を別の名前に変更し、次に一時テーブルの名前をテスト テーブルの名前に変更して、アトミックな重複排除を実現します。

一時テーブルの構造はテストテーブルと同じなので、一時テーブル作成時と同様に作成できます。

クエリ文を挿入することで、重複排除クエリの結果を一時テーブルに挿入します。一時テーブルとテストテーブルの構造は同じであり、select は全列クエリを実行するため、列リストを指定する必要はありません。挿入時にテーブル名の後に追加します。

テスト テーブルの名前を別の名前に変更し (重複排除の前にデータをバックアップし、不要な場合は直接削除するのと同じです)、一時テーブルの名前をテスト テーブルの名前に変更して、テーブル内のデータの重複排除を完了します。

6. 集計関数

集計関数は値のリストに対して計算を実行し、単一の値を返します

クラスの生徒の数を数える 

デモンストレーションのために前の Student テーブルを使用します。テーブル内のデータは次のとおりです。

 select ステートメントで count 関数を使用し、*それをパラメータとして count 関数に渡すと、テーブル内のレコード数をカウントできます。

select文内でcount関数を使用し、式をパラメータとしてcount関数に渡すと、テーブル内のレコード数をカウントすることもできます。

これは、テーブル内のデータをクエリするときに特定の式という名前の新しい列を追加し、count 関数を使用して列内のデータの数をカウントすることと同等であり、これは統計テーブル内のレコードの数と同等です。

クラスごとに集めたQQ番号の数を数える

select ステートメントで count 関数を使用して、qq 列のデータ数をカウントすると、テーブル内の QQ 番号の数をカウントできます。

count 関数のパラメータが特定の列名の場合、count 関数はその列の NULL 値を無視します。

このテストの数学の得点の得点数を数えます

プレゼンテーションに以前のスコアシートを使用する

select ステートメントで count 関数を使用して数学列のデータ数をカウントすると、テーブル内の数学スコアの数をカウントできます。

このテストの数学スコアのスコアの数を数えます (重複を削除します)

count 関数 (他の集計関数を含む) を使用する場合、渡されたパラメーターの前に distinct を追加すると、テーブル内の重複排除された数学スコアの数をカウントできます。

統計数学の合計点

select ステートメントで sum 関数を使用して数学列のデータの合計をカウントすると、テーブル内の数学スコアの合計をカウントできます。

統計 失敗した数学の成績 合計スコア

where 句で、フィルター条件が数学スコアが 60 点未満であることを示し、select ステートメントで sum 関数を使用して数学列のデータの合計をカウントします。

現在、数学に失敗したクラスメートはいないため、合計の結果は NULL になります。

統計的平均

select ステートメントで avg 関数を使用して、合計スコアの平均を計算します。

英語の最高スコアを返します

英語の最高スコアをクエリするには、select ステートメントで max 関数を使用します。

最低でも 70 以上の英語スコアを返します

where 句で、フィルタ条件が英語のスコアが 70 点を超えることであることを示し、select ステートメントで min 関数を使用して最低の英語スコアをクエリします

7、グループクエリ

SELECT column1 [, column2], ... FROM table_name [WHERE ...] GROUP BY column [, ...] [order by ...] [LIMIT ...];
  • SQL の大文字はキーワードを表し、[ ] はオプションの項目を表します
  • クエリ SQL の各ステートメントの実行順序は次のとおりです。 where、group by、select、order by、limit
  • group by の後の列名は、指定された列に従ってクエリをグループ化することを示します。

7.1 グループクエリテストテーブル - 従業員情報テーブル

従業員情報フォームの内容

従業員情報テーブルには、従業員テーブル (emp)、部門テーブル (dept)、給与等級テーブル (salgrade) の 3 つのテーブルが含まれています。

従業員テーブル (emp) には次のフィールドが含まれます。

  • 従業員番号 (empno)
  • 従業員名 (ename)
  • 社員の立場(仕事)
  • 従業員リーダー番号 (MGR)
  • 雇用期間(入社日)
  • 給与 月給(給料)
  • ボーナス(コミュニケーション)
  • 部門番号 (deptno)

部門テーブル (dept) には次のフィールドが含まれます。

  • 部門番号 (deptno)
  • 部署名 (dname)
  • 部門の所在地 (loc)

給与等級テーブル (salgrade) には次のフィールドが含まれます。

  • 学年
  • この等級の最低賃金(損失)
  • このレベルでの最高給与 (ヒサル)

従業員情報テーブルSQL

DROP database IF EXISTS `scott`;
CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `scott`;

DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `deptno` int(2) unsigned zerofill NOT NULL COMMENT '部门编号',
  `dname` varchar(14) DEFAULT NULL COMMENT '部门名称',
  `loc` varchar(13) DEFAULT NULL COMMENT '部门所在地点'
);


DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
  `ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',
  `job` varchar(9) DEFAULT NULL COMMENT '雇员职位',
  `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
  `hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',
  `sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
  `comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',
  `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
);


DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (
  `grade` int(11) DEFAULT NULL COMMENT '等级',
  `losal` int(11) DEFAULT NULL COMMENT '此等级最低工资',
  `hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资'
);


insert into dept (deptno, dname, loc)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept (deptno, dname, loc)
values (20, 'RESEARCH', 'DALLAS');
insert into dept (deptno, dname, loc)
values (30, 'SALES', 'CHICAGO');
insert into dept (deptno, dname, loc)
values (40, 'OPERATIONS', 'BOSTON');

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);

insert into salgrade (grade, losal, hisal) values (1, 700, 1200);
insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);
insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);
insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);
insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);

各部門の平均給与と最高給与を表示します

group by句で部門番号によるグループ化を指定し、select文でavg関数とmax関数を使用して各部門の平均給与と最高給与を問い合わせます。

上記の SQL は、まずテーブル内のデータを部門番号に従ってグループ化し、次に各グループで集計クエリを実行して、各グループの平均給与と最高給与を取得します。

各分野の職種ごとの平均賃金と最低賃金を表示

group by 句で、部門番号と役職によるグループ化を順番に指定し、select ステートメントで avg 関数と min 関数を使用して、各部門の各役職の平均給与と最低給与をクエリします。

  • group by 句は複数のフィールドによるグループ化を示すことができ、各フィールドはカンマで区切られ、グループ化の優先順位は書き込み順序と同じになります。
  • 上記SQLのように、2つのレコードの部門番号が同じ場合、引き続き役職ごとにグループ化されます。

7.2 HAVING 条件

SELECT ... FROM table_name [WHERE ...] [GROUP BY ...] [HAVING ...] [order by ...] [LIMIT ...];
  • SQL の大文字はキーワードを表し、[ ] はオプションの項目を表します
  • SQL の各ステートメントの実行順序は次のとおりです。 where、group by、select、having、order by、limit
  • 1 つ以上のフィルター条件を Hasting 句で指定できます。

Hasting 句と Where 句の違い

  • where 句はテーブル名の後に配置され、having 句は group by 句とともに使用され、group by 句の後に配置される必要があります。
  • where 句はテーブル全体のデータをフィルタリングし、having 句はグループ化されたデータをフィルタリングします。
  • 集計関数とエイリアスは where 句では使用できませんが、集計関数とエイリアスは Have 句では使用できます

SQLの各ステートメントの実行順序

  • where 句に基づいて対象となるレコードをフィルターで除外する
  • group by 句に従ってデータをグループ化する
  • グループ化されたデータに対して select ステートメントを順番に実行します。
  • グループ化されたデータをhaving句に従ってさらにフィルタリングします。
  • order by句に従ってデータを並べ替えます
  • 制限句に従って複数のレコードをフィルタリングして表示します

平均給与が2000未満の部門とその平均給与を表示します

  • まず各部門の平均給与を計算します。
  • 次に、having 句を使用して、平均給与が 2000 未満の部門を除外します。

おすすめ

転載: blog.csdn.net/GG_Bruse/article/details/131198505