Pertanyaan bersama berbilang jadual
Sambungan jadual
Apabila anda perlu menanyakan medan dalam berbilang jadual, Ini boleh dicapai menggunakan cantuman jadual. Cantuman meja dibahagikan kepada cantuman dalam dan cantuman luar.
1. Cantuman dalaman: Gabungan yang membentuk set rekod dengan menggabungkan rekod tersebut yang medannya dalam dua jadual mempunyai hubungan sambungan dan sepadan dengan hubungan sambungan.
2. Sambungan luar: Rekod lain yang tidak sepadan akan dipilih, dibahagikan kepada sambung kiri luar dan sambung kanan luar.
Sebelum mempelajari eksperimen, saya menyediakan dua jadual data simulasi untuk semua orang:
1 Jadual pengguna, yang menyimpan maklumat pengguna
2 Produk manakah yang telah dibeli oleh pengguna?
Pernyataan penciptaan jadual pengguna
CREATE TABLE IF NOT EXISTS user ( uid int(11) NOT NULL, username varchar(30) NOT NULL, password char(32) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS order_goods ( oid int(11) NOT NULL, uid int(11) NOT NULL, name varchar(50) NOT NULL, buytime int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Data jadual pengguna adalah seperti berikut:
Nota: Dalam jadual order_goods di atas, uid merujuk kepada medan uid dalam jadual pengguna. Dalam jadual di atas, baris data dengan oid ialah 1 dan pengguna dengan uid ialah 10. Untuk pengguna dengan uid 10 dalam jadual pengguna: Gao Xiaofeng. Pengguna membeli tetikus Apple. Masa belian masa pembelian ialah cap waktu unix.
Sambungan dalaman
Nota: Dalam contoh berikut, jadual dari menggunakan alias jadual.
Oleh kerana nama jadual terlalu panjang, mudah untuk melakukan kesilapan setiap kali anda menulisnya. Kita boleh mengikuti jadual secara langsung dengan rentetan bahasa Inggeris yang disingkat. Apabila menyambung medan tadi, hanya gunakan rentetan singkatan.medan.
mysql> select u.uid ,u.username as username,o.oid,o.uid,o.name as shopname from user u,order_goods o where u.uid = o.uid; +-----+-----------+-----+-----+---------------+ | uid | username | oid | uid | shopname | +-----+-----------+-----+-----+---------------+ | 10 | 高小峰 | 1 | 10 | 苹果鼠标 | | 3 | 李文凯 | 2 | 3 | iphone 12s | | 12 | 李小超 | 3 | 12 | 雪碧 | | 15 | 佟小刚 | 4 | 15 | | | 3 | 李文凯 | 5 | 3 | iphone 键盘 | +-----+-----------+-----+-----+---------------+ 5 rows in set (0.00 sec)
Tatabahasa Asas 2:
Hasilnya konsisten dengan Tatabahasa Asas 1.
mysql> select user.uid ,user.username as username,order_goods.oid,order_goods.uid,order_goods.name as shopname from user inner join order_goods on user.uid = order_goods.uid; +-----+-----------+-----+-----+---------------+ | uid | username | oid | uid | shopname | +-----+-----------+-----+-----+---------------+ | 10 | 高小峰 | 1 | 10 | 苹果鼠标 | | 3 | 李文凯 | 2 | 3 | iphone 12s | | 12 | 李小超 | 3 | 12 | 雪碧 | | 15 | 佟小刚 | 4 | 15 | | | 3 | 李文凯 | 5 | 3 | iphone 键盘 | +-----+-----------+-----+-----+---------------+ 5 rows in set (0.00 sec)
Sambungan luar
Sambungan luar dibahagikan kepada sambung kiri dan pautan kanan, definisi khusus adalah seperti berikut.
Caburan kiri: Mengandungi semua rekod dalam jadual kiri, malah rekod yang tidak sepadan dengannya dalam jadual kanan
mysql> select * from user left join order_goods on user.uid = order_goods.uid; +-----+-----------+------------+------+------+---------------+-----------+ | uid | username | password | oid | uid | name | buytime | +-----+-----------+------------+------+------+---------------+-----------+ | 10 | 高小峰 | 3124qwqw | 1 | 10 | 苹果鼠标 | 1212313 | | 3 | 李文凯 | 1235531 | 2 | 3 | iphone 12s | 123121241 | | 12 | 李小超 | 311aqqee | 3 | 12 | 雪碧 | 13232333 | | 15 | 佟小刚 | 3cxvdfs | 4 | 15 | | 34242123 | | 3 | 李文凯 | 1235531 | 5 | 3 | iphone 键盘 | 12123413 | | 1 | 景甜 | 123456 | NULL | NULL | NULL | NULL | | 2 | 王小二 | 245667 | NULL | NULL | NULL | NULL | | 4 | 井柏然 | 123455 | NULL | NULL | NULL | NULL | | 5 | 范冰冰 | 5abcwa | NULL | NULL | NULL | NULL | | 6 | 黄晓明 | abcdeef | NULL | NULL | NULL | NULL | | 7 | anglebaby | caption | NULL | NULL | NULL | NULL | | 8 | TFBOYS | abcdwww | NULL | NULL | NULL | NULL | | 9 | 安小超 | 12tfddwd | NULL | NULL | NULL | NULL | | 11 | 李小强 | 323fxfvdvd | NULL | NULL | NULL | NULL | | 13 | 韩小平 | 121rcfwrfq | NULL | NULL | NULL | NULL | | 14 | 宋小康 | 123123tcsd | NULL | NULL | NULL | NULL | +-----+-----------+------------+------+------+---------------+-----------+ 16 rows in set (0.00 sec)
Campur kanan: Mengandungi semua rekod dalam jadual kanan, malah rekod dalam jadual kanan Tiada rekod yang sepadan dengannya dalam
mysql> select * from user right join order_goods on user.uid = order_goods.uid; +------+-----------+----------+-----+-----+---------------+-----------+ | uid | username | password | oid | uid | name | buytime | +------+-----------+----------+-----+-----+---------------+-----------+ | 10 | 高小峰 | 3124qwqw | 1 | 10 | 苹果鼠标 | 1212313 | | 3 | 李文凯 | 1235531 | 2 | 3 | iphone 12s | 123121241 | | 12 | 李小超 | 311aqqee | 3 | 12 | 雪碧 | 13232333 | | 15 | 佟小刚 | 3cxvdfs | 4 | 15 | | 34242123 | | 3 | 李文凯 | 1235531 | 5 | 3 | iphone 键盘 | 12123413 | +------+-----------+----------+-----+-----+---------------+-----------+ 5 rows in set (0.00 sec)
Subquery
Kadangkala, apabila kita membuat pertanyaan, syarat yang diperlukan adalah hasil daripada pernyataan pilihan yang lain, dalam hal ini kita perlu menggunakan subquery. Kata kunci yang digunakan untuk subkueri termasuk dalam, bukan dalam, =, !=, wujud, tidak wujud, dsb.
Contoh 1:
mysql> select * from user where uid in (1,3,4); +-----+-----------+----------+ | uid | username | password | +-----+-----------+----------+ | 1 | 景甜 | 123456 | | 3 | 李文凯 | 1235531 | | 4 | 井柏然 | 123455 | +-----+-----------+----------+ 3 rows in set (0.00 sec)
Contoh 2:
mysql> select * from user where uid in (select uid from order_goods); +-----+-----------+----------+ | uid | username | password | +-----+-----------+----------+ | 10 | 高小峰 | 3124qwqw | | 3 | 李文凯 | 1235531 | | 12 | 李小超 | 311aqqee | | 15 | 佟小刚 | 3cxvdfs | +-----+-----------+----------+ 4 rows in set (0.00 sec)rrree
Penyatuan rekod
Gunakan penyatuan dan penyatuan semua kata kunci untuk menanyakan data kedua-dua jadual mengikut syarat pertanyaan tertentu, kemudian gabungkan hasilnya bersama-sama untuk paparan. Perbezaan utama antara kedua-duanya ialah hasil digabungkan secara langsung, manakala kesatuan ialah hasil daripada melaksanakan operasi yang berbeza pada keputusan selepas gabungan semua, dan mengalih keluar rekod pendua.
mysql> select * from emp where deptno in (select deptno from dept);