Maison > base de données > tutoriel mysql > le corps du texte

MySQL - introduction détaillée et exemples de requêtes multi-tables

王林
Libérer: 2019-08-28 11:59:23
avant
2685 Les gens l'ont consulté

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
    );
Copier après la connexion
 create table woman(
        wid  int primary key  auto_increment,
        wname varchar(32)
    );
Copier après la connexion

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
        );
Copier après la connexion
 create table dept(
            deptno int primary key  auto_increment,
            dname varchar(32)
        );
Copier après la connexion

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)
        );
Copier après la connexion
insert into student (sname) values ('大拿');     
insert into student (sname) values ('唐嫣');
insert into student (sname) values ('王健林');
Copier après la connexion
 create table course(
            cid int primary key  auto_increment,
            cname varchar(32)
        );
Copier après la connexion
insert into course (cname) values ('语文');    
insert into course (cname) values ('数学');    
insert into course (cname) values ('英语');    
insert into course (cname) values ('化学');
Copier après la connexion
create table s_c(
       cid int,        sid int
   );
Copier après la connexion
 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);
Copier après la connexion

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. 🎜> <1>Fusionner 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)
   );
Copier après la connexion
create table dept(
        deptno int primary key  auto_increment,
        dname varchar(32)
    );
Copier après la connexion
select * from emp  union select * from dept;    
select * from emp  union all select * from dept;
Copier après la connexion

<2>Requête de jointure

Table des employés


  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                  #所属部门
        );
Copier après la connexion

Table des départements <<>

 create table dept(
            deptno int primary key auto_increment,  #部门编号
            dname varchar(32),      #部门名称
            loc varchar(32)             #部门地址
        );
Copier après la connexion

Connexion interne : Inner Join .... On, Join,,
Inner Join est un opérateur comparatif, renvoyant uniquement des lignes qualifiées

<🎜 🎜 >Par exemple :

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;
Copier après la connexion

Jointure externe :

Jointure externe gauche : LEFT OUTER JOIN left join ... on

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;
Copier après la connexion

Jointure externe droite : jointure droite ... on ou jointure externe droite .... on
          La jointure droite contient toutes les lignes du table de droite dans la jointure de droite Si une ligne du tableau de gauche ne correspond pas à la table de droite, alors les départements de la table de gauche correspondante dans le résultat sont tous vides (null)

 select * from emp e right OUTER JOIN  dept d ON e.deptno = d.deptno;
Copier après la connexion

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;
Copier après la connexion

Jointure naturelle : jointure naturelle (rejoindre) | jointure naturelle à gauche (identique à la jointure naturelle à droite) ( identique à la jointure à droite)

La jointure naturelle jugera et utilisera automatiquement les mêmes champs dans les deux tables que la condition de connexion, renverra les résultats de la requête.

select * from emp natural join dept;       
select * from emp NATURAL left join dept;        
select * from emp NATURAL right join dept;
Copier après la connexion


Remarque : Si la connexion interne n'écrit pas la condition de connexion, le résultat du produit cartésien se produira. Cette situation doit être évitée, et si la connexion externe n'écrit pas la condition de connexion. condition de connexion, une erreur sera signalée.

<3>Sous-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=&#39;从浩&#39;);
Copier après la connexion
Définition : La sous-requête permet d'imbriquer une requête dans une autre requête
La sous-requête est également appelée requête interne, ce qui équivaut à une requête interne. Une requête contenant une requête interne est appelée requête externe. Les résultats de la sous-requête sont utilisés par la requête principale.

Choses à noter

 :

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 humaines

Première méthode : utiliser la sous-requête

select * from emp where deptno=(select deptno from dept where dname=&#39;人力部&#39;);
Copier après la connexion

Deuxième méthode : utiliser la requête associée

 select * from emp e,dept d where e.deptno = d.deptno and d.dname=&#39;人力部&#39;;
Copier après la connexion

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;
Copier après la connexion

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

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

ANY关键字

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

select .... from .. where a > any(...);
->select ..... from ... where a > result1 or a >result2  or a >result3;
Copier après la connexion

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

select * from emp where sal > any(select sal from emp where deptno = 1);
Copier après la connexion

ALL关键字

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

select .... from .. where a > all(...);
->select ..... from ... where a > result1 and a >result2  and a >result3;
Copier après la connexion

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

   select * from emp where sal > all(select sal from emp where deptno = 1);
Copier après la connexion

SOME关键字

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

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

->select ..... from ... where a > result1 or a >result2  or a >result3;
Copier après la connexion

IN关键字

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

where column in (v1,v2,v3,.....);        
where column not in (v1,v2,v3,.....);
Copier après la connexion

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

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

 select * from emp where deptno in   (select deptno from dept where dname=&#39;人力部&#39; or dname=&#39;研发部&#39;)
分类: MySQL数据库
Copier après la connexion

想了解更多相关问题请访问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!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal