Maison >base de données >tutoriel mysql >Maîtriser complètement les opérations multi-tables MySQL
Cet article vous apporte des connaissances pertinentes sur mysql, qui présente principalement les problèmes liés aux opérations multi-tables, notamment les relations multi-tables, les contraintes de clé étrangère, les requêtes conjointes multi-tables, les requêtes de jointure interne et les requêtes de jointure externe Attendez, j'espère ça aide tout le monde.
Apprentissage recommandé : Tutoriel MySQL
Un-à-un (tables généralement fusionnées),
Un-à-plusieurs/plusieurs-à-un (départements et employés),
plusieurs -à plusieurs (étudiants et cours) - Utilisation de tables intermédiaires
Spécialement utilisé pour les contraintes dans les relations multi-tables
Utilisez la clé primaire de la table maître pour contrôler les clés étrangères de la table esclave
1. La table principale doit déjà exister ou est en cours de création
2. La colonne de clé primaire doit être définie pour la table principale
3. La clé primaire ne peut pas inclure de valeurs nulles, mais la clé étrangère peut inclure valeurs nulles
4. Le nom de la liste ou de la colonne spécifié après le nom de la table de la combinaison de tables principale. Cette colonne ou combinaison de colonnes doit être la clé primaire ou la clé candidate de la table principale
5. Le nombre de colonnes dans la clé étrangère doit être le même que le nombre de colonnes dans la clé primaire
6. Le type de données du la colonne de la clé étrangère doit être la même que les données de la colonne correspondante dans la clé primaire Le même type
• Créer des contraintes de clé étrangère clé étrangère
foreign key
在创建表之前添加外键约束
在创建表之后添加外键约束
1、数据插入:
要先给主表添加约束
从表添加约束要依赖于主表,主表没有的数据不能添加
2、数据删除
主表的数据被从表依赖时,不能删除,否则可以删除
从表的数据可以任意删除
eg:
delete from dept where deptno = '1001';-----不可以删除(被依赖了)delete from dept where deptno = '1004'; ------可以删除delete from emp where eid = '7'; -----可以删除
删除之后,表与表之间就没有关系了
语法:
alter table 表名字 drop foreign key 外键约束名alter table emp2 drop foreign key emp2_fk;
• 多对多关系-构建外键约束
A表的一行对应B表的多行,B表的一行对应A表的多行,这时候需要再重新建立一个中间表,记录表关系
注意:
修改和删除时,中间从表可以随便删除和修改,但是两边从表手主表依赖的数据不能删除或者修改。
• 概念
就是同时 查询两个或者两个以上的表,因为有时候用户在查看数据的时候,需要显示的数据来自多张表
• 数据准备
注意:
外键约束只对数据的增删改起作用,对于数据查询没有影响
• 交叉连接查询 select * from A ,B
;---会产生冗余数据
1、交叉连接查询返回返回被连接的两个表所有数据行的笛卡尔积
2、笛卡尔集可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
3、假如A表有 m 行数据,B表有 n 行数据,则返回 m * n 行数据
4、笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选
求的是两个表之间的交集
inner
可以省略
隐式内连接(SQL92标准):
select * from A,B where 条件;
显式内连接(SQL99标准);
select * from A inner join B on 条件
---查询每个部门的所属员工 //隐式内连接
select* from dept3,emp3 where dept3.deptno = emp3.dept_id; //这样写标准
还可以给表起别名,如;
select* from dept3 a ,emp3 b where a.deptno = b.dept_id;
---查询每个部门的所属员工 //显式内连接select *from dept3 inner join emp3 on dept3.deptno = emp3.dept_id; //这样写标准
还可以给表起别名,如;
select *from dept3 a join emp3 b on a.deptno = b.dept_id;
分为:(outer可以 省略)
左外连接left outer join
、
select* from A left outer join B on 条件;
右外连接right outer join
、
select* from A right outer join B on 条件;
满外连接full outer join
Ajouter des contraintes de clé étrangère avant de créer la table
select* from A full outer join B on 条件;🎜Supprimer les clés étrangères Après la suppression de la contrainte 🎜🎜, il y aura aucune relation entre les tables 🎜 Syntaxe : 🎜
use mydb3;select* from dept3 left outer join emp3 on dept3.deptno =emp3.dept_id;🎜🎜🎜• Relation plusieurs-à-plusieurs - construction de contraintes de clé étrangère🎜 Une ligne du tableau A correspond à plusieurs lignes du tableau B, et une ligne du tableau B correspond à plusieurs lignes du tableau A. À ce stade, vous devez recréez une 🎜table intermédiaire🎜 pour enregistrer la relation entre les tables🎜🎜🎜Remarque : 🎜🎜Lors de la modification et de la suppression, la table esclave du milieu peut être supprimée et modifiée à volonté, mais les données dont dépend la table esclave des deux côtés de la table maître ne peuvent pas être supprimées ou modifiées. 🎜🎜🎜Requête conjointe multi-tables (très important)🎜🎜• Le concept🎜 est d'interroger deux ou plusieurs tables en même temps🎜, car parfois, lorsque les utilisateurs consultent des données, les données qu'ils doivent afficher proviennent de plusieurs tables🎜🎜 • Préparation des données 🎜 Remarque : 🎜 Les contraintes de clé étrangère affectent uniquement l'ajout, la suppression et la modification des données, et n'ont aucun impact sur la requête de données 🎜🎜 • Requête de connexion croisée
select * from A, B
- ; -- produira une redondance Données restantes 🎜🎜 1. La requête de connexion croisée renvoie le produit cartésien de toutes les lignes de données des 🎜 deux tables connectées 🎜🎜 2. L'ensemble cartésien peut être compris comme chaque ligne d'une table et n'importe quelle ligne d'une autre table Match 🎜 3. Si la table A a m lignes de données et la table B a n lignes de données, alors 🎜m * n lignes de données seront renvoyées 🎜🎜 4. Le produit cartésien produira beaucoup de 🎜données🎜redondantes, et d'autres requêtes ultérieures peuvent, en fonction de l'ensemble, effectuer un filtrage conditionnel 🎜🎜La requête de jointure interne🎜🎜 recherche l'🎜intersection entre les deux tables🎜🎜🎜🎜inner
peut être omis🎜🎜Jointure interne implicite (norme SQL92) : 🎜select* from dept3 right outer join emp3 on dept3.deptno =emp3.dept_id;🎜Connexion interne explicite ( Standard SQL99); 🎜
select* from dept3 left outer join emp3 on dept3.deptno=emp3.dept_idunionselect* from dept3 right outer join emp3 on dept3.deptno =emp3.dept_id;
usemydb3;select* from dept3 a left outer join emp3 b on a.deptno = b.dept.idselect* from dept3 a left join emp3 b on a.deptno = b.dept_id;
select* from Aleft join B on 条件1left join C on 条件2left join D on 条件3;🎜 Vous pouvez également donner à la table un alias, tel que : 🎜
select * from dept3 a right outer join emp3 b on a.deptno = b.dept_id;select* from dept3 a right join emp3 b on a.deptno = b,dept_id;select*from Aright joinB on条件1,right joinC on条件2,right joinD on条件3;
select* from dept3 a left join emp3 b on a.deptno = b.dept_idunionselect* from dept3 a right join emp3 b on a.deptno = b.dept_id🎜 Vous pouvez également donner à la table un alias, tel que 🎜
select* from dept3 a left join emp3 b on a.deptno = b.dept_idunion allselect* from dept3 a right join emp3 b on a.deptno= b.dept_id🎜🎜🎜 🎜 🎜🎜La requête de jointure externe🎜🎜 est divisée en : (l'extérieur peut être omis)🎜jointure externe gauche
jointure externe gauche
, 🎜rrreee🎜jointure externe droiteright jointure externe
, 🎜rrreee🎜jointure externe complètejointure externe complète
🎜select* from A full outer join B on 条件;
注意:
Oracle 里面有 full join
,可是在mysql 对 full join
支持的不好,我们可以使用 union
来达到目的
----外连接查询
----查询哪些部门有员工,哪些部门没有员工
use mydb3;select* from dept3 left outer join emp3 on dept3.deptno =emp3.dept_id;
----查询哪些员工有对应的部门,哪些没有
select* from dept3 right outer join emp3 on dept3.deptno =emp3.dept_id;
----使用 union 关键字实现左外连接和右外连接的并集
select* from dept3 left outer join emp3 on dept3.deptno=emp3.dept_idunionselect* from dept3 right outer join emp3 on dept3.deptno =emp3.dept_id;
----外连接查询
----查询哪些部门有员工,哪些部门没有员工
usemydb3;select* from dept3 a left outer join emp3 b on a.deptno = b.dept.idselect* from dept3 a left join emp3 b on a.deptno = b.dept_id;
----外连接多个表
select* from Aleft join B on 条件1left join C on 条件2left join D on 条件3;
----查询哪些员工有对应的部门,哪些没有
select * from dept3 a right outer join emp3 b on a.deptno = b.dept_id;select* from dept3 a right join emp3 b on a.deptno = b,dept_id;select*from Aright joinB on条件1,right joinC on条件2,right joinD on条件3;
----实现满外连接: full join
----使用 union
关键字实现左外连接和右外连接的并集
----select * from dept3 a full join emp3 b on a.deptno = b.dept_id; --不能执行
----union是将两个查询结果上下拼接,并去重
select* from dept3 a left join emp3 b on a.deptno = b.dept_idunionselect* from dept3 a right join emp3 b on a.deptno = b.dept_id
----union all 是将两个查询结果上下拼接,不去重
select* from dept3 a left join emp3 b on a.deptno = b.dept_idunion allselect* from dept3 a right join emp3 b on a.deptno= b.dept_id
• 基本子查询
• 子查询关键字-ALL
• 子查询关键字-ANY ,SOME
• 子查询关键字-IN
• 子查询关键字-EXISTS
• 自关联查询
推荐学习:mysql视频教程
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!