Klausa dalam pernyataan SELECT yang ditulis sesuai sintaks SELECT dari MaxCompute dieksekusi dalam urutan berbeda dibandingkan klausa dalam pernyataan SELECT standar. Topik ini menjelaskan urutan eksekusi klausa dalam pernyataan SELECT MaxCompute dan memberikan contoh untuk referensi.
Urutan Eksekusi Klausa dalam Pernyataan SELECT
Sintaks SELECT mencakup klausa-klausa berikut:
selectfromwheregroup byhavingwindowqualifyorder bydistribute bysort bylimit
Klausa berikut tidak dapat digunakan bersamaan dengan DISTRIBUTE BY atau SORT BY: ORDER BY dan GROUP BY. Anda dapat mengeksekusi klausa dalam pernyataan SELECT dalam salah satu urutan berikut:
Urutan 1:
FROM>WHERE>GROUP BY>HAVING>SELECT>ORDER BY>LIMIT.Urutan 2:
FROM>WHERE>SELECT>DISTRIBUTE BY>SORT BY.
Untuk menghindari kebingungan, MaxCompute memungkinkan Anda menulis pernyataan SELECT dalam urutan di atas. Sintaks pernyataan SELECT dapat diubah menjadi bentuk berikut:
from <table_reference>
[where <where_condition>]
[group by <col_list>]
[having <having_condition>]
[window <window_name> AS (<window_definition>)]
[qualify <expression>]
select [all | distinct] <select_expr>, <select_expr>, ...
[order by <order_condition>]
[distribute by <distribute_condition> [sort by <sort_condition>] ]
[limit <number>]Data Contoh
Data sumber contoh disediakan untuk membantu Anda lebih memahami contoh-contoh dalam topik ini. Pernyataan contoh:
-- Buat tabel partisi bernama sale_detail.
create table if not exists sale_detail
(
shop_name string,
customer_id string,
total_price double
)
partitioned by (sale_date string, region string);
-- Tambahkan partisi ke tabel sale_detail.
alter table sale_detail add partition (sale_date='2013', region='china') partition (sale_date='2014', region='shanghai');
-- Masukkan data ke dalam tabel sale_detail.
insert into sale_detail partition (sale_date='2013', region='china') values ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);
insert into sale_detail partition (sale_date='2014', region='shanghai') values ('null','c5',null),('s6','c6',100.4),('s7','c7',100.5);Query data dalam tabel sale_detail. Pernyataan contoh:
set odps.sql.allow.fullscan=true;
select * from sale_detail;
-- Hasil berikut dikembalikan:
+------------+-------------+-------------+------------+------------+
| shop_name | customer_id | total_price | sale_date | region |
+------------+-------------+-------------+------------+------------+
| s1 | c1 | 100.1 | 2013 | china |
| s2 | c2 | 100.2 | 2013 | china |
| s3 | c3 | 100.3 | 2013 | china |
| null | c5 | NULL | 2014 | shanghai |
| s6 | c6 | 100.4 | 2014 | shanghai |
| s7 | c7 | 100.5 | 2014 | shanghai |
+------------+-------------+-------------+------------+------------+Contoh
Contoh 1: Klausa dalam pernyataan SELECT dieksekusi dalam Urutan 1.
CatatanJika Anda mengeksekusi pernyataan berikut untuk mengquery data dari tabel partisi, Anda harus menambahkan
set odps.sql.allow.fullscan=true;sebelum pernyataan tersebut untuk mengaktifkan pemindaian tabel penuh atau menentukan partisi dalam pernyataan.-- Tulis pernyataan SELECT berdasarkan sintaks SELECT. set odps.sql.allow.fullscan=true; select region,max(total_price) from sale_detail where total_price > 100 group by region having sum(total_price)>300.5 order by region limit 5; -- Tulis pernyataan SELECT berdasarkan Urutan 1. Pernyataan berikut setara dengan pernyataan sebelumnya. from sale_detail where total_price > 100 group by region having sum(total_price)>300.5 select region,max(total_price) order by region limit 5;Hasil berikut dikembalikan:
+------------+------------+ | region | _c1 | +------------+------------+ | china | 100.3 | +------------+------------+Logika eksekusi klausa dalam pernyataan SELECT:
Mengambil data yang memenuhi kondisi (
WHERE total_price > 100) dari tabel sale_detail (FROM sale_detail).Mengelompokkan data yang diperoleh dari Langkah a berdasarkan nilai kolom region (
GROUP BY).Mengambil data kelompok yang jumlah total_price-nya lebih besar dari 305 dari data yang diperoleh dari Langkah b (
HAVING sum(total_price)>305).Memperoleh nilai maksimum kolom total_price di setiap region (
SELECT region,max(total_price)) dari data yang diperoleh dari Langkah c.Mengurutkan data yang diperoleh dari Langkah d berdasarkan nilai kolom region (
ORDER BY region).Menampilkan lima data pertama (
LIMIT 5) dari data yang diperoleh dari Langkah e.
Contoh 2: Klausa dalam pernyataan SELECT dieksekusi dalam Urutan 2.
-- Tulis pernyataan SELECT berdasarkan sintaks SELECT. set odps.sql.allow.fullscan=true; select shop_name ,total_price ,region from sale_detail where total_price > 100.2 distribute by region sort by total_price; -- Tulis pernyataan SELECT berdasarkan Urutan 2. Pernyataan berikut setara dengan pernyataan sebelumnya. from sale_detail where total_price > 100.2 select shop_name ,total_price ,region distribute by region sort by total_price;Hasil berikut dikembalikan:
+------------+-------------+------------+ | shop_name | total_price | region | +------------+-------------+------------+ | s3 | 100.3 | china | | s6 | 100.4 | shanghai | | s7 | 100.5 | shanghai | +------------+-------------+------------+Logika eksekusi klausa dalam pernyataan SELECT:
Mengambil data yang memenuhi kondisi (
WHERE total_price > 100.2) dari tabel sale_detail (FROM sale_detail).Mengambil data dari data yang diperoleh dari Langkah a berdasarkan nilai kolom nama toko, harga total, dan wilayah (
SELECT shop_name, total_price, region).Melakukan partisi hash pada data yang diperoleh dari Langkah b berdasarkan nilai kolom region (
DISTRIBUTE BY region).Mengurutkan data yang diperoleh dari Langkah c secara menaik berdasarkan nilai kolom total_price (
SORT BY total_price).