MySQLグループリンクの使用に関する詳細な説明

MySQLグループリンクの使用に関する詳細な説明

MYSQL におけるグループ化とリンクは、データベースの操作やデータのやり取りで最もよく使用される 2 つの機能です。この 2 つの項目を適切に処理すると、MYSQL の実行効率が非常に高くなります。

1. グループ化

名前が示すように、データは各グループがどのような原則と特性を持っているかに応じてグループ化されます。

1. 一番簡単なものから始めましょう:

tb1.sex で tb1 グループから count(*) を選択します。

すべてのデータ項目の数を照会し、性別ごとにグループ化します。このクエリによって取得される結果セットには、count(*) という 1 つの列のみが含まれます。

2. 次に、このグループ化を分析しましょう。select と from の間に何を置くことができますか?

データがグループ化されると、ほとんどのデータ フィールドの意味が失われます。考えてみてください。複数のデータの同じ列に 1 つの値しか表示されない場合、その値は誰に対して表示されるのでしょうか。この値は役に立つのでしょうか。

よく考えてみると、by の列だけを入れることができ、count()、sum() などの SQL 関数操作があることに気づくのは難しくありません。(グループ化の基準として by の後に含まれ、結果として集計関数に含まれる)

例: 各大学の学生数を照会します: (大学の値は大学 ID です)

SELECT a.COLLEGE AS college,COUNT(*) AS number of students FROM base_alumni a GROUP BY a.COLLEGE;

3. where、having、group by を一緒に使用する

初めて group by を学んだとき、group by は where と一緒に使用できず、having のみ使用できるという誤解をしていました...

あなたは本を注意深く読んでいません。実際、それらは一緒に使用できますが、where は group by の前にのみ使用でき、having は group by の後にのみ使用できます。

ここで、フィルター条件のキーワードですが、グループ化前のデータのみをフィルターできます。

Having もフィルタリング条件のキーワードです。機能は where と同じですが、グループ化されたデータをフィルタリングします。つまり、グループ化後に得られた結果セットをフィルタリングします。

目的は、1 つのステートメント内の 2 つの where 句の問題を解決し、それらを区別することだと思います。

例:

30100 の大学の各専攻に何人の学生がいるかを問い合わせます。

SELECT a.MAJOR AS major, COUNT(*) AS number of students FROM base_alumni a WHERE a.COLLEGE = 30100 GROUP BY a.MAJOR;

各大学に何人の学生がいるかを問い合わせます。学生数は 3 人を超えます。

SELECT a.COLLEGE AS college,COUNT(*) AS number of students FROM base_alumni a GROUP BY a.COLLEGE HAVING COUNT(*)>3;

フィルター実行順序:①最初に*をフィルター、②フィルター結果をグループ化、③グループ化結果をフィルター

4. Group By All の使用、ハハハ、私はよくオンラインで確認し、この構文を削除することにしました〜

実は、前のwhereの後に、グループ化された結果にwhereに一致しないデータを表示したいのですが、もちろん計算は行われず、計算結果は0またはnullで表されます。この構文は役に立たない気がして、応用シナリオが思い浮かびません~

2. ディープラーニング接続

接続には、内側接続、フル接続、左外側接続、右外側接続の4種類があります。

1. 接続が表示される場所

① fromとwhereの間にテーブルを接続する

② whereとhavingのうち、havingはgroup byの結果セットをフィルタリングすること、つまりgroup byの結果セットをテーブルとして扱い、それを他のテーブルに接続してさらにフィルタリングすることです。

2. 接続タイプの解釈

テーブルをセット、接続をマッピングとして考えると、結果は次のようになります。

内部結合: 1 対 1 マッピング。完全結合: デカルト積。左外部結合: 1 対 1 マッピング + 左のテーブルは右のテーブルの null に対応。右外部結合: 1 対 1 マッピング + 右のテーブルは左のテーブルの null に対応。

キーワード:

内部結合: 内部結合、完全結合: クロス結合、左外部結合: 左結合、右外部結合: 右結合。

文法:

テーブル a は、テーブル b を a.column 1 = b.column 2 で左結合します。

3. 接続の使用

前のグループ化の例では、結果セットにバグがありました。

例: 各大学の学生数を照会します: (大学の値は大学 ID です)。接続がない場合、現在のテーブルにはこの大学に関する情報がないため、学生数が 0 の大学は表示されません。

では、ここで左結合 (左外部結合) を実行してみましょう。

SELECT c.ID, a.COLLEGE, COUNT(a.COLLEGE) FROM (SELECT ID FROM dic_college) c LEFT JOIN (SELECT COLLEGE FROM base_alumni) a ON c.ID = a.COLLEGE GROUP BY c.ID

ここに完全な文章があります。この文章を書くのにとても苦労しました。

読んでみてください:

まず、大学のテーブルと卒業生の情報テーブル(学生テーブル)の左結合をしてみましょう。

大学が必要なので、大学がメイン テーブルとなり、左結合 c LEFT JOIN a ON ... の前に配置されます。

すると、フィールドが多数あることがわかったので、冗長なフィールドを削除しました。これにより、観察が容易になっただけでなく、SQL の実行効率も向上しました。

①大学テーブルを1つのフィールドのみに変更する(SELECT ID FROM dic_college)

