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

推薦する

mysql8.x docker リモートアクセスの詳細な設定

目次環境条件エラーが発生しました回避策1. mysql dockerにログインする2. ルートパスワ...

SQL 実践演習: オンライン モール データベースの製品カテゴリ データ操作

オンラインショッピングモールデータベース - 商品カテゴリデータ操作(I)プロジェクトの説明電子商取...

CSS3プロパティline-clampはテキスト行の使用を制御します

説明: ブロック要素に表示されるテキストの行数を制限します。 -webkit-line-clamp ...

Linux 上のカラフルな猫

Linux システムを使用したことがある友人なら、 catコマンドを使用したことがあるはずです。もち...

React Nativeプロジェクトフレームワークの構築経験

React Native は、2015 年 4 月に Facebook によってオープンソース化され...

DockerにJava環境をインストールするための実装手順

この記事は Linux centos8 をベースにして、docker をインストールし、イメージをプ...

CSS 配送先住所平行四辺形線スタイルの例コード

コードは次のようになります。 // 配送先住所の平行四辺形の線のスタイル <view clas...

HTML doctype の役割の紹介

ドキュメント モードには次の 2 つの機能があります。 1. HTML文書を解析するためにどのHTM...

Linux で Squid プロキシ サーバーを構築するための完全な手順

序文この記事では、Linux で Squid プロキシ サーバーを設定することに関する関連コンテンツ...

Docker コンテナのネットワーク障害に対する 6 つの解決策

Docker コンテナのネットワーク障害に対する 6 つの解決策注: 以下の方法は、コンテナ内のパブ...

HTML の基本概要推奨事項 (段落)

HTML段落段落は <p> タグによって定義されます。例<p>これは段落で...

MySQLはカスタム関数を使用して親IDまたは子IDを再帰的に照会します

背景: MySQL では、レベルに制限がある場合、たとえば、ツリーの最大深度を事前に決定できる場合、...

Redission-tomcatは、単一マシンから複数マシンへの展開を迅速に実装します。

序文一部のプロジェクトの初期段階では、シンプルさとスピードのために、開発と展開は単一のマシンで行われ...

Windows 64 ビットに MySQL を再インストールするチュートリアル (Zip バージョン、解凍バージョンの MySQL インストール)

MySQLをアンインストールする1. コントロールパネルで、MySQLのすべてのコンポーネントをア...

JSはカード配布アニメーションを実現します

この記事の例では、カード配布アニメーションを実装するためのJSの具体的なコードを参考までに共有してい...