Comment utiliser des requêtes SQL imbriquées qui renvoient une valeur unique

L'introduction d'une sous-requête avec l'un des six opérateurs de comparaison (=, lt;>, lt;,lt; =, >, > =) Est souvent utile. Dans un tel cas, l'expression SQL précédant l'opérateur évalue à une valeur unique, et la sous-requête suivante, l'opérateur doit également évaluer à une seule valeur. Une exception est le cas de la opérateur de comparaison quantifiée, qui est un opérateur de comparaison suivie par un quantificateur (QUELCONQUE, CERTAINS, ou TOUS).

Pour illustrer un cas dans lequel une sous-requête renvoie une valeur unique, regarder un autre morceau de la base de données de Zetec Corporation. Il contient une table de client qui contient des informations sur les entreprises qui achètent des produits de Zetec.

ColonneTypeContraintes
CustIDENTIERCLÉ PRIMAIRE
CompagnieCHAR (40)UNIQUE
CustAddress CHAR (30)
CustCityCHAR (20)
CustStateCHAR (2)
CustZipCHAR (10)
CustPhoneCHAR (12)
ModLevelENTIER

La table Contact contient des données personnelles concernant des personnes à chacune des organisations de la clientèle de Zetec.

ColonneTypeContraintes
CustIDENTIERCLÉ PRIMAIRE
ContFNameCHAR (10)
ContLNameCHAR (16)
ContPhoneCHAR (12)
ContInfoCHAR (50)

Dites que vous voulez regarder les informations de contact pour les Jeux olympiques de vente, mais vous ne vous souvenez pas de cette société CustID. Utilisez une requête imbriquée comme celui-ci pour récupérer l'information que vous voulez:

SELECT * FROM CONTACTWHERE CustID = (SELECT CustIDFROM CUSTOMERWHERE Société = 'Olympique Sales') -

Le résultat ressemble à ceci:

CustID ContFName ContLName ContPhone ContInfo ------ --------- --------- --------- -------- 118 505 Jerry Attwater -876-3456 Will playmajor rôle inadditivemanufacturing.



Vous pouvez maintenant appeler Jerry olympique et à lui raconter vente spéciale de ce mois sur les imprimantes 3D.

Lorsque vous utilisez une sous-requête dans une “=” comparaison, la sous-requête de SELECT liste doit indiquer une seule colonne (CustID dans l'exemple). Lorsque la sous-requête est exécutée, elle doit retourner une seule rangée afin d'avoir une valeur unique pour la comparaison.

Dans cet exemple, supposons que la table CLIENT a une seule ligne avec un Compagnie valeur de 'Olympique Sales'. La CREATE TABLE déclaration pour le client spécifie une UNIQUE contrainte pour Compagnie, et cette déclaration garantit que la sous-requête dans l'exemple précédent renvoie une valeur unique (ou aucune valeur).

Les sous-requêtes comme celle de cet exemple, cependant, sont couramment utilisés sur des colonnes qui ne sont pas spécifiés pour être UNIQUE. Dans de tels cas, vous devez compter sur la connaissance préalable du contenu de la base de données pour croire que la colonne n'a pas de doublons.

Si plus d'un client a une valeur de 'Olympique Sales' dans le Compagnie colonne (peut-être dans des états différents), la sous-requête soulève une erreur.

Si aucun client avec un tel nom de la société existe, la sous-requête est traitée comme si elle était nulle, et la comparaison devient inconnue. Dans ce cas, la clause renvoie aucune ligne (car elle retourne uniquement les lignes avec la condition Vrai et filtre rangées avec la condition Faux ou inconnu). Ce serait probablement le cas, par exemple, si quelqu'un le mal orthographié Compagniecomme 'Olumpic Sales'.

Bien que l'opérateur égal (=) Est la plus courante, vous pouvez utiliser l'un des cinq autres opérateurs de comparaison dans une structure similaire. Pour chaque ligne de la table spécifiée dans la déclaration de enfermant DE clause, la seule valeur renvoyée par la sous-requête est comparée à l'expression dans la déclaration de enfermant clause. Si la comparaison donne une vraie valeur, une ligne est ajoutée à la table de résultat.

Vous pouvez garantir que les requêtes va renvoyer une valeur unique si vous incluez une fonction d'agrégation en elle. Les fonctions d'agrégation toujours renvoyer une valeur unique. Bien sûr, cette façon de retourner une seule valeur est utile uniquement si vous voulez que le résultat d'une fonction d'agrégation.

Supposons que vous êtes un vendeur de Zetec et vous avez besoin de gagner un gros chèque de commission à payer pour certaines factures inattendues. Vous décidez de se concentrer sur la vente de produit le plus cher de Zetec. Vous pouvez découvrir ce que ce produit est avec une requête imbriquée:

Sélectionnez le modèle, ProdName, ListPriceFROM PRODUCTWHERE ListPrice = (SELECT MAX (ListPrice) à partir du produit) -

Dans la requête imbriquée précédente, à la fois la sous-requête et la déclaration d'enceinte fonctionnent sur la même table. La sous-requête renvoie une valeur unique: le prix de la liste maximale dans le tableau des produits. La requête externe extrait toutes les lignes de la table de produits qui ont ce prix de liste.

L'exemple suivant montre une sous-requête de comparaison qui utilise un opérateur de comparaison autre que =:

Sélectionnez le modèle, ProdName, ListPriceFROM PRODUCTWHERE ListPrice lt; (SELECT AVG (ListPrice) à partir du produit) -

La sous-requête renvoie une valeur unique: la liste de prix moyen dans le tableau des produits. La requête externe extrait toutes les lignes de la table de produits qui ont une liste de prix inférieur au prix de liste moyenne.

Dans le standard SQL d'origine, une comparaison pourrait avoir un seul sous-requête, et il a dû être sur le côté droit de la comparaison. SQL: 1999 permis ou l'autre ou les deux opérandes de la comparaison soit sous-requêtes, et les versions ultérieures de SQL retenir que l'expansion de la capacité.


» » » » Comment utiliser des requêtes SQL imbriquées qui renvoient une valeur unique