Tüm Ürünler
Search
Belge Merkezi

MaxCompute:SELECT sözdizimi

Son Güncelleme:Oct 04, 2026

SELECT bir veya daha fazla tablodan veri sorgular. Bir SELECT deyimi çalıştırmadan önce hedef tablo üzerinde Select iznine sahip olduğunuzdan emin olun. Daha fazla bilgi için bkz. MaxCompute izinleri.

Desteklenen istemciler:

Sözdizimi

[WITH <cte>[, ...] ]
SELECT [ALL | DISTINCT] <SELECT_expr>[, <EXCEPT_expr>][, <REPLACE_expr>] ...
       FROM <TABLE_reference>
       [WHERE <WHERE_condition>]
       [GROUP BY {<col_list>|ROLLUP(<col_list>)}]
       [HAVING <HAVING_condition>]
       [WINDOW <WINDOW_clause>]
       [ORDER BY <ORDER_condition>]
       [DISTRIBUTE BY <DISTRIBUTE_condition> [SORT BY <SORT_condition>]|[ CLUSTER BY <CLUSTER_condition>] ]
       [LIMIT <number>]

Bir SELECT deyiminin yan tümcelerinin yürütülme sırası için bkz. Yan tümcelerin yürütülme sırası.

Kısıtlamalar

  • Bir SELECT deyimi en fazla 10.000 satır görüntüler ve boyutu 10 MB'ı aşmayan sonuçlar döndürür. Bu sınır, SELECT alt sorgu olarak kullanıldığında geçerli değildir; bu durumda tüm satırlar üst sorguya döndürülür.

  • Bölümlenmiş tablolarda tam tablo taramaları varsayılan olarak yasaktır. 10 Ocak 2018 tarihinde saat 20:00:00'den sonra oluşturulan projeler için bölümlenmiş bir tabloyu sorgularken bir bölüm belirtmeniz gerekir. Bu yaklaşım, özellikle kullandıkça öde faturalaması altında gereksiz G/Ç ve hesaplama maliyetlerini azaltır. Geçerli oturum için tam tablo taraması çalıştırmak üzere SET odps.sql.allow.fullscan=true; komutunu SELECT deyimiyle birlikte gönderin:

    SET odps.sql.allow.fullscan=true;
    SELECT * FROM sale_detail;
  • Küme tablolarında paket budama optimizasyonu yalnızca tablo başına 400 veya daha az bölüm tarandığında etkilidir. Paket budama gerçekleşmezse daha fazla veri taranır; bu durum kullandıkça öde faturalamasında maliyetleri artırırken abonelik faturalamasında performansı düşürür.

İlgili sorgu türleri


Sorgu türü


Açıklama


Alt sorgular


Önceki bir sorgunun sonuçlarını sorgulama


INTERSECT, UNION ve EXCEPT


Sorgu sonucu veri kümelerini kesiştirme, birleştirme veya tümleme


JOIN


Tabloları birleştirerek eşleşen satırları döndürme


SEMI JOIN


Sol tablo satırlarını sağ tabloyla filtreleme; sonuç yalnızca sol tablo verilerini içerir


MAPJOIN ipucu


Büyük bir tabloyu bir veya daha fazla küçük tabloyla birleştirirken JOIN performansını iyileştirme


SKEWJOIN ipucu


Sıcak nokta ve sıcak nokta dışı verileri ayrı işleyerek JOIN işlemlerindeki veri çarpıklığını ele alma


LATERAL VIEW


Kullanıcı tanımlı tablo değerli bir işlev (UDTF) ile birlikte kullanarak tek bir satırı birden çok satıra bölme


GROUPING SETS


Verileri birden çok boyutta toplama ve analiz etme


SELECT TRANSFORM


Bir alt işlem başlatma, biçimlendirilmiş girişi stdin üzerinden gönderme ve stdout'u çıkış olarak ayrıştırma


Split size ipucu


Split boyutunu ayarlayarak sorgu eşzamanlılığını kontrol etme


