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.