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
SELECTdeyimi 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,SELECTalt 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;komutunuSELECTdeyimiyle 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ö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ı
WITHyan tümcesindeki CTE adları benzersiz olmalıdır.Bir CTE, aynı
WITHyan 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 tablodadsvedshhbö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 |
+-----------+------------+
DISTINCTveGROUP BYaynı 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.UdfPropertytanımıodps-sdk-udf.jariçinde bulunur.odps-sdk-udfsü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 BYişlemiSELECTişleminden önce yürütülür.GROUP BYiçindeki sütunlar giriş tablosunun sütun adlarıyla veya o tablonun sütunlarından oluşan bir ifadeyle belirtilebilir.SELECTlistesinde tanımlanan takma adlar daGROUP BYiçinde kullanılabilir.Bir toplama işlevine sarılmayan
SELECTlistesindeki tüm sütunlarGROUP BYyan tümcesinde yer almalıdır.GROUP BYiçindeki normal ifadeler sütunlar için tam ifadeyi kullanmalıdır.GROUP BYileDISTRIBUTE BYveyaSORT BYaynı 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.
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çinDESCkullanın.NULLdeğerler en küçük değer olarak kabul edilir (MySQL davranışıyla tutarlıdır).ORDER BYsütunlarıSELECTdeyiminin çıkış sütunlarına sütun adı veya takma ad aracılığıyla başvurmalıdır.ORDER BYileDISTRIBUTE BYveyaSORT BYaynı 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 BYileORDER BYveyaGROUP BYaynı 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
DESCkullanın.DISTRIBUTE BYile birlikte kullanıldığındaSORT BY,DISTRIBUTE BYtarafından oluşturulan her bölüm içinde sıralama yapar.DISTRIBUTE BYolmadan kullanıldığındaSORT BYher 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 BYveSORT BYiç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.inidosyasındause_instance_tunnel=trueayarını etkinleştirin.instance_tunnel_max_recordparametresi 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_ROWile 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.