Zaman yolculuğu ve artımlı sorgular


Delta tablolarından geçmiş anlık görüntüleri (zaman yolculuğu) veya artımlı verileri (artımlı sorgu) sorgulama

Örnek veriler

Bu konudaki örnekler sale_detail tablosunu kullanır. Tabloyu oluşturmak ve örnek verileri eklemek için aşağıdaki deyimleri çalıştırın:

-- Create a partitioned table named 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);

-- Add a partition.
ALTER TABLE sale_detail ADD PARTITION (sale_date='2013', region='china');

-- Insert data.
INSERT INTO sale_detail PARTITION (sale_date='2013', region='china') VALUES ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);

Tabloyu doğrulamak için sorgulayın:

SELECT * FROM sale_detail;
-- Result:
+------------+-------------+-------------+------------+------------+
| 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      |
+------------+-------------+-------------+------------+------------+

WITH yan tümcesi (CTE)

WITH yan tümcesi bir veya daha fazla ortak tablo ifadesi (CTE) tanımlar. Her CTE, aynı deyimdeki sonraki sorgular için kullanılabilen geçici adlandırılmış bir sonuç kümesi gibi davranır.

Kurallar:

  • Aynı WITH yan tümcesindeki CTE adları benzersiz olmalıdır.

  • Bir CTE, aynı WITH yan tümcesinde daha önce tanımlanan diğer CTE'lere başvurabilir ancak kendisine veya döngüsel bağımlılıklara başvurmaz.

Kendine başvuru (desteklenmez)

-- Incorrect: A cannot reference itself.
WITH
A AS (SELECT 1 FROM A)
SELECT * FROM A;
-- FAILED: ODPS-0130161:[1,6] Parse exception - recursive cte A is invalid, it must have an initial_part and a recursive_part, which must be connected by UNION ALL

Döngüsel başvuru (desteklenmez)

-- Incorrect: A references B, and B references A.
WITH
A AS (SELECT * FROM B),
B AS (SELECT * FROM A)
SELECT * FROM B;
-- FAILED: ODPS-0130071:[1,26] Semantic analysis exception - while resolving view B - [1,51]recursive function call is not supported, cycle is A->B->A

Sıralı başvuru (desteklenir)

WITH
A AS (SELECT 1 AS C),
B AS (SELECT * FROM A)
SELECT * FROM B;
-- Result:
+---+
| c |
+---+
| 1 |
+---+

Sütun ifadesi (SELECT_expr)

SELECT_expr hangi sütunların döndürüleceğini belirtir. Sütun adlarını, * karakterini, normal ifadeleri veya DISTINCT ve ALL anahtar sözcüklerini kullanabilirsiniz.

Belirli sütunları ada göre seçme

SELECT shop_name FROM sale_detail;
-- Result:
+------------+
| shop_name  |
+------------+
| s1         |
| s2         |
| s3         |
+------------+

* ile tüm sütunları seçme

-- Enable full table scan for the current session.
SET odps.sql.allow.fullscan=true;
SELECT * FROM sale_detail;
-- Result:
+------------+-------------+-------------+------------+------------+
| 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      |
+------------+-------------+-------------+------------+------------+

WHERE ile filtreleme

SELECT * FROM sale_detail WHERE shop_name='s1';
-- Result:
+------------+-------------+-------------+------------+------------+
| shop_name  | customer_id | total_price | sale_date  | region     |
+------------+-------------+-------------+------------+------------+
| s1         | c1          | 100.1       | 2013       | china      |
+------------+-------------+-------------+------------+------------+

Normal ifade ile sütun seçme

Normal ifadeyi ters tırnak içine alın.

Adı sh ile başlayan tüm sütunları seçin:

SELECT `sh.*` FROM sale_detail;
-- Result:
+------------+
| shop_name  |
+------------+
| s1         |
| s2         |
| s3         |
+------------+

shop_name sütununu hariç tutarak diğer tüm sütunları döndürün:

