Apache Tajo - zapytania SQL
W tym rozdziale wyjaśniono następujące ważne zapytania.
- Predicates
- Explain
- Join
Przejdźmy dalej i wykonajmy zapytania.
Predykaty
Predykat jest wyrażeniem używanym do obliczania wartości prawda / fałsz i NIEZNANY. Predykaty są używane w warunku wyszukiwania klauzul WHERE i HAVING oraz w innych konstrukcjach, w których wymagana jest wartość logiczna.
Predykat IN
Określa, czy wartość wyrażenia do przetestowania pasuje do dowolnej wartości w podzapytaniu lub na liście. Podzapytanie to zwykła instrukcja SELECT, która ma zestaw wyników składający się z jednej kolumny i co najmniej jednego wiersza. Ta kolumna lub wszystkie wyrażenia na liście muszą mieć ten sam typ danych co testowane wyrażenie.
Syntax
IN::=
<expression to test> [NOT] IN (<subquery>)
| (<expression1>,...)
Query
select id,name,address from mytable where id in(2,3,4);
Result
Powyższe zapytanie wygeneruje następujący wynik.
id, name, address
-------------------------------
2, Amit, 12 old street
3, Bob, 10 cross street
4, David, 15 express avenue
Zapytanie zwraca rekordy z mytable dla uczniów id 2, 3 i 4.
Query
select id,name,address from mytable where id not in(2,3,4);
Result
Powyższe zapytanie wygeneruje następujący wynik.
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
Powyższe zapytanie zwraca rekordy z mytable gdzie uczniowie nie są w 2,3 i 4.
Podobnie jak Predicate
Predykat LIKE porównuje ciąg określony w pierwszym wyrażeniu w celu obliczenia wartości ciągu, która jest określana jako wartość do przetestowania, ze wzorcem zdefiniowanym w drugim wyrażeniu w celu obliczenia wartości ciągu.
Wzorzec może zawierać dowolną kombinację symboli wieloznacznych, takich jak -
Symbol podkreślenia (_), którego można użyć zamiast dowolnego pojedynczego znaku w testowanej wartości.
Znak procentu (%), który zastępuje dowolny ciąg zera lub więcej znaków w testowanej wartości.
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
Powyższe zapytanie wygeneruje następujący wynik.
id, name, address, age, mark
-------------------------------
1, Adam, 23 new street, 12, 90
2, Amit, 12 old street, 13, 95
Zapytanie zwraca rekordy z mytable tych uczniów, których imiona zaczynają się na literę „A”.
Query
select * from mytable where name like ‘_a%';
Result
Powyższe zapytanie wygeneruje następujący wynik.
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
Zapytanie zwraca rekordy z mytable tych uczniów, których imiona zaczynają się od „a” jako drugiego znaku.
Używanie wartości NULL w warunkach wyszukiwania
Zrozummy teraz, jak używać wartości NULL w warunkach wyszukiwania.
Syntax
Predicate
IS [NOT] NULL
Query
select name from mytable where name is not null;
Result
Powyższe zapytanie wygeneruje następujący wynik.
name
-------------------------------
Adam
Amit
Bob
David
Esha
Ganga
Jack
Leena
Mary
Peter
(10 rows, 0.076 sec, 163 B selected)
Tutaj wynik jest prawdziwy, więc zwraca wszystkie nazwy z tabeli.
Query
Sprawdźmy teraz zapytanie z warunkiem NULL.
default> select name from mytable where name is null;
Result
Powyższe zapytanie wygeneruje następujący wynik.
name
-------------------------------
(0 rows, 0.068 sec, 0 B selected)
Wyjaśnić
Explainsłuży do uzyskania planu wykonania zapytania. Przedstawia logiczny i globalny plan wykonania instrukcji.
Zapytanie dotyczące planu logicznego
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
Powyższe zapytanie wygeneruje następujący wynik.
Wynik zapytania przedstawia logiczny format planu dla danej tabeli. Plan logiczny zwraca następujące trzy wyniki -
- Lista docelowa
- Nasz schemat
- W schemacie
Zapytanie dotyczące planu globalnego
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
Powyższe zapytanie wygeneruje następujący wynik.
Tutaj plan globalny pokazuje identyfikator bloku wykonania, kolejność wykonywania i informacje o nim.
Łączy
Łączenia SQL służą do łączenia wierszy z dwóch lub więcej tabel. Poniżej przedstawiono różne typy połączeń SQL -
- Połączenie wewnętrzne
- {LEFT | PRAWO | FULL} OUTER JOIN
- Łączenie krzyżowe
- Dołącz do siebie
- Połączenie naturalne
Aby wykonać operacje łączenia, rozważ poniższe dwie tabele.
Tabela 1 - Klienci
ID | Nazwa | Adres | Wiek |
---|---|---|---|
1 | Klient 1 | 23 Old Street | 21 |
2 | Klient 2 | 12 New Street | 23 |
3 | Klient 3 | 10 Express Avenue | 22 |
4 | Klient 4 | 15 Express Avenue | 22 |
5 | Klient 5 | 20 Garden Street | 33 |
6 | Klient 6 | 21 North Street | 25 |
Table2 - customer_order
ID | Identyfikator zamówienia | Emp Id |
---|---|---|
1 | 1 | 101 |
2 | 2 | 102 |
3 | 3 | 103 |
4 | 4 | 104 |
5 | 5 | 105 |
Przejdźmy teraz i wykonajmy operacje łączenia SQL na dwóch powyższych tabelach.
Połączenie wewnętrzne
Sprzężenie wewnętrzne wybiera wszystkie wiersze z obu tabel, gdy istnieje zgodność między kolumnami w obu tabelach.
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
Powyższe zapytanie wygeneruje następujący wynik.
age, empid
-------------------------------
21, 101
23, 102
22, 103
22, 104
33, 105
Zapytanie dopasowuje pięć wierszy z obu tabel. W związku z tym zwraca wiek dopasowanych wierszy z pierwszej tabeli.
Lewe połączenie zewnętrzne
Lewe sprzężenie zewnętrzne zachowuje wszystkie wiersze „lewej” tabeli, niezależnie od tego, czy istnieje wiersz, który pasuje do „prawej” tabeli, czy nie.
Query
select c.name,c1.empid from customers c left outer join customer_order c1 on c.id = c1.id;
Result
Powyższe zapytanie wygeneruje następujący wynik.
name, empid
-------------------------------
customer1, 101
customer2, 102
customer3, 103
customer4, 104
customer5, 105
customer6,
W tym przypadku lewe sprzężenie zewnętrzne zwraca wiersze kolumn nazw z tabeli klientów (po lewej) i wiersze dopasowane do kolumn empid z tabeli customer_order (po prawej).
Prawe połączenie zewnętrzne
Prawe sprzężenie zewnętrzne zachowuje wszystkie wiersze „prawej” tabeli, niezależnie od tego, czy istnieje wiersz, który pasuje do „lewej” tabeli.
Query
select c.name,c1.empid from customers c right outer join customer_order c1 on c.id = c1.id;
Result
Powyższe zapytanie wygeneruje następujący wynik.
name, empid
-------------------------------
customer1, 101
customer2, 102
customer3, 103
customer4, 104
customer5, 105
W tym przypadku prawe sprzężenie zewnętrzne zwraca empid wiersze z tabeli customer_order (po prawej) i wiersze zgodne z kolumną nazwy z tabeli klientów.
Pełne połączenie zewnętrzne
Pełne łączenie zewnętrzne zachowuje wszystkie wiersze z lewej i prawej tabeli.
Query
select * from customers c full outer join customer_order c1 on c.id = c1.id;
Result
Powyższe zapytanie wygeneruje następujący wynik.
Zapytanie zwraca wszystkie pasujące i niepasujące wiersze zarówno z tabel customer, jak i customer_order.
Łączenie krzyżowe
Zwraca iloczyn kartezjański zestawów rekordów z dwóch lub więcej połączonych tabel.
Syntax
SELECT * FROM table1 CROSS JOIN table2;
Query
select orderid,name,address from customers,customer_order;
Result
Powyższe zapytanie wygeneruje następujący wynik.
Powyższe zapytanie zwraca iloczyn kartezjański tabeli.
Połączenie naturalne
Naturalne łączenie nie używa żadnego operatora porównania. Nie łączy się w sposób, w jaki robi to produkt kartezjański. Możemy wykonać sprzężenie naturalne tylko wtedy, gdy istnieje co najmniej jeden wspólny atrybut, który istnieje między dwiema relacjami.
Syntax
SELECT * FROM table1 NATURAL JOIN table2;
Query
select * from customers natural join customer_order;
Result
Powyższe zapytanie wygeneruje następujący wynik.
Tutaj istnieje jeden wspólny identyfikator kolumny, który istnieje między dwiema tabelami. Korzystając z tej wspólnej kolumny, plikNatural Join łączy oba stoły.
Dołącz do siebie
SQL SELF JOIN służy do łączenia tabeli ze sobą, tak jakby była to dwie tabele, tymczasowo zmieniając nazwę przynajmniej jednej tabeli w instrukcji 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
Powyższe zapytanie wygeneruje następujący wynik.
id, name
-------------------------------
1, customer1
2, customer2
3, customer3
4, customer4
5, customer5
6, customer6
Zapytanie łączy ze sobą tabelę klientów.