Tutorial SQL ( Structured Query Language ) part 3
Menghilangkan Penggandaan Dengan DISTINCT
Penggunaan keyword DISTINCT hampir mirip dengan GROUP BY yaitu untuk melakukan grouping hasil pencarian. Tetapi DISTINCT hanya berfungsi menghilangkan duplikasi hasil dan tidak dapat digunakan untuk membantu melakukan berbagai perhitungan fungsi agregat.
Penerapan praktisnya misalnya anda ingin mencari negara mana saja yang yang terdapat di tabel customer.
Apabila anda menggunakan perintah SELECT saja maka akan muncul banyak duplikasi karena banyak terdapat customer yang berasal dari negara yang sama. Dengan menggunakan DISTINCT maka duplikasi tersebut dapat dihilangkan.
SELECT DISTINCT Country
FROM Customers
Cobalah bandingkan hasilnya apabila anda menggunakan perintah berikut :
SELECT Country
FROM Customers
Membatasi Group BY dengan Having
Untuk membatasi hasil yang didapat dari suatu perintah yang menggunakan GROUP BY digunakan klausa HAVING. Fungsi klausa ini mirip dengan WHERE tetapi HAVING hanya dapat digunakan bersamaan dengan klausa GROUP BY dan diletakkan sesudah GROUP BY.
Perintah berikut digunakan untuk mencari produk yang jumlah penjualannya melebihi 1000 buah di tabel Order Details.
SELECT ProductID, SUM(Quantity)as Jumlah,
FROM [Order Details]
GROUP BY ProductID
HAVING SUM(Quantity) > 1000
Apabila dijalankan maka hasilnya adalah sebagai berikut :
ProductID Jumlah
----------- --------
31 1397
62 1083
21 1016
75 1155
60 1577
Terlihat jelas bahwa yang ditampilkan hanya yang memiliki jumlah diatas 1000 sebagaimana kriteria:
HAVING SUM(Quantity) > 1000
15
Mencari Data dengan BETWEEN
Keyword BETWEEN digunakan untuk mencari data yang memenuhi interval kriteria tertentu dalam suatu kolom. Biasanya digunakan untuk mencari data berdasarkan interval tanggal tertentu.
Penggunaan praktisnya misalnya anda ingin mencari penjualan yang terjadi antara tanggal 1 Januari 2003 sampai dengan 31 Januari 2003. Keyword BETWEEN digunakan bersamaan dengan interval tanggal tersebut.
Tuliskan baris kode berikut :
USE NorthWind
SELECT OrderID, CustomerID, OrderDate
FROM Orders
WHERE OrderDate BETWEEN '07/01/1996' AND '07/31/1996'
Kode tersebut mencari data di tabel Orders yang memiliki OrderDate antara tanggal 1 Juli 1996 sampai dengan 31 Juli 1996. Setelah di run maka hasilnya adalah :
OrderID CustomerID OrderDate
----------- ---------- -----------------
10248 VINET 1996-07-04 00:00:00.000
10249 TOMSP 1996-07-05 00:00:00.000
10250 HANAR 1996-07-08 00:00:00.000
10251 VICTE 1996-07-08 00:00:00.000
10252 SUPRD 1996-07-09 00:00:00.000
10253 HANAR 1996-07-10 00:00:00.000
Selain menggunakan kriteria tanggal anda juga dapat menggunakan keyword BETWEEN tersebut untuk tipe data lain misalnya string dan numeric. Misalnya anda ingin menampilkan data customer yang diawali huruf A sampai dengan D, maka digunakan kode program berikut :
SELECT * FROM dbo.Customers
WHERE CompanyName BETWEEN 'A' AND 'D'
Menggabungkan Table
Anda telah mempelajari bagaimana menampilkan data dari database Northwind serta memfilternya dengan berbagai kriteria. Pengambilan data tersebut hanya dari satu tabel saja sehingga belum dapat menyajikan informasi lebih detil.
Perintah SQL dapat digunakan untuk menampilkan data dari 2 atau lebih tabel. Antara tabel tersebut harus memiliki penghubung yaitu Primary Key dan Foreign Key sebagaimana telah dijelaskan pada Bab 2 mengenai desain database. Dengan menggunakan kriteria penghubung tersebut anda dapat menampilkan data dari beberapa tabel secara konsisten.
Inner Join
Penggabungan tabel dalam perintah SQL menggunakan keyword JOIN. Jenis penggabungan tabel yang pertama adalah INNER JOIN. INNER JOIN hanya menampilkan data yang benar-benar terdapat di dalam tabel yang saling dihubungkan.
Misalnya anda menggabungkan tabel Customers dengan Orders, maka field penghubung yang digunakan adalah CustomerID. Perhatikan diagram berikut :
![](data:image/png;base64,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)
Pada gambar tersebut terlihat bahwa CustomerID merupakan Primary Key di tabel Customers dan menjadi Foreign Key di tabel Orders. Hubungan kedua tabel tersebut adalah One to Many, dimana satu customer dapat memiliki banyak order yang berulang.
Dalam teknik INNER JOIN maka hasil yang ditampilkan hanya record yang memiliki CustomerID sama di kedua tabel tersebut. Apabila terdapat customr yang CustomerID nya tidak ditemukan di tabel Orders maka data tersebut tidak ditampilkan.
Coba ketikkan perintah berikut di Query Analyser :
SELECT CompanyName, OrderID, OrderDate
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
Dan perhatikan hasilnya sebagai berikut :
CompanyName OrderID OrderDate
---------------------------------------- ----------- ---------
Vins et alcools Chevalier 10248 1996-07-04 00:00:00.000
Toms Spezialitäten 10249 1996-07-05 00:00:00.000
Hanari Carnes 10250 1996-07-08 00:00:00.000
Victuailles en stock 10251 1996-07-08 00:00:00.000
Suprêmes délices 10252 1996-07-09 00:00:00.000
Hanari Carnes 10253 1996-07-10 00:00:00.000
…………………………………………………………
……………………………………………………….
(830 row(s) affected)
Perintah SQL tersebut mengambil field CompanyName dari tabel Customers, sedangkan field OrderID dan OrderDate diambil dari tabel Orders. Perhatikan baik baik diagram pada gambar 3.2.
Kunci utama penggabungan dua tabel tersebut adalah keyword INNER JOIN dengan kriteria CustomerID.
Perhatikan bahwa nama tabel juga harus dituliskan sebelum nama field CustomerID tersebut.
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
Antara nama tabel dengan nama field dibatasi dengan tanda titik (.) misalnya Orders.CustomerID. Tujuan pencantuman nama tabel tersebut adalah menghindari ambiguitas yang mengakibatkan error apabila perintah tersebut dieksekusi. Karena CustomerID tersebut terdapat di kedua tabel maka nama tabel harus dicantumkan agar dapat diidentifikasi secara unik field mana yang dimaksud.
Untuk memberikan gambaran lebih kompleks mengenai penerapan penggabungan tabel ini anda dapat memodifikasi contoh perintah yang terdapat penggunaan GROUP BY. Pada perintah tersebut anda menghitung Jumlah dan rataan produk yang terjual, tetapi hanya ditampilkan ProductID saja sedangkan nama produknya tidak terlihat karena terdapat di tabel lain.
Anda dapat menggabungan tabel Order Details tersebut dengan tabel Products yang menyimpan nama produk. Dengan demikian dapat ditampilkan baik ProductID maupun nama produknya. Tuliskan baris perintah berikut :
SELECT Products.ProductID, Products.ProductName,
SUM([Order Details].Quantity) AS Jumlah,
AVG([Order Details].Quantity) AS Rataan,
SUM(Products.UnitPrice * [Order Details].Quantity)
AS Nilai,
AVG(Products.UnitPrice * [Order Details].Quantity)
AS AVGNilai
FROM Products
INNER JOIN [Order Details]
ON Products.ProductID = [Order Details].ProductID
GROUP BY Products.ProductID, Products.ProductName
Setelah dijalankan maka akan tampak hasilnya :
ProductID ProductName Jumlah Rataan Nilai AVGNilai
----------- ---------------------------------------- ---------
1 Chai 828 21 14904.0000 392.2105
2 Chang 1057 24 20083.0000 456.4318
3 Aniseed 328 27 3280.0000 273.3333
4 Chef Anton 453 22 9966.0000 498.3000
Pada perintah diatas anda dapat melihat bahwa semua nama field diawali dengan nama tabelnya. Hal ini menyebabkan penulisan kode program menjadi panjang, tetapi sisi positifnya adalah kita dapat langsung mengetahui posisi tabel dari tiap-tiap field yang ditampilkan.
Selain itu antara tabel Customers terdapat beberapa field yang namanya sama sehingga apabila tidak
dituliskan nama tabelnya berakibat error pada perintah tersebut.
LEFT JOIN dan RIGHT JOIN
Berbeda dengan INNER JOIN yang hanya menampilkan irisan data dari tabel yang digabungkan maka LEFT JOIN akan menampilkan data dari tabel yang disebutkan terlebih dahulu.
LEFT JOIN
Misalkan pada diagram gambar 3.2 diatas digunakan perintah LEFT JOIN maka apabila tabel Customers disebutkan terlebih dahulu SQL Server akan menampilkan semua nama customer yang terdapat di tabel tersebut. Semua data customer ditampilkan walaupun CustomerID nya tidak terdapat di tabel Orders.
Penggunaan praktis perintah ini misalnya anda ingin mengetahui frekuensi order semua customer baik yang telah memiliki order maupun yang belum. Untuk kebutuhan tersebut maka ditampilkan semua customer berikut data frekuensi ordernya. Perhatikan contoh perintah berikut :
SELECT Customers.CustomerID, Customers.CompanyName,
COUNT(Orders.OrderID) AS Frekuensi
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
GROUP BY Customers.CustomerID, Customers.CompanyName
ORDER BY COUNT(Orders.OrderID)
Karena menggunakan perintah LEFT JOIN maka semua data di tabel Customers ditampilkan seluruhnya walaupun frekuensi ordernya 0. Hasil perintah tersebut adalah :
CustomerID CompanyName Frekuensi
---------- ---------------------------------------- ----------
PARIS Paris spécialités 0
FISSA FISSA Fabrica Inter. Salchichas S.A. 0
CENTC Centro comercial Moctezuma 1
LAZYK Lazy K Kountry Store 2
GROSR GROSELLA-Restaurante 2
LAUGB Laughing Bacchus Wine Cellars 3
……………
……………
(91 row(s) affected)
Anda dapat melihat terdapat 2 customer yang frekuensi 0 tetapi tetap ditampilkan. Di akhir tampilan hasil tersebut terlihat ada 91 baris yang ditampikan. Untuk melakukan pengecekan jalankan perintah berikut :
SELECT COUNT(*) from dbo.Customers
maka hasilnya adalah :
-----------
91
(1 row(s) affected)
Artinya terdapat 91customer di tabel Customers, yaitu sama dengan jumlah baris di perintah sebelumnya.
Dengan demikian memang benar bahwa LEFT JOIN telah menampilkan seluruh Customer yang berjumlah 91.
RIGHT JOIN
Perintah RIGHT JOIN merupakan kebalikan dari LEFT JOIN, yaitu menampilkan semua isi tabel yang disebutkan kedua dalam perintah join. Dalam contoh di atas apabila LEFT JOIN diganti RIGHT JOIN maka semua isi tabel Orders akan ditampilkan semuanya. Cobalah memodifikasi perintah diatas menjadi sebagai berikut :
SELECT Customers.CustomerID, Customers.CompanyName,
COUNT(Orders.OrderID) AS Frekuensi
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
GROUP BY Customers.CustomerID, Customers.CompanyName
ORDER BY COUNT(Orders.OrderID)
Setelah anda jalankan perintah tersebut lihatlah perbedaaanya dengan perintah LEFT JOIN sebelumnya. Maka terlihat hanya dihasilkan 89 baris, berarti terdapat 2 customer yang CustomerID nya tidak terdapat di tabel Orders atau frekuensi ordernya = 0.
FULL JOIN
Jenis join terakhir adalah FULL JOIN yang menampilkan semua data dari dua tabel yang dihubungkan meskipun terdapat data yang tidak memiliki pasangan di tabel lainnya.
Misalnya kita mengambil data dari tabel Country dengan tabel City menggunakan FULL JOIN. Data dari kedua tabel akan ditampilkan semuanya baik untuk nama kota yang tidak memiliki data negara maupun sebaliknya.
Penggunaan keyword DISTINCT hampir mirip dengan GROUP BY yaitu untuk melakukan grouping hasil pencarian. Tetapi DISTINCT hanya berfungsi menghilangkan duplikasi hasil dan tidak dapat digunakan untuk membantu melakukan berbagai perhitungan fungsi agregat.
Penerapan praktisnya misalnya anda ingin mencari negara mana saja yang yang terdapat di tabel customer.
Apabila anda menggunakan perintah SELECT saja maka akan muncul banyak duplikasi karena banyak terdapat customer yang berasal dari negara yang sama. Dengan menggunakan DISTINCT maka duplikasi tersebut dapat dihilangkan.
SELECT DISTINCT Country
FROM Customers
Cobalah bandingkan hasilnya apabila anda menggunakan perintah berikut :
SELECT Country
FROM Customers
Membatasi Group BY dengan Having
Untuk membatasi hasil yang didapat dari suatu perintah yang menggunakan GROUP BY digunakan klausa HAVING. Fungsi klausa ini mirip dengan WHERE tetapi HAVING hanya dapat digunakan bersamaan dengan klausa GROUP BY dan diletakkan sesudah GROUP BY.
Perintah berikut digunakan untuk mencari produk yang jumlah penjualannya melebihi 1000 buah di tabel Order Details.
SELECT ProductID, SUM(Quantity)as Jumlah,
FROM [Order Details]
GROUP BY ProductID
HAVING SUM(Quantity) > 1000
Apabila dijalankan maka hasilnya adalah sebagai berikut :
ProductID Jumlah
----------- --------
31 1397
62 1083
21 1016
75 1155
60 1577
Terlihat jelas bahwa yang ditampilkan hanya yang memiliki jumlah diatas 1000 sebagaimana kriteria:
HAVING SUM(Quantity) > 1000
15
Mencari Data dengan BETWEEN
Keyword BETWEEN digunakan untuk mencari data yang memenuhi interval kriteria tertentu dalam suatu kolom. Biasanya digunakan untuk mencari data berdasarkan interval tanggal tertentu.
Penggunaan praktisnya misalnya anda ingin mencari penjualan yang terjadi antara tanggal 1 Januari 2003 sampai dengan 31 Januari 2003. Keyword BETWEEN digunakan bersamaan dengan interval tanggal tersebut.
Tuliskan baris kode berikut :
USE NorthWind
SELECT OrderID, CustomerID, OrderDate
FROM Orders
WHERE OrderDate BETWEEN '07/01/1996' AND '07/31/1996'
Kode tersebut mencari data di tabel Orders yang memiliki OrderDate antara tanggal 1 Juli 1996 sampai dengan 31 Juli 1996. Setelah di run maka hasilnya adalah :
OrderID CustomerID OrderDate
----------- ---------- -----------------
10248 VINET 1996-07-04 00:00:00.000
10249 TOMSP 1996-07-05 00:00:00.000
10250 HANAR 1996-07-08 00:00:00.000
10251 VICTE 1996-07-08 00:00:00.000
10252 SUPRD 1996-07-09 00:00:00.000
10253 HANAR 1996-07-10 00:00:00.000
Selain menggunakan kriteria tanggal anda juga dapat menggunakan keyword BETWEEN tersebut untuk tipe data lain misalnya string dan numeric. Misalnya anda ingin menampilkan data customer yang diawali huruf A sampai dengan D, maka digunakan kode program berikut :
SELECT * FROM dbo.Customers
WHERE CompanyName BETWEEN 'A' AND 'D'
Menggabungkan Table
Anda telah mempelajari bagaimana menampilkan data dari database Northwind serta memfilternya dengan berbagai kriteria. Pengambilan data tersebut hanya dari satu tabel saja sehingga belum dapat menyajikan informasi lebih detil.
Perintah SQL dapat digunakan untuk menampilkan data dari 2 atau lebih tabel. Antara tabel tersebut harus memiliki penghubung yaitu Primary Key dan Foreign Key sebagaimana telah dijelaskan pada Bab 2 mengenai desain database. Dengan menggunakan kriteria penghubung tersebut anda dapat menampilkan data dari beberapa tabel secara konsisten.
Inner Join
Penggabungan tabel dalam perintah SQL menggunakan keyword JOIN. Jenis penggabungan tabel yang pertama adalah INNER JOIN. INNER JOIN hanya menampilkan data yang benar-benar terdapat di dalam tabel yang saling dihubungkan.
Misalnya anda menggabungkan tabel Customers dengan Orders, maka field penghubung yang digunakan adalah CustomerID. Perhatikan diagram berikut :
Pada gambar tersebut terlihat bahwa CustomerID merupakan Primary Key di tabel Customers dan menjadi Foreign Key di tabel Orders. Hubungan kedua tabel tersebut adalah One to Many, dimana satu customer dapat memiliki banyak order yang berulang.
Dalam teknik INNER JOIN maka hasil yang ditampilkan hanya record yang memiliki CustomerID sama di kedua tabel tersebut. Apabila terdapat customr yang CustomerID nya tidak ditemukan di tabel Orders maka data tersebut tidak ditampilkan.
Coba ketikkan perintah berikut di Query Analyser :
SELECT CompanyName, OrderID, OrderDate
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
Dan perhatikan hasilnya sebagai berikut :
CompanyName OrderID OrderDate
---------------------------------------- ----------- ---------
Vins et alcools Chevalier 10248 1996-07-04 00:00:00.000
Toms Spezialitäten 10249 1996-07-05 00:00:00.000
Hanari Carnes 10250 1996-07-08 00:00:00.000
Victuailles en stock 10251 1996-07-08 00:00:00.000
Suprêmes délices 10252 1996-07-09 00:00:00.000
Hanari Carnes 10253 1996-07-10 00:00:00.000
…………………………………………………………
……………………………………………………….
(830 row(s) affected)
Perintah SQL tersebut mengambil field CompanyName dari tabel Customers, sedangkan field OrderID dan OrderDate diambil dari tabel Orders. Perhatikan baik baik diagram pada gambar 3.2.
Kunci utama penggabungan dua tabel tersebut adalah keyword INNER JOIN dengan kriteria CustomerID.
Perhatikan bahwa nama tabel juga harus dituliskan sebelum nama field CustomerID tersebut.
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
Antara nama tabel dengan nama field dibatasi dengan tanda titik (.) misalnya Orders.CustomerID. Tujuan pencantuman nama tabel tersebut adalah menghindari ambiguitas yang mengakibatkan error apabila perintah tersebut dieksekusi. Karena CustomerID tersebut terdapat di kedua tabel maka nama tabel harus dicantumkan agar dapat diidentifikasi secara unik field mana yang dimaksud.
Untuk memberikan gambaran lebih kompleks mengenai penerapan penggabungan tabel ini anda dapat memodifikasi contoh perintah yang terdapat penggunaan GROUP BY. Pada perintah tersebut anda menghitung Jumlah dan rataan produk yang terjual, tetapi hanya ditampilkan ProductID saja sedangkan nama produknya tidak terlihat karena terdapat di tabel lain.
Anda dapat menggabungan tabel Order Details tersebut dengan tabel Products yang menyimpan nama produk. Dengan demikian dapat ditampilkan baik ProductID maupun nama produknya. Tuliskan baris perintah berikut :
SELECT Products.ProductID, Products.ProductName,
SUM([Order Details].Quantity) AS Jumlah,
AVG([Order Details].Quantity) AS Rataan,
SUM(Products.UnitPrice * [Order Details].Quantity)
AS Nilai,
AVG(Products.UnitPrice * [Order Details].Quantity)
AS AVGNilai
FROM Products
INNER JOIN [Order Details]
ON Products.ProductID = [Order Details].ProductID
GROUP BY Products.ProductID, Products.ProductName
Setelah dijalankan maka akan tampak hasilnya :
ProductID ProductName Jumlah Rataan Nilai AVGNilai
----------- ---------------------------------------- ---------
1 Chai 828 21 14904.0000 392.2105
2 Chang 1057 24 20083.0000 456.4318
3 Aniseed 328 27 3280.0000 273.3333
4 Chef Anton 453 22 9966.0000 498.3000
Pada perintah diatas anda dapat melihat bahwa semua nama field diawali dengan nama tabelnya. Hal ini menyebabkan penulisan kode program menjadi panjang, tetapi sisi positifnya adalah kita dapat langsung mengetahui posisi tabel dari tiap-tiap field yang ditampilkan.
Selain itu antara tabel Customers terdapat beberapa field yang namanya sama sehingga apabila tidak
dituliskan nama tabelnya berakibat error pada perintah tersebut.
LEFT JOIN dan RIGHT JOIN
Berbeda dengan INNER JOIN yang hanya menampilkan irisan data dari tabel yang digabungkan maka LEFT JOIN akan menampilkan data dari tabel yang disebutkan terlebih dahulu.
LEFT JOIN
Misalkan pada diagram gambar 3.2 diatas digunakan perintah LEFT JOIN maka apabila tabel Customers disebutkan terlebih dahulu SQL Server akan menampilkan semua nama customer yang terdapat di tabel tersebut. Semua data customer ditampilkan walaupun CustomerID nya tidak terdapat di tabel Orders.
Penggunaan praktis perintah ini misalnya anda ingin mengetahui frekuensi order semua customer baik yang telah memiliki order maupun yang belum. Untuk kebutuhan tersebut maka ditampilkan semua customer berikut data frekuensi ordernya. Perhatikan contoh perintah berikut :
SELECT Customers.CustomerID, Customers.CompanyName,
COUNT(Orders.OrderID) AS Frekuensi
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
GROUP BY Customers.CustomerID, Customers.CompanyName
ORDER BY COUNT(Orders.OrderID)
Karena menggunakan perintah LEFT JOIN maka semua data di tabel Customers ditampilkan seluruhnya walaupun frekuensi ordernya 0. Hasil perintah tersebut adalah :
CustomerID CompanyName Frekuensi
---------- ---------------------------------------- ----------
PARIS Paris spécialités 0
FISSA FISSA Fabrica Inter. Salchichas S.A. 0
CENTC Centro comercial Moctezuma 1
LAZYK Lazy K Kountry Store 2
GROSR GROSELLA-Restaurante 2
LAUGB Laughing Bacchus Wine Cellars 3
……………
……………
(91 row(s) affected)
Anda dapat melihat terdapat 2 customer yang frekuensi 0 tetapi tetap ditampilkan. Di akhir tampilan hasil tersebut terlihat ada 91 baris yang ditampikan. Untuk melakukan pengecekan jalankan perintah berikut :
SELECT COUNT(*) from dbo.Customers
maka hasilnya adalah :
-----------
91
(1 row(s) affected)
Artinya terdapat 91customer di tabel Customers, yaitu sama dengan jumlah baris di perintah sebelumnya.
Dengan demikian memang benar bahwa LEFT JOIN telah menampilkan seluruh Customer yang berjumlah 91.
RIGHT JOIN
Perintah RIGHT JOIN merupakan kebalikan dari LEFT JOIN, yaitu menampilkan semua isi tabel yang disebutkan kedua dalam perintah join. Dalam contoh di atas apabila LEFT JOIN diganti RIGHT JOIN maka semua isi tabel Orders akan ditampilkan semuanya. Cobalah memodifikasi perintah diatas menjadi sebagai berikut :
SELECT Customers.CustomerID, Customers.CompanyName,
COUNT(Orders.OrderID) AS Frekuensi
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
GROUP BY Customers.CustomerID, Customers.CompanyName
ORDER BY COUNT(Orders.OrderID)
Setelah anda jalankan perintah tersebut lihatlah perbedaaanya dengan perintah LEFT JOIN sebelumnya. Maka terlihat hanya dihasilkan 89 baris, berarti terdapat 2 customer yang CustomerID nya tidak terdapat di tabel Orders atau frekuensi ordernya = 0.
FULL JOIN
Jenis join terakhir adalah FULL JOIN yang menampilkan semua data dari dua tabel yang dihubungkan meskipun terdapat data yang tidak memiliki pasangan di tabel lainnya.
Misalnya kita mengambil data dari tabel Country dengan tabel City menggunakan FULL JOIN. Data dari kedua tabel akan ditampilkan semuanya baik untuk nama kota yang tidak memiliki data negara maupun sebaliknya.
Harrah's Cherokee Casino and Hotel - Jackson County
ReplyDeleteThe Harrah's Cherokee Casino and Hotel 광주광역 출장샵 features a 광명 출장마사지 casino, a seasonal outdoor pool and live 여수 출장안마 entertainment. The casino 순천 출장안마 features over 2,300 양주 출장샵 slots,