SELECT `(shop_name)?+.+` FROM sale_detail;
-- Result:
+-------------+-------------+------------+------------+
| customer_id | total_price | sale_date  | region     |
+-------------+-------------+------------+------------+
| c1          | 100.1       | 2013       | china      |
| c2          | 100.2       | 2013       | china      |
| c3          | 100.3       | 2013       | china      |
+-------------+-------------+------------+------------+

Birden çok sütunu hariç tutma (shop_name ve customer_id):

SELECT `(shop_name|customer_id)?+.+` FROM sale_detail;
-- Result:
+-------------+------------+------------+
| total_price | sale_date  | region     |
+-------------+------------+------------+
| 100.1       | 2013       | china      |
| 100.2       | 2013       | china      |
| 100.3       | 2013       | china      |
+-------------+------------+------------+

Adı t ile başlayan tüm sütunları hariç tutma:

SELECT `(t.*)?+.+` FROM sale_detail;
-- Result:
+------------+-------------+------------+------------+
| shop_name  | customer_id | sale_date  | region     |
+------------+-------------+------------+------------+
| s1         | c1          | 2013       | china      |
| s2         | c2          | 2013       | china      |
| s3         | c3          | 2013       | china      |
+------------+-------------+------------+------------+
Birinin adı diğerinin ön eki olan birden çok sütunu hariç tutarken ifadede uzun adı önce yerleştirin. Örneğin, bir tabloda ds ve dshh bölümleri varsa ` SELECT (dshh|ds)?+.+ FROM t; kullanın, SELECT (ds|dshh)?+.+ FROM t; `ifadesini değil.

DISTINCT ile yinelenenleri kaldırma

DISTINCT benzersiz değerleri döndürür; ALL (varsayılan) ise yinelenenler dahil tüm satırları döndürür.

SELECT DISTINCT region FROM sale_detail;
-- Result:
+------------+
| region     |
+------------+
| china      |
+------------+

Birden çok sütuna uygulandığında DISTINCT listedeki tüm sütunların bileşik değerine göre yinelemeleri kaldırır:

SELECT DISTINCT region, sale_date FROM sale_detail;
-- Result:
+------------+------------+
| region     | sale_date  |
+------------+------------+
| china      | 2013       |
+------------+------------+

DISTINCT pencere işlevleriyle de çalışarak pencere işlevi sonucundan yinelenen satırları kaldırır:

SET odps.sql.allow.fullscan=true;
SELECT DISTINCT sale_date, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY total_price) AS rn FROM sale_detail;
-- Result:
+-----------+------------+
| sale_date | rn         |
+-----------+------------+
| 2013      | 1          |
+-----------+------------+
DISTINCT ve GROUP BY aynı sorguda kullanılamaz. Aşağıdaki deyim hata döndürür:
SELECT DISTINCT shop_name FROM sale_detail GROUP BY shop_name;
-- Error: GROUP BY cannot be used with SELECT DISTINCT

Sütunları hariç tutma (EXCEPT_expr)

SELECT * EXCEPT(col1, col2, ...) belirtilenler dışındaki tüm sütunları döndürür.

-- Return all columns except region.
SELECT * EXCEPT(region) FROM sale_detail;
-- Result:
+-----------+-------------+-------------+-----------+
| shop_name | customer_id | total_price | sale_date |
+-----------+-------------+-------------+-----------+
| s1        | c1          | 100.1       | 2013      |
| s2        | c2          | 100.2       | 2013      |
| s3        | c3          | 100.3       | 2013      |
+-----------+-------------+-------------+-----------+

Sütunları değiştirme (REPLACE_expr)

SELECT * REPLACE(expr AS col, ...) tüm sütunları döndürür ve belirtilen sütunların değerlerini verilen ifadelerle değiştirir.

-- Return all columns, replacing total_price and region values.
SELECT * REPLACE(total_price+100 AS total_price, 'shanghai' AS region) FROM sale_detail;
-- Result:
+-----------+-------------+-------------+-----------+--------+
| shop_name | customer_id | total_price | sale_date | region |
+-----------+-------------+-------------+-----------+--------+
| s1        | c1          | 200.1       | 2013      | shanghai |
| s2        | c2          | 200.2       | 2013      | shanghai |
| s3        | c3          | 200.3       | 2013      | shanghai |
+-----------+-------------+-------------+-----------+--------+

Hedef tablo (TABLE_reference)

TABLE_reference sorgulanacak tabloyu belirtir.

Adlandırılmış bir tabloyu sorgulama

SELECT customer_id FROM sale_detail;
-- Result:
+-------------+
| customer_id |
+-------------+
| c1          |
| c2          |
| c3          |
+-------------+

Kaynak olarak iç içe alt sorgu kullanma

SELECT * FROM (SELECT region, sale_date FROM sale_detail) t WHERE region = 'china';
-- Result:
+------------+------------+
| region     | sale_date  |
+------------+------------+
| china      | 2013       |
| china      | 2013       |
| china      | 2013       |
+------------+------------+

WHERE yan tümcesi

WHERE yan tümcesi satırları filtreler. Bölümlenmiş tablolar için bölüm sütunlarına yönelik koşullar bölüm elemeyi sağlar; yalnızca eşleşen bölümler taranır.

Desteklenen karşılaştırma operatörleri: >, <, =, >=, <=, <>, LIKE, RLIKE, IN, NOT IN, BETWEEN...AND. Ayrıntılar için bkz. Karşılaştırma operatörleri.

Aralığa göre bölüm filtreleme

SELECT *
FROM sale_detail
WHERE sale_date >= '2008' AND sale_date <= '2014';

-- Equivalent to:
SELECT *
FROM sale_detail
WHERE sale_date BETWEEN '2008' AND '2014';
-- Result:
+------------+-------------+-------------+------------+------------+
| 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      |
+------------+-------------+-------------+------------+------------+
Bölüm elemanın etkili olduğunu doğrulamak için EXPLAIN deyimi çalıştırın. Kullanıcı tanımlı bir işlev (UDF) veya JOIN ON yan tümcesindeki bölüm koşulları elemeyi engelleyebilir. Daha fazla bilgi için bkz. Bölüm elemanın etkili olup olmadığını denetleme .

Bölüm eleme için UDF kullanma

WHERE yan tümcesindeki bir UDF küçük bir ön iş olarak çalışır ve sonuç orijinal deyimdeki UDF'nin yerine geçer.

UDF tabanlı bölüm elemeyi etkinleştirmek için UDF sınıfına açıklama ekleyin:

@com.aliyun.odps.udf.annotation.UdfProperty(isDeterministic=true)
com.aliyun.odps.udf.annotation.UdfProperty tanımı odps-sdk-udf.jar içinde bulunur. odps-sdk-udf sürümünü %0,30.x veya üzeri bir sürüme yükseltin.

Alternatif olarak, SQL deyimi öncesine SET odps.sql.udf.ppr.deterministic = true; ekleyerek deyimdeki tüm UDF'lerin deterministik olarak değerlendirilmesini sağlayabilirsiniz. Bu yöntem, en fazla 1.000 bölüm olmak üzere iş sonuçlarıyla bölümleri doldurur. 1.000'den fazla bölüm doldurulursa hata döndürülür. Hatayı bastırmak ve UDF tabanlı bölüm elemeyi devre dışı bırakmak için SET odps.sql.udf.ppr.to.subquery = false; komutunu çalıştırın.

Elemanın gerçekleşmesi için UDF'nin kaynak tablonun WHERE yan tümcesinde olması gerekir:

-- Correct: UDF in the WHERE clause of the source table.
SELECT key, value FROM srcp WHERE udf(ds) = 'xx';

-- Incorrect: UDF in a JOIN ON clause does not trigger partition pruning.
SELECT A.c1, A.c2 FROM srcp1 A JOIN srcp2 B ON A.c1 = B.c1 AND udf(A.ds) = 'xx';

