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
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)
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
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.
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
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)
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)
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
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!