ホームページ  >  記事  >  データベース  >  MySQL データベースでの重複排除と接続クエリの方法

MySQL データベースでの重複排除と接続クエリの方法

WBOY
WBOY転載
2023-05-28 22:07:101155ブラウズ
ディレクトリ
  • 1.重複排除

  • 2.接続クエリ

    • マルチテーブル接続クエリには where を使用します

    • ##内部結合 - 等価結合

    • ##内部結合 - 非等価結合
    • ##内部結合 - 自己結合
    • #外部結合 - 左および右外部結合

    • ##3 つのテーブル結合

    • 1. 重複排除

    • サンプル テーブルの内容については、この記事を参照してください。
一部の MySQL データ テーブルには重複レコードが含まれる場合があり、場合によっては重複データが許可されます。存在しますが、場合によってはこれらの重複データを削除する必要があることもあります。

例: 重複を削除し、位置情報を表示します:

mysql> select distinct job from emp;
+-----------+
| job       |
+-----------+
| CLERK     |
| SALESMAN  |
| MANAGER   |
| ANALYST   |
| PRESIDENT |
+-----------+
5 rows in set (0.02 sec)

別の例: 共同重複排除、部門および位置に関する固有の情報を検索します:

mysql> select distinct job,deptno from emp;
+-----------+--------+
| job       | deptno |
+-----------+--------+
| CLERK     |     20 |
| SALESMAN  |     30 |
| MANAGER   |     20 |
| MANAGER   |     30 |
| MANAGER   |     10 |
| ANALYST   |     20 |
| PRESIDENT |     10 |
| CLERK     |     30 |
| CLERK     |     10 |
+-----------+--------+
9 rows in set (0.00 sec)

別の例: 次のことが必要ですcount 関数と組み合わせてジョブの数をカウントする:

mysql> select count(distinct job) from emp;
+---------------------+
| count(distinct job) |
+---------------------+
|                   5 |
+---------------------+
1 row in set (0.00 sec)

2. 接続クエリ

テーブル内のデータを読み取る方法を学習しましたが、これは比較的単純ですが、実際のアプリケーションでは、多くの場合、複数のデータ テーブルからデータを読み取る必要があります。

JOIN は、その機能に応じて次の 3 つのカテゴリに大別されます。

INNER JOIN (内部結合、または等価結合): 2 つのテーブル内のフィールドの一致関係のレコードを取得します。

LEFT JOIN (左結合): 右側のテーブルに対応する一致するレコードがない場合でも、左側のテーブルのすべてのレコードを取得します。

RIGHT JOIN (右結合): LEFT JOIN とは逆に、左側のテーブルに対応する一致するレコードがない場合でも、右側のテーブルのすべてのレコードを取得するために使用されます。

複数テーブル結合の操作は、1 つのテーブルの各データを別のテーブルのデータ行と照合することです。これには効率制御の問題が含まれます

複数テーブル接続クエリを実行する場所の使用

次に例を示します: 各従業員の名前と部門名を取り出します:

mysql> select ename,dname
    -> from emp,dept
    -> where emp.deptno = dept.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)

上記の SQL ステートメントは、実際には非常に非効率的です。最適化を試みます (テーブルのエイリアス): (SQL92 構文)

mysql> select e.ename,d.dname
    -> from emp e,dept d
    -> where e.deptno = d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)

注: テーブルの接続数が増えるほど、効率は低くなります。テーブル内の接続の数。接続の数!

内部結合 - 同等の結合

上記の例から、各従業員の名前と部門名を取り出します: (SQL99 構文)

内部結合。inner# を使用します。 ##
mysql> select e.ename,d.dname
    -> from emp e
    -> inner join
    -> dept d
    -> on
    -> e.deptno = d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)

sql99 の利点は、テーブルの接続が独立しており、where の位置を占有しないことです。 SQL ステートメント全体をより明確にする

内部結合と非等価結合

ケース: 各従業員の給与等級を調べ、従業員名、給与、および給与等級を表示する必要があります

mysql> select
    -> e.ename,e.sal,s.grade
    -> from
    -> emp e
    -> inner join
    -> salgrade s
    -> on
    -> e.sal between s.losal and s.hisal;
+--------+---------+-------+
| ename  | sal     | grade |
+--------+---------+-------+
| SMITH  |  800.00 |     1 |
| ALLEN  | 1600.00 |     3 |
| WARD   | 1250.00 |     2 |
| JONES  | 2975.00 |     4 |
| MARTIN | 1250.00 |     2 |
| BLAKE  | 2850.00 |     4 |
| CLARK  | 2450.00 |     4 |
| SCOTT  | 3000.00 |     4 |
| KING   | 5000.00 |     5 |
| TURNER | 1500.00 |     3 |
| ADAMS  | 1100.00 |     1 |
| JAMES  |  950.00 |     1 |
| FORD   | 3000.00 |     4 |
| MILLER | 1300.00 |     2 |
+--------+---------+-------+
14 rows in set (0.01 sec)

内部のつながり - 自己のつながり

ケース: 従業員の上司のリーダーに問い合わせて、従業員の名前と対応するリーダーの名前を表示するよう要求します。

