Apache Tajo - Requêtes SQL

Ce chapitre explique les requêtes importantes suivantes.

  • Predicates
  • Explain
  • Join

Continuons et exécutons les requêtes.

Prédicats

Predicate est une expression qui est utilisée pour évaluer les valeurs vrai / faux et INCONNU. Les prédicats sont utilisés dans la condition de recherche des clauses WHERE et HAVING et d'autres constructions où une valeur booléenne est requise.

Prédicat IN

Détermine si la valeur de l'expression à tester correspond à n'importe quelle valeur de la sous-requête ou de la liste. La sous-requête est une instruction SELECT ordinaire qui a un jeu de résultats d'une colonne et d'une ou plusieurs lignes. Cette colonne ou toutes les expressions de la liste doivent avoir le même type de données que l'expression à tester.

Syntax

IN::= 
<expression to test> [NOT] IN (<subquery>) 
| (<expression1>,...)

Query

select id,name,address from mytable where id in(2,3,4);

Result

La requête ci-dessus générera le résultat suivant.

id,  name,   address 
------------------------------- 
2,  Amit,  12 old street 
3,  Bob,   10 cross street 
4,  David, 15 express avenue

La requête renvoie les enregistrements de mytable pour les étudiants id 2,3 et 4.

Query

select id,name,address from mytable where id not in(2,3,4);

Result

La requête ci-dessus générera le résultat suivant.

id,  name,  address 
------------------------------- 
1,  Adam,   23 new street 
5,  Esha,   20 garden street 
6,  Ganga,  25 north street 
7,  Jack,   2 park street 
8,  Leena,  24 south street 
9,  Mary,   5 west street 
10, Peter,  16 park avenue

La requête ci-dessus renvoie les enregistrements de mytable où les étudiants ne sont pas en 2,3 et 4.

Comme prédicat

Le prédicat LIKE compare la chaîne spécifiée dans la première expression pour calculer la valeur de chaîne, qui est référencée comme valeur à tester, avec le modèle défini dans la deuxième expression pour calculer la valeur de chaîne.

Le modèle peut contenir n'importe quelle combinaison de caractères génériques tels que -

  • Symbole de soulignement (_), qui peut être utilisé à la place de n'importe quel caractère unique dans la valeur à tester.

  • Signe de pourcentage (%), qui remplace toute chaîne de zéro caractère ou plus dans la valeur à tester.

Syntax

LIKE::= 
<expression for calculating the string value> 
[NOT] LIKE 
<expression for calculating the string value> 
[ESCAPE <symbol>]

Query

select * from mytable where name like ‘A%';

Result

La requête ci-dessus générera le résultat suivant.

id,  name,  address,     age,  mark 
------------------------------- 
1,  Adam,  23 new street,  12,  90 
2,  Amit,  12 old street,  13,  95

La requête renvoie les enregistrements de ma table des étudiants dont les noms commencent par «A».

Query

select * from mytable where name like ‘_a%';

Result

La requête ci-dessus générera le résultat suivant.

id,  name,  address,    age,  mark 
——————————————————————————————————————- 
4,  David,  15 express avenue,  12,  85 
6,  Ganga,  25 north street,    12,  55 
7,  Jack,  2 park street,       12,  60 
9,  Mary,  5 west street,       12,  75

La requête renvoie les enregistrements de mytable des élèves dont les noms commencent par «a» comme deuxième caractère.

Utilisation de la valeur NULL dans les conditions de recherche

Voyons maintenant comment utiliser la valeur NULL dans les conditions de recherche.

Syntax

Predicate  
IS [NOT] NULL

Query

select name from mytable where name is not null;

Result

La requête ci-dessus générera le résultat suivant.

name 
------------------------------- 
Adam 
Amit 
Bob 
David 
Esha 
Ganga 
Jack 
Leena 
Mary 
Peter  
(10 rows, 0.076 sec, 163 B selected)

Ici, le résultat est vrai donc il renvoie tous les noms de la table.

Query

Vérifions maintenant la requête avec la condition NULL.

default> select name from mytable where name is null;

Result

La requête ci-dessus générera le résultat suivant.

name 
------------------------------- 
(0 rows, 0.068 sec, 0 B selected)

Explique

Explainest utilisé pour obtenir un plan d'exécution de requête. Il montre une exécution de plan logique et globale d'une instruction.

Requête de plan logique

explain select * from mytable;  
explain 
-------------------------------  
   => target list: default.mytable.id (INT4), default.mytable.name (TEXT), 
      default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4) 
   
   => out schema: {
   (5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   } 
   
   => in schema: {
	(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   }

Result

La requête ci-dessus générera le résultat suivant.

Le résultat de la requête montre un format de plan logique pour la table donnée. Le plan logique renvoie les trois résultats suivants -

  • Liste des cibles
  • Out schéma
  • Dans le schéma

Requête de plan global

explain global select * from mytable;  
explain 
------------------------------- 
------------------------------------------------------------------------------- 
Execution Block Graph (TERMINAL - eb_0000000000000_0000_000002) 
------------------------------------------------------------------------------- 
|-eb_0000000000000_0000_000002 
   |-eb_0000000000000_0000_000001 
------------------------------------------------------------------------------- 
Order of Execution 
------------------------------------------------------------------------------- 
1: eb_0000000000000_0000_000001 
2: eb_0000000000000_0000_000002 
-------------------------------------------------------------------------------  
======================================================= 
Block Id: eb_0000000000000_0000_000001 [ROOT] 
=======================================================  
SCAN(0) on default.mytable 
   
   => target list: default.mytable.id (INT4), default.mytable.name (TEXT), 
      default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4) 
   
   => out schema: {
	(5) default.mytable.id (INT4), default.mytable.name (TEXT),default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   } 
   
   => in schema: {
	(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT), 
      default.mytable.age (INT4), default.mytable.mark (INT4)
   }  
======================================================= 
Block Id: eb_0000000000000_0000_000002 [TERMINAL] 
======================================================= 
(24 rows, 0.065 sec, 0 B selected)

Result

La requête ci-dessus générera le résultat suivant.

Ici, le plan global affiche l'ID du bloc d'exécution, l'ordre d'exécution et ses informations.

Rejoint

Les jointures SQL sont utilisées pour combiner des lignes de deux ou plusieurs tables. Voici les différents types de jointures SQL -

  • Jointure interne
  • {GAUCHE | DROITE | FULL} JOINTURE EXTÉRIEURE
  • Jointure croisée
  • Auto-rejoindre
  • Jointure naturelle

Considérez les deux tableaux suivants pour effectuer des opérations de jointure.

Tableau 1 - Clients

Id Nom Adresse Âge
1 Client 1 23 vieille rue 21
2 Client 2 12 New Street 23
3 Client 3 10 avenue Express 22
4 Client 4 15 avenue Express 22
5 Client 5 20 rue Garden 33
6 Client 6 21 rue Nord 25

Tableau2 - commande_client

Id Numéro de commande ID Emp
1 1 101
2 2 102
3 3 103
4 4 104
5 5 105

Continuons maintenant et exécutons les opérations de jointure SQL sur les deux tables ci-dessus.

Jointure interne

La jointure interne sélectionne toutes les lignes des deux tables lorsqu'il existe une correspondance entre les colonnes des deux tables.

Syntax

SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Query

default> select c.age,c1.empid from customers c inner join customer_order c1 on c.id = c1.id;

Result

La requête ci-dessus générera le résultat suivant.

age,  empid 
------------------------------- 
21,  101 
23,  102 
22,  103 
22,  104 
33,  105

La requête correspond à cinq lignes des deux tables. Par conséquent, il renvoie l'âge des lignes correspondantes de la première table.

Jointure externe gauche

Une jointure externe gauche conserve toutes les lignes de la table «gauche», qu'il existe ou non une ligne correspondant à la table «droite».

Query

select c.name,c1.empid from customers c left outer join customer_order c1 on c.id = c1.id;

Result

La requête ci-dessus générera le résultat suivant.

name,       empid 
------------------------------- 
customer1,  101 
customer2,  102 
customer3,  103 
customer4,  104 
customer5,  105 
customer6,

Ici, la jointure externe gauche renvoie les lignes de la colonne de nom de la table customers (à gauche) et les lignes correspondant à la colonne empid de la table customer_order (à droite).

Jointure externe droite

Une jointure externe droite conserve toutes les lignes de la table «droite», qu'il existe ou non une ligne qui correspond à la table «gauche».

Query

select c.name,c1.empid from customers c right outer join customer_order c1 on c.id = c1.id;

Result

La requête ci-dessus générera le résultat suivant.

name,      empid 
------------------------------- 
customer1,  101 
customer2,  102 
customer3,  103 
customer4,  104 
customer5,  105

Ici, la jointure externe droite renvoie les lignes empid de la table customer_order (à droite) et la colonne de nom correspond aux lignes de la table clients.

Jointure externe complète

La jointure externe complète conserve toutes les lignes des tables de gauche et de droite.

Query

select * from customers c full outer join customer_order c1 on c.id = c1.id;

Result

La requête ci-dessus générera le résultat suivant.

La requête renvoie toutes les lignes correspondantes et non correspondantes des tables clients et commande_client.

Jointure croisée

Cela renvoie le produit cartésien des ensembles d'enregistrements des deux ou plusieurs tables jointes.

Syntax

SELECT *  FROM table1  CROSS JOIN table2;

Query

select orderid,name,address from customers,customer_order;

Result

La requête ci-dessus générera le résultat suivant.

La requête ci-dessus renvoie le produit cartésien de la table.

Jointure naturelle

Une jointure naturelle n'utilise aucun opérateur de comparaison. Il ne concatène pas comme le fait un produit cartésien. Nous ne pouvons effectuer une jointure naturelle que s'il existe au moins un attribut commun entre les deux relations.

Syntax

SELECT * FROM table1 NATURAL JOIN table2;

Query

select * from customers natural join customer_order;

Result

La requête ci-dessus générera le résultat suivant.

Ici, il existe un identifiant de colonne commun entre deux tables. En utilisant cette colonne commune, leNatural Join joint les deux tables.

Auto-rejoindre

Le SQL SELF JOIN est utilisé pour joindre une table à elle-même comme si la table était deux tables, renommant temporairement au moins une table dans l'instruction SQL.

Syntax

SELECT a.column_name, b.column_name...  
FROM table1 a, table1 b  
WHERE a.common_filed = b.common_field

Query

default> select c.id,c1.name from customers c, customers c1 where c.id = c1.id;

Result

La requête ci-dessus générera le résultat suivant.

id,   name 
------------------------------- 
1,   customer1 
2,   customer2 
3,   customer3 
4,   customer4 
5,   customer5 
6,   customer6

La requête joint une table client à elle-même.