WHERE içinde sütun takma adları kullanılamaz

SELECT_expr içindeki bir sütun bir işlev kullanıyor ve bir takma adla yeniden adlandırıyorsa bu takma ada WHERE yan tümcesinden başvuramazsınız. Aşağıdaki deyim hata döndürür:

-- Incorrect: skynet_id is an alias defined in SELECT, not available in WHERE.
SELECT  task_name,
        inst_id,
        settings,
        GET_JSON_OBJECT(settings, '$.SKYNET_ID') AS skynet_id,
        GET_JSON_OBJECT(settings, '$.SKYNET_NODENAME') AS user_agent
FROM    Information_Schema.TASKS_HISTORY
WHERE   ds = '20211215' AND skynet_id IS NOT NULL
LIMIT 10;

GROUP BY yan tümcesi

GROUP BY satırları belirtilen sütunlara göre gruplar ve genellikle toplama işlevleri ile birlikte kullanılır.

Kurallar:

  • GROUP BY işlemi SELECT işleminden önce yürütülür. GROUP BY içindeki sütunlar giriş tablosunun sütun adlarıyla veya o tablonun sütunlarından oluşan bir ifadeyle belirtilebilir. SELECT listesinde tanımlanan takma adlar da GROUP BY içinde kullanılabilir.

  • Bir toplama işlevine sarılmayan SELECT listesindeki tüm sütunlar GROUP BY yan tümcesinde yer almalıdır.

  • GROUP BY içindeki normal ifadeler sütunlar için tam ifadeyi kullanmalıdır.

  • GROUP BY ile DISTRIBUTE BY veya SORT BY aynı anda kullanılamaz.

Bir sütuna göre gruplama

SELECT region FROM sale_detail GROUP BY region;
-- Result:
+------------+
| region     |
+------------+
| china      |
+------------+

GROUP BY ile toplama

SELECT region, SUM(total_price) FROM sale_detail GROUP BY region;
-- Result:
+------------+------------+
| region     | _c1        |
+------------+------------+
| china      | 300.6      |
+------------+------------+

GROUP BY içinde SELECT takma adı kullanma

SELECT region AS r FROM sale_detail GROUP BY r;
-- Equivalent to:
SELECT region AS r FROM sale_detail GROUP BY region;
-- Result:
+------------+
| r          |
+------------+
| china      |
+------------+

Bir sütun ifadesine göre gruplama

SELECT 2 + total_price AS r FROM sale_detail GROUP BY 2 + total_price;
-- Result:
+------------+
| r          |
+------------+
| 102.1      |
| 102.2      |
| 102.3      |
+------------+

Eksik GROUP BY sütunu hata döndürür

-- Incorrect: total_price is not in GROUP BY and not in an aggregate function.
SELECT region, total_price FROM sale_detail GROUP BY region;
-- Error: FAILED: ODPS-0130071:[1,16] Semantic analysis exception - column reference sale_detail.total_price should appear in GROUP BY key

-- Correct:
SELECT region, total_price FROM sale_detail GROUP BY region, total_price;
-- Result:
+------------+-------------+
| region     | total_price |
+------------+-------------+
| china      | 100.1       |
| china      | 100.2       |
| china      | 100.3       |
+------------+-------------+

GROUP BY ALL (BigQuery uyumlu mod)

odps.sql.bigquery.compatible=true olduğunda GROUP BY ALL SELECT listesindeki toplanmamış tüm sütunlara otomatik olarak grup uygular:

-- Explicitly list grouping fields.
SELECT
    shop_name,
    customer_id,
    sale_date,
    region,
    SUM(total_price) AS total_sales
FROM sale_detail
GROUP BY shop_name, customer_id, sale_date, region;

-- Equivalent using GROUP BY ALL.
SET odps.sql.bigquery.compatible=true;
SELECT
    shop_name,
    customer_id,
    sale_date,
    region,
    SUM(total_price) AS total_sales
