Rumah > Artikel > pangkalan data > Cara menggunakan gabungan luar jadual data dalam MySQL
Sebelum menerangkan sebab "cantuman luar" digunakan, mari kita lihat rekod. (Seperti berikut:)
Memandangkan Zhang San dalam jadual tidak mempunyai nombor jabatan, kami akan mengklasifikasikannya buat sementara waktu sebagai "pekerja sementara" dan tiada jabatan tetap penubuhan.
Dalam senario sedemikian, masalah timbul. Apabila kami ingin menanyakan nama setiap pekerja dan jabatan di mana dia berada, apabila menggunakan gabungan dalaman, kerana syarat pautan kami ialah ` "Nombor Jabatan" bagi "Jadual Pekerja" = "Nombor Jabatan "Jabatan Jabatan", "Zhang San" akan dirindui. Walaupun "Zhang San" tidak mempunyai "nombor jabatan", dia juga merupakan ahli syarikat sebagai "pekerja sementara", jadi sintaks gabungan luaran mesti diperkenalkan untuk menyelesaikan masalah ini, jika tidak, beberapa data logik akan hilang .
Perbezaan antara cantuman luar dan cantuman dalam:
Dalam hasil cantuman dalam, hanya rekod yang memenuhi syarat sambungan akan muncul dan rekod yang tidak memenuhi syarat sambungan akan muncul. Ia tidak akan muncul dalam set hasil.
Tidak kira sama ada syarat sambungan data dipenuhi atau tidak, sambungan luar akan dipaparkan dalam keputusan yang ditetapkan dengan cara yang istimewa. (Contohnya, menanyakan maklumat nombor jabatan pekerja yang dinyatakan di atas, kerana "Zhang San" tidak mempunyai nombor jabatan, jika sambung dalam digunakan, "Zhang San" tidak memenuhi "syarat sambungan" dan tidak akan muncul dalam keputusan tetapkan join
"Left outer join" bermaksud semasa operasi sambungan, semua rekod dalam jadual kiri dikekalkan dan disambungkan dengan jadual kanan. Jadual kiri akan disambungkan ke jadual kanan Jika terdapat rekod yang memenuhi syarat dalam jadual kanan; jika tiada rekod yang memenuhi syarat dalam jadual kanan, "NULL" akan digunakan untuk menyambung jadual kiri.
Perbezaan daripada "cantum kiri" ialah "cantum kanan" adalah bertentangan dengan "cantum kiri". ; sama , jika jadual kiri tidak mempunyai rekod yang memenuhi syarat, gunakan "NULL" untuk menyertai jadual kanan.
Kanan sertai contoh pernyataan SQL:SELECT e.empno, e.ename, d.dname FROM t_emp e LEFT JOIN t_dept d ON e.deptno = d.deptno; -- 在连接的时候仍然是链接 "员工表" 与 "部门表" ,只不过连接关键字由 "JOIN" 变成了 "LEFT JOIN" (下文再为大家详细解释) -- 两张表的连接条件还是使用 "ON" 关键字去连接的 , 连接条件依然是 "员工表" 的 "部门编号" = "部门表" 的 "部门编号" -- LEFT JOIN 为 "外连接" 的 "左外连接" ;(在 "外连接" 中,是分为 "左外连接" 与 "右外连接" 的) -- 在该SQL语句中 "LEFT JOIN" 左右各有数据表 "t_emp e" 与 "t_dept d" -- 所以这里的 "左连接" 的意思就是:保留 左表 的所有记录,然后与 右表 去连接,如果 右表 有符合条件的记录,则正常连接即可; -- 如果 右表 没有符合条件的连接记录, 右表 则展示 "NULL" 值与 "左表" 去匹配
Di sini, anda dapat melihat bahawa anda masih boleh mengetahui bahawa "Zhang San" tidak mempunyai "jabatan nombor" rekod. Jadi perbezaan antara "gabungan kiri" dan "sambung kanan" tidaklah begitu besar.
Latihan penyertaan luar ①
Tanyakan nama setiap jabatan dan bilangan orang dalam jabatan itu?
Soalan ini nampaknya mudah, tetapi terdapat dua kesukaran di dalamnya, dan terdapat juga kawasan di mana kesilapan mudah dilakukan Untuk butiran, lihat contoh pernyataan SQL dan rajah skema di bawah.SELECT e.empno, e.ename, d.dname FROM t_dept d RIGHT JOIN t_emp e ON e.deptno = d.deptno; -- 这里有个需要注意的地方,就是相较于上文中的 "左连接" ,这里的 "右连接" 左右两张的表的位置做了调换
OK, di sinilah masalah bermula.
Semua orang memberi perhatian kepada jabatan "40" - "OPERASI" di sini sebenarnya tiada sesiapa di jabatan ini, iaitu bilangan orang adalah "0", tetapi yang peliknya ialah apabila statistik. selesai di sini, nampaknya Bilangan orang yang dikira ialah "1". Mengapa ini kerana apabila kami menggunakan kumpulan, kami menggunakan "gabungan kiri" dan mengekalkan semua data dalam jadual kiri, jadi kita ikut "deptno" jadual kiri untuk mengumpulkan. (Oleh kerana rekod jadual kiri dikekalkan, kumpulan juga perlu dikumpulkan mengikut jadual kiri. Kekunci seterusnya ialah "COUNT(*)", yang akan mengira bilangan semua rekod yang sah. Jadi apabila semua rekod daripada jadual kiri "t_dept" Apabila rekod disambungkan ke jadual kanan "t_emp", jadual kanan akan menggunakan nilai "NULL" untuk menyambung ke jadual kiri "t_dept". Selepas sambungan selesai, ia akan menjadi a rekod yang sah. Oleh kerana ia adalah rekod yang sah, maka "COUNT(*)" Keputusan statistik ialah "1". tetapi keputusan ini bukan yang kami mahukan. Bagaimana untuk menyelesaikannya. Sila rujuk kepada pernyataan SQL di bawah >
Dapatkan nama dan nombor jabatan Untuk pekerja tanpa jabatan, gunakan "NULL" untuk menggantikan nama jabatan (ini sebenarnya maksudnya. "Zhang San")Anda mungkin berfikir bahawa anda hanya. menggunakan "cantuman luar kiri" untuk mengekalkan semua rekod dalam jadual jabatan. Bukankah cukup untuk menggantikannya dengan cantuman luar "kanan" di sini . Ia tidak semudah itu latihan ini perlu dilaksanakan menggunakan kata kunci "UNION" Kata kunci "UNION" digunakan untuk menggabungkan set hasil pernyataan pertanyaan (untuk mengecualikan pendua
)."UNION"关键字 在 SQL 语句中的用法如下:
(SQL查询语句) UNION (SQL查询语句) -- 如果存在多条查询语句的话,可以继续使用 UNION 关键字 连接
PS:这里需要注意一下,“UNION” 合并多少个结果集其实无所谓,关键是这些结果集的字段数量和字段的名称必须要相同 。如果说第一个 SQL 查询语句返回的是 10个 字段,第二个返回的是 2个字段 ,这种情况是完全没办法合并的。
(SELECT d.deptno, d.dname, COUNT(e.deptno) FROM t_dept d LEFT JOIN t_emp e ON d.deptno = e.deptno GROUP BY d.deptno) UNION (SELECT d.deptno, d.dname, COUNT(*) FROM t_dept d RIGHT JOIN t_emp e ON d.deptno = e.deptno GROUP BY d.deptno); -- 第一个查询语句,得到的结果集是各个部门的人数。 -- 第二个查询语句,得到的结果集是隶属于各个部门的人数,但是因为 "张三" 是一个没有部门所属的 "临时工" -- 所以两个查询语句的结果集合并之下没救如下图所示。
Atas ialah kandungan terperinci Cara menggunakan gabungan luar jadual data dalam MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!