Requête conjointe de plusieurs tables
Requête conjointe multi-tables
Connexion de table
Lorsque vous devez interroger des champs dans plusieurs tables, Ceci peut être réalisé en utilisant des jointures de tables. Les jointures de table sont divisées en jointures internes et jointures externes.
1. Jointure interne : une jointure qui forme un ensemble d'enregistrements en combinant les enregistrements dont les champs dans les deux tables ont une relation de connexion et correspondent à la relation de connexion.
2. Jointure externe : d'autres enregistrements sans correspondance seront sélectionnés, divisés en jointure externe gauche et jointure externe droite.
Avant d'apprendre l'expérience, j'ai préparé deux tables de données simulées pour tout le monde :
1. Table utilisateur, qui stocke les informations utilisateur
2. Quel produit l'utilisateur a-t-il acheté ?
Déclaration de création de table utilisateur
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;
Les données de la table utilisateur sont les suivantes :
Remarque : dans la table order_goods ci-dessus, uid fait référence au champ uid de 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
Remarque : dans l'exemple suivant, la table from utilise un 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.
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)
Grammaire de base 2 :
Le résultat est cohérent avec la grammaire de base 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)
Jointure externe
La jointure externe est divisée en jointure gauche et lien droit, les définitions spécifiques sont les suivants.
Jointure gauche : contient tous les enregistrements de la table de gauche, même les enregistrements qui ne lui correspondent pas dans la table de droite
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)
Jointure droite : contient tous les enregistrements de la table de droite, même les enregistrements de la table de droite table de droite Il n'y a aucun enregistrement correspondant dans
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)
Sous-requête
Parfois, lorsque nous interrogeons, la condition requise est le résultat d'une autre instruction select, auquel cas nous devons utiliser une sous-requête. Les mots clés utilisés pour les sous-requêtes incluent dans, pas dans, =, !=, existe, n'existe pas, etc.
Exemple 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)
Exemple 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
Union d'enregistrement
Utilisez les mots-clés union et union all pour interroger les données des deux tables selon certaines conditions de requête, puis fusionnez les résultats pour les afficher. 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.
mysql> select * from emp where deptno in (select deptno from dept);