Heim > Datenbank > MySQL-Tutorial > Beispiel für eine MySQL-Mehrtabellenabfrage

Beispiel für eine MySQL-Mehrtabellenabfrage

(*-*)浩
Freigeben: 2020-09-17 10:35:23
Original
2673 Leute haben es durchsucht

In diesem Artikel werden Mehrtabellenabfragen vorgestellt. Im Folgenden werden Datentabellen und ihre Operations-SQL-Anweisungen aufgeführt.

Empfohlener Kurs: MySQL-Tutorial.

Beispiel für eine MySQL-Mehrtabellenabfrage

Erstellen Sie eine Beispieldatentabelle:

#学生表
create table stu(sid int primary key,sname varchar(10) not null);
#成绩表
create table score (sid int, score int , cid int);
#科目表
create table subjects (cid int primary key,cname varchar(10));
alter table score add constraint fk_score_sid foreign key(sid) references stu(sid);
alter table score add constraint fk_score_cid foreign key(cid) references subjects(cid);
Nach dem Login kopieren

Fragen Sie Schülernoten und Fachnamen ab

select * from stu,score where stu.sid = score.sid;
Nach dem Login kopieren

Fragen Sie Schülernoten ab

select s.sid, s.sname, c.score from stu s,score c where s.sid = c.sid and c.score>70;
Nach dem Login kopieren

erfordert 70 oder mehr. Fragen Sie die Ergebnisse aller Schüler ab.

select * from stu s inner join score c on s.sid = c.sid; 
内连接相当于把两张表链接成一张表查询 使用inner join 关键词 条件 使用on 并且Inner 可以省略 
外链接查询 左外连接查询 以左边的表为主 左边表中的数据都会查询出来 有可能会产生无用的数据 
select s.sid, s.sname, c.score from score c left join stu s on s.sid = c.sid; 
右外链接查询 
select s.sid, s.sname, c.score from score c right join stu s on s.sid = c.sid; 
自然链接 :会自动匹配表中相同的字段 没有外键也能自然查询 
select * from stu natural join score;
Nach dem Login kopieren

Fragen Sie die Ergebnisse und Testfächer aller Schüler ab.

select s.sid, s.sname, c.score,u.cname from stu s left join score c on s.sid = c.sid join subjects u on c.cid = u.cid; 
三张表查询时2条件 n张表n-1条件
Nach dem Login kopieren

Erstellen Sie eine Beispieldatentabelle:

#员工表
CREATE TABLE emp(
    empno INT,
    ename VARCHAR(50),
    job VARCHAR(50),
    mgr INT,
    hiredate DATE,
    sal DECIMAL(7,2),
    comm decimal(7,2),
    deptno INT
);
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

--  部门表:dept
CREATE TABLE dept(
    deptno INT,
    dname varchar(14),
    loc varchar(13)
);
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');
Nach dem Login kopieren

Mitarbeiter in derselben Abteilung wie SCOTT abfragen

select ename from emp where deptno = (select deptno from emp where ename=’SCOTT’);
Nach dem Login kopieren

Mitarbeiterinformationen, deren Gehalt höher ist als das des Inhabers der Abteilung Nr. 30

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

Mitarbeiterinformationen abfragen dessen Job und Gehalt genau mit denen von MARTIN übereinstimmen

select * from emp where (job,sal) in (select job,sal from emp where ename=’MARTIN’);
Nach dem Login kopieren

Es gibt mehr als zwei Mitarbeiterinformationen mit direkten Untergebenen

select * from emp where empno in (select mgr from emp group by mgr having count(mgr)>=2);
Nach dem Login kopieren

Suchen Sie den Mitarbeiternamen mit Mitarbeiternummer 7788, Name der Gehaltsabteilung des Mitarbeiters, Abteilung Adresse

select e.ename,e.sal,d.dname,d.loc from emp e ,dept d where e.deptno = d.deptno and empno = 7788;
Nach dem Login kopieren

Suchen Sie nach Mitarbeiternummer 7369, Name, Managernummer und Managername

select ename,empno from emp where empno in (7369, (select mgr from emp where empno = 7369)); 
select e1.ename,e1.empno,e2.ename,e2.empno from emp e1,emp e2 where e1.mgr = e2.empno and e1.empno = 7369
Nach dem Login kopieren

Suchen Sie nach allen Informationen des bestbezahlten Mitarbeiters in jeder Abteilung

select * from emp where (deptno ,sal) in (select deptno,max(sal) from emp group by deptno); 
查询过程中出现问题 查询时没有把部门的条件带进去 只是按最高工资处理的 可以把查询结果返回的结果集当做一个新表来使用 
select * from emp e1 ,(select deptno,max(sal) msal from emp group by deptno) e2 where e1.sal = e2.msal and e1.deptno = e2.deptno;
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonBeispiel für eine MySQL-Mehrtabellenabfrage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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