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)