FROM sale_detail
GROUP BY ALL;
-- Result:
+-----------+-------------+-----------+--------+-------------+
| shop_name | customer_id | sale_date | region | total_sales |
+-----------+-------------+-----------+--------+-------------+
| s1        | c1          | 2013      | china  | 100.1       |
| s2        | c2          | 2013      | china  | 100.2       |
| s3        | c3          | 2013      | china  | 100.3       |
+-----------+-------------+-----------+--------+-------------+

GROUP BY içinde konumsal takma adlar kullanma

GROUP BY içindeki tamsayı sabitlerini SELECT listesindeki sütun konumları olarak değerlendirmek için SET odps.sql.groupby.position.alias=true; komutunu çalıştırın:

SET odps.sql.groupby.position.alias=true;
-- 1 refers to the first column in the SELECT list (region).
SELECT region, SUM(total_price) FROM sale_detail GROUP BY 1;
-- Result:
+------------+------------+
| region     | _c1        |
+------------+------------+
| china      | 300.6      |
+------------+------------+

HAVING yan tümcesi

HAVING gruplandırılmış verileri filtreler ve genellikle toplama işlevlerini kullanır. GROUP BY sonrasında değerlendirilir.

-- Insert additional data to demonstrate HAVING.
INSERT INTO sale_detail PARTITION (sale_date='2014', region='shanghai') VALUES ('null','c5',null),('s6','c6',100.4),('s7','c7',100.5);

-- Return only groups where the total price is less than 305.
SELECT region, SUM(total_price) FROM sale_detail
GROUP BY region
HAVING SUM(total_price) < 305;
-- Result:
+------------+------------+
| region     | _c1        |
+------------+------------+
| china      | 300.6      |
| shanghai   | 200.9      |
+------------+------------+

ORDER BY yan tümcesi

ORDER BY tüm satırları bir veya daha fazla sütuna göre sıralar. Sıralama geneldir; tüm veriler tek bir düğümde birleştirilir.

Uyarı

Varsayılan olarak ORDER BY bir LIMIT yan tümcesi gerektirir. LIMIT olmadan hata döndürülür. Bu kural, büyük veri kümelerinin yanlışlıkla tek bir düğümde işlenmesini önler.

Kurallar:

  • Varsayılan sıralama düzeni artandır (ASC). Azalan sıralama için DESC kullanın.

  • NULL değerler en küçük değer olarak kabul edilir (MySQL davranışıyla tutarlıdır).

  • ORDER BY sütunları SELECT deyiminin çıkış sütunlarına sütun adı veya takma ad aracılığıyla başvurmalıdır.

  • ORDER BY ile DISTRIBUTE BY veya SORT BY aynı anda kullanılamaz.

Artan sıralama (varsayılan)

SELECT * FROM sale_detail ORDER BY total_price LIMIT 2;
-- Result:
+------------+-------------+-------------+------------+------------+
| shop_name  | customer_id | total_price | sale_date  | region     |
+------------+-------------+-------------+------------+------------+
| s1         | c1          | 100.1       | 2013       | china      |
| s2         | c2          | 100.2       | 2013       | china      |
+------------+-------------+-------------+------------+------------+

Azalan sıralama

SELECT * FROM sale_detail ORDER BY total_price DESC LIMIT 2;
-- Result:
+------------+-------------+-------------+------------+------------+
| shop_name  | customer_id | total_price | sale_date  | region     |
+------------+-------------+-------------+------------+------------+
| s3         | c3          | 100.3       | 2013       | china      |
| s2         | c2          | 100.2       | 2013       | china      |
+------------+-------------+-------------+------------+------------+

ORDER BY içinde sütun takma adı kullanma

SELECT total_price AS t FROM sale_detail ORDER BY t LIMIT 3;
-- Result:
+------------+
| t          |
+------------+
| 100.1      |
| 100.2      |
| 100.3      |
+------------+

