Apache Tajo - Kueri SQL
Bab ini menjelaskan tentang Kueri penting berikut.
- Predicates
- Explain
- Join
Mari kita lanjutkan dan lakukan kueri.
Predikat
Predikat adalah ekspresi yang digunakan untuk mengevaluasi nilai benar / salah dan TIDAK DIKETAHUI. Predikat digunakan dalam kondisi pencarian klausa WHERE dan klausa HAVING serta konstruksi lain yang memerlukan nilai Boolean.
DI predikat
Menentukan apakah nilai ekspresi yang akan diuji cocok dengan nilai apa pun di subkueri atau daftar. Subquery adalah pernyataan SELECT biasa yang memiliki kumpulan hasil dari satu kolom dan satu atau lebih baris. Kolom ini atau semua ekspresi dalam daftar harus memiliki tipe data yang sama dengan ekspresi yang akan diuji.
Syntax
IN::=
<expression to test> [NOT] IN (<subquery>)
| (<expression1>,...)
Query
select id,name,address from mytable where id in(2,3,4);
Result
Kueri di atas akan menghasilkan hasil sebagai berikut.
id, name, address
-------------------------------
2, Amit, 12 old street
3, Bob, 10 cross street
4, David, 15 express avenue
Kueri mengembalikan rekaman dari mytable untuk siswa id 2,3 dan 4.
Query
select id,name,address from mytable where id not in(2,3,4);
Result
Kueri di atas akan menghasilkan hasil sebagai berikut.
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
Kueri di atas mengembalikan rekaman dari mytable dimana siswa tidak berada di 2,3 dan 4.
Seperti Predikat
Predikat LIKE membandingkan string yang ditentukan dalam ekspresi pertama untuk menghitung nilai string, yang dirujuk sebagai nilai untuk diuji, dengan pola yang ditentukan dalam ekspresi kedua untuk menghitung nilai string.
Polanya mungkin berisi kombinasi karakter pengganti seperti -
Simbol garis bawah (_), yang dapat digunakan sebagai pengganti karakter tunggal apa pun dalam nilai untuk diuji.
Tanda persen (%), yang menggantikan string apa pun yang tidak memiliki karakter atau lebih dalam nilai yang akan diuji.
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
Kueri di atas akan menghasilkan hasil sebagai berikut.
id, name, address, age, mark
-------------------------------
1, Adam, 23 new street, 12, 90
2, Amit, 12 old street, 13, 95
Kueri mengembalikan catatan dari mytable siswa yang namanya dimulai dengan 'A'.
Query
select * from mytable where name like ‘_a%';
Result
Kueri di atas akan menghasilkan hasil sebagai berikut.
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
Kueri mengembalikan rekaman dari mytable dari siswa yang namanya diawali dengan 'a' sebagai karakter kedua.
Menggunakan Nilai NULL dalam Kondisi Pencarian
Mari kita sekarang memahami bagaimana menggunakan Nilai NULL dalam kondisi pencarian.
Syntax
Predicate
IS [NOT] NULL
Query
select name from mytable where name is not null;
Result
Kueri di atas akan menghasilkan hasil sebagai berikut.
name
-------------------------------
Adam
Amit
Bob
David
Esha
Ganga
Jack
Leena
Mary
Peter
(10 rows, 0.076 sec, 163 B selected)
Di sini, hasilnya benar sehingga mengembalikan semua nama dari tabel.
Query
Sekarang mari kita periksa query dengan kondisi NULL.
default> select name from mytable where name is null;
Result
Kueri di atas akan menghasilkan hasil sebagai berikut.
name
-------------------------------
(0 rows, 0.068 sec, 0 B selected)
Menjelaskan
Explaindigunakan untuk mendapatkan rencana eksekusi kueri. Ini menunjukkan eksekusi rencana logis dan global dari sebuah pernyataan.
Kueri Rencana Logis
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
Kueri di atas akan menghasilkan hasil sebagai berikut.
Hasil kueri menunjukkan format rencana logis untuk tabel yang diberikan. Rencana Logis mengembalikan tiga hasil berikut -
- Daftar target
- Skema keluar
- Dalam skema
Kueri Rencana 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
Kueri di atas akan menghasilkan hasil sebagai berikut.
Di sini, rencana Global menunjukkan ID blok eksekusi, urutan eksekusi, dan informasinya.
Bergabung
Gabungan SQL digunakan untuk menggabungkan baris dari dua atau lebih tabel. Berikut ini adalah jenis-jenis SQL Joins -
- Bergabung batin
- {KIRI | KANAN | FULL} OUTER GABUNG
- Bergabung silang
- Bergabung sendiri
- Gabungan alami
Pertimbangkan dua tabel berikut untuk melakukan operasi penggabungan.
Tabel1 - Pelanggan
Indo | Nama | Alamat | Usia |
---|---|---|---|
1 | Pelanggan 1 | 23 Old Street | 21 |
2 | Pelanggan 2 | 12 Jalan Baru | 23 |
3 | Pelanggan 3 | 10 Express Avenue | 22 |
4 | Pelanggan 4 | 15 Express Avenue | 22 |
5 | Pelanggan 5 | 20 Garden Street | 33 |
6 | Pelanggan 6 | 21 North Street | 25 |
Tabel2 - pesanan_pelanggan
Indo | Id pemesanan | Id Emp |
---|---|---|
1 | 1 | 101 |
2 | 2 | 102 |
3 | 3 | 103 |
4 | 4 | 104 |
5 | 5 | 105 |
Sekarang mari kita lanjutkan dan lakukan operasi gabungan SQL pada dua tabel di atas.
Gabung Batin
Gabungan dalam memilih semua baris dari kedua tabel saat ada kecocokan antara kolom di kedua tabel.
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
Kueri di atas akan menghasilkan hasil sebagai berikut.
age, empid
-------------------------------
21, 101
23, 102
22, 103
22, 104
33, 105
Kueri cocok dengan lima baris dari kedua tabel. Oleh karena itu, ia mengembalikan usia baris yang cocok dari tabel pertama.
Gabung Luar Kiri
Gabungan luar kiri mempertahankan semua baris dari tabel "kiri", terlepas dari apakah ada baris yang cocok dengan tabel "kanan" atau tidak.
Query
select c.name,c1.empid from customers c left outer join customer_order c1 on c.id = c1.id;
Result
Kueri di atas akan menghasilkan hasil sebagai berikut.
name, empid
-------------------------------
customer1, 101
customer2, 102
customer3, 103
customer4, 104
customer5, 105
customer6,
Di sini, left outer join mengembalikan baris kolom nama dari tabel pelanggan (kiri) dan kolom kosong yang cocok dengan baris dari tabel customer_order (kanan).
Gabung Luar Kanan
Gabungan kanan luar mempertahankan semua baris dari tabel "kanan", terlepas dari apakah ada baris yang cocok pada tabel "kiri".
Query
select c.name,c1.empid from customers c right outer join customer_order c1 on c.id = c1.id;
Result
Kueri di atas akan menghasilkan hasil sebagai berikut.
name, empid
-------------------------------
customer1, 101
customer2, 102
customer3, 103
customer4, 104
customer5, 105
Di sini, Right Outer Join mengembalikan baris kosong dari tabel customer_order (kanan) dan kolom nama cocok dengan baris dari tabel customers.
Gabung Luar Penuh
Gabungan Luar Penuh mempertahankan semua baris dari tabel kiri dan kanan.
Query
select * from customers c full outer join customer_order c1 on c.id = c1.id;
Result
Kueri di atas akan menghasilkan hasil sebagai berikut.
Kueri mengembalikan semua baris yang cocok dan tidak cocok dari tabel pelanggan dan tabel customer_order.
Gabung Silang
Ini mengembalikan produk Cartesian dari kumpulan rekaman dari dua atau lebih tabel yang digabungkan.
Syntax
SELECT * FROM table1 CROSS JOIN table2;
Query
select orderid,name,address from customers,customer_order;
Result
Kueri di atas akan menghasilkan hasil sebagai berikut.
Kueri di atas mengembalikan produk Cartesian dari tabel.
Bergabung Alami
A Natural Join tidak menggunakan operator perbandingan apa pun. Ini tidak menggabungkan seperti yang dilakukan produk Cartesian. Kita dapat melakukan Gabung Alami hanya jika ada setidaknya satu atribut umum yang ada di antara dua relasi.
Syntax
SELECT * FROM table1 NATURAL JOIN table2;
Query
select * from customers natural join customer_order;
Result
Kueri di atas akan menghasilkan hasil sebagai berikut.
Di sini, ada satu id kolom umum yang ada di antara dua tabel. Menggunakan kolom umum itu, fileNatural Join menggabungkan kedua tabel.
Bergabung Sendiri
SQL SELF JOIN digunakan untuk menggabungkan tabel ke tabel itu sendiri seolah-olah tabel adalah dua tabel, untuk sementara mengganti nama setidaknya satu tabel dalam pernyataan 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
Kueri di atas akan menghasilkan hasil sebagai berikut.
id, name
-------------------------------
1, customer1
2, customer2
3, customer3
4, customer4
5, customer5
6, customer6
Kueri menggabungkan tabel pelanggan itu sendiri.