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