Tutorial Oracle
Tutorial Oracle
Sub Pembahasan
- Correlated Subquery
- Exist
- Not Exist
- Any
- All
- Oracle Data Types
- Number
- Float
Oleh :
Indrawati (G41170170)
Chusnaini Nur A (G41170424)
Sonia Yuangganita S (G41170489)
Puspita Ayu APN (G41170563)
a. Oracle subquery
SELECT
MAX( list_price )
FROM
products;
Untuk memilih informasi terperinci dari produk paling mahal, kita menggunakan daftar
harga di atas (8867,99) dalam permintaan berikut:
SELECT
product_id,
product_name,
list_price
FROM
products
WHERE
list_price = 8867.99;
untuk mendapatkan informasi produk yang paling mahal kita bisa menggunakan
perntanyaan berpisah. kita bisa membuat sarang permintaan pertama di dalam yang
kedua seperti yang ditunjukkan dalam pernyataan berikut:
SELECT
product_id,
product_name,
list_price
FROM
products
WHERE
list_price = (
SELECT
MAX( list_price )
FROM
products
);
permintaan yang mengambil harga maksimum disebut subquery dan permintaan yang
memilih data produk terperinci disebut permintaan luar. Query harus diakhiri dengan
tanda kurung.
1. Berikan cara alternatif untuk meminta data yang akan membutuhkan gabungan dan
serikat yang kompleks.
2. Buat kueri kompleks lebih mudah dibaca.
3. Izinkan kueri yang kompleks disusun sedemikian rupa sehingga memungkinkan untuk
mengisolasi setiap bagian.
Oracle subquery dalam contoh klausa SELECT.
SELECT
product_name,
list_price,
ROUND(
(
SELECT
AVG( list_price )
FROM
products p1
WHERE
p1. category_id = p2.category_id
),
2
) avg_list_price
FROM
products p2
ORDER BY
product_name;
Oracle subquery dalam contoh klausa FROM
SELECT
order_id,
order_value
FROM
(
SELECT
order_id,
SUM( quantity * unit_price ) order_value
FROM
order_items
GROUP BY
order_id
ORDER BY
order_value DESC
)
WHERE
Rownum
subquery mengembalikan daftar order_id dan nilai order_id diurutkan berdasarkan nilai
order_id dalam urutan menurun.
Oracle subquery dengan contoh operator perbandingan
Subqueries yang menggunakan operator pembanding e..g,>,> =, <, <=, <>, = sering
menyertakan fungsi agregat, karena fungsi agregat mengembalikan nilai tunggal yang
dapat digunakan untuk perbandingan dalam klausa WHERE dari permintaan luar.
SELECT
product_id,
product_name,
list_price
FROM
products
WHERE
list_price > (
SELECT
AVG( list_price )
FROM
products
)
ORDER BY
product_name;
Pertama, subquery mengembalikan harga daftar rata-rata semua produk.
Kedua, permintaan luar mendapatkan produk yang harganya daftar lebih besar dari harga
daftar rata-rata yang dikembalikan oleh subquery.
Oracle subquery dengan operator IN dan NOT IN
Subquery yang menggunakan operator IN sering mengembalikan daftar nilai nol atau
lebih. Setelah subquery mengembalikan set hasil, kueri luar memanfaatkannya.
Lihat tabel karyawan, pesanan, dan order_items berikut dari sampel database.
SELECT
employee_id,
first_name,
last_name
FROM
employees
WHERE
employee_id IN(
SELECT
salesman_id
FROM
orders
INNER JOIN order_items
USING(order_id)
WHERE
status = 'Shipped'
GROUP BY
salesman_id,
EXTRACT(
YEAR
FROM
order_date
)
HAVING
SUM( quantity * unit_price ) >= 1000000
AND EXTRACT(
YEAR
FROM
order_date) = 2017
AND salesman_id IS NOT NULL
)
ORDER BY
first_name,
last_name;
dibawah ini merupakan Pernyataan menemukan semua pelanggan yang belum
melakukan pemesanan pada 2017:
SELECT
name
FROM
customers
WHERE
customer_id NOT IN(
SELECT
customer_id
FROM
orders
WHERE
EXTRACT(
YEAR
FROM
order_date) = 2017
)
ORDER BY
name;
b. Operator Oracle EXISTS adalah operator Boolean yang mengembalikan benar atau
salah. Operator EXISTS sering digunakan dengan subquery untuk menguji keberadaan
baris. Operator EXISTS mengembalikan true jika subquery mengembalikan baris, jika
tidak, mengembalikan false. Selain itu, operator EXISTS menghentikan pemrosesan
subquery setelah subquery mengembalikan baris pertama.
SELECT
name
FROM
customers c
WHERE
EXISTS (
SELECT
1
FROM
orders
WHERE
customer_id = c.customer_id
)
ORDER BY
name;
Untuk setiap pelanggan di tabel pelanggan, subquery memeriksa apakah
pelanggan muncul di tabel pesanan. Jika ya, maka operator EXISTS mengembalikan true
dan berhenti memindai tabel pesanan. Jika tidak, operator EXISTS mengembalikan false
jika subquery tidak menemukan pelanggan di tabel pesanan. Dapat disimpulkan bahwa
Oracle mengabaikan daftar pilih dalam subquery sehingga Anda dapat menggunakan
kolom, nilai literal, ekspresi, dll.
untuk setiap gudang, subquery memeriksa apakah lokasinya di AS atau tidak.
Jika ya, operator EXISTS dalam klausa WHERE mengembalikan true yang
menyebabkan kueri luar menambahkan string ', USA' ke nama gudang. Jika tidak,
pernyataan UPDATE tidak melakukan apa-apa karena kondisinya adalah klausa
WHERE salah.
Membuat table :
o Oracle EXISTS vs. IN
Operator EXISTS berhenti memindai baris setelah subquery mengembalikan baris
pertama karena ia dapat menentukan hasilnya. sedangkan operator IN harus memindai
semua baris yang dikembalikan oleh subquery untuk menyimpulkan hasilnya. Selain itu,
klausa IN tidak dapat membandingkan apa pun dengan nilai NULL, tetapi klausa
EXISTS dapat membandingkan semuanya dengan nilai NULL. Misalnya, pernyataan
pertama tidak mengembalikan baris sedangkan yang kedua mengembalikan semua baris
dari tabel pelanggan.
1 SELECT
2 *
3 FROM
4 table_name
5 WHERE
6 NOT EXISTS (subquery);
Operator [Not Exists] mengembalikan true jika subquery tidak mengembalikan baris.
Jika tidak, itu mengembalikan false.
Operator [Not Exists] mengembalikan baris dengan nilai NULL
Pernyataan berikut ini menemukan semua pelanggan yang tidak memiliki pesanan:
1 SELECT
2 name
3 FROM
4 customers
5 WHERE
6 NOT EXISTS (
7 SELECT
8 NULL
9 FROM
10 orders
11 WHERE
12 orders.customer_id = customers.customer_id
13 )
14 ORDER BY
15 name;
Pernyataan berikut ini menemukan semua pelanggan yang memiliki pesanan:
Pernyataan UPDATE
1 UPDATE
2 customers
3 SET
4 credit_limit = 0
5 WHERE
6 NOT EXISTS (
7 SELECT
8 NULL
9 FROM
10 orders
11 WHERE
12 orders.customer_id = customers.customer_id
13 AND EXTRACT (
14 YEAR
15 FROM
16 order_date
17
18 );
Pernyataan Delete
1 DELETE
2 FROM
3 customers
4 WHERE
5 NOT EXISTS (
6 SELECT
7 NULL
8 FROM
9 orders
10 WHERE
11 orders.customer_id = customers.customer_id
12 AND EXTRACT (
13 YEAR FROMorder_date
14 ) IN (
15 2016,
16 2017
17 )
18 );
1 id = NULL
Oleh karena itu, ekspresi berikut mengembalikan nilai NULL jika ada baris dalam set
hasil dari subquery adalah NULL.
1 id NOT IN (subquery)
Sebaliknya, NULL tidak memengaruhi hasil dari operator NOT EXIST karena operator
NOT EXISTS semata-mata memeriksa keberadaan baris dalam subquery:
1 SELECT
2 *
3 FROM
4 table_name
5 WHERE
6 NOT EXISTS (subquery);
Kesimpulannya, NOT EXISTS dan NOT IN berperilaku berbeda ketika ada nilai nol
yang terlibat.
Digunakan membandingkan nilai ke daftar nilai atau hasil yang disetel oleh subquery.
Subquery
1 operator ANY ( v1, v2, v3)
2
3 operator ANY ( subquery)
1 SELECT
2 *
3 FROM
4 table_name
5 WHERE
6 c > v1
7 OR c > v2
8 OR c > v3;
Untuk membandingkan nilai dengan hasil yang disetel oleh subquery, Oracle
menggunakan operator exists . Untuk mengubah kueri menjadi yang setara tanpa
menggunakan operator any. Misalnya, pernyataan berikut mengembalikan semua produk
yang daftar harganya lebih besar daripada daftar harga produk dalam kategori 1:
1 SELECT
2 product_name,
3 list_price
4 FROM
5 products
6 WHERE
7 list_price > ANY (
8 SELECT
9 list_price
10 FROM
11 products
12 WHERE
13 category_id = 1
14 )
15 ORDER BY
16 product_name;
Perhatikan bahwa jika subquery tidak mengembalikan baris, kondisi berikut ini
bernilai false:
1 SELECT
2 *
3 FROM
4 table_name
5 WHERE
6 col operator ANY (subquery);
Dalam Oracle, SOME dan operator ANY berperilaku sama persis sehingga mereka
benar-benar dipertukarkan.
1) col = ANY (daftar)
Ekspresi bernilai true jika col cocok dengan satu atau beberapa nilai dalam daftar,
misalnya:
1 SELECT
2 product_name,
3 list_price
4 FROM
5 products
6 WHERE
7 list_price = ANY (
8 2200,
9 2259.99,
10 2269.99
11 )
12 AND category_id = 1;
Ekspresi bernilai true jika col tidak cocok dengan satu atau beberapa nilai dalam daftar.
1 SELECT
2 product_name,
3 list_price
4 FROM
5 products
6 WHERE
7 list_price != ANY (
8 2200,
9 2259.99,
10 2269.99
11 )
12 AND category_id = 1
13 ORDER BY
14 list_price DESC ;
Ekspresi bernilai true jika col lebih besar dari nilai terkecil dalam daftar.
SELECT
1 product_name,
2 list_price
3 FROM
4 products
5 WHERE
7 2200,
8 2259.99,
9 2269.99
10 )
11 AND category_id = 1
12 ORDER BY
13 list_price DESC ;
14
Ekspresi bernilai true jika col lebih besar atau sama dengan nilai terkecil dalam daftar.
1 SELECT
2 product_name,
3 list_price
4 FROM
5 products
6 WHERE
8 2200,
9 2259.99,
10 2269.99
11 )
12 AND category_id = 1
13 ORDER BY
14 list_price DESC ;
5) col <APA SAJA (daftar)
Ekspresi bernilai true jika col lebih kecil dari nilai tertinggi dalam daftar.
1 SELECT
2 product_name,
3 list_price
4 FROM
5 products
6 WHERE
8 2200,
9 2259.99,
10 2269.99
11 )
12 AND category_id = 1
13 ORDER BY
14 list_price DESC ;
6) col <= ANY (daftar)
Ekspresi bernilai true jika col lebih kecil dari atau sama dengan nilai tertinggi dalam
daftar.
1 SELECT
2 product_name,
3 list_price
4 FROM
5 products
6 WHERE
8 2200,
9 2259.99,
10 2269.99
11 )
12 AND category_id = 1
13 ORDER BY
14 list_price DESC ;
Pengantar operator Oracle ALL
Operator Oracle ALL digunakan untuk membandingkan nilai ke daftar nilai atau hasil yang
ditetapkan oleh subquery.
Berikut ini menunjukkan sintaks dari ALL operator yang digunakan dengan daftar atau
subquery:
SELECT
*
FROM
table_name
WHERE
c > v1
AND c > v2
AND c > v3;
Jika menggunakan operator ALL untuk membandingkan nilai dengan set hasil yang
dikembalikan oleh subquery, Oracle melakukan transformasi dua langkah di bawah ini:
SELECT product_name,
list_price
FROM products
WHERE list_price > ALL
( SELECT list_price
FROM products
WHERE category_id = 1 )
ORDER BY product_name;
SELECT product_name,
list_price
FROM products p1
WHERE NOT( p1.list_price <= ANY
(SELECT list_price
FROM products p2
WHERE category_id = 1 ))
Code Data Type
ORDER BY product_name;
Jika subquery tidak mengembalikan baris, maka kondisi berikut ini bernilai benar:
Yang berarti bahwa kueri yang menggunakan kondisi di atas dalam klausa WHERE akan
mengembalikan semua baris jika subquery tidak mengembalikan baris.
SELECT
*
FROM
table_name
WHERE
col operator ALL(subquery);
Pengantar tipe data Oracle
Di Oracle, setiap nilai memiliki tipe data yang mendefinisikan sekumpulan karakteristik
untuk nilai tersebut. Karakteristik ini menyebabkan Oracle memperlakukan nilai dari satu tipe
data secara berbeda dari nilai yang lain. Oracle memiliki sejumlah tipe data bawaan yang
diilustrasikan dalam tabel berikut:
1 VARCHAR2(size [BYTE | CHAR])
1 NVARCHAR2(size)
2 NUMBER[(precision [, scale]])
8 LONG
12 DATE
21 BINARY_FLOAT
22 BINARY_DOUBLE
23 RAW(size)
24 LONG RAW
69 ROWID
96 CHAR [(size [BYTE | CHAR])]
96 NCHAR[(size)]
112 CLOB
112 NCLOB
113 BLOB
114 BFILE
180 TIMESTAMP [(fractional_seconds)]
181 TIMESTAMP [(fractional_seconds)] WITH TIME ZONE
182 INTERVAL YEAR [(year_precision)] TO MONTH
183 INTERVAL DAY [(day_precision)] TO SECOND[(fractional_seconds)]
208 UROWID [(size)]
231 TIMESTAMP [(fractional_seconds)] WITH LOCAL TIMEZONE
Setiap tipe data memiliki kode yang dikelola secara internal oleh Oracle. Untuk menemukan
kode tipe data nilai dalam kolom, Anda menggunakan fungsi DUMP ().
Tipe data NCHAR dan NVARCHAR2 adalah untuk menyimpan string karakter Unicode.
Tipe data NUMBER memiliki presisi p dan skala s. Presisi berkisar dari 1 hingga 38
sedangkan skala berkisar dari -84 hingga 127.
Jika tidak menentukan presisi, kolom dapat menyimpan nilai termasuk angka titik tetap dan
titik mengambang. Nilai default untuk skala adalah nol.
Jenis data interval adalah INTERVAL YEAR TO MONTH dan INTERVAL DAY TO
SECOND. Nilai tipe data interval adalah interval.
Jenis data RAW dan PANJANG RAW adalah untuk menyimpan data biner atau string byte
misalnya, konten dokumen, file suara, dan file video.
Tipe data RAW dapat menyimpan hingga 2000 byte sementara tipe data PANJANG RAW
dapat menyimpan hingga 2GB.
Datatype BFILE
Tipe data BFILE menyimpan locator ke file biner besar yang terletak di luar database.
Locator terdiri dari direktori dan nama file.
Datatype BLOB
BLOB singkatan dari objek besar biner. Anda menggunakan tipe data BLOB untuk
menyimpan objek biner dengan ukuran maksimum (4 gigabytes - 1) * (ukuran blok database).
Datatype CLOB
CLOB adalah singkatan dari character big object. Anda menggunakan CLOB untuk
menyimpan karakter single-byte atau multibyte dengan ukuran maksimum adalah (4
gigabytes - 1) * (ukuran blok basis data).
Datatype NCLOB
Datatype UROWID
UROWID terutama untuk nilai-nilai yang dikembalikan oleh pseudo-kolom ROWID.
Nilainya adalah string 64 basis yang mewakili alamat unik baris dalam tabel.
Saat menggunakan tipe data ANSI untuk definisi kolom, Oracle akan mengonversi ke tipe
data terkait di Oracle berdasarkan tab pemetaan berikut
Example :
Presisi dan skala dalam digit desimal dan opsional. Jika melewatkan presisi dan skala,
Oracle menggunakan kisaran maksimum dan presisi untuk nomor tersebut. Misalnya,
formulir berikut mendefinisikan angka yang dapat menyimpan nilai numerik dengan
rentang dan presisi maksimum:
Pernyataan perikut membuat tabel bernama number_demo yang terdiri dari kolom
numerik :
Berikut yang menyebabkan kesalahan karena nilai yang dimasukkan melebihi presisi
yang telah ditentukan untuk kolom
Dalam contoh diatas yaitu dibulatkan keatas yang menghasilkan angka yang melebihi
presisi yang ditentukan oleh kolom.
Berikut yang dapat digunakan untuk mendefinisikan kolom angka seperti dibawah ini
Int, Smallint, Numeric, dan Decimal bukan tipe data nyata. Secara internal, oracle
memetakan ke tipe data number sesuai.
Oracle Float
Tipe data oracle float adalah subtipe dari tipe data number. Tujuannya adalah untuk
memfasilitasi kompatibilitas dengan tipe data ANSI SQL float
Hanya mennentukan presisi untuk tipe data float , oracle database menerjemahkan skala
dari data sehingga tidak dapat menentukan skala. Ketepatan maksimum ffloat adalah 126
Dalam float ketepatan dalam bit biner, sedangkan dalam number presesi dalam angka
desimal. Rumus untuk mengkonversi antara presisi biner dan desimal:
Maksimum 126 digit presisi biner kira kira sama dengan 38 digit presisi desimal.
Dalam contoh diatas fi, f2, dan f3 adalah float(1), float(4), dan float(7). Jadi presisi yang
sesuai dengan angka desimal kolom f1, f2, dan f3 adalah 1(1 * 0,30103), 2(4 * 0,30203),
dan 3 (7 * 0,30203).