Maison  >  Article  >  base de données  >  MySQL - introduction détaillée et exemples de requêtes multi-tables

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

王林
王林avant
2019-08-28 11:59:232676parcourir

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;

2cc198a1d5eb0d3eb508d858c9f5cbdbRequê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                  #所属部门
        );

Table des départements

 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

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;

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;

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;

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;

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;


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.

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
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='人力部');

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer