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

Que signifie l'instruction de requête sous-conditionnelle MySQL ?

青灯夜游
Libérer: 2020-10-07 12:52:04
original
2723 Les gens l'ont consulté

Dans MySQL, vous pouvez appeler une autre expression de table dans une expression de table. Cette expression de table appelée est appelée une instruction de sous-requête (sous-requête), également appelée sous-sélection (sous-sélection) ou sélection en ligne (sélection interne). Les résultats de la sous-requête sont transmis à l'expression de table qui l'a appelée pour un traitement ultérieur.

Que signifie l'instruction de requête sous-conditionnelle MySQL ?

Classification des sous-requêtes

Classification par ensemble de résultats renvoyés

Les sous-requêtes sont divisées en quatre types en fonction de l'ensemble de résultats renvoyé : sous-requête de table, sous-requête de ligne, sous-requête de colonne et sous-requête scalaire.

  • Sous-requête de table : l'ensemble de résultats renvoyé est un ensemble de lignes, N lignes et N colonnes (N>=1). Les sous-requêtes de table sont souvent utilisées dans la clause FROM d'une requête parent.

  • Sous-requête de ligne : l'ensemble de résultats renvoyé est un ensemble de colonnes, une ligne avec N colonnes (N>=1). Les sous-requêtes de ligne peuvent être utilisées dans les clauses FROM et WHERE d'une requête.

  • Sous-requête de colonne : l'ensemble de résultats renvoyé est un ensemble de lignes, N lignes et une colonne (N>=1).

  • Sous-requête scalaire : l'ensemble de résultats renvoyé est un ensemble scalaire, une ligne et une colonne, qui est une valeur scalaire. Partout où vous pouvez spécifier une expression scalaire, vous pouvez utiliser une sous-requête scalaire.

Par définition, chaque sous-requête scalaire est également une sous-requête de ligne et une sous-requête de colonne, mais pas l'inverse ; chaque sous-requête de ligne et chaque sous-requête de colonne est également une sous-requête de table, ni l'inverse.

2. Selon la méthode d'appel du résultat renvoyé

La sous-requête peut être divisée en sous-requête de type Where et en sous-requête de type From selon la méthode d'appel du résultat renvoyé. set et existe une sous-requête de type.

Où tapez la sous-requête : (utilisez le résultat de la requête interne comme condition de comparaison de la requête externe)

Définition : où la sous-requête de type utilise le résultat de la requête interne comme condition de requête externe.

from type subquery : (le résultat de la requête interne est à nouveau fourni pour la requête externe)

Définition : from subquery consiste à traiter le résultat de la sous-requête (une table en mémoire) comme Créer un table temporaire, puis traitez-la.

Sous-requête de type Existe : (transmettez le résultat de la requête externe à la couche interne pour voir si la requête interne est vraie)

Définition : La sous-requête existe consiste à parcourir la table externe, puis La table interne effectue une requête interne. Semblables à in (), mais ils sont toujours différents. Cela dépend principalement de la différence de taille entre les deux tables. Si la table de sous-requête est grande, utilisez exist (index interne), et si la table de sous-requête est petite, utilisez in (index externe)

Utilisez le principe de sous-requête

1. Une sous-requête doit être placée entre parenthèses.

2. Placez la sous-requête à droite de la condition de comparaison pour augmenter la lisibilité.

La sous-requête ne contient pas de clause ORDER BY. Une seule clause ORDER BY peut être utilisée avec une instruction SELECT, et si elle est spécifiée, elle doit être placée à la fin de l'instruction SELECT principale.

