MaxComputer入門SQL雜談


SQL:

--MySQL
SELECT * FROM tb1;
SELECT * FROM tb1 WHERE id = 1;
SELECT * FROM tb1 WHERE (SELECT 1 FROM tb2 WHERE id IN (1,2,3));
SELECT * FROM tb1 WHERE id <> 3 ORDER BY age DESC;
INSERT INTO tb1 VALUES(1,"cc",19);
UPDATE tb1 SET age = 18 WHERE id = 1;
DELETE FROM tb1 WHERE id = 1;

SELECT name,age FROM tb1;
SELECT DISTINCT name,age FROM tb1;
SELECT name,age FROM tb1 WHERE id = 1 AND id = 2;
SELECT name,age FROM tb1 WHERE id = 1 OR id = 2;
SELECT name,age FROM tb1 WHERE NOT id = 1;
SELECT age FROM tb1 WHERE id IS NOT NULL;
UPDATE tb1 SET name = '張三',age = 18 WHERE id = 1;

SELECT * FROM tb1 WHERE id < 10 LIMIT 1,5;--(索引從0開始,指定第二個參數為-1則為所有,orlcal使用ROWNUM)
SELECT * FROM tb1 WHERE name LIKE 'a%';--(%與_)
SELECT * FROM tb1 WHERE id IN (1,2,3);
SELECT * FROM tb1 WHERE age BETWEEN 18 AND 22;--(閉區間)

CREATE TABLE tb3(
    id INT(32),
    age INT(2),
    name VARCHAR(64)
);

SELECT a.name,b.age 
FROM tb1 a
INNER JOIN tb2 b
ON a.id = b.id
ORDER BY a.id;

SELECT a.name,b.age 
FROM tb1 a
LEFT JOIN tb2 b
ON a.id = b.id
ORDER BY a.id;

SELECT a.name,b.age 
FROM tb1 a,tb1 b
WHERE a.id = b.pid;

SELECT * FROM tb1 
UNION
SELECT * FROM tb2;

SELECT name,age INTO tb4 FROM tb1;--要求tb4不存在
INSERT INTO tb2 SELECT * FROM tb1;--復制數據到已經存在的表

CREATE DATABASE db1;

CREATE VIEW view1 AS SELECT * FROM tb1;

CREATE TABLE tb5(
    id INT(11) NOT NULL PRIMARY KEY,
    name VARCHAR(64) NOT NULL,
    age INT(11),
    UNIQUE(id)
)
CREATE TABLE tb5(
    id INT(11) NOT NULL PRIMARY KEY,
    name VARCHAR(64) NOT NULL,
    age INT(11),
    FOREIGN KEY (id) REFERENCES tb1(id)
)
CREATE TABLE tb5(
    id INT(11) NOT NULL PRIMARY KEY,
    name VARCHAR(64) NOT NULL,
    age INT(11) DEFAULT 18,
    FOREIGN KEY (id) REFERENCES tb1(id)
)
--UNION與UNION ALL區別是去重與不去重
SHOW CREATE TABLE tb1;
CREATE INDEX idx1 ON tb1(name);
DROP INDEX idx1;
TRUNCATE TABLE tb1;

SELECT MAX(age) AS max_age FROM tb1;
SELECT UPPER(name) AS upper_name FROM tb2;
SELECT LEN(name) AS len_name FROM tb3;
SELECT id,IFNULL(age,0) FROM tb1;

----------------------------------------------
--maxComputer(ODPS) 表名列名對大小寫不敏感
create table mtb1(
    id bigint COMMENT '主鍵ID',
    name string COMMENT '名稱',
) partitioned by (pt string, ds string)

CREATE TABLE user(
    id BIGINT COMMENT '用戶標識',
    gender BIGINT COMMENT '性別0未知,1男,2女',
    age BIGINT COMMENT '年齡'
) partitioned by (Region string, dt string) lifecycle 365
--生命周期指的是數據最后一次修改時間經過指定的時間沒有變動則回收,分區表則回收分區!
--創建分區以加入分區數據
alter table user add partition(Region='hangzhou',dt='20180706');
Alter table user add if not exists partition(region='hangzhou',dt='20150923');

DESC user;
alter table drop partition(region='hangzhou',dt='20180706');

drop table user;

CREATE TABLE user2 LIKE user;--拷貝生命周期外的全部屬性
CREATE TABLE user2 AS SELECT * FROM user;

create table pt1(ket string) partitioned by (pt string)
alter table pt1 add partition(pt = '20180706');--!分區類似於文件夾!
--請注意正確使用string類型分區
SELECT * FROM pt1 WHERE pt = '20180706';

