Requête conjointe multi-tables Mysql
Souvent, dans les affaires réelles, nous ne nous contentons pas d'interroger une table.
Dans le système de commerce électronique, recherchez quels utilisateurs n'ont pas acheté de produits.
La banque peut interroger les enregistrements de violation, et en même temps interroger l'utilisateur
interroger les informations gagnantes et les informations de base du gagnant .
Si ce qui précède n'est qu'une situation de colonne, nous devons interroger les deux tables ensemble.
Dans les activités mentionnées ci-dessus, plusieurs tables doivent être réunies pour interroger afin d'obtenir des résultats, et l'essence d'une requête conjointe multi-tables est : la connexion de tables.
Connexion de table
Lorsque vous devez interroger des champs dans plusieurs tables, vous pouvez utiliser la connexion de table. Les jointures de table sont divisées en jointures internes et jointures externes.
Jointure interne : joignez les enregistrements dont les champs dans les deux tables ont une relation de jointure qui correspond à la relation de jointure pour former un jeu d'enregistrements.
Jointure externe : d'autres enregistrements sans correspondance seront sélectionnés, divisés en jointure externe gauche et jointure externe droite.
Avant l'expérience d'apprentissage, j'ai préparé deux tableaux de données simulés pour tout le monde :
- Tableau utilisateur pour stocker les informations utilisateur
- Tableau de commande, qui stocke quel utilisateur a acheté quel produit
déclaration de création de table utilisateur
CREATE TABLE IF NOT EXISTS
user
(
uid
int(11) PAS NULL,
username
varchar(30) PAS NULL,
password
char(32) PAS 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) NON NULL,
buytime
int(11) NON NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
les données de la table utilisateur sont les suivantes :
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 |
Les données order_goods sont les suivantes :
oid | uid | name | buytime |
---|---|---|---|
1 | 10 | 苹果鼠标 | 1212313 |
2 | 3 | iphone 12s | 123121241 |
3 | 12 | 雪碧 | 13232333 |
4 | 15 | 34242123 | |
5 | 3 | iphone 键盘 | 12123413 |
Remarque : Dans la table order_goods ci-dessus, uid fait référence au champ uid dans la table user. Dans le tableau ci-dessus, la ligne de données avec oid est 1 et l'utilisateur avec uid est 10. Pour l'utilisateur avec l'uid 10 dans la table utilisateur : Gao Xiaofeng. L'utilisateur a acheté une souris Apple. L'heure d'achat est un horodatage Unix.
Jointure interne
Syntaxe de base 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; |
示例说明 | 查询商品表中哪些用户购买过商品,并将用户信息显示出来 |
Remarque : Dans l'exemple suivant, la table from utilise des alias de table.
Le nom de la table étant trop long, il est facile de faire des erreurs à chaque fois que vous l'écrivez. Nous pouvons suivre le tableau directement avec une chaîne anglaise abrégée. Lors de l'épissage de champs plus tôt, utilisez simplement l'abréviation string.field.
Syntaxe de base 2 :mysql> sélectionnez u.uid,u.username comme nom d'utilisateur,o.oid,o.uid,o.name comme nom de boutique de l'utilisateur u,order_goods o où u.uid = o.uid ;
+-----+-----------+-----+-----+---------------+
| identifiant | nom d'utilisateur | identifiant | nom de la boutique |
+-----+-----------+-----+-----+---------------+
| 10 | Gao Xiaofeng | 1 | 10 | Pomme Souris |
| |12 |Li Xiaochao |3 |12 |
|15 |Tong Xiaogang |4 |15 |
| 3 | Li Wenkai | 5 | 3 | clavier iphone |
+-----+-----------+-----+-----+---------------+
5 lignes dans l'ensemble (0,00 sec)
Le résultat est conforme à la grammaire de base 1.
Jointure externemysql> sélectionnez user.uid, user.username comme nom d'utilisateur,order_goods.oid,order_goods.uid,order_goods.name comme nom de boutique de l'utilisateur, rejoignez order_goods sur user.uid = order_goods. uid;
+-----+-----------+-----+-----+---------------+
| identifiant | nom d'utilisateur | identifiant | nom de la boutique |
+-----+-----------+-----+-----+---------------+
| 10 | Gao Xiaofeng | 1 | 10 | Pomme Souris |
| |12 |Li Xiaochao |3 |12 |
|15 |Tong Xiaogang |4 |15 |
| 3 | Wang Baoqiang | 5 | 3 | clavier iphone |
+-----+-----------+-----+-----+---------------+
5 lignes dans l'ensemble (0,00 sec)
Les jointures externes sont divisées en jointures gauches et liens droits. Les définitions spécifiques sont les suivantes.
Jointure gauche : contient tous les enregistrements de la table de gauche, même les enregistrements qui ne correspondent pas à ceux de la table de droite
mysql> .uid = order_goods.uid;
+-----+---------------+------------+------+ - -----+---------------+-----------+
| nom d'utilisateur | mot de passe oid | heure d'achat |
+-----+-----------+------------+------+----- - +---------------+---------+
| 10 | Gao Xiaofeng | 3124qwqw 1 | 10 | >| 3 | dfs | 4 | 15 | 34242123 |
| 3 | 1235531 | 5 | 3 | Wang Xiao二 | NULL | NULL | NULL |
| abcdeef | NULL | NULL |
| 7 | anglebaby | NULL |
| 9 | ----------+------+------+---------------+------ --- -+
16 lignes dans l'ensemble (0,00 sec)
Jointure à droite : contient tous les enregistrements de la table de droite, même les enregistrements qui ne correspondent pas à la table de droite
类别 | 详细解示 |
---|---|
基本语法 | select 表1.字段 [as 别名],表n.字段 from 表1 right JOIN 表n on 条件; |
示例 | select * from user right join order_goods on user.uid = order_goods.uid; |
示例说明 | 查询商品表中哪些用户购买过商品,并将用户信息显示出来 |
mysql> .uid = order_goods.uid;
+------+---------------+----------+-----+-- - --+--------------+----------+
| nom d'utilisateur | mot de passe | nom d'utilisateur | 🎜>+------+-----------+----------+-----+-----+---- - ----------+----------+
| 10 | Gao Xiaofeng | 3124qwqw | 10 | Baoqiang | 2 | 3 | iphone 123121241 |
| 15 | 34242123 |
| 3 | Wang Baoqiang | 1235531 | 5 | 3 | clavier iphone |
+-------+---------+-------- --- +-----+-----+---------------+---------------+
5 lignes dans set (0,00 sec)
Sous-requête
Exemple 1 :
mysql> sélectionnez * de l'utilisateur où l'uid est dans (1,3,4);
+-----+-----------+----------+
| identifiant | nom d'utilisateur | mot de passe |
+-----+-----------+----------+
| 1 | Jing Tian | 123456 |
|3 |Wang Baoqiang |1235531 |
| 4 |Jing Boran | 123455 |
+-----+-----------+----------+
3 lignes dans l'ensemble (0,00 sec)
Exemple 2 :
mysql> ;
+-----+-----------+----------+
| identifiant | nom d'utilisateur | mot de passe |
+-----+-----------+----------+
|10 |Gao Xiaofeng |3124qwqw |
|3 |Wang Baoqiang |1235531 |
|12 |Li Xiaochao |311aqqee |
|15 |Tong Xiaogang |3cxvdfs |
+-----+-----------+----------+
4 lignes dans l'ensemble (0,00 sec)
mysql> sélectionnez * depuis emp où deptno in (sélectionnez deptno dans dept);
Enregistrez l'union
Utilisez l'union et Le mot-clé union all est utilisé pour interroger les données des deux tables selon certaines conditions de requête, puis fusionner les résultats et les afficher ensemble. La principale différence entre les deux est que les résultats sont directement fusionnés, tandis que l'union est le résultat de l'exécution d'une opération distincte sur les résultats après l'union et de la suppression des enregistrements en double.
类别 | 详细解示 |
---|---|
基本语法 | select语句1 union[all] select语句2 |
示例 | select * from user where uid in (1,3,4); |
示例说明 | 将商品表中的用户信息和用户表中的用户信息的结果组合在一起 |
mysql> sélectionnez l'uid de l'union des utilisateurs, sélectionnez l'uid de order_goods ;
+-----+
| uide |
+-----+
|1 |
|2 |
| 3 |
| 4 |
| 5 |
|6 |
|7 |
| 8 |
|9|
|10 |
|11 |
|12 |
|13 |
|14 |
|15 |
+-----+
15 lignes par série (0,00 sec)