5.5) Explain how the GROUP BY clause works. What is the difference between the WHERE and HAVING clauses?
5.6) What is the difference between a subquery and a join? Under what circumstances would you not be able to use a subquery?
Jawab :
5.5 Group by : untuk mengelompokan field dan menyertakan fungsi agregasi; mengurutkan berdasarkan kolom
Where : untuk menentukan syarat/kondisi dalam memanipulasi data
Having : untuk memberikan syarat pada fungsi-fungsi agregat; seperti max,min,avg,sum,count. Dan having harus digunakan bersama dengan group by.
Perbedaan where dan having adalah where digunakan untuk menentukan syarat pada kondisi biasa(non-aggregate), sedangkan having untuk menetukan syarat pada kondisi yang menggunakan aggregate.
5.6 Subqueries : Subquery adalah query yang berada di query lain contohnya query SELECT, INSERT, UPDATE, atau DELETE, subquery juga bisa terdapat di dalam subquery lain. Subquery dapat digunakan dibagian manapun dari query.
Join : Join digunakan untuk menggabungkan dua atau lebih tabel secara horizontal. join dibedakan menjadi beberapa macam, antara lain:
a.) Inner join
Jika kita hanya menuliskan ‘join’ saja, maka defautnya adalah inner join. Inner join akan menggabungkan 2 tabel, yang mempunyai nilai yang sama (dengan kata lain hanya akan menggabungkan data yang nilainya ada di KEDUA tabel yang di-inner join kan)
Sintaks :
SELECT field1, field2, field3
FROM first_table
INNER JOIN second_table
ON first_table.keyfield = second_table.foreign_keyfield
b.) Left join
Akan menggabungkan dua tabel, tetapi mengacu pada tabel yang ada di sebelah kiri (tabel pertama). asal nilai dari data tersebut ada di tabel pertama, maka data tersebut akan ditampilkan, walaupun nilai dari data tersebut tidak ada di tabel kedua.
Sintaks :
SELECT field1, field2, field3
FROM first_table
LEFT JOIN second_table
ON first_table.keyfield = second_table.foreign_keyfield
c.) Right join
Kebalikan dari left join. right join ini akan menampilkan data - data yang mengacu pada tabel di sebelah kanan (tabel kedua). asal nilai dari data tersebut ada di tabel kedua, maka data tersebut akan ditampilkan, walaupun nilainya tidak ada di tabel pertama.
Sintaks :
SELECT field1, field2, field3
FROM first_table
RIGHT JOIN second_table
ON first_table.keyfield = second_table.foreign_keyfield
d.) Full join
Jika inner join hanya menampilkan data-data yang bernilai sama dikedua tabel, left join hanya mengacu pada tabel pertama dan right join mengacu pada tabel kedua, maka full join ini akan menampilkan data-data hasil gabungan dari kedua tabel tersebut, tanpa memperdulikan apakah nilai dari data tersebut hanya ada di sebelah kanan, sebelah kiri, ataupun tidak.
contohnya:
ada dua tabel, tabel pelanggan dan tabel beli
isi dari tabel pelanggan:

Isi dari tabel Beli :

Query create :
create table pelanggan
(
Nama varchar(50),
umur int
)
create table beli
(
Nama varchar(50),
Banyak int
)
insert into Pelanggan values(‘Marlene’,20)
insert into Pelanggan values(‘Dennise’,17)
insert into Pelanggan values(‘Alvin’,29)
insert into Pelanggan values(‘Hadi’,40)
insert into Beli values(‘Alvin’,200)
insert into Beli values(‘Hadi’,50)
insert into Beli values(‘Marlene’,100)
Pertanyaan :
a. Gabungkan dua tabel dengan inner join
select* from pelanggan p inner join beli b
on p.nama = b.nama
hasilnya:
Nama
|
Umur
|
Nama
|
Banyak
|
Marlene
|
20
|
Marlene
|
100
|
Alvin
|
29
|
Alvin
|
200
|
Hadi
|
40
|
Hadi
|
50
|
Dengan inner join kita menggabungkan tabel pelanggan dan tabel beli yang dihubungkan oleh foreign key nama. Dapat kita lihat, dengan inner join, maka data yang ditampilkan hanyalah data yang nilainya ada di tabel pelanggan dan tabel beli. Hartini dan Norman yang tidak ada di tabel beli, tidak ditampilkan.
b. Gabungkan dua tabel dengan left join
select* from pelanggan p left join beli b
on p.nama = b.nama
hasilnya:
Nama
|
Umur
|
Nama
|
Banyak
|
Marlene
|
20
|
Marlene
|
100
|
Dennise
|
20
|
NULL
|
NULL
|
Alvin
|
20
|
Alvin
|
200
|
Hadi
|
20
|
Hadi
|
50
|
Left join akan menggabungkan tabel dengan mengacu pada tabel yg pertama(tabel pelanggan). sehingga semua data yg ada di tabel pelanggan akan ditampilkan, walaupun data tersebut tidak ada nilainya di tabel beli, nilainya akan diisi dengan NULL
c. gabungkan dua tabel dengan right join
select* from pelanggan p right join beli b
on p.nama = b.nama
Nama
|
Umur
|
Nama
|
Banyak
|
Alvin
|
20
|
Alvin
|
200
|
Hadi
|
20
|
Hadi
|
50
|
Marlene
|
20
|
Marlene
|
100
|
hasilnya :
Right join akan menggabungkan tabel dengan mengacu pada tabel yg kedua(tabel beli). Sehingga, semua data yg ada di tabel beli akan ditampilkan. Walaupun data tersebut tidak ada nilainya di tabel pelanggan, nilainya akan diisi dengan NULL. tapi dalam kondisi ini, semua data yang ada di tabel beli ada di tabel pelanggan, sehingga tidak ada data yg bernilai NULL.
d. Gabungkan dua tabel dengan full join
select* from pelanggan p full join beli b
on p.nama = b.nama
hasilnya:
Nama
|
Umur
|
Nama
|
Banyak
|
Marlene
|
20
|
Marlene
|
100
|
Dennise
|
20
|
NULL
|
NULL
|
Alvin
|
20
|
Alvin
|
200
|
Hadi
|
20
|
Hadi
|
50
|
Full join akan menggabungkan tabel tanpa mengacu pada tabel manapun. sehingga semua data akan ditampilkan, walaupun data tersebut ada nilainya di tabel beli, tapi tidak ada nilainya di tabel pelanggan, nilainya akan diisi dengan NULL, demikian juga bila data tersebut hanya ada nilainya di tabel pelanggan, tidak tapi dalam tabel beli. Namun kondisi ini, semua data yang ada di tabel beli ada di tabel pelanggan, sehingga full join terlihat berfungsi seperti left join.