基础知识
SQL IN
SELECT column_name
FROM table_name
WHERE column_name IN (value1, value2);
作用:筛选column等于value1或value2。
SQL BETWEEN
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2);
作用:筛选大于等于value小于value2。
value可为字符串。
ALTER
添加列
ALTER TABLE table_name
ADD column_name datatype;
删除列
ALTER TABLE table_name
DROP COLUMN column_name;
改变列数据类型
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
常用记不住的SQL语句收集
创建行时create_at字段自动填写为当前时间。
ALTER TABLE foo MODIFY create_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
更新行时update_at字段自动填写为当前时间。
ALTER TABLE foo MODIFY update_at DATETIME \
NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
常用且记住了的SQL语句收集
单表关联查询
SELECT id FROM foo WHERE set_id = (SELECT set_id TABLE foo WHERE id = 1);
SELECT city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
分组过滤
SELECT city, max(temp_lo)
FROM weather
GROUP BY city
HAVING max(temp_lo) < 40;
WHERE和HAVING区别
WHERE和HAVING的基本区别如下:WHERE在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而HAVING在分组和聚集之后选取分组行。因此,WHERE子句不能包含聚集函数; 因为试图用聚集函数判断哪些行应输入给聚集运算是没有意义的。相反,HAVING子句总是包含聚集函数(严格说来,你可以写不使用聚集的HAVING子句, 但这样做很少有用。同样的条件用在WHERE阶段会更有效)。
更新
UPDATE weather
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
WHERE date > '1994-11-28';
函数
CAST(id as INT)
JOIN ON 常量
JOIN之前根据常量过滤。而Where是JOIN后,整行过滤掉。
SELECT * FROM dwd_foo
LEFT JOIN dim_foo ON
dim_foo.name = dwd_foo.name AND
dwd_foo.name = 'haha';
满足常量条件,查询维表。不满足直接空行JOIN。