Apache Tajo - consultas SQL

Este capítulo explica sobre as seguintes consultas significativas.

  • Predicates
  • Explain
  • Join

Prossigamos e façamos as consultas.

Predicados

Predicado é uma expressão que é usada para avaliar valores verdadeiro / falso e DESCONHECIDO. Predicados são usados ​​na condição de pesquisa de cláusulas WHERE e cláusulas HAVING e outras construções onde um valor booleano é necessário.

Predicado IN

Determina se o valor da expressão a ser testada corresponde a qualquer valor na subconsulta ou na lista. A subconsulta é uma instrução SELECT comum que possui um conjunto de resultados de uma coluna e uma ou mais linhas. Esta coluna ou todas as expressões na lista devem ter o mesmo tipo de dados que a expressão a ser testada.

Syntax

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

Query

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

Result

A consulta acima irá gerar o seguinte resultado.

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

A consulta retorna registros de mytable para os alunos id 2,3 e 4.

Query

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

Result

A consulta acima irá gerar o seguinte 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

A consulta acima retorna registros de mytable onde os alunos não estão em 2,3 e 4.

Como predicado

O predicado LIKE compara a string especificada na primeira expressão para calcular o valor da string, que é referido como um valor a ser testado, com o padrão que é definido na segunda expressão para calcular o valor da string.

O padrão pode conter qualquer combinação de curingas, como -

  • Símbolo de sublinhado (_), que pode ser usado em vez de qualquer caractere único no valor a ser testado.

  • Sinal de porcentagem (%), que substitui qualquer string de zero ou mais caracteres no valor a ser testado.

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

A consulta acima irá gerar o seguinte resultado.

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

A consulta retorna registros de minha tabela daqueles alunos cujos nomes começam com 'A'.

Query

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

Result

A consulta acima irá gerar o seguinte 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

A consulta retorna registros de mytable dos alunos cujos nomes começam com 'a' como o segundo caractere.

Usando o valor NULL nas condições de pesquisa

Vamos agora entender como usar o valor NULL nas condições de pesquisa.

Syntax

Predicate  
IS [NOT] NULL

Query

select name from mytable where name is not null;

Result

A consulta acima irá gerar o seguinte resultado.

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

Aqui, o resultado é verdadeiro, então ele retorna todos os nomes da tabela.

Query

Vamos agora verificar a consulta com a condição NULL.

default> select name from mytable where name is null;

Result

A consulta acima irá gerar o seguinte resultado.

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

Explicar

Explainé usado para obter um plano de execução de consulta. Mostra a execução de um plano lógico e global de uma declaração.

Consulta de plano 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

A consulta acima irá gerar o seguinte resultado.

O resultado da consulta mostra um formato de plano lógico para a tabela fornecida. O plano lógico retorna os três resultados a seguir -

  • Lista de alvos
  • Nosso esquema
  • No esquema

Consulta de plano 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

A consulta acima irá gerar o seguinte resultado.

Aqui, o plano global mostra o ID do bloco de execução, a ordem de execução e suas informações.

Junta-se

As junções SQL são usadas para combinar linhas de duas ou mais tabelas. A seguir estão os diferentes tipos de junções SQL -

  • Junção interna
  • {LEFT | DIREITO | FULL} OUTER JOIN
  • Junção cruzada
  • Autoinserir
  • Junção natural

Considere as duas tabelas a seguir para realizar operações de junção.

Tabela 1 - Clientes

Eu iria Nome Endereço Era
1 Cliente 1 23 Old Street 21
2 Cliente 2 12 New Street 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 North Street 25

Tabela2 - pedido_cliente

Eu iria Id do pedido Id Emp
1 1 101
2 2 102
3 3 103
4 4 104
5 5 105

Vamos agora prosseguir e realizar as operações de junção SQL nas duas tabelas acima.

Junção interna

A junção interna seleciona todas as linhas de ambas as tabelas quando há uma correspondência entre as colunas em ambas as tabelas.

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

A consulta acima irá gerar o seguinte resultado.

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

A consulta corresponde a cinco linhas de ambas as tabelas. Portanto, ele retorna a idade das linhas correspondentes da primeira tabela.

União Externa Esquerda

Uma junção externa esquerda retém todas as linhas da tabela “esquerda”, independentemente de haver uma linha que corresponda à tabela “direita” ou não.

Query

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

Result

A consulta acima irá gerar o seguinte resultado.

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

Aqui, a junção externa esquerda retorna linhas de coluna de nome da tabela de clientes (esquerda) e linhas correspondentes de coluna vazia da tabela customer_order (direita).

Junção Externa Direita

Uma junção externa direita retém todas as linhas da tabela “direita”, independentemente de haver uma linha que corresponda à tabela “esquerda”.

Query

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

Result

A consulta acima irá gerar o seguinte resultado.

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

Aqui, o Right Outer Join retorna as linhas vazias da tabela customer_order (direita) e as linhas correspondentes da coluna de nome da tabela customers.

Full Outer Join

A Full Outer Join retém todas as linhas da tabela à esquerda e à direita.

Query

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

Result

A consulta acima irá gerar o seguinte resultado.

A consulta retorna todas as linhas correspondentes e não correspondentes das tabelas clientes e customer_order.

Cross Join

Isso retorna o produto cartesiano dos conjuntos de registros de duas ou mais tabelas unidas.

Syntax

SELECT *  FROM table1  CROSS JOIN table2;

Query

select orderid,name,address from customers,customer_order;

Result

A consulta acima irá gerar o seguinte resultado.

A consulta acima retorna o produto cartesiano da tabela.

União Natural

Uma junção natural não usa nenhum operador de comparação. Ele não concatena a maneira como um produto cartesiano o faz. Podemos realizar uma junção natural apenas se houver pelo menos um atributo comum entre as duas relações.

Syntax

SELECT * FROM table1 NATURAL JOIN table2;

Query

select * from customers natural join customer_order;

Result

A consulta acima irá gerar o seguinte resultado.

Aqui, há um id de coluna comum entre duas tabelas. Usando essa coluna comum, oNatural Join junta-se a ambas as tabelas.

Self Join

O SQL SELF JOIN é usado para juntar uma tabela a si mesma como se a tabela fosse duas tabelas, renomeando temporariamente pelo menos uma tabela na instrução 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

A consulta acima irá gerar o seguinte resultado.

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

A consulta associa uma tabela de clientes a si mesma.