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.