Dieser Artikel vermittelt Ihnen relevantes Wissen über MySQL, in dem hauptsächlich Probleme im Zusammenhang mit Operationen mit mehreren Tabellen vorgestellt werden, einschließlich Beziehungen mit mehreren Tabellen, Fremdschlüsseleinschränkungen, gemeinsame Abfragen mit mehreren Tabellen, Abfragen für innere Verknüpfungen und Abfragen für äußere Verknüpfungen. Warten Sie, ich hoffe es hilft allen.
Empfohlenes Lernen: MySQL-Tutorial
Eins-zu-eins (normalerweise zusammengeführte Tabellen),
Eins-zu-viele/viele-zu-eins (Abteilungen und Mitarbeiter),
viele -to-many (Studenten und Kurs) – Verwendung von Zwischentabellen
Wird speziell für Einschränkungen in Beziehungen mit mehreren Tabellen verwendet
Verwenden Sie den Primärschlüssel der Master-Tabelle, um die Fremdschlüssel der Slave-Tabelle zu steuern
1. Die Mastertabelle muss bereits vorhanden sein oder wird erstellt
2. Die Primärschlüsselspalte muss für die Haupttabelle festgelegt sein
3. Der Primärschlüssel darf keine Nullwerte enthalten, der Fremdschlüssel jedoch Nullwerte
4. Der Listen- oder Spaltenname, der nach dem Tabellennamen der Haupttabellenkombination angegeben wird. Diese Spalte oder Spaltenkombination muss der Primärschlüssel oder Kandidatenschlüssel der Haupttabelle sein
5. Die Anzahl der Spalten im Fremdschlüssel muss mit der Anzahl der Spalten im Primärschlüssel übereinstimmen
6. Der Datentyp der Die Spalte im Fremdschlüssel muss mit den Daten der entsprechenden Spalte im Primärschlüssel identisch sein. Derselbe Typ
• Erstellen Sie Fremdschlüsseleinschränkungen Foreign Key
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
Fügen Sie Fremdschlüsseleinschränkungen hinzu, bevor Sie die Tabelle erstellen
select* from A full outer join B on 条件;
use mydb3;select* from dept3 left outer join emp3 on dept3.deptno =emp3.dept_id;
select * from A, B
– -- erzeugt Redundanz. Verbleibende Daten 🎜🎜 1. Die Querverbindungsabfrage gibt das kartesische Produkt aller Datenzeilen der verbundenen 🎜 zwei Tabellen zurück 🎜🎜 2. Die kartesische Menge kann als jede Zeile einer Tabelle und jede Zeile einer anderen Tabelle verstanden werden Tabellenübereinstimmung 🎜 3. Wenn Tabelle A m Datenzeilen und Tabelle B n Datenzeilen enthält, werden 🎜m * n Datenzeilen zurückgegeben 🎜🎜 4. Das kartesische Produkt erzeugt viele 🎜redundante🎜Daten und Andere nachfolgende Abfragen können basierend auf dem Satz eine bedingte Filterung durchführen. 🎜🎜Inner-Join-Abfrage🎜🎜 sucht nach der 🎜Schnittmenge zwischen den beiden Tabellen🎜🎜🎜🎜inner
kann weggelassen werden🎜🎜Impliziter innerer Join (SQL92-Standard): 🎜select* from dept3 right outer join emp3 on dept3.deptno =emp3.dept_id;
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;
rechts%20%C3%A4u%C3%9Ferer%20Join
,%20%F0%9F%8E%9Cselect*%C2%A0from%C2%A0dept3%C2%A0a%C2%A0left%C2%A0join%C2%A0emp3%C2%A0b%C2%A0on%C2%A0a.deptno%C2%A0=%C2%A0b.dept_idunionselect*%C2%A0from%C2%A0dept3%C2%A0a%C2%A0right%C2%A0join%C2%A0emp3%C2%A0b%C2%A0on%C2%A0a.deptno%C2%A0=%C2%A0b.dept_id%F0%9F%8E%9Cvollst%C3%A4ndiger%20%C3%A4u%C3%9Ferer%20Join
vollst%C3%A4ndiger%20%C3%A4u%C3%9Ferer%20Join
%F0%9F%8E%9Cselect*%C2%A0from%C2%A0A%C2%A0full%C2%A0outer%C2%A0join%C2%A0B%C2%A0on%C2%A0%E6%9D%A1%E4%BB%B6;
%E6%B3%A8%E6%84%8F%EF%BC%9A
%20Oracle%20%E9%87%8C%E9%9D%A2%E6%9C%89%20full%20join
%20,%E5%8F%AF%E6%98%AF%E5%9C%A8mysql%20%E5%AF%B9%20full%20join
%20%E6%94%AF%E6%8C%81%E7%9A%84%E4%B8%8D%E5%A5%BD%EF%BC%8C%E6%88%91%E4%BB%AC%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20union
%E6%9D%A5%E8%BE%BE%E5%88%B0%E7%9B%AE%E7%9A%84
----外连接查询
----查询哪些部门有员工,哪些部门没有员工
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视频教程
Das obige ist der detaillierte Inhalt vonBeherrschen Sie den MySQL-Multitabellenbetrieb vollständig. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!