次のような関係があることがわかります。従業員とリーダーはテーブル内にあります。このとき、自己結合を使用する必要があります (テクニック: 1 つのテーブルを 2 つのテーブルとして扱う)

mysql> select
    -> a.ename as '员工名',b.ename as '领导名'
    -> from emp a
    -> join emp b
    -> on
    -> a.mgr = b.empno;
+-----------+-----------+
| 员工名    | 领导名      |
+-----------+-----------+
| SMITH     | FORD      |
| ALLEN     | BLAKE     |
| WARD      | BLAKE     |
| JONES     | KING      |
| MARTIN    | BLAKE     |
| BLAKE     | KING      |
| CLARK     | KING      |
| SCOTT     | JONES     |
| TURNER    | BLAKE     |
| ADAMS     | SCOTT     |
| JAMES     | BLAKE     |
| FORD      | JONES     |
| MILLER    | CLARK     |
+-----------+-----------+
13 rows in set (0.00 sec)

外部結合 - 左外部結合と右外部結合

外部結合と内部結合の違いは、外部結合がうまく一致しないことです。 特定のテーブルのレコードも取り出されます。

ケース: 従業員の部門情報を検索します。従業員がいない場合でも部門に確認するよう要求する

mysql> select
    -> e.ename,d.dname
    -> from emp e
    -> right join dept d
    -> on
    -> e.deptno = d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
| NULL   | OPERATIONS |
+--------+------------+
15 rows in set (0.00 sec)

同様に、左外部結合の場合は、左テーブル内のすべてのデータがクエリされ、左結合キーワードを使用できます

外部結合の場合、クエリ結果の数は、内部結合のクエリ結果の数以上である必要があります。

3 つのテーブル接続

より複雑な状況は、グループ テーブル接続です

ケースを見てみましょう:

各従業員の部門名と給与等級を調べます。従業員名、部門名、給与、および給与等級を表示する必要があります

mysql> select
    -> e.ename,e.sal,d.dname,s.grade
    -> from emp e
    -> join dept d
    -> on e.deptno = d.deptno
    -> join salgrade s
    -> on e.sal between s.losal and s.hisal;
+--------+---------+------------+-------+
| ename  | sal     | dname      | grade |
+--------+---------+------------+-------+
| SMITH  |  800.00 | RESEARCH   |     1 |
| ALLEN  | 1600.00 | SALES      |     3 |
| WARD   | 1250.00 | SALES      |     2 |
| JONES  | 2975.00 | RESEARCH   |     4 |
| MARTIN | 1250.00 | SALES      |     2 |
| BLAKE  | 2850.00 | SALES      |     4 |
| CLARK  | 2450.00 | ACCOUNTING |     4 |
| SCOTT  | 3000.00 | RESEARCH   |     4 |
| KING   | 5000.00 | ACCOUNTING |     5 |
| TURNER | 1500.00 | SALES      |     3 |
| ADAMS  | 1100.00 | RESEARCH   |     1 |
| JAMES  |  950.00 | SALES      |     1 |
| FORD   | 3000.00 | RESEARCH   |     4 |
| MILLER | 1300.00 | ACCOUNTING |     2 |
+--------+---------+------------+-------+
14 rows in set (0.00 sec)

もっと複雑な状況を見てみましょう:

部門名、給与等級、およびリーダー名を確認してください従業員一人ひとりの。従業員名、部署名、リーダー名、給与、給与等級の表示リクエスト

mysql> select
    -> e.ename,e.sal,d.dname,s.grade,l.ename
    -> from emp e
    -> join dept d
    -> on e.deptno = d.deptno
    -> join salgrade s
    -> on e.sal between s.losal and s.hisal
    -> left join
    -> emp l
    -> on e.mgr = l.empno;
+--------+---------+------------+-------+-------+
| ename  | sal     | dname      | grade | ename |
+--------+---------+------------+-------+-------+
| SMITH  |  800.00 | RESEARCH   |     1 | FORD  |
| ALLEN  | 1600.00 | SALES      |     3 | BLAKE |
| WARD   | 1250.00 | SALES      |     2 | BLAKE |
| JONES  | 2975.00 | RESEARCH   |     4 | KING  |
| MARTIN | 1250.00 | SALES      |     2 | BLAKE |
| BLAKE  | 2850.00 | SALES      |     4 | KING  |
| CLARK  | 2450.00 | ACCOUNTING |     4 | KING  |
| SCOTT  | 3000.00 | RESEARCH   |     4 | JONES |
| KING   | 5000.00 | ACCOUNTING |     5 | NULL  |
| TURNER | 1500.00 | SALES      |     3 | BLAKE |
| ADAMS  | 1100.00 | RESEARCH   |     1 | SCOTT |
| JAMES  |  950.00 | SALES      |     1 | BLAKE |
| FORD   | 3000.00 | RESEARCH   |     4 | JONES |
| MILLER | 1300.00 | ACCOUNTING |     2 | CLARK |
+--------+---------+------------+-------+-------+
14 rows in set (0.00 sec)

以上がMySQL データベースでの重複排除と接続クエリの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。