3. Deux conditions de comparaison peuvent être utilisées dans les sous-requêtes : les opérateurs monolignes (>, =, >=, ,

Exemple d'analyse

1 Créez une table de test

CREATE TABLE PLAYERS  
    (PLAYERNO      INTEGER      NOT NULL,  
    NAME           CHAR(15)     NOT NULL,  
    INITIALS       CHAR(3)      NOT NULL,  
    BIRTH_DATE     DATE                 ,  
    SEX            CHAR(1)      NOT NULL,  
    JOINED         SMALLINT     NOT NULL,  
    STREET         VARCHAR(30)  NOT NULL,  
    HOUSENO        CHAR(4)              ,  
    POSTCODE       CHAR(6)              ,  
    TOWN           VARCHAR(30)  NOT NULL,  
    PHONENO        CHAR(13)             ,  
    LEAGUENO       CHAR(4)              ,  
    PRIMARY KEY    (PLAYERNO));  
  
CREATE   TABLE PENALTIES  
        (PAYMENTNO      INTEGER      NOT NULL,  
         PLAYERNO       INTEGER      NOT NULL,  
         PAYMENT_DATE   DATE         NOT NULL,  
         AMOUNT         DECIMAL(7,2) NOT NULL,  
         PRIMARY KEY    (PAYMENTNO));
Copier après la connexion

Remarque : Le tableau des joueurs est un tableau de base contenant des informations sur les joueurs, et les pénalités sont une liste de joueurs avec de bons records.

2. Insérer les données de test

INSERT INTO PLAYERS VALUES (2, 'Everett', 'R', '1948-09-01', 'M', 1975, 'Stoney Road','43', '3575NH', 'Stratford', '070-237893', '2411');  
INSERT INTO PLAYERS VALUES (6, 'Parmenter', 'R', '1964-06-25', 'M', 1977, 'Haseltine Lane','80', '1234KK', 'Stratford', '070-476537', '8467');  
INSERT INTO PLAYERS VALUES (7, 'Wise', 'GWS', '1963-05-11', 'M', 1981, 'Edgecombe Way','39', '9758VB', 'Stratford', '070-347689', NULL);  
INSERT INTO PLAYERS VALUES (8, 'Newcastle', 'B', '1962-07-08', 'F', 1980, 'Station Road','4', '6584WO', 'Inglewood', '070-458458', '2983');  
INSERT INTO PLAYERS VALUES (27, 'Collins', 'DD', '1964-12-28', 'F', 1983, 'Long Drive','804', '8457DK', 'Eltham', '079-234857', '2513');  
INSERT INTO PLAYERS VALUES (28, 'Collins', 'C', '1963-06-22', 'F', 1983, 'Old Main Road','10', '1294QK', 'Midhurst', '010-659599', NULL);  
INSERT INTO PLAYERS VALUES (39, 'Bishop', 'D', '1956-10-29', 'M', 1980, 'Eaton Square','78', '9629CD', 'Stratford', '070-393435', NULL);  
INSERT INTO PLAYERS VALUES (44, 'Baker', 'E', '1963-01-09', 'M', 1980, 'Lewis Street','23', '4444LJ', 'Inglewood', '070-368753', '1124');  
INSERT INTO PLAYERS VALUES (57, 'Brown', 'M', '1971-08-17', 'M', 1985, 'Edgecombe Way','16', '4377CB', 'Stratford', '070-473458', '6409');  
INSERT INTO PLAYERS VALUES (83, 'Hope', 'PK', '1956-11-11', 'M', 1982, 'Magdalene Road','16A', '1812UP', 'Stratford', '070-353548', '1608');  
INSERT INTO PLAYERS VALUES (95, 'Miller', 'P', '1963-05-14', 'M', 1972, 'High Street','33A', '5746OP', 'Douglas', '070-867564', NULL);  
INSERT INTO PLAYERS VALUES (100, 'Parmenter', 'P', '1963-02-28', 'M', 1979, 'Haseltine Lane','80', '6494SG', 'Stratford', '070-494593', '6524');  
INSERT INTO PLAYERS VALUES (104, 'Moorman', 'D', '1970-05-10', 'F', 1984, 'Stout Street','65', '9437AO', 'Eltham', '079-987571', '7060');  
INSERT INTO PLAYERS VALUES (112, 'Bailey', 'IP', '1963-10-01', 'F', 1984, 'Vixen Road','8', '6392LK', 'Plymouth', '010-548745', '1319');  
  
INSERT INTO PENALTIES VALUES (1,  6, '1980-12-08',100);  
INSERT INTO PENALTIES VALUES (2, 44, '1981-05-05', 75);  
INSERT INTO PENALTIES VALUES (3, 27, '1983-09-10',100);  
INSERT INTO PENALTIES VALUES (4,104, '1984-12-08', 50);  
INSERT INTO PENALTIES VALUES (5, 44, '1980-12-08', 25);  
INSERT INTO PENALTIES VALUES (6,  8, '1980-12-08', 25);  
INSERT INTO PENALTIES VALUES (7, 44, '1982-12-30', 30);  
INSERT INTO PENALTIES VALUES (8, 27, '1984-11-12', 75);
Copier après la connexion

3. Exemple de sous-requête de table

Par exemple : obtenez des hommes avec des nombres inférieurs à 10 Numéro du joueur

mysql> select playerno from (  
    select playerno, sex   
    from players   
    where playerno < 10)   
as players10 where sex=&#39;M&#39;;
Copier après la connexion

Que signifie linstruction de requête sous-conditionnelle MySQL ?

4. Exemple de sous-requête de ligne

Par exemple : obtenir le même sexe que le joueur n°100 et vivre au même endroit le numéro de joueur de City.

mysql> select playerno   
from players   
where (sex, town) = (  
    select sex, town   
    from players   
    where playerno = 100);
Copier après la connexion

Que signifie linstruction de requête sous-conditionnelle MySQL ?

Explication : Le résultat de la sous-requête est une ligne avec deux valeurs : ('M', 'stratford'). Cette valeur est comparée à une expression de ligne (sexe, ville).

5 Exemples de sous-requêtes scalaires

Partout où une expression scalaire peut être spécifiée, une sous-requête scalaire peut être utilisée presque partout.

Par exemple : Obtenez le numéro du joueur né la même année que le joueur n°27

mysql> select playerno   
from players   
where year(birth_date) =   
    (select year(birth_date)   
    from players   
    where playerno = 27)   
and playerno <> 27;
Copier après la connexion

Que signifie linstruction de requête sous-conditionnelle MySQL ?

La déclaration ci-dessus équivaut à :

mysql> select playerno from players where year(birth_date) = 1964 and playerno <> 27;
Copier après la connexion

6 Exemples de sous-requête de colonne

Étant donné que l'ensemble de résultats renvoyé par la sous-requête de colonne est constitué de N lignes et d'une colonne, il ne peut pas être utilisé directement =  >  <=  <> Cet opérateur de résultats scalaires de comparaison. Vous pouvez utiliser les opérateurs IN, ANY (SOME) et ALL dans les sous-requêtes de colonne :

IN : Dans l'élément spécifié, le même que IN (élément 1, élément 2,...).

ANY:与比较操作符联合使用,ANY关键字必须接在一个比较操作符的后面,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。

SOME:ANY 的别名,较少使用。

ALL:与比较操作符联合使用,ALL关键字必须接在一个比较操作符的后面,表示与子查询返回的所有值比较都为 TRUE ,则返回 TRUE 。

实例1(in):获取球员性别为女的所有球员的球员号,名字及所在城市。

mysql> select playerno, name, town   
from players   
where playerno in   
    (select playerno   
    from players   
    where sex = &#39;F&#39;);
Copier après la connexion

Que signifie linstruction de requête sous-conditionnelle MySQL ?

实例2(any):获取至少比同城的另一球员年轻的所有球员的号码,日期和居住城市。

mysql> select playerno, birth_date, town   
from players as p1   
where birth_date > any   
    (select birth_date   
    from players as p2   
    where p1.town = p2.town);
Copier après la connexion

Que signifie linstruction de requête sous-conditionnelle MySQL ?

实例3(all):获取最老球员的号码,名字及生日。(即出生日期数值小于或等于所有其它球员的球员)

mysql> select playerno, name, birth_date   
from players   
where birth_date <= all   
    (select birth_date   
    from players);
Copier après la connexion

Que signifie linstruction de requête sous-conditionnelle MySQL ?

7、exists型子查询

EXISTS关键字表示存在。使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,如果内层查询语句查询到满足条件的记录,只要子查询中至少返回一个值,则EXISTS语句的值就为True。就返回true,否则返回false。当返回的值为true时,外层查询语句将进行查询,否则不进行查询。NOT EXISTS刚好与之相反。exists的用法和in ()差不多,但是它们还是有区别的。主要是看两个张表大小差的程度。若子查询表大则用exists(内层索引),子查询表小则用in(外层索引);

实例1(exists):获取那些至少支付了一次罚款的球员的名字和首字母。

mysql> select name, initials   
from players   
where exists   
    (select * from penalties   
    where playerno = players.playerno);
Copier après la connexion

Que signifie linstruction de requête sous-conditionnelle MySQL ?

实例2(not exists):获取那些从来没有罚款的球员的名字和首字母。

mysql> select name, initials   
from players   
where not exists   
    (select * from penalties   
    where playerno = players.playerno);
Copier après la connexion

Que signifie linstruction de requête sous-conditionnelle MySQL ?

推荐教程: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:php.cn
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!