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.
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));
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);
3. Exemple de sous-requête de table
Par exemple : obtenez des hommes avec des nombres inférieurs à 10 Numéro du joueurmysql> select playerno from ( select playerno, sex from players where playerno < 10) as players10 where sex='M';
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);
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°27mysql> select playerno from players where year(birth_date) = (select year(birth_date) from players where playerno = 27) and playerno <> 27;
mysql> select playerno from players where year(birth_date) = 1964 and playerno <> 27;
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 = 'F');
实例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);
实例3(all):获取最老球员的号码,名字及生日。(即出生日期数值小于或等于所有其它球员的球员)
mysql> select playerno, name, birth_date from players where birth_date <= all (select birth_date from players);
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);
实例2(not exists):获取那些从来没有罚款的球员的名字和首字母。
mysql> select name, initials from players where not exists (select * from penalties where playerno = players.playerno);
推荐教程: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!