Heim > Datenbank > MySQL-Tutorial > MySQL – ausführliche Einführung und Beispiele für Abfragen mit mehreren Tabellen

MySQL – ausführliche Einführung und Beispiele für Abfragen mit mehreren Tabellen

王林
Freigeben: 2019-08-28 11:59:23
nach vorne
2730 Leute haben es durchsucht

1. Die Beziehung zwischen Tabellen

Eins-zu-eins: Benutzertabelle und Identitätsinformationstabelle, die Benutzertabelle ist die Haupttabelle
Zum Beispiel: Männertabelle, Frauentabelle

  create table man( 
   mid int primary key  auto_increment,
        mname varchar(32),
        wid int unique
    );
Nach dem Login kopieren
 create table woman(
        wid  int primary key  auto_increment,
        wname varchar(32)
    );
Nach dem Login kopieren

Eins-zu-viele: die häufigsten Tabellenbeziehungen, Benutzertabelle und Auftragstabelle
Zum Beispiel: Mitarbeitertabelle, Abteilungstabelle

 create table emp(
            empno int primary key  auto_increment,
            ename varchar(32),
            deptno int
        );
Nach dem Login kopieren
 create table dept(
            deptno int primary key  auto_increment,
            dname varchar(32)
        );
Nach dem Login kopieren

Viele-zu-viele: Zum Beispiel teilen die Studententabelle und der Stundenplan die Viele-zu-viele-Beziehung normalerweise in eine Eins-zu-viele- oder eine Viele-zu-eins-Beziehung auf.

create table student(            sid  int primary key  auto_increment,
            sname varchar(32)
        );
Nach dem Login kopieren
insert into student (sname) values ('大拿');     
insert into student (sname) values ('唐嫣');
insert into student (sname) values ('王健林');
Nach dem Login kopieren
 create table course(
            cid int primary key  auto_increment,
            cname varchar(32)
        );
Nach dem Login kopieren
insert into course (cname) values ('语文');    
insert into course (cname) values ('数学');    
insert into course (cname) values ('英语');    
insert into course (cname) values ('化学');
Nach dem Login kopieren
create table s_c(
       cid int,        sid int
   );
Nach dem Login kopieren
 insert into s_c (sid,cid) values (1,1);    
 insert into s_c (sid,cid) values (1,2);    
 insert into s_c (sid,cid) values (1,3);    
 insert into s_c (sid,cid) values (1,4);    
 insert into s_c (sid,cid) values (2,2);    
 insert into s_c (sid,cid) values (2,4);    
 insert into s_c (sid,cid) values (3,1);    
 insert into s_c (sid,cid) values (3,3);
Nach dem Login kopieren

2. Warum mehrere Tabellen verwenden

Um die Redundanz großer Datenmengen zu vermeiden.
Je mehr die Uhr geteilt ist, desto besser ist es, sie entsprechend der tatsächlichen Situation aufzuteilen.

3. Konzept

Mehrere Tabellen gleichzeitig abfragen

4 🎜> <1>Abfrage zusammenführen

Union, Union All


Das Zusammenführen von Ergebnismengen bedeutet das Zusammenführen der Abfrageergebnisse von zwei Auswahlanweisungen. (Entspricht Union)
Die beiden zusammengeführten Ergebnisse, die Anzahl der Spalten, die Reihenfolge der Spalten und die Klasse müssen konsistent sein

create table emp(
       empno int primary key  auto_increment,
       ename varchar(32)
   );
Nach dem Login kopieren
create table dept(
        deptno int primary key  auto_increment,
        dname varchar(32)
    );
Nach dem Login kopieren
select * from emp  union select * from dept;    
select * from emp  union all select * from dept;
Nach dem Login kopieren

<2>Join-Abfrage

Mitarbeitertabelle


  create table emp(
            empno int primary key auto_increment, # 员工编号
            ename varchar(32),  #员工姓名
            job varchar(32),        #员工职位
            mgr  int,                       #上级编号
            hiredate date,          #入职时间
            sal double,                 #薪水
            comm double,                #奖金
            deptno int                  #所属部门
        );
Nach dem Login kopieren

Abteilungstabelle <<>

 create table dept(
            deptno int primary key auto_increment,  #部门编号
            dname varchar(32),      #部门名称
            loc varchar(32)             #部门地址
        );
Nach dem Login kopieren

Interne Verbindung: Inner Join .... On, Join,,
Inner Join ist ein Vergleichsoperator, der nur qualifizierte Zeilen zurückgibt

<🎜 🎜 >Zum Beispiel:

select * from emp inner join  dept  on emp.deptno=dept.deptno;        
select * from emp e ,dept d where e.deptno = d.deptno;        
select * from emp e join dept d where e.deptno = d.deptno;
Nach dem Login kopieren

Outer Join:

Left Outer Join: LEFT OUTER JOIN |. Left Join ... on

Stellt die Abfrage dar, alle Zeilen auf der linken Seite, wenn rechts gibt es keine, null

select * from emp e LEFT OUTER JOIN  dept d ON e.deptno = d.deptno;
Nach dem Login kopieren

