全部产品
Search
文档中心

MaxCompute:Urutan Eksekusi Klausa dalam Pernyataan SELECT

更新时间:Jul 02, 2025

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:

  • select

  • from

  • where

  • group by

  • having

  • window

  • qualify

  • order by

  • distribute by

  • sort by

  • limit

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.

    Catatan

    Jika 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:

    1. Mengambil data yang memenuhi kondisi (WHERE total_price > 100) dari tabel sale_detail (FROM sale_detail).

    2. Mengelompokkan data yang diperoleh dari Langkah a berdasarkan nilai kolom region (GROUP BY).

    3. Mengambil data kelompok yang jumlah total_price-nya lebih besar dari 305 dari data yang diperoleh dari Langkah b (HAVING sum(total_price)>305).

    4. Memperoleh nilai maksimum kolom total_price di setiap region (SELECT region,max(total_price)) dari data yang diperoleh dari Langkah c.

    5. Mengurutkan data yang diperoleh dari Langkah d berdasarkan nilai kolom region (ORDER BY region).

    6. 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:

    1. Mengambil data yang memenuhi kondisi (WHERE total_price > 100.2) dari tabel sale_detail (FROM sale_detail).

    2. Mengambil data dari data yang diperoleh dari Langkah a berdasarkan nilai kolom nama toko, harga total, dan wilayah (SELECT shop_name, total_price, region).

    3. Melakukan partisi hash pada data yang diperoleh dari Langkah b berdasarkan nilai kolom region (DISTRIBUTE BY region).

    4. Mengurutkan data yang diperoleh dari Langkah c secara menaik berdasarkan nilai kolom total_price (SORT BY total_price).