②学生テーブルを1つのフィールドのみに変更します(SELECT COLLEGE FROM base_alumni)

この時点でのクエリ結果は次のようになります

SELECT * FROM (SELECT ID FROM dic_college) c LEFT JOIN (SELECT COLLEGE FROM base_alumni) a ON c.ID = a.COLLEGE

この時点で、結果セットをグループ化します:GROUP BY c.ID、クエリフィールドを変更します

上記の結果セットでは、c.ID と a.COLLEGE が 1 対 1 で対応しています。このとき、count(*) のデータは行の総数です。メイン テーブルは college テーブルなので、このデータは count(c.ID) のデータと同じです。

しかし、a.COLLEGEが空の行の値はすべて1であり、これは望んでいるものではないので、count(*)をcount(a.COLLEGE)に変更すると、データが出てきます。

これは、すべての大学の中で各大学の学生数を問い合わせる正しい答えです。もちろん、上のスクリーンショットはデータの最初の数行のみであり、その背後にはさらに多くのデータがあります。

4. テストした後

左と右が結合します...

SELECT * FROM a LEFT JOIN b ON b.ID = a.FK_ID;

SELECT * FROM b RIGHT JOIN a ON b.ID = a.FK_ID;

2 つのステートメントは同じ結果を生成し、それらの間に他の違いは検出されません。

フル接続はクロス接続であり、接続は使用されません...

SELECT * FROM c,a WHERE c.ID = a.FK_ID;

SELECT * FROM c CROSS JOIN a ON c.ID = a.FK_ID;

これら 2 つのステートメントの間に違いはありません。

上記は、MYSQL のグループ化とリンクの詳細な説明に関するこの記事の内容のすべてです。まだ質問がある場合は、下のコメントエリアで議論することができます。

以下もご興味があるかもしれません:
  • IDEA で MySQL にリンクするとエラー 08001 が発生し、接続に成功した後にテーブルが表示されない問題と解決策
  • MySQLにNavicatをインストールした後、2059が表示され、認証プラグインとローカルリンク仮想マシンdocker、リモートリンクサーバー
  • Python pymysql リンク データベース クエリ結果を Dataframe インスタンスに変換
  • MySQL マルチテーブルクエリ例の詳しい解説 [リンククエリ、サブクエリなど]
  • 操作例 MySQL ショートリンク
  • MySql 8.0.11 のインストール プロセスと Navicat とのリンク時に発生する問題の概要
  • MySqlは、外部ネットワーク接続クライアントの低速問題を解決するためにskip-name-resolveを使用します。
  • SSHトンネルを使用してMySQLサーバーに接続する方法
  • MySQL リンクを表示し、異常なリンクを削除する方法

<<:  WHMCS V7.4.2 グラフィカル インストール チュートリアル

>>:  js の parseInt() の奇妙な動作の調査と修正

推薦する

Nginx サービス クイック スタート チュートリアル

目次1. Nginx の紹介1. Nginx とは何ですか? 2. Nginx を使用する理由3. ...

Ubuntu 20.04 では、隠し録音ノイズ低減機能が有効になります (推奨)

最近、 Ubuntu 20.04でkazamを使用して録音しているときに、問題が見つかりました。シス...

Linuxシステムはルートアカウントのリモートログインコマンドを禁止しています

ps: Linux システムで root アカウントのリモート ログインを無効にする方法は次のとおり...

MYSQL における char と varchar の違い

CHAR 型と VARCHAR 型は似ていますが、主に格納場所、末尾のスペース、取得方法が異なります...

Dockerコンテナ内でホストDocker操作を呼び出して実行する

まず、この投稿は Docker 初心者向けです。もちろん、ベテランであれば記事中の分割線以降の操作方...

jQueryはショッピングカート機能を実装します

この記事の例では、ショッピングカート機能を実装するためのjQueryの具体的なコードを参考までに共有...

Linux仮想マシンを作成し、仮想マシンネットワークを設定する方法に関するVMwareの詳細なチュートリアル

VMware で Linux 仮想マシンを作成し、VMware と仮想マシンのネットワークを設定する...

JavaScriptの厳密モードが8進数をサポートしていない問題の説明

JavaScript厳密モードが 8 進数をサポートしていないという問題に関して、まず、 Java...

MySQLテーブルのフィールドと関連属性をエクスポートする手順

データベース内のテーブルのフィールドとプロパティをエクスポートし、テーブルを作成してWordに保存す...

JS、CSS スタイルのリファレンスの記述

CS: ... 1. <link type="text/css" href...

VMwareを使用したPermeateレンジシステムのインストール手順の詳細説明

1. 背景私たちは時々社内研修を行っており、実験環境をよく利用しています。最初はdockerコンテナ...

CentOS 7 で Apache (httpd) サービスをインストールおよびアンインストールする詳細な手順

アンインストールまず、次のコマンドを使用して、httpd サービスがインストールされているかどうか、...

MySQL で制限を使用するとパフォーマンスに影響するのはなぜですか?

まず、MySQL のバージョンについて説明します。 mysql> バージョンを選択します();...

両側にCSS固定レイアウト、中央に適応レイアウトを実装

フローティング、フローティング埋め込み div、配置、フレックスという 4 つの一般的な方法と原則を...