Maison > Article > base de données > MySQL - introduction détaillée et exemples de requêtes multi-tables
1. La relation entre les tables
Uni-to-one : table utilisateur et table d'informations d'identité, la table utilisateur est la table principale
Par exemple : table men, table des femmes
create table man( mid int primary key auto_increment, mname varchar(32), wid int unique );
create table woman( wid int primary key auto_increment, wname varchar(32) );
Un-à-plusieurs : les relations de table les plus courantes, table utilisateur et table de commande
Par exemple : table des employés, table des départements
create table emp( empno int primary key auto_increment, ename varchar(32), deptno int );
create table dept( deptno int primary key auto_increment, dname varchar(32) );
Plusieurs-à-plusieurs : par exemple, la table des étudiants et l'horaire des cours divisent généralement la relation plusieurs-à-plusieurs en une relation un-à-plusieurs ou plusieurs-à-un.
create table student( sid int primary key auto_increment, sname varchar(32) );
insert into student (sname) values ('大拿'); insert into student (sname) values ('唐嫣'); insert into student (sname) values ('王健林');
create table course( cid int primary key auto_increment, cname varchar(32) );
insert into course (cname) values ('语文'); insert into course (cname) values ('数学'); insert into course (cname) values ('英语'); insert into course (cname) values ('化学');
create table s_c( cid int, sid int );
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);
2. Pourquoi utiliser plusieurs tables
Pour éviter la redondance de grandes quantités de données.
Ce n'est pas que plus la montre est divisée, mieux c'est.
3. Concept
Interroger plusieurs tables en même temps
4. 🎜> f35d6e602fd7d0f0edfa6f7d103c1b57Fusionner la requête
union, union all
Fusionner des ensembles de résultats signifie fusionner les résultats de la requête de deux instructions select ensemble. (Équivalent à l'union)
Les deux résultats fusionnés, le nombre de colonnes, l'ordre des colonnes et la classe doivent être cohérents
create table emp( empno int primary key auto_increment, ename varchar(32) );
create table dept( deptno int primary key auto_increment, dname varchar(32) );
select * from emp union select * from dept; select * from emp union all select * from dept;
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 #所属部门 );
create table dept( deptno int primary key auto_increment, #部门编号 dname varchar(32), #部门名称 loc varchar(32) #部门地址 );
Connexion interne : Inner Join .... On, Join,,
Inner Join est un opérateur comparatif, renvoyant uniquement des lignes qualifiées
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;
Représente la requête, toutes les lignes à gauche, s'il n'y en a pas à droite, null
select * from emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;
select * from emp e right OUTER JOIN dept d ON e.deptno = d.deptno;
Self- rejoindre :
L'auto-jointure signifie que dans la même table de données, elle est considérée comme deux tables, cela signifie trouver le leader de chaque personne, s'il n'y a pas de leader, il n'affichera aucun leader
Pensez à un. table comme deux tables, une table d'employés et une table de leader, les deux sont des tables emp
select e.ename,el.ename from emp e left join emp el on e.mgr = el.empno;
select * from emp natural join dept; select * from emp NATURAL left join dept; select * from emp NATURAL right join dept;
5bdf4c78156c7953567bb5a0aef2fc53Sous-requête (TOUTE sous-requête, DANS sous-requête, CERTAINES sous-requête, TOUTES sous-requête) Problème résolu par sous-requête :
Dont le salaire est plus élevé que Cong Hao ? ? ?
select * from emp where sal >(select sal from emp where ename='从浩');Définition : La sous-requête permet d'imbriquer une requête dans une autre requête
:
1. Crochets 2. Vous pouvez utiliser des sous-requêtes après où, sélectionnez avoir depuis dans la requête principale
3 . Les sous-requêtes ne peuvent pas être utilisées après group by
4. La requête principale et la sous-requête n'ont pas besoin d'être dans la même table ; seule la valeur renvoyée par la sous-requête peut être utilisée par la requête principale.
Exigence : interroger les informations sur les employés dont le nom du service est ressources humainesPremière méthode : utiliser la sous-requête
select * from emp where deptno=(select deptno from dept where dname='人力部');
Deuxième méthode : utiliser la requête associée
select * from emp e,dept d where e.deptno = d.deptno and d.dname='人力部';Optimisation SQL : essayez d'utiliser des requêtes multi-tables
La plupart des sous-requêtes sont converties en requête multi-tables lorsqu'elles sont finalement exécutées. Cela se voit à travers le plan d’exécution SQL.
Grâce au plan d'exécution SQL, vous constaterez que l'exécution des deux méthodes est la même.
5.from后面的子查询
需求:
查询员工号 姓名 月薪
select empno,ename,sal from emp;
6.一般不在子查询中排序
7.一般先执行子查询,再去执行主查询
ANY关键字
假设any内部的查询返回结果个数是三个,如:result1,result2,result3,那么
select .... from .. where a > any(...); ->select ..... from ... where a > result1 or a >result2 or a >result3;
需求:
查询工资比1号部门中任意一个员工高的信息
select * from emp where sal > any(select sal from emp where deptno = 1);
ALL关键字
ALL关键字与any关键字类似,只不过上面的or改成and :
select .... from .. where a > all(...); ->select ..... from ... where a > result1 and a >result2 and a >result3;
需求:
查询工资比1号部门中所有员工号的员工信息
select * from emp where sal > all(select sal from emp where deptno = 1);
SOME关键字
some 关键字和any关键字是一样的功能。所以:
select .... from .. where a > any(...); ->select ..... from ... where a > result1 or a >result2 or a >result3;
IN关键字
IN运算符用于where表达式中,以列表向的形式支持多个选择。语法如下:
where column in (v1,v2,v3,.....); where column not in (v1,v2,v3,.....);
当in前面加上not运算符时候,表示与in相反的意思,既不在这写列表项中选择。
案例:
查询部门名称是人力和研发的员工
select * from emp where deptno in (select deptno from dept where dname='人力部' or dname='研发部') 分类: MySQL数据库
想了解更多相关问题请访问PHP中文网: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!