Rumah > pangkalan data > tutorial mysql > Kaedah deduplikasi dan pertanyaan sambungan dalam pangkalan data MySQL

Kaedah deduplikasi dan pertanyaan sambungan dalam pangkalan data MySQL

WBOY
Lepaskan: 2023-05-28 22:07:10
ke hadapan
1202 orang telah melayarinya
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)
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan