|
) V9 |. W9 r+ C$ _2 ]! L: m o 第四关的内容是我期盼已久的,虽然学过SQL,但是自己根本没有系统地掌握,也没有将其应用于实践的机会,一直是纸上谈兵。现在公司里用的就是MySQL,客户端用的是Workbench。跟着老师的课程,先在自己电脑上安好了MySQL和Navicat。先开始读书,并做一些读书笔记。 《SQL基础教程》关系数据库必须以行为单位进行数据读写。SQL语句以分号结尾。为了规范语句写法:关键字大写。字符串和日期常数要用单引号括起来,数字直接书写即可。要用半角空格作为单词的分隔符。COUNT 函数的结果根据参数的不同而不同。 COUNT (*) 会得到包含 NULL 的数据行数,而 COUNT (< 列名 >) 会得到 NULL 之外的数据行数。四则运算中如果存在 NULL ,结果一定是 NULL 。聚合函数,如果以列名为参数,那么在计算之前就已经把NULL 排除在外了。聚合函数会将 NULL 排除在外。但 COUNT (*)例外,并不会排除 NULL 。日期、字符串类型的数据能够使用 MAX/MIN 函数,但不能使用 SUM/AVG 函数。MAX / MIN 函数几乎适用于所有数据类型的列。 SUM / AVG 函数只适用于数值类型的列。SELECT → 2FROM → WHERE → GROUP BY→ HAVING→ ORDER BY。只有 SELECT 子句和 HAVING 子句(以及 ORDER BY 子句)中能够使用聚合函数。WHERE 子句 = 指定行所对应的条件,HAVING 子句 = 指定组所对应的条件。内联结中要用ON,ON要在FROM和WHERE之间。内联结只能取出同时存在于两张表中的数据。外联结:RIGHT OUTER JOIN代表右边为主表,LEFT OUTER JOIN代表左边为主表,取出单张表中的全部信息。最近比较忙,我也是刚报老师的班就很幸运的找到工作了,虽然没有相关工作经验,所以在公司里这一段时间也是在天天学各种东西,SQL一时就有点跟不上了。我的工作中现在对SQL技术要求不高,但是还是要自己会取数据的。终于把《SQL基础教程》里老师要求看的章节囫囵吞枣看完了,边看边练习,粗糙的过了一遍。现在开始练习SQL ZOO里的习题。选择一些比较有难度的题记到笔记里。 SQL ZOO练习题笔记1、第1章:第13题找出所有首都和其國家名字,而首都要有國家名字中出現。 5 ?3 A* |) Q5 k. N: s) ]1 B! G
SELECT capital,name FROM world WHERE capital LIKE concat(%,name,%);
* ?: [4 R! ~2 P7 J+ ^ 2、第1章:第15题"Monaco-Ville"是合併國家名字 "Monaco" 和延伸詞"-Ville",顯示國家名字,及其延伸詞,如首都是國家名字的延伸。
. V! C+ x @! A SELECT name,REPLACE(capital,name, ) FROM world WHERE capital LIKE concat(name,_%);
; f0 P+ {# ?6 z9 t 3、第2章中文版:第13题Oceania becomes Australasia,Countries in Eurasia and Turkey go to Europe/Asia,Caribbean islands starting with B go to North America, other Caribbean islands go to South America,Show the name, the original continent and the new continent of all countries。
: {- I# K! j- c8 Z, g. ^ SELECT name,continent,8 j0 G4 K$ ?+ ~$ C
CASE WHEN continent=Oceania THEN Australasia0 t( }+ D: R2 B$ o
WHEN continent=Eurasia THEN Europe/Asia5 {6 _" x5 o! N6 o
WHEN name=Turkey THEN Europe/Asia F y+ a5 A, \2 y7 g
WHEN continent=Caribbean AND name LIKE B% THEN North America
+ r( z. \" [# b% y: J( V* I3 E WHEN continent=Caribbean AND name NOT LIKE B% THEN South America
& V3 v% ~0 f) c ELSE continent END% w+ \, B/ b8 P0 n4 u- F/ i8 x
FROM world4 N% d. r! l8 k7 c3 w
ORDER BY name;; X5 M4 H0 Q2 j i9 x. o s
( x+ n7 W0 w. [+ I% Z, C8 O0 u 4、第3章:第14题The expression subject IN (Chemistry,Physics) can be used as a value - it will be 0 or 1.Show the 1984 winners and subject ordered by subject and winner name; but list Chemistry and Physics last.
9 O% a; g* U c8 v SELECT winner,subject
- u0 ?! _* F/ V0 ~- q; i FROM nobel
$ ?8 Q$ I; J6 y- \* \* L8 D6 b% x WHERE yr=1984
. S# ]* w$ c% J- X$ [+ u ORDER BY subject IN (Physics,Chemistry),subject,winner;+ u5 a! ^+ `- ^
; `) T I3 j( c/ T2 J 5、第4章:第5题顯示歐洲的國家名稱name和每個國家的人口population百分比,以德國的人口的百分比作人口顯示。 0 [1 y4 U2 w' ?
SELECT name,$ k( l1 C. Y# c/ i% j8 H' @
CONCAT(ROUND(population*100/(SELECT population FROM world WHERE name=Germany),0),%)
$ c- M5 y1 F- G2 w5 n; q AS population/ M4 [' C$ L* R8 p V* X# B, |7 r
FROM world WHERE continent=Europe;% F: F, b. k/ T7 F* q
: {: V+ c( n. W, A
6、第5章:关于nobel表的SUM和COUNT练习第11题列出誰獲得多於一個獎項(Subject)。
& g/ ]) v, Z& v- v# c- p% z SELECT winner FROM nobel GROUP BY winner HAVING COUNT(DISTINCT(subject))>1;
& }' y @" H$ J2 r- M0 G 7、第6章:第12题每一場德國GER有參與的賽事中,列出賽事編號 matchid, 日期date 和德國的入球數字。原题要求列出的是德国的入球次数,所以此处必须添加条件teamid=GER , ^' v" s: V$ u8 D& n- |
SELECT matchid,mdate,count(teamid)
8 m# v, `# Y( r* M8 i" v. n! W; ~3 l FROM game JOIN goal ON matchid=id
. }2 P5 [1 i8 `3 w5 U: E WHERE (team1 = GER OR team2 = GER) aAND teamid=GER GROUP BY matchid,mdate;! i$ F( l- P3 d v$ Z
" x0 h3 c, X# @
8、第6章:第13题Notice in the query given every goal is listed. If it was a team1 goal then a 1 appears in score1, otherwise there is a 0. You could SUM this column to get a count of the goals scored by team1.Sort your result by mdate, matchid, team1 and team2.
5 h# F. u9 u- w. {- J2 ? SELECT mdate,team1,- t0 H w( B& r) u* r6 s' d. h0 d5 w
SUM(CASE WHEN teamid=team1 THEN 1 ELSE 0 END); h" M' s) p3 b: M( `6 N+ h
score1,
$ J" j0 ?2 Z4 H9 V, X team2,
& T1 y# M) o5 D+ [5 e SUM(CASE WHEN teamid=team2 THEN 1 ELSE 0 END )' ^" k7 t0 n9 ]( U+ T( y
score2
/ H% Q. \2 ]& ^) M. v FROM game LEFT JOIN goal ON matchid = id
' e. d1 \% [# w/ D6 V2 e GROUP BY mdate, matchid, team1,team2
: e7 {# |9 S: r ORDER BY mdate, matchid, team1,team28 x+ S4 I! Z4 @# q$ i& x8 g. h# \
总结SQLZOO里的题目做了90%,有个别很复杂的我没有做,大概有五六道。经过这一段时间的学习以及最近在公司做的数据分析项目,对SQL的应用,我个人的理解如果不是专门做数据库的人员,不需要掌握太复杂的,但是基本的知识应该反复温习、练习、复习以及应用。
- Z+ l2 }1 B! ]- s 最近做的项目就是根据数据的唯一编号从数据库里取数据,公司的数据库管理员已经写好很多Views,其实我是从Views里取的数据。 用SQL做上海地区出租房屋情况的分析分析需求: 9 u6 p/ S Z6 U5 m( r
1、上海出租房分布情况:各区域房源数目,平均面积,楼层情况,交通方便情况。在某如网站上爬取的数据,由于网站限制,租金字段爬不下来,只能就分布区域,面积等分析。 9 x1 g I* z: f( N; `% M* G- L" U
2、爬取数据后先在excel里做数据处理、数据清洗,在这里有的字符型数据需要通过“分列”转化为数字型数据。另存为csv格式,然后导入Navicat里。
4 K" r$ G9 k# y6 |' u) F 9 H! V0 ?: n7 z; o+ j" Q8 V5 J0 a# e; ~% a! ]
3、总数据量。
; Y3 M2 |! Y! p% P
8 ^' }8 A+ }* [ W. i 4、分析各个区域出租房屋数及占比。 1 o# F% l, Z8 W U: z
u4 M, A9 h" Z( h9 E2 g1 \+ c% O
5、各个区域出租房屋的平均面积。 2 H1 ?" u5 |) q q: y! w3 c
3 z2 \0 H: F5 F! ]
6、出租房屋的层级划分。按整楼高。
1 w0 A1 U% T2 N9 L) w
7 h& _( E. O: p N4 f3 t! B6 _ 7、距地铁站的距离。
2 R7 a" {/ U3 ^* p$ i% j: S2 a 项目总结爬取到的数据量有些太少了,并且感觉很不全面。要想真正提高自己的技术水平,还需要多应用。自己接触的数据分析项目还是比较少,感觉有点无从下手,不知道应该分析哪些东西才是有价值的,现实情况中,做数据分析还需多学习些业务知识,与业务相结合的分析才能分析对方向,才能分析出有价值的东西。 , h% E r( D# p9 w O
9 m3 f- u0 V" W2 x" J% N
0 ~' d( _) H; e% K J
0 l$ f( f8 _9 u; _( I
! w8 ]3 S }( O, t/ F/ v1 A6 ^% O, c9 U |