Rechter äußerer Join: rechter Join ... on oder rechter äußerer Join .... on
          Der rechte Join enthält alle Zeilen der rechten Seite Tabelle im rechten Join. Wenn eine Zeile in der linken Tabelle nicht mit der rechten Tabelle übereinstimmt, sind die Abteilungen der entsprechenden linken Tabelle im Ergebnis alle leer (null)

 select * from emp e right OUTER JOIN  dept d ON e.deptno = d.deptno;
Nach dem Login kopieren

Selbstverknüpfung :
Selbstverknüpfung bedeutet, dass in derselben Datentabelle zwei Tabellen betrachtet werden. Dies bedeutet, dass der Anführer jeder Person gefunden wird. Wenn es keinen Anführer gibt, wird kein Anführer angezeigt.
Denken Sie an eine Tabelle Als zwei Tabellen, eine Mitarbeitertabelle und eine Führungstabelle, sind beide Emp-Tabellen als rechter Join)

Natural Join beurteilt und verwendet automatisch dieselben Felder in den beiden Tabellen wie die Verbindungsbedingung und gibt Abfrageergebnisse zurück.

select e.ename,el.ename from emp e left join emp el on e.mgr = el.empno;
Nach dem Login kopieren

Hinweis: Wenn die innere Verbindung die Verbindungsbedingung nicht schreibt, tritt das Ergebnis des kartesischen Produkts auf. Diese Situation sollte vermieden werden, und wenn die äußere Verbindung die nicht schreibt Verbindungszustand wird ein Fehler gemeldet.




<3>Unterabfrage (JEDE Unterabfrage, IN-Unterabfrage, EINIGE Unterabfrage, ALLE Unterabfrage)

Problem gelöst durch Unterabfrage:

Wessen Gehalt ist höher als Cong Hao? ? ?

select * from emp natural join dept;       
select * from emp NATURAL left join dept;        
select * from emp NATURAL right join dept;
Nach dem Login kopieren

Definition: Unterabfrage ermöglicht die Verschachtelung einer Abfrage in einer anderen Abfrage
Unterabfrage wird auch als interne Abfrage bezeichnet, was einer internen Abfrage entspricht. Eine Abfrage, die eine innere Abfrage enthält, wird als äußere Abfrage bezeichnet. Die Ergebnisse der Unterabfrage werden von der Hauptabfrage verwendet.
Wichtige Hinweise
:

1. Klammern


2. Sie können Unterabfragen verwenden, nachdem Sie in der Hauptabfrage ausgewählt haben
3 . Unterabfragen können nicht nach der Gruppierung von

4 verwendet werden. Die Hauptabfrage und die Unterabfrage müssen sich nicht in derselben Tabelle befinden.

Anforderung: Mitarbeiterinformationen abfragen, deren Abteilungsname Personalwesen ist

Erster Weg: Unterabfrage verwenden

 select * from emp where sal >(select sal from emp where ename=&#39;从浩&#39;);
Nach dem Login kopieren

Zweiter Weg: Verwandte Abfrage verwenden

select * from emp where deptno=(select deptno from dept where dname=&#39;人力部&#39;);
Nach dem Login kopieren

SQL-Optimierung: Versuchen Sie, Abfragen mit mehreren Tabellen zu verwenden
Die meisten Unterabfragen werden bei der endgültigen Ausführung in eine Abfrage mit mehreren Tabellen umgewandelt. Dies ist im SQL-Ausführungsplan ersichtlich.
Durch den SQL-Ausführungsplan werden Sie feststellen, dass die Ausführung der beiden Methoden gleich ist.

5.from后面的子查询
需求:
查询员工号 姓名 月薪

select empno,ename,sal from emp;
Nach dem Login kopieren

6.一般不在子查询中排序

7.一般先执行子查询,再去执行主查询

ANY关键字

假设any内部的查询返回结果个数是三个,如:result1,result2,result3,那么

select .... from .. where a > any(...);
->select ..... from ... where a > result1 or a >result2  or a >result3;
Nach dem Login kopieren

需求:
查询工资比1号部门中任意一个员工高的信息

select * from emp where sal > any(select sal from emp where deptno = 1);
Nach dem Login kopieren

ALL关键字

ALL关键字与any关键字类似,只不过上面的or改成and :

select .... from .. where a > all(...);
->select ..... from ... where a > result1 and a >result2  and a >result3;
Nach dem Login kopieren

需求:
查询工资比1号部门中所有员工号的员工信息

   select * from emp where sal > all(select sal from emp where deptno = 1);
Nach dem Login kopieren

SOME关键字

some 关键字和any关键字是一样的功能。所以:

select .... from .. where a > any(...);

->select ..... from ... where a > result1 or a >result2  or a >result3;
Nach dem Login kopieren

IN关键字

IN运算符用于where表达式中,以列表向的形式支持多个选择。语法如下:

where column in (v1,v2,v3,.....);        
where column not in (v1,v2,v3,.....);
Nach dem Login kopieren

当in前面加上not运算符时候,表示与in相反的意思,既不在这写列表项中选择。

案例:
查询部门名称是人力和研发的员工

 select * from emp where deptno in   (select deptno from dept where dname=&#39;人力部&#39; or dname=&#39;研发部&#39;)
分类: MySQL数据库
Nach dem Login kopieren

想了解更多相关问题请访问PHP中文网:MySQL视频教程

Das obige ist der detaillierte Inhalt vonMySQL – ausführliche Einführung und Beispiele für Abfragen mit mehreren Tabellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage