MySQL
Common command
mysql -u root -p
password:xxxx0000
create database xxxx character set utf8mb4;
drop database xxxx;
use xxxx;
source pathto.sql;Schemas
Fact and dimension tables are organized in particular structures known as schemas.
Star schema && Snowflake schema
Star schema and snowflake schema are popular ways of organising this information.
Mysql Syntax
WITH and DATE_SUB
WITH first_logins AS ( # first with table
SELECT
player_id,
MIN(event_date) AS first_login
FROM
Activity
GROUP BY
player_id
), consec_logins AS ( # second with table
SELECT
COUNT(A.player_id) AS num_logins
FROM
first_logins F
INNER JOIN Activity A ON F.player_id = A.player_id
AND F.first_login = DATE_SUB(A.event_date, INTERVAL 1 DAY)
)
SELECT
ROUND(
(SELECT num_logins FROM consec_logins)
/ (SELECT COUNT(player_id) FROM first_logins)
, 2) AS fraction;MOD
SELECT
(CASE
WHEN MOD(id, 2) != 0 AND counts != id THEN id + 1
WHEN MOD(id, 2) != 0 AND counts = id THEN id
ELSE id - 1
END) AS id,
student
FROM
seat,
(SELECT
COUNT(*) AS counts
FROM
seat) AS seat_counts
ORDER BY id ASC;Cross Join vs Outer Join
Cross Join
returning all possible combinations of all rows
SELECT
...
FROM
table1,
table2 as t2 # must have alias here
;Outer Join
mysql doesn’t have outer join, but we can emulate it by union with left and right join
UNION vs UNION ALL
UNION remove duplicates UNION ALL won’t remove duplicates
# should have () in practice
()
union
()SUM
sum(case when date between "2020-02-01" and "2020-02-28" then 1 else 0 end) over(partition by id) as cntLIKE
where date like "2020-02-%"WINDOW
range between unbounded preceding and current rowcreate table
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);CREATE TABLE new_table_name AS
SELECT column1, column2,...
FROM existing_table_name
WHERE ....;CREATE TABLE IF NOT EXISTS sales(
sales_employee VARCHAR(50) NOT NULL,
fiscal_year INT NOT NULL,
sale DECIMAL(14,2) NOT NULL,
PRIMARY KEY(sales_employee,fiscal_year)
);
INSERT INTO sales(sales_employee,fiscal_year,sale)
VALUES('Bob',2016,100),
('Bob',2017,150),
('Bob',2018,200),
('Alice',2016,150),
('Alice',2017,100),
('Alice',2018,200),
('John',2016,200),
('John',2017,150),
('John',2018,250);show columns
# version 1
show columns from table_name;
# version 2: better
desc table_name;insert into table
# version 1: insert into all columns
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
# version 2: insert into specified columns
INSERT INTO Customers (CustomerName, City, Country)
VALUES ('Cardinal', 'Stavanger', 'Norway');delete row
# version 1: delete all rows without deleting table
delete from table_name;
# version 2: delete + WHERE
delete from table_name WHERE conditions;limit
# will show the first row
limit 0, 1 === limit 1 === limit 1 offset 0ISNULL & IFNULL
ISNULL(expr) 的用法:
如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0。 mysql> select isnull(1+1); -> 0 mysql> select isnull(1/0); -> 1 使用= 的null 值对比通常是错误的。
isnull() 函数同 is null比较操作符具有一些相同的特性。请参见有关is null 的说明。
IFNULL(expr1,expr2)的用法:
假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。IF & datediff & lag
select
...
,if(datediff(suc_time,lag(suc_time,1) over(partition by pin order by suc_time))<=365,1,0) as bank_cr_new_flag
...
from
...LAG(<expression>[,offset[, default_value]]) OVER (
PARTITION BY expr,...
ORDER BY expr [ASC|DESC],...
)sql declare variable within function
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
# set n := n - 1
declare ll int;
set ll := n - 1;
RETURN (
# Write your MySQL query statement below.
select
salary
from
employee
group by
salary
order by
salary desc
# limit 1 offset n
limit 1 offset ll
);
ENDexample
select
substr(a.suc_time,1,10) as date
,a.bankcode
,count(distinct a.outbizno) as total_order_cnt
,count(distinct case when b.item_first_cate_name = '食品饮料' then a.outbizno end) as food_order_cnt
,sum(case when b.item_first_cate_name = '食品饮料' then nvl(b.suc_paymoney,0) end) food_amt
,count(distinct case when b.item_first_cate_name = '酒类' then a.outbizno end) as wine_order_cnt
,sum(case when b.item_first_cate_name = '酒类' then nvl(b.suc_paymoney,0) end) wine_amt
,count(distinct case when b.item_first_cate_name = '美妆个护' then a.outbizno end) as care_order_cnt
,sum(case when b.item_first_cate_name = '美妆个护' then nvl(b.suc_paymoney,0) end) care_amt
,count(distinct case when b.item_first_cate_name = '家用电器' then a.outbizno end) as household_order_cnt
,sum(case when b.item_first_cate_name = '家用电器' then nvl(b.suc_paymoney,0) end) household_amt
,count(distinct case when b.item_first_cate_name = '生鲜' then a.outbizno end) as fresh_order_cnt
,sum(case when b.item_first_cate_name = '生鲜' then nvl(b.suc_paymoney,0) end) fresh_amt
from dmv.DWB_PAY_SYT_ORDR_DET_I_D a
left join
(select matchid,first_cate as item_first_cate_name,suc_paymoney from dmv.a_sc_order_union_i_d where dt >=${startdate})as b
on a.outbizno=b.matchid
where
dt>=${startdate}
and a.suc_time is not null
and a.payenum in(209,210,263,264,131,132,138,139,152,153,205,206,229,643,688,689,471,690,691,670,667,665,569,548,392,241,750,1008,1011,299,496,352,183,546,185,686,701,1015,186,258,147,140,110,553,651,648,663,568,1009,1060,1018,199,200,201,202,404,405,394,395,406,407,616,617,618,637,672,531,628,731,619,642,664,415,668,669,759,532,755,530,192,193,174,1022,563,564,124,195,196,164,166,219,599,191,159,262,127,119,501,122,603,207,711,710,1019,1061,1039)
and a.cardtype = 2
-- and a.bankcode in('CEB','CMB','CCB','CITIC','BCOM','GDB','BOC','PAB','SPDB','ICBC','ABC','CMBC','CIB')
group by
substr(a.suc_time,1,10)
,a.bankcode
;case when
select
...
,case when bankcode = 'COMM' then 'BCOM' else bankcode end as bankcode
,case when cardtype = 'DEBIT' then 1
when cardtype = 'CREDIT' then 2
else cardtype
end as cardtype
from dev_tmp.wyx_wx_bank_tmp00