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() の奇妙な動作の調査と修正

推薦する

CSS3 @mediaの基本的な使い方のまとめ

//文法: @media mediatype and | not | only (メディア機能) ...

Rails APIを使用してReactアプリケーションを構築するための詳細な手順

目次バックエンド: Rails API部分フロントエンド: React部分Reactコンポーネントa...

MySQL の JSON 挿入の問題

MySQL 5.7.8 以降では、JSON テキストでデータを効率的に取得できるネイティブ JSON...

太字の <b> と <strong> の違いの分析

私たちウェブマスターは皆、ウェブサイトを最適化する際に記事内のキーワードを太字にすることが最適化に非...

Windows Server 2012 リモート デスクトップ ライセンス サーバーがライセンスを提供できず、リモート セッションが切断される

本日、会社の内部サーバーにログインしたところ、リモートアクセスができませんでした。エラー メッセージ...

MySQL 基本チュートリアル: DML ステートメントの詳細な説明

目次DMLステートメント1. レコードを挿入する2. 記録を更新する3. シンプルなクエリレコード4...

Windows 10 での mysql5.5 データベース コマンドラインの中国語文字化け問題を解決する

システムをリセットした後、かなり前にインストールした MySQL データベースのコンソール クエリで...

マウスのドラッグ効果を実現するJavaScript

この記事では、マウスドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

MySQL データベースに基づくデータ制約の例と 5 つの整合性制約の紹介

非準拠データがデータベースに入るのを防ぐために、ユーザーがデータを挿入、変更、削除、その他の操作を行...

MySQL 8.0.13 のインストールと設定方法のグラフィックチュートリアル (Win10 の場合)

MySQL 8.0.13 のインストールと設定方法を皆さんと共有したいと思います。お役に立てれば幸...

JavaScript 遅延読み込みの詳細な説明

目次遅延読み込みCSS スタイル: HTML部分:スクリプト部分:要約する遅延読み込み名前の通り、私...

CSS パフォーマンスの最適化 - will-change の使用方法の詳細な説明

will-change は、要素にどのような変更が行われるかをブラウザに伝え、ブラウザが事前に最適化...

mysqlを使用して、URLから返されたhttp GETリクエストデータを記録します。

ビジネスシナリオの要件と実装ロジックの分析ビジネスでは、HTTP GET を使用してデータを要求する...

AIX マウント NFS の書き込み効率が低い場合の解決策

NFSが提供するサービスマウント: サーバー上で /usr/sbin/rpc.mountd サーボ ...

CentOS 6.9 で glibc ダイナミック ライブラリをアップグレードする詳細なプロセス

glibc は、gnu によってリリースされた libc ライブラリ、つまり c ランタイム ライブ...