Apache Tajo - Consultas SQL

Este capítulo explica las siguientes consultas importantes.

  • Predicates
  • Explain
  • Join

Procedamos y realicemos las consultas.

Predicados

El predicado es una expresión que se utiliza para evaluar valores verdaderos / falsos y DESCONOCIDOS. Los predicados se utilizan en la condición de búsqueda de cláusulas WHERE y cláusulas HAVING y otras construcciones donde se requiere un valor booleano.

IN predicado

Determina si el valor de la expresión a probar coincide con algún valor de la subconsulta o de la lista. La subconsulta es una instrucción SELECT ordinaria que tiene un conjunto de resultados de una columna y una o más filas. Esta columna o todas las expresiones de la lista deben tener el mismo tipo de datos que la expresión a probar.

Syntax

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

Query

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

Result

La consulta anterior generará el siguiente resultado.

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

La consulta devuelve registros de mytable para los estudiantes id 2,3 y 4.

Query

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

Result

La consulta anterior generará el siguiente resultado.

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 consulta anterior devuelve registros de mytable donde los estudiantes no están en 2,3 y 4.

Como predicado

El predicado LIKE compara la cadena especificada en la primera expresión para calcular el valor de la cadena, al que se hace referencia como un valor para probar, con el patrón que se define en la segunda expresión para calcular el valor de la cadena.

El patrón puede contener cualquier combinación de comodines como:

  • Símbolo de subrayado (_), que se puede utilizar en lugar de cualquier carácter individual en el valor para probar.

  • Signo de porcentaje (%), que reemplaza cualquier cadena de cero o más caracteres en el valor a probar.

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 consulta anterior generará el siguiente resultado.

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

La consulta devuelve registros de mytable de aquellos estudiantes cuyos nombres comienzan con 'A'.

Query

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

Result

La consulta anterior generará el siguiente resultado.

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 consulta devuelve registros de mytable de aquellos estudiantes cuyos nombres comienzan con 'a' como segundo carácter.

Uso de valor NULL en condiciones de búsqueda

Ahora entendamos cómo usar NULL Value en las condiciones de búsqueda.

Syntax

Predicate  
IS [NOT] NULL

Query

select name from mytable where name is not null;

Result

La consulta anterior generará el siguiente resultado.

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

Aquí, el resultado es verdadero, por lo que devuelve todos los nombres de la tabla.

Query

Comprobemos ahora la consulta con la condición NULL.

default> select name from mytable where name is null;

Result

La consulta anterior generará el siguiente resultado.

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

Explique

Explainse utiliza para obtener un plan de ejecución de consultas. Muestra una ejecución lógica y global del plan de una declaración.

Consulta de plan lógico

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 consulta anterior generará el siguiente resultado.

El resultado de la consulta muestra un formato de plan lógico para la tabla dada. El plan lógico devuelve los siguientes tres resultados:

  • Lista de objetivos
  • Fuera esquema
  • En esquema

Consulta del 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 consulta anterior generará el siguiente resultado.

Aquí, el plan global muestra el ID del bloque de ejecución, el orden de ejecución y su información.

Uniones

Las uniones SQL se utilizan para combinar filas de dos o más tablas. Los siguientes son los diferentes tipos de uniones SQL:

  • Unir internamente
  • {IZQUIERDA | DERECHA | COMPLETO} UNIÓN EXTERIOR
  • Unión cruzada
  • Auto unirse
  • Unión natural

Considere las siguientes dos tablas para realizar operaciones de combinación.

Table1 - Clientes

Carné de identidad Nombre Habla a Años
1 Cliente 1 23 calle vieja 21
2 Cliente 2 12 calle nueva 23
3 Cliente 3 10 Express Avenue 22
4 Cliente 4 15 Express Avenue 22
5 Cliente 5 20 Garden Street 33
6 Cliente 6 21 calle norte 25

Table2 - customer_order

Carné de identidad Solicitar ID ID de emp
1 1 101
2 2 102
3 3 103
4 4 104
5 5 105

Procedamos ahora y realicemos las operaciones de combinación SQL en las dos tablas anteriores.

Unir internamente

La combinación interna selecciona todas las filas de ambas tablas cuando hay una coincidencia entre las columnas de ambas tablas.

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 consulta anterior generará el siguiente resultado.

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

La consulta coincide con cinco filas de ambas tablas. Por lo tanto, devuelve la antigüedad de las filas coincidentes de la primera tabla.

Izquierda combinación externa

Una combinación externa izquierda retiene todas las filas de la tabla "izquierda", independientemente de si hay una fila que coincide en la tabla "derecha" o no.

Query

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

Result

La consulta anterior generará el siguiente resultado.

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

Aquí, la combinación externa izquierda devuelve filas de columnas de nombre de la tabla de clientes (izquierda) y filas coincidentes de columnas empid de la tabla customer_order (derecha).

Unión externa derecha

Una combinación externa derecha conserva todas las filas de la tabla "derecha", independientemente de si hay una fila que coincide en la tabla "izquierda".

Query

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

Result

La consulta anterior generará el siguiente resultado.

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

Aquí, la unión externa derecha devuelve las filas vacías de la tabla customer_order (derecha) y la columna de nombre coincide con las filas de la tabla de clientes.

Unión externa completa

La unión externa completa conserva todas las filas de la tabla izquierda y derecha.

Query

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

Result

La consulta anterior generará el siguiente resultado.

La consulta devuelve todas las filas coincidentes y no coincidentes de las tablas customers y customer_order.

Unión cruzada

Esto devuelve el producto cartesiano de los conjuntos de registros de las dos o más tablas unidas.

Syntax

SELECT *  FROM table1  CROSS JOIN table2;

Query

select orderid,name,address from customers,customer_order;

Result

La consulta anterior generará el siguiente resultado.

La consulta anterior devuelve el producto cartesiano de la tabla.

Unión natural

Una unión natural no utiliza ningún operador de comparación. No se concatena como lo hace un producto cartesiano. Podemos realizar una unión natural solo si existe al menos un atributo común entre las dos relaciones.

Syntax

SELECT * FROM table1 NATURAL JOIN table2;

Query

select * from customers natural join customer_order;

Result

La consulta anterior generará el siguiente resultado.

Aquí, hay una identificación de columna común que existe entre dos tablas. Usando esa columna común, elNatural Join une ambas tablas.

Auto unión

SQL SELF JOIN se utiliza para unir una tabla consigo misma como si fueran dos tablas, cambiando temporalmente el nombre de al menos una tabla en la declaración 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 consulta anterior generará el siguiente resultado.

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

La consulta une una tabla de clientes a sí misma.