ORDER BY içinde konumsal takma adlar kullanma

ORDER BY içindeki tamsayı sabitlerini sütun konumları olarak değerlendirmek için SET odps.sql.orderby.position.alias=true; komutunu çalıştırın:

SET odps.sql.orderby.position.alias=true;
-- 3 refers to the third column in the SELECT list (total_price).
SELECT * FROM sale_detail ORDER BY 3 LIMIT 3;
-- Result:
+------------+-------------+-------------+------------+------------+
| 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      |
+------------+-------------+-------------+------------+------------+

OFFSET ile satır atlama

ORDER BY...LIMIT m OFFSET n ilk n satırdan sonra gelen m satırı döndürür. LIMIT n, m buna eşdeğer bir kısa gösterimdir.

-- Sort by total_price ascending, skip the first 2 rows, return up to 3.
SELECT customer_id, total_price FROM sale_detail ORDER BY total_price LIMIT 3 OFFSET 2;

-- Equivalent:
SELECT customer_id, total_price FROM sale_detail ORDER BY total_price LIMIT 2, 3;
-- Result (only 1 row remains after skipping 2):
+-------------+-------------+
| customer_id | total_price |
+-------------+-------------+
| c3          | 100.3       |
+-------------+-------------+

ORDER BY için LIMIT gereksinimini kaldırma

ORDER BY tek bir düğümde çalıştığından LIMIT gereksinimi çok büyük veri kümelerinin yanlışlıkla sıralanmasını önler. Bu gereksinimi devre dışı bırakmak için:

  • Proje düzeyi: SETPROJECT odps.sql.validate.orderby.limit=false; komutunu çalıştırın.

  • Oturum düzeyi: SQL deyimiyle birlikte SET odps.sql.validate.orderby.limit=false; gönderin.

Tek bir düğümde büyük veri kümelerini sıralamak daha fazla kaynak tüketir ve daha uzun sürer.

Range Clustering ile global sıralamayı hızlandırma

Tipik ORDER BY senaryolarında tüm verilerin tek bir düğümde işlenmesi gerekir. Range Clustering önce verileri örnekler, aralıklara böler ve ardından her aralığı eşzamanlı olarak sıralayarak paralel şekilde genel olarak sıralı bir sonuç üretir. Ayrıntılar için bkz. Global sıralama hızlandırma.

DISTRIBUTE BY yan tümcesi

DISTRIBUTE BY belirtilen sütunlara göre satırlarda karma parçalama gerçekleştirerek aynı anahtara sahip satırları aynı indirgeyiciye yönlendirir. İlişkili verilerin birlikte işlenmesini sağlamak veya indirgeyiciler arasında veri örtüşmesini önlemek için kullanılır.

DISTRIBUTE BY içindeki sütunlar, SELECT deyiminin çıkış sütunlarına takma adlarıyla başvurmalıdır. Takma ad belirtilmemişse sütun adı kullanılır.

-- Hash-shard rows by the region column.
SELECT region FROM sale_detail DISTRIBUTE BY region;

-- The following two statements are equivalent to the one above:
SELECT region AS r FROM sale_detail DISTRIBUTE BY region;
SELECT region AS r FROM sale_detail DISTRIBUTE BY r;
-- Result:
+------------+
| r          |
+------------+
| china      |
| china      |
| china      |
+------------+
DISTRIBUTE BY ile ORDER BY veya GROUP BY aynı anda kullanılamaz.

SORT BY yan tümcesi

SORT BY her indirgeyici bölümü içindeki verileri sıralar. Genel sıralama garantisi vermez.

Kurallar:

  • Varsayılan sıralama düzeni artandır. Azalan sıralama için DESC kullanın.

  • DISTRIBUTE BY ile birlikte kullanıldığında SORT BY, DISTRIBUTE BY tarafından oluşturulan her bölüm içinde sıralama yapar.

  • DISTRIBUTE BY olmadan kullanıldığında SORT BY her indirgeyicide bağımsız olarak sıralama yapar.

DISTRIBUTE BY + SORT BY (dağıtılmış sıralama)

-- Insert additional data to show multiple regions.
INSERT INTO sale_detail PARTITION (sale_date='2014', region='shanghai') VALUES ('null','c5',null),('s6','c6',100.4),('s7','c7',100.5);

-- Set 2 reducers.
SET odps.stage.reducer.num=2;

-- Hash-shard by region, then sort by total_price ascending within each shard.
SELECT region, total_price FROM sale_detail DISTRIBUTE BY region SORT BY total_price;
-- Result:
+------------+-------------+
| region     | total_price |
+------------+-------------+
| shanghai   | NULL        |
| shanghai   | 100.4       |
| shanghai   | 100.5       |
| china      | 100.1       |
| china      | 100.2       |
| china      | 100.3       |
+------------+-------------+

Her parça içinde azalan sıralama:

SET odps.stage.reducer.num=2;
SELECT region, total_price FROM sale_detail DISTRIBUTE BY region SORT BY total_price DESC;
-- Result:
+------------+-------------+
| region     | total_price |
+------------+-------------+
| shanghai   | 100.5       |
| shanghai   | 100.4       |
| shanghai   | NULL        |
| china      | 100.3       |
| china      | 100.2       |
| china      | 100.1       |
+------------+-------------+

DISTRIBUTE BY olmadan SORT BY

Tek başına SORT BY her indirgeyicide bağımsız olarak sıralama yapar. Bu yaklaşım genel olarak sıralı bir sonuç üretmez ancak depolama sıkıştırma oranını iyileştirir ve filtreleme sırasında disk okumalarını azaltarak sonraki global sıralama işlemlerini hızlandırabilir.

SET odps.stage.reducer.num=2;
SELECT region, total_price FROM sale_detail SORT BY total_price DESC;
-- Result (order across reducers is not guaranteed):
+------------+-------------+
| region     | total_price |
+------------+-------------+
| shanghai   | 100.5       |
| shanghai   | 100.4       |
| china      | 100.3       |
| china      | 100.2       |
| china      | 100.1       |
| shanghai   | NULL        |
+------------+-------------+
ORDER BY , DISTRIBUTE BY ve SORT BY içindeki sütun takma adları Çince olarak belirtilebilir.

LIMIT yan tümcesi

LIMIT <number> çıktı satır sayısını kısıtlar. Değer maksimum 2.147.483.647 olabilen 32 bitlik bir tamsayı olmalıdır.

LIMIT dağıtılmış taramadan sonra verileri filtreler. Taranan veri miktarını azaltmaz veya hesaplama maliyetlerini düşürmez.

Ekran görüntüleme sınırını kaldırma

Bir SELECT deyimi LIMIT yan tümcesi içermiyorsa veya LIMIT değeri projenin görüntüleme sınırını (n) aşıyorsa sonuç penceresi en fazla n satır gösterir.

  • Veri koruma devre dışı: odpscmd_config.ini dosyasında use_instance_tunnel=true ayarını etkinleştirin. instance_tunnel_max_record parametresi yoksa görüntüleme sınırı yoktur. Parametre mevcutsa görüntüleme bu değerle sınırlanır (maksimum 10.000 satır). Ayrıntılar için bkz. Kullanım notları.

  • Veri koruma etkin: Görüntüleme READ_TABLE_MAX_ROW ile sınırlanır (maksimum 10.000 satır).

ProjectProtection ayarını denetlemek için SHOW SecurityConfiguration; komutunu çalıştırın. ProjectProtection=true ise projenizin gereksinimleri izin veriyorsa veri korumayı SET ProjectProtection=false; komutuyla devre dışı bırakın. Daha fazla bilgi için bkz. Veri koruma mekanizması.

WINDOW yan tümcesi

Pencere işlevi sözdizimi için bkz. Pencere işlevi sözdizimi.

Sonraki adımlar