Maison  >  Article  >  base de données  >  Méthodes de déduplication et requête de connexion dans la base de données MySQL

Méthodes de déduplication et requête de connexion dans la base de données MySQL

WBOY
WBOYavant
2023-05-28 22:07:101150parcourir
Répertoire
  • 1. Déduplication

  • 2. Requête de jointure

    • Jointure interne - Non-e Connexion équivalente

    • Anner Join - Auto-join

    • outer JOINT - RECHERCHE ET REGOSE RECHERCHE

    • Tableau de jointure

    • 1. Tables de données MySQL Il peut y avoir des enregistrements en double dans la base de données. Dans certains cas, nous autorisons l'existence de données en double, mais parfois nous devons également supprimer ces données en double.
    • Par exemple : Supprimez les doublons et affichez les informations sur l'emploi :

      mysql> select distinct job from emp;
      +-----------+
      | job       |
      +-----------+
      | CLERK     |
      | SALESMAN  |
      | MANAGER   |
      | ANALYST   |
      | PRESIDENT |
      +-----------+
      5 rows in set (0.02 sec)

      Autre exemple : Supprimez conjointement les doublons et trouvez des informations uniques sur les départements et les postes :
    • mysql> select distinct job,deptno from emp;
      +-----------+--------+
      | job       | deptno |
      +-----------+--------+
      | CLERK     |     20 |
      | SALESMAN  |     30 |
      | MANAGER   |     20 |
      | MANAGER   |     30 |
      | MANAGER   |     10 |
      | ANALYST   |     20 |
      | PRESIDENT |     10 |
      | CLERK     |     30 |
      | CLERK     |     10 |
      +-----------+--------+
      9 rows in set (0.00 sec)
    Autre exemple : Nous voulons maintenant compter le nombre d'emplois, combiné avec la fonction de comptage :
mysql> select count(distinct job) from emp;
+---------------------+
| count(distinct job) |
+---------------------+
|                   5 |
+---------------------+
1 row in set (0.00 sec)

2. Requête de jointure

Nous avons appris à lire les données d'une seule table, ce qui est relativement simple, mais dans les applications réelles, il est souvent nécessaire de lire les données de plusieurs tables de données.

JOIN est grossièrement divisé en trois catégories suivantes selon ses fonctions :

INNER JOIN (inner join, ou jointure équivalente) : obtient les enregistrements des relations de correspondance de champs dans deux tables.

LEFT JOIN (jointure à gauche) : obtenez tous les enregistrements de la table de gauche, même s'il n'y a aucun enregistrement correspondant correspondant dans la table de droite.

RIGHT JOIN : contrairement à LEFT JOIN, il est utilisé pour obtenir tous les enregistrements de la table de droite, même s'il n'y a pas d'enregistrements correspondants dans la table de gauche.

L'opération de jointure multi-tables consiste à faire correspondre chaque élément de données d'une table avec les lignes de données d'une autre table. Cela implique le problème du contrôle de l'efficacité

Utilisez Where pour les requêtes de connexion multi-tables

Montrons maintenant un exemple : supprimez le nom et le nom du service de chaque employé :

mysql> select ename,dname
    -> from emp,dept
    -> where emp.deptno = dept.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)

L'instruction SQL ci-dessus est en fait très inefficace, essayons Optimiser (alias la table) : (syntaxe sql92)

mysql> select e.ename,d.dname
    -> from emp e,dept d
    -> where e.deptno = d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)

Remarque : plus la table a de connexions, plus l'efficacité est faible. Veuillez essayer de réduire le nombre de connexions à la table !

Inner join - Equivalent join

Toujours l'exemple ci-dessus, retirez le nom et le nom du service de chaque employé : (syntaxe sql99)

Inner join, on utilise inner

mysql> select e.ename,d.dname
    -> from emp e
    -> inner join
    -> dept d
    -> on
    -> e.deptno = d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)

L'avantage de sql99 est : la jointure du la table est indépendante, n'occupe pas l'emplacement de où. Rendre la déclaration SQL globale plus claire

Jointure interne - jointure non équivalente

Cas : connaître l'échelon salarial de chaque employé et exiger que le nom de l'employé, son salaire et son échelon soient affichés

mysql> select
    -> e.ename,e.sal,s.grade
    -> from
    -> emp e
    -> inner join
    -> salgrade s
    -> on
    -> e.sal between s.losal and s.hisal;
+--------+---------+-------+
| ename  | sal     | grade |
+--------+---------+-------+
| SMITH  |  800.00 |     1 |
| ALLEN  | 1600.00 |     3 |
| WARD   | 1250.00 |     2 |
| JONES  | 2975.00 |     4 |
| MARTIN | 1250.00 |     2 |
| BLAKE  | 2850.00 |     4 |
| CLARK  | 2450.00 |     4 |
| SCOTT  | 3000.00 |     4 |
| KING   | 5000.00 |     5 |
| TURNER | 1500.00 |     3 |
| ADAMS  | 1100.00 |     1 |
| JAMES  |  950.00 |     1 |
| FORD   | 3000.00 |     4 |
| MILLER | 1300.00 |     2 |
+--------+---------+-------+
14 rows in set (0.01 sec)

Jointure interne - auto-adhésion