CREATE TABLE t_word(word string COMMENT '語句');
--比普通sql多了一個table關鍵字
INSERT OVERWRITE TABLE user PARTITION(region = 'hangzhou',ds) SELECT name,age,ds FROM user2
INSERT OVERWRITE TABLE user2 PARTITION(region = 'hangzhou') SELECT name FROM user3;

CREATE TABLE t1(
    id BIGINT COMMENT '主鍵',
    name string COMMENT '名稱'
) partitioned by (ds string, dt string) lifecycle 365
AS SELECT * FROM tb1;--復制所有數據,但是分區列將作為普通列進行處理
EXTERNAL --建立外部表
set odps.sql.type.system.odps2=true;,並與建表語句一起提交執行。

CREATE TABLE shop(
    shop_name string COMMENT '商店名稱',
    coutomer_id BIGINT COMMENT '用戶ID'
) PARTITIONED BY (dt string,region string)
alter table user add partition (dt = '20180706')

INSERT INTO TABLE t1 PARTITION (region='hangzhou') VALUES('a', 1)

SELECT name,age FROM user WHERE name LIKE 'hang%'; --屏顯最多顯示10000行,子句無限制
--強制使用全表掃描
set odps.sql.allow.fullscan=true;
select * from sale_detail;
--ORDER BY的全局排序必須使用limit進行限制
SELECT name FROM user ORDER BY age DESC LIMIT 5;

--SQL執行順序,先從FROM找表,
--然后WHERE過濾,然后分組以及分組過濾,再SELECT選擇,最后排序與LIMIT限制
SELECT * FROM (SELECT name FROM user);

--獨有的半連接,LEFT SEMI JOIN
SELECT t1.name,t1.age FROM t1 LEFT SEMI JOIN t2 ON t1.id = t2.id;
--左表為大表形式的map join,非mapjoin不支持不等值連接!
SELECT a.name FROM tb1 a JOIN tb2 b ON a.id = b.id;
--支持執行計划
EXPLAIN
SELECT * FROM user;
--支持CTE(WITH...AS子句)
WITH a AS (SELECT name FROM user) INSERT OVERWRITE TABLE t1 PARTITION(dt='20180708') SELECT * FROM a

CREATE TABLE t1(
    id BIGINT COMMENT '主鍵',
    name string COMMENT '姓名',
    gender BIGINT COMMENT '性別0未知,1男,2女'
) PARTITIONED BY (dt string, region string);
Alter table t1 add partition (dt='20180709',region='hangzhou');
----------
--內建函數
DATEADD(trans_date, 1, 'day') --支持拓展的時間類型
DATEDIFF(date1, date2, 'day') --計算時間差
DATEPART(date1, 'day') --抽取時間單位
DATETRUNC(date1, 'year') --時間單位截取
FROM_UNIXTIME(123456789) --UNIX時間轉date
GETDATE() --獲取當前系統時間
ISDATE() --判斷字符串能否轉為時間
LASTDAY(date1) --取date當月最后一天
TO_DATE(string, format) --字符串轉時間 yyyy-mm-dd hh:mi:ss
TO_CHAR(date1, format) --'2018-07-09','數據連接夢想yyyy'
UNIX_TIMESTAMP(date1) --日期轉unix時間值
WEEKDAY(date1) --周一第一天,返回0,周日返回6
WEEKOFYEAR(date1) --返回這一周是當年第多少周
--MaxComputer拓展函數
set odps.sql.type.system.odps2=true;
select year('1970-01-01 12:30:00')=1970 from dual;

ABS(num) --取絕對值
CEIL(num) --向上取整
CONV(input,from,to) --進制轉換
FLOOR(num) --向下取整
RAND(seed) --返回0-1之間隨機數
ROUND(num) --四舍五入

--窗口函數,三個關鍵點:窗口幀、窗口函數、窗口分區
SELECT AVG(close) OVER (PARTITION BY stock ROWS BETWEEN AND) AS mavg FROM t_stock; 
窗口函數 OVER () --待補充

--字符串函數
CHAR_MATCHCOUNT(str1, str2) --str1中有多少個字符出現在str2中
CHR(asc) --BIGINT型的ASCII碼轉字符
CONCAT(str1, str2, ...) --連接函數
GET_JSON_OBJECT(json, path) --按SJONPATH從JSON中抽取
IS_ENCODING(str, from, to) --判斷是否可以轉碼
 --將str1按split1默認;分割為keyvalue,再按split2分默認:,返回key對應的value,keyvalue('0:1\;1:2', 1) = '2'
KEYVALUE(str1,split1,split2,key)
LENGTH(str) --返回字符串長度
LENGTHB(str) --返回字節的長度
MD5(str) --md5加密
SPLIT_PART(str1,separtor,start,end) --按照分隔符分組,返回指定閉區間的組(可指定單獨組)
SUBSTR(str1,start,len) --指定起始字符和指定長度進行字符串截取

UDF,查看相關鏈接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM