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.