Rumah  >  Artikel  >  pangkalan data  >  Kaedah deduplikasi dan pertanyaan sambungan dalam pangkalan data MySQL

Kaedah deduplikasi dan pertanyaan sambungan dalam pangkalan data MySQL

WBOY
WBOYke hadapan
2023-05-28 22:07:101080semak imbas
Direktori
  • 1 Deduplikasi

  • 2. Pertanyaan sambungan

    • Gunakan di mana untuk pertanyaan sambung berbilang jadual

    • Sambungan dalam-samaan dalam

    • Sambungan dalam-bukan setara

    • Sambungan dalam - sambung sendiri

    • Sambungan luar - sambung luar kiri dan kanan

    • Sambung tiga meja

1 Deduplikasi

Rujuk artikel ini untuk contoh kandungan jadual

Sesetengah jadual data MySQL mungkin mempunyai rekod pendua, dan dalam sesetengah kes kami membenarkan pendua data wujud, tetapi kadangkala kami juga perlu memadamkan data pendua ini.

Contoh: Alih keluar pendua dan paparkan maklumat kedudukan:

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

Contoh lain: Penyahduaan bersama, cari maklumat unik jabatan dan jawatan:

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)

Contoh lain: Sekarang Kami mahu kira bilangan kerja dan gunakan fungsi kira:

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

2. Sertai pertanyaan

Kami telah mempelajari cara membaca data dalam jadual, yang agak mudah, tetapi Dalam aplikasi sebenar, ia selalunya diperlukan untuk membaca data daripada berbilang jadual data.

JOIN dibahagikan secara kasar kepada tiga kategori berikut mengikut fungsinya:

INNER JOIN (gabungan dalam atau gabungan yang setara): memperoleh rekod hubungan padanan medan dalam dua jadual.

LEFT JOIN: Dapatkan semua rekod dalam jadual kiri, walaupun tiada rekod sepadan yang sepadan dalam jadual kanan.

RIGHT JOIN: Bertentangan dengan LEFT JOIN, ia digunakan untuk mendapatkan semua rekod dalam jadual kanan, walaupun tiada rekod sepadan yang sepadan dalam jadual kiri.

Kendalian gabungan berbilang jadual adalah untuk memadankan setiap keping data dalam satu jadual dengan baris data dalam jadual lain. Ini melibatkan isu kawalan kecekapan

Gunakan tempat untuk melakukan pertanyaan sambungan berbilang jadual

Sekarang mari kita tunjukkan contoh: keluarkan nama dan nama jabatan setiap pekerja:

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)

Pernyataan sql di atas sebenarnya sangat tidak cekap Kami cuba mengoptimumkannya (alias jadual): (sintaks 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)

Nota: Semakin banyak sambungan jadual, semakin rendah kecekapan bilangan sambungan dalam jadual.

Inner join - equivalent join

Masih contoh di atas, keluarkan nama dan nama jabatan setiap pekerja: (sintaks sql99)

Inner join, kami guna 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)

Kelebihan sql99 ialah: sambungan jadual adalah bebas dan tidak menduduki kedudukan di mana. Jadikan penyata sql keseluruhan lebih jelas

Caburan dalaman - join bukan setara

Kes: Ketahui gred gaji setiap pekerja dan minta nama pekerja, gaji dan gred gaji dipaparkan

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)

Sambungan dalaman - sambung sendiri

Kes: Tanya ketua atasan pekerja dan minta untuk memaparkan nama pekerja dan nama ketua yang sepadan

Kita dapati bahawa hubungan antara pekerja dan pemimpin berada dalam satu meja Pada masa ini Perlu menggunakan gabungan sendiri (teknik: layan satu meja sebagai dua meja)

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)

Jam luar - join luar kiri dan kanan

Bezanya antara cantuman luar dan cantuman dalam ialah cantuman luar tidak berjaya dipadankan Rekod daripada jadual tertentu juga akan dikeluarkan

Kes: Cari maklumat jabatan pekerja. Memerlukan jabatan untuk mengetahui

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)

walaupun tiada pekerja Begitu juga, jika ia adalah gabungan luar kiri, semua data dalam jadual kiri akan disoal menggunakan kata kunci gabungan kiri untuk

Sambungan luar Bilangan hasil pertanyaan mestilah >= bilangan hasil pertanyaan sambung dalam

Tiga sambungan jadual

Situasi yang lebih rumit ialah sambungan jadual kumpulan

Jom Tengok satu kes:

Ketahui nama jabatan dan gred gaji setiap pekerja. Ia dikehendaki memaparkan nama pekerja, nama jabatan, gaji, dan gred gaji

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)

Mari kita lihat situasi yang lebih kompleks:

Ketahui nama jabatan, gred gaji dan nama ketua daripada setiap pekerja. Minta untuk memaparkan nama pekerja, nama jabatan, nama ketua, gaji, gred gaji

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)

Atas ialah kandungan terperinci Kaedah deduplikasi dan pertanyaan sambungan dalam pangkalan data MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam