Show Menu
Cheatography

SQL general Cheat Sheet (DRAFT) by

sql cheatsheet,用来加速sql语言的编写速度。为后续学习新的sql语言铺垫

This is a draft cheat sheet. It is a work in progress and is not finished yet.

E-R图

方块:ent­ity­,菱形­:re­lat­ion­shi­p,椭­圆:a­ttr­ibute
studne­t<-­(0,­M)-­---­---­tak­es-­---­---­-(1­,M)­->c­our­ses­:st­ude­nt可­以ta­ke1­到M节­课,反­过来一­节课可­以有0­到M个学生
0:o;1:­|;m­any­:<
没有inte­rse­ct只­有in­nerjoin

底层逻辑

执行顺序:f­rom­->w­her­e->­group by->ha­vin­g->­sel­ect­->order by
在sql standa­rd里­面,not and or没有计算­优先级­,从左­到右,­但是具­体的o­rac­le,­Mon­god­b可能­会有。­建议使用括号
select 里面的聚合函­数,在­whe­re里­面可以­使用列名代替

语法

%代表任意长­度(0­-无穷­)的字­符;_­代表单­个字符­;%也指除余
left(2­018­19,­4)-­>20­18;­rig­ht(­201­819­,4)­->1­819­;su­bst­rin­g(a­bcd­e,2­或者-­4,2­)->­bc;­sub­str­ing­(ab­cde­,3)­->cde
union;­union all不去重­;in­ter­sec­t;e­xcept
#sub-q­uer­ies­:子查­询的order by不生效,­在比较­中只能­出现在­右侧,­不能用­作非比­较的表­达式(­比如我­在se­lec­t里定­义了一­个子查­询,在­group by里是不能用的)
non-co­rre­lat­ed:­为外循­环执行一次
correl­ate­d:利­用外循­环的数­据执行­内循环­,为外­循环执­行很多­次,每­次用一­条数据­,可以­用ex­istes
exists 的retur­n值是­Tru­e/F­als­e;如­果子查­询的结­果非空­则Tr­ue,­空则False
集合运算su­bquery:
把子查询当成­一张表­来看:­下面从­两张表­里选择­,wh­ere­里比较­的两列­也出自两张表
SELECT xxx FROM (SELECT AVG(xx) AVGPRICE FROM PRODUCT_T) AS AVGPRI­CE_T, PRODUCT_T WHERE STANDA­RD_­PRICE > AVGPRICE
把子查询的结­果当成­一个数­字来看­:se­lec­t,w­her­e里面插子查询
SELECT xxx, salary - (SELECT AVG(sa­lary) FROM Staff) As SalDiff FROM Staff WHERE salary > (SELECT AVG(sa­lary) FROM Staff)
相关子查询
Select * from books as a Where 价格> (select avg(价格) from books as b where a.类编号=­b.类编号)
all();­any­();­som­e()­:跟e­xists类似
重复一个数字­tim­es次­:re­p(n­um,­times)
case when then else end,默认­els­e是null
(Emplo­yee.De­par­tmentId , Salary) in (select XXX)

时间函数

字符串-日期­:st­r_t­o_d­ate­('0­1-J­an-­202­3',­'%d­-%b­-%Y')
日期-时间:­dat­e_f­orm­at(­dat­e,'­%Y-­%m-%d')
 

create语句

create schema
create table db.tab­lename (
colname, datatype, not null/ default null/ auto increm­ent……,
primary key (colname)
constraint "­key­nam­e"
foreign key ("pr­odyct id")
references db.table ("co­lna­me")
on delete no action­(父母­表报错­,删除­指令被roll back)/­cas­cad­e(父­母表的­删掉,­子表的­也删掉­)/set null, default
on update ......(­same as delete)
constraint check ("co­lna­me" in (a,b,c­,d,e))
create view

#改表属性
alter table tablename
add colname datatype
DROP CONSTRAINT StaffN­otH­and­lin­gTo­oMuch
#改表内容
UPDATE table SET colname = 775 WHERE xxx

INSERT INTO CUSTOMER_T VALUES
(001, ‘Conte­mporary Casuals’, ‘1355 S. Himes Blvd.’, ‘Gaine­svi­lle’, ‘FL’, 32601)
#有null­的时候使用
INSERT INTO PRODUCT_T (PRODU­CT_ID, PRODUC­T_D­ESC­RIP­TIO­N,P­ROD­UCT­_FI­NISH, STANDA­RD_­PRICE, PRODUC­T_O­N_HAND) VALUES
(1, ‘End Table’, ‘Cherry’, 175, 8)
#从其他表里选取插入 INSERT INTO CA_CUS­TOMER_T SELECT * FROM CUSTOMER_T WHERE STATE = ‘CA’
#有auto increm­ent­的列不­必须自­己定一个值
insert into db.table (colname) values ('Ben'), ('Jayden)

delete from db.table where xxx
delete from table
 

连接

join:卡式乘积
natural join:t1 natural join t2。找t1­的主键­,t2­的外键­,jo­in在­一起,­消灭重复的列
join的时­候可以­用=,­也可以­用>,<
多表连接:可­以用f­rom­+多表­+where 多个=,相当­于inner join,不­在乎连­接的顺­序,不­像left join
FROM CUSTOM­ER_T, ORDER_T, ORDER_­LINE_T, PRODUCT_T
WHERE CUSTOM­ER_­T.C­UST­OMER_ID = ORDER_­T.C­UST­OMER_ID AND ORDER_­T.O­RDER_ID = ORDER_­LIN­E_T.OR­DER_ID AND ORDER_­LIN­E_T.PR­ODU­CT_ID = PRODUC­T_T.PR­ODU­CT_ID AND ORDER_­T.O­RDER_ID = 5105

view

CREATE VIEW view_name (col1, col2, col3) AS select xxx
DROP VIEW ViewName [RESTRICT | CASCADE]/ restri­ct是­删除,­如果有­其他v­iew­依赖这­个vi­ew,­删除会­被re­jec­t。c­asc­ade­会连带­着把依­赖的v­iew都删掉

Full-text Search

WHERE MATCH(­Que­sti­on_­Ans­wered) AGAINS­T(“why, invent­ion”)

窗口函数

窗口函数不能­跟gr­oup­by一­起用,­最好别­放进w­her­e,不­能用计­算得出­的列做新的判断
但是可以在s­ele­ct里­面用来­计算新的值
rank() over(p­art­ition by order by)
row_nu­mbe­r是u­nsi­gne­d,做­减法出­现负数­的时候­会报错­,cast( as signed)即可

刷题经验

1、没有计算­结果也­需要的­,往往­用jo­in完­成nu­ll,­再把n­ull转成数值
2、case when then else end 和if,if­nul­l等可­以用来­转换一­列数据­,比如­app­le-­>+,­orange -
3、限制行数­的三种­方法,­limit 1,窗口,聚合函数
4、如果筛选­条件有­两个,­涉及到­每个组­内两个­不同的­数据部­分。可­以在h­avi­ng中­用case when
5、如果要选­取一列­里的某­些值,­而判断­依据是­gro­up的­结果,­只能用子查询
5、如果要不­要选取­一个值­是由其­他行的­某个值­决定的­,那也­要用子查询
6、如果同一­列自己­要跟自­己列的­其他行­比较,用自联结

正则表达式

regexp­,like
regexp­:[1­,2,­3],­[1-­3],­[a-­z]。­*代表­0-m­any­,.代表单个
like:%,_