Maison >base de données >tutoriel mysql >Maîtriser complètement les opérations multi-tables MySQL

Maîtriser complètement les opérations multi-tables MySQL

WBOY
WBOYavant
2022-03-28 13:48:222247parcourir

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.

Maîtriser complètement les opérations multi-tables MySQL

Apprentissage recommandé : Tutoriel MySQL

Relations entre tables multiples

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

Concepts de contraintes de clés étrangères

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

Contraintes de clé étrangère :

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èreforeign key
在创建表之前添加外键约束
Maîtriser complètement les opérations multi-tables MySQL

在创建表之后添加外键约束

Maîtriser complètement les opérations multi-tables MySQL

验证外键约束的作用

1、数据插入:
要先给主表添加约束
从表添加约束要依赖于主表,主表没有的数据不能添加
Maîtriser complètement les opérations multi-tables MySQL

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;

Maîtriser complètement les opérations multi-tables MySQL

• 多对多关系-构建外键约束
A表的一行对应B表的多行,B表的一行对应A表的多行,这时候需要再重新建立一个中间表,记录表关系
Maîtriser complètement les opérations multi-tables MySQL

注意:
修改和删除时,中间从表可以随便删除和修改,但是两边从表手主表依赖的数据不能删除或者修改。

多表联合查询(非常重要)

• 概念
就是同时 查询两个或者两个以上的表,因为有时候用户在查看数据的时候,需要显示的数据来自多张表

• 数据准备
注意:
外键约束只对数据的增删改起作用,对于数据查询没有影响

• 交叉连接查询 select * from A ,B;---会产生冗余数据

1、交叉连接查询返回返回被连接的两个表所有数据行的笛卡尔积
2、笛卡尔集可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
3、假如A表有 m 行数据,B表有 n 行数据,则返回 m * n 行数据
4、笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选

内连接查询

求的是两个表之间的交集
Maîtriser complètement les opérations multi-tables MySQL

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;

Maîtriser complètement les opérations multi-tables MySQL

Maîtriser complètement les opérations multi-tables MySQL
Maîtriser complètement les opérations multi-tables MySQL

外连接查询

分为:(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

Insérer la description de l'image ici🎜🎜Ajoutez des contraintes de clé étrangère après avoir créé le table🎜🎜Insérer la description de l'image ici🎜🎜Vérifiez le rôle de Contraintes de clé étrangère🎜🎜1. Insertion de données : 🎜 Vous devez d'abord ajouter des contraintes à la table principale🎜 De L'ajout de contraintes à la table dépend de la table principale. Les données qui n'existent pas dans la table principale ne peuvent pas être ajoutées🎜Insérer la description de l'image ici🎜🎜2. Suppression des données🎜 Lorsque les données du principal la table dépend de la table esclave, elle ne peut pas être supprimée, sinon elle peut être supprimée🎜 Les données de la table esclave peuvent être supprimées arbitrairement🎜🎜par exemple :🎜
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;
🎜Insérer la description de l'image ici🎜🎜• 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🎜ici Insérer description de l'image 🎜🎜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🎜🎜Insérer la description de l'image ici🎜🎜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
🎜Insérer la description de l'image ici🎜🎜 Insérer une description en image 🎜 Maîtriser complètement les opérations multi-tables MySQL🎜🎜La requête de jointure externe🎜🎜 est divisée en : (l'extérieur peut être omis)🎜jointure externe gauchejointure 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来达到目的
Maîtriser complètement les opérations multi-tables MySQL

----外连接查询
----查询哪些部门有员工,哪些部门没有员工

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;

Maîtriser complètement les opérations multi-tables MySQL

----外连接查询
----查询哪些部门有员工,哪些部门没有员工

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;

Maîtriser complètement les opérations multi-tables MySQL

----查询哪些员工有对应的部门,哪些没有

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;

Maîtriser complètement les opérations multi-tables MySQL

----实现满外连接: 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

Maîtriser complètement les opérations multi-tables MySQL

• 基本子查询
• 子查询关键字-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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer