Pertanyaan bersama berbilang jadual Mysql
Banyak kali dalam perniagaan sebenar, kami tidak hanya menanyakan jadual.
Dalam sistem e-dagang, tanya pengguna yang belum membeli produk.
Bank boleh menanyakan rekod pelanggaran, dan pada masa yang sama menanyakan
meminta maklumat pemenang dan maklumat asas pemenang .
Jika perkara di atas hanyalah situasi lajur, kita perlu menanyakan kedua-dua jadual bersama-sama.
Dalam perniagaan yang dinyatakan di atas, berbilang jadual perlu disatukan untuk membuat pertanyaan bagi mendapatkan hasil, dan intipati pertanyaan bersama berbilang jadual ialah: sambungan jadual.
Sambungan jadual
Apabila anda perlu menanyakan medan dalam berbilang jadual, anda boleh menggunakan sambungan jadual. Cantuman meja dibahagikan kepada cantuman dalam dan cantuman luar.
Campuran dalaman: Sertai rekod yang medan dalam dua jadual mempunyai perhubungan cantum yang sepadan dengan perhubungan cantum untuk membentuk set rekod.
Sambungan luar: Rekod lain yang tidak dapat dipadankan akan dipilih, dibahagikan kepada sambung kiri luar dan sambung kanan luar.
Sebelum eksperimen pembelajaran, saya menyediakan dua jadual data simulasi untuk semua orang:
- Jadual pengguna untuk menyimpan maklumat pengguna
- Jadual pesanan, yang menyimpan pengguna mana yang membeli produk mana
penyata penciptaan jadual pengguna
BUAT JADUAL JIKA TIDAK WUJUD
user
(
uid
int(11) BUKAN NULL,
username
varchar(30) BUKAN NULL,
password
char(32) BUKAN NULL
) ENGINE=CHARSET LAALA InnoDB=utf8;BUAT JADUAL JIKA TIDAK WUJUD
order_goods
(
oid
int(11) BUKAN NULL,
uid
int(11) BUKAN NULL,
name
varchar(50) BUKAN NULL,
buytime
int(11) BUKAN NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
data jadual pengguna adalah seperti berikut:
uid | username | password |
---|---|---|
1 | 景甜 | 123456 |
2 | 王小二 | 245667 |
3 | 王宝强 | 1235531 |
4 | 井柏然 | 123455 |
5 | 范冰冰 | 5abcwa |
6 | 黄晓明 | abcdeef |
7 | anglebaby | caption |
8 | TFBOYS | abcdwww |
9 | 安小超 | 12tfddwd |
10 | 高小峰 | 3124qwqw |
11 | 李小强 | 323fxfvdvd |
12 | 李小超 | 311aqqee |
13 | 韩小平 | 121rcfwrfq |
14 | 宋小康 | 123123tcsd |
15 | 佟小刚 | 3cxvdfs |
data barang_pesanan adalah seperti berikut:
oid | uid | name | buytime |
---|---|---|---|
1 | 10 | 苹果鼠标 | 1212313 |
2 | 3 | iphone 12s | 123121241 |
3 | 12 | 雪碧 | 13232333 |
4 | 15 | 34242123 | |
5 | 3 | iphone 键盘 | 12123413 |
Nota: Dalam jadual barang_pesanan 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.
Penyertaan dalaman
Sintaks asas 1:
类别 | 详细解示 |
---|---|
基本语法 | select 表1.字段 [as 别名],表n.字段 from 表1 [别名],表n where 条件; |
示例 | select user.uid ,user.username as username,order_goods.oid,order_goods.uid,order_goods.name as shopname from user,order_goods where user.uid = order_goods.uid; |
示例说明 | 查询商品表中哪些用户购买过商品,并将用户信息显示出来 |
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> pilih u.uid ,u.username sebagai nama pengguna,o.oid,o.uid,o.name sebagai nama kedai daripada pengguna u,order_goods o where u.uid = o.uid;
+-----+-----------+-----+-----+---------------+
|. uid |. nama kedai | +-----+-----------+-----+-----+---------------+
|. 10 |. Gao Xiaofeng | |. 3 |. Wang Baoqiang | |. 12 |. Li Xiaochao | |.. Tong Xiaogang | |. 3 |. Li Wenkai | +-----+-----------+-----+-----+---------------+
5 baris dalam set (0.00 saat)
Sintaks asas 2:Hasilnya konsisten dengan Tatabahasa Asas 1.
mysql> pilih user.uid ,user.username sebagai nama pengguna,order_goods.oid,order_goods.uid,order_goods.name sebagai nama kedai daripada pengguna inner join order_goods pada user.uid = order_goods. uid;
+-----+-----------+-----+-----+---------------+
|. uid |. nama kedai | +-----+-----------+-----+-----+---------------+
|. 10 |. Gao Xiaofeng | |. 3 |. Wang Baoqiang | |. 12 |. Li Xiaochao | |.. Tong Xiaogang | |. 3 |. Wang Baoqiang | +-----+-----------+-----+-----+---------------+
5 baris dalam set (0.00 saat)
Sambungan luarCambung luar dibahagikan kepada cantuman kiri dan pautan kanan Definisi khusus adalah seperti berikut.
Cabutan kiri: Mengandungi semua rekod dalam jadual kiri walaupun rekod yang tidak sepadan dengannya dalam jadual kanan
mysql> pilih * daripada pengguna kiri sertai order_goods pada pengguna .uid = order_goods.uid;
+-----+-----------+------------+------+ - -----+--------------+----------+
| nama pengguna | masa beli |
+-----+-----------+------------+------+----- - +--------------+---------+
|. 1212313 | >|. 3 |. 1235531 | |. Tong Xiaogang | 15 |. 34242123 | NULL |
|. 2 | Wang Xiao |. NULL |. NULL | 🎜 >| 6 | abcdeef |. NULL |. NULL |. | NULL |
| 9 |. 12tfddwd |. NULL | 123tcsd |. NULL |. ----------+------+------+-----------------+------ --- -+
16 baris dalam set (0.00 saat)Cantum kanan: Mengandungi semua rekod dalam jadual yang betul walaupun rekod yang tidak sepadan dengannya dalam jadual yang betul
类别 详细解示 基本语法 select 表1.字段 [as 别名],表n.字段 from 表1 right JOIN 表n on 条件; 示例 select * from user right join order_goods on user.uid = order_goods.uid; 示例说明 查询商品表中哪些用户购买过商品,并将用户信息显示出来 mysql> pilih * daripada user right join order_goods pada pengguna .uid = order_goods.uid;
+------+-----------+----------+-----+-- - --+----------------+---------+
| nama pengguna | 🎜>+------+-----------+----------+-----+-----+---- - ---------+----------+
| 3124qwqw | Baoqiang |. 311aqqee | ng Xiaogang |. 3cxvdfs | 🎜 >|. 3 |. Wang Baoqiang |. 5 |. --- +-----+-----+----------------+-----------+
5 baris dalam set (0.00 saat)
Subquery
Kadangkala, apabila kita membuat pertanyaan, syarat yang diperlukan adalah hasil daripada penyataan pilih yang lain, maka kita perlu menggunakan subquery. Kata kunci yang digunakan untuk subkueri termasuk dalam, bukan dalam, =, !=, wujud, tidak wujud, dsb.Contoh 1:
mysql> pilih * daripada pengguna di mana uid masuk (1,3,4);
+-----+-----------+----------+
|. nama pengguna | +-----+-----------+----------+
|. 1 |. Jing Tian | |. 3 |. Wang Baoqiang | 4 |. Jing Boran | +-----+-----------+----------+
3 baris dalam set (0.00 saat)
Contoh 2:mysql> ; +-----+-----------+----------+
|. nama pengguna | +-----+-----------+----------+|. 10 | |. 3 |. Wang Baoqiang | |. 12 |. Li Xiaochao | |. 15 |. Tong Xiaogang | +-----+-----------+----------+mysql> pilih uid daripada kesatuan pengguna pilih uid daripada order_goods;4 baris dalam set (0.00 saat)
mysql> pilih * dari emp di mana deptno masuk (pilih deptno dari dept);
Rekod kesatuan
Gunakan kesatuan dan Kesatuan semua kata kunci digunakan untuk menanyakan data daripada dua jadual mengikut syarat pertanyaan tertentu, dan kemudian menggabungkan hasil dan memaparkannya bersama-sama. 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.+-----+
|. uid |+-----+
|. 1 ||. 2 |
|. 3 ||. 4 |
类别 详细解示 基本语法 select语句1 union[all] select语句2 示例 select * from user where uid in (1,3,4); 示例说明 将商品表中的用户信息和用户表中的用户信息的结果组合在一起 |. 5 ||. 6 |
|. 7 |
|. 8 |
|. 9 |
|. 10 |
|. 11 |
|. 12 |
|. 13 |
|. 14 |
|. 15 |
+-----+
15 baris dalam set (0.00 saat)