Cas : requête Le leader supérieur de l'employé nécessite que le nom de l'employé et le nom du leader correspondant soient affichés

Nous pouvons constater que la relation entre les employés et les dirigeants est dans une seule table. À ce stade, nous devons utiliser l'auto-jointure (astuce. : une table est traitée comme deux tables)

mysql> select
    -> a.ename as '员工名',b.ename as '领导名'
    -> from emp a
    -> join emp b
    -> on
    -> a.mgr = b.empno;
+-----------+-----------+
| 员工名    | 领导名      |
+-----------+-----------+
| SMITH     | FORD      |
| ALLEN     | BLAKE     |
| WARD      | BLAKE     |
| JONES     | KING      |
| MARTIN    | BLAKE     |
| BLAKE     | KING      |
| CLARK     | KING      |
| SCOTT     | JONES     |
| TURNER    | BLAKE     |
| ADAMS     | SCOTT     |
| JAMES     | BLAKE     |
| FORD      | JONES     |
| MILLER    | CLARK     |
+-----------+-----------+
13 rows in set (0.00 sec)

Jointure externe - jointure externe gauche et droite

La différence entre la jointure externe et la jointure interne est que les enregistrements d'une certaine table qui ne correspondent pas avec succès par la jointure externe seront également souscrit

Cas : Retrouver les informations départementales des salariés. Exiger que le service le sache même s'il n'y a pas d'employés

mysql> select
    -> e.ename,d.dname
    -> from emp e
    -> right join dept d
    -> on
    -> e.deptno = d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
| NULL   | OPERATIONS |
+--------+------------+
15 rows in set (0.00 sec)

De même, s'il s'agit d'une jointure externe gauche, toutes les données de la table de gauche seront interrogées, utilisez simplement le mot-clé de jointure gauche

Le nombre de résultats de requête pour la jointure externe doit être > ;= Nombre de résultats de requête de la jointure interne

Connexion à trois tables

Une situation plus compliquée est la connexion à une table de groupe

Regardons un cas :

Découvrez le nom du département et le niveau de salaire de chaque employé. Il est obligatoire d'afficher le nom de l'employé, le nom du département, le salaire et l'échelon salarial

mysql> select
    -> e.ename,e.sal,d.dname,s.grade
    -> from emp e
    -> join dept d
    -> on e.deptno = d.deptno
    -> join salgrade s
    -> on e.sal between s.losal and s.hisal;
+--------+---------+------------+-------+
| ename  | sal     | dname      | grade |
+--------+---------+------------+-------+
| SMITH  |  800.00 | RESEARCH   |     1 |
| ALLEN  | 1600.00 | SALES      |     3 |
| WARD   | 1250.00 | SALES      |     2 |
| JONES  | 2975.00 | RESEARCH   |     4 |
| MARTIN | 1250.00 | SALES      |     2 |
| BLAKE  | 2850.00 | SALES      |     4 |
| CLARK  | 2450.00 | ACCOUNTING |     4 |
| SCOTT  | 3000.00 | RESEARCH   |     4 |
| KING   | 5000.00 | ACCOUNTING |     5 |
| TURNER | 1500.00 | SALES      |     3 |
| ADAMS  | 1100.00 | RESEARCH   |     1 |
| JAMES  |  950.00 | SALES      |     1 |
| FORD   | 3000.00 | RESEARCH   |     4 |
| MILLER | 1300.00 | ACCOUNTING |     2 |
+--------+---------+------------+-------+
14 rows in set (0.00 sec)

Regardons une situation plus complexe :

Découvrez le nom du département, l'échelon salarial et le nom du leader de chaque employé. Demande d'affichage du nom de l'employé, du nom du département, du nom du leader, du salaire et de l'échelon de salaire

mysql> select
    -> e.ename,e.sal,d.dname,s.grade,l.ename
    -> from emp e
    -> join dept d
    -> on e.deptno = d.deptno
    -> join salgrade s
    -> on e.sal between s.losal and s.hisal
    -> left join
    -> emp l
    -> on e.mgr = l.empno;
+--------+---------+------------+-------+-------+
| ename  | sal     | dname      | grade | ename |
+--------+---------+------------+-------+-------+
| SMITH  |  800.00 | RESEARCH   |     1 | FORD  |
| ALLEN  | 1600.00 | SALES      |     3 | BLAKE |
| WARD   | 1250.00 | SALES      |     2 | BLAKE |
| JONES  | 2975.00 | RESEARCH   |     4 | KING  |
| MARTIN | 1250.00 | SALES      |     2 | BLAKE |
| BLAKE  | 2850.00 | SALES      |     4 | KING  |
| CLARK  | 2450.00 | ACCOUNTING |     4 | KING  |
| SCOTT  | 3000.00 | RESEARCH   |     4 | JONES |
| KING   | 5000.00 | ACCOUNTING |     5 | NULL  |
| TURNER | 1500.00 | SALES      |     3 | BLAKE |
| ADAMS  | 1100.00 | RESEARCH   |     1 | SCOTT |
| JAMES  |  950.00 | SALES      |     1 | BLAKE |
| FORD   | 3000.00 | RESEARCH   |     4 | JONES |
| MILLER | 1300.00 | ACCOUNTING |     2 | CLARK |
+--------+---------+------------+-------+-------+
14 rows in set (0.00 sec)

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