|
1 i! W t2 {/ ^' h
第四关的内容是我期盼已久的,虽然学过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题找出所有首都和其國家名字,而首都要有國家名字中出現。 / f/ r( U' i/ T! ~
SELECT capital,name FROM world WHERE capital LIKE concat(%,name,%); - E9 m4 w7 u+ D8 `6 e* p! D
2、第1章:第15题"Monaco-Ville"是合併國家名字 "Monaco" 和延伸詞"-Ville",顯示國家名字,及其延伸詞,如首都是國家名字的延伸。
0 @& a3 d( J( [8 [* e SELECT name,REPLACE(capital,name, ) FROM world WHERE capital LIKE concat(name,_%);
. P7 Q- P+ g$ |( \ 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。 4 `. d: R! K, A4 ?+ c
SELECT name,continent,
# o3 J. `' [. {) t6 I9 X, [ CASE WHEN continent=Oceania THEN Australasia
7 j' a: h2 F: c: \& G7 r5 c( u WHEN continent=Eurasia THEN Europe/Asia
: G- B) Q% Z8 v; S& s WHEN name=Turkey THEN Europe/Asia8 t2 O# ~; f+ s5 \) V
WHEN continent=Caribbean AND name LIKE B% THEN North America. }8 J. B% {8 T: h/ D/ g3 P
WHEN continent=Caribbean AND name NOT LIKE B% THEN South America
/ \( n8 t! `( E3 L3 c ELSE continent END: P; }3 t; [4 b
FROM world. y$ H/ J* c$ l, U" r
ORDER BY name;
! X) l, `) M9 l1 L' ^9 \. M
+ c' b8 M; {$ F' L3 P5 t 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.
+ m( u" K Z; s2 l7 u3 H; x, E SELECT winner,subject3 z" m- P* J5 t8 i# M, a6 S
FROM nobel
0 ^0 O) d4 E- T- K# H$ q8 p1 M WHERE yr=1984( y! w$ n m* d
ORDER BY subject IN (Physics,Chemistry),subject,winner;
4 Q5 b2 G7 P, l$ o3 l , v3 @8 ^. l7 l, \9 h) n* F% N
5、第4章:第5题顯示歐洲的國家名稱name和每個國家的人口population百分比,以德國的人口的百分比作人口顯示。 / T6 V4 f3 z/ F8 P$ _$ _& `! ~
SELECT name,5 Q" Q- y/ x+ ]$ Z
CONCAT(ROUND(population*100/(SELECT population FROM world WHERE name=Germany),0),%)
j7 Q8 D; n! W# C& ~: P. C) r AS population
) N. Y$ p: Q. z3 a7 |( L/ I9 V- ` FROM world WHERE continent=Europe;, ?4 i3 c% C1 V7 a
5 s( ^5 @5 w" D, N( l4 |
6、第5章:关于nobel表的SUM和COUNT练习第11题列出誰獲得多於一個獎項(Subject)。 + k4 Y5 t5 p$ h
SELECT winner FROM nobel GROUP BY winner HAVING COUNT(DISTINCT(subject))>1; 2 V& H0 y3 F' m' f
7、第6章:第12题每一場德國GER有參與的賽事中,列出賽事編號 matchid, 日期date 和德國的入球數字。原题要求列出的是德国的入球次数,所以此处必须添加条件teamid=GER : _' U6 B) T+ w4 X4 @" Z+ F) s" e
SELECT matchid,mdate,count(teamid): Y/ d$ N ? p J) b6 I1 t
FROM game JOIN goal ON matchid=id' T ^, ~: ]+ s3 S
WHERE (team1 = GER OR team2 = GER) aAND teamid=GER GROUP BY matchid,mdate;
" I7 K; d% i E8 i
7 y: e9 d8 M8 N8 f. r+ | 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. " o; C, {( {4 g
SELECT mdate,team1,
* f! |" l) k+ g6 Y6 U6 E! x8 b! ~7 { SUM(CASE WHEN teamid=team1 THEN 1 ELSE 0 END)+ U& O+ r' g/ B( h! p7 J9 M
score1,
7 i' l8 O4 W8 ^' l$ z' Y team2,
6 z% {# h4 K7 C7 y. f SUM(CASE WHEN teamid=team2 THEN 1 ELSE 0 END )+ M( n/ b/ b, ?5 D( a h
score2
. l. H! j# }2 ~7 [, R' B* e$ H; } FROM game LEFT JOIN goal ON matchid = id/ M2 f2 T' [. h' t) f* R
GROUP BY mdate, matchid, team1,team2
" K$ P7 u p# k) Y. v9 } ORDER BY mdate, matchid, team1,team2
, P: u- p! n4 \# L/ A8 E# {* a& }. G 总结SQLZOO里的题目做了90%,有个别很复杂的我没有做,大概有五六道。经过这一段时间的学习以及最近在公司做的数据分析项目,对SQL的应用,我个人的理解如果不是专门做数据库的人员,不需要掌握太复杂的,但是基本的知识应该反复温习、练习、复习以及应用。
+ g! m- s# U8 W. ^+ i" y. \ 最近做的项目就是根据数据的唯一编号从数据库里取数据,公司的数据库管理员已经写好很多Views,其实我是从Views里取的数据。 用SQL做上海地区出租房屋情况的分析分析需求:
! n0 D1 [: G" E5 ?8 g8 I 1、上海出租房分布情况:各区域房源数目,平均面积,楼层情况,交通方便情况。在某如网站上爬取的数据,由于网站限制,租金字段爬不下来,只能就分布区域,面积等分析。 ) t3 Z8 R! x: G- `
2、爬取数据后先在excel里做数据处理、数据清洗,在这里有的字符型数据需要通过“分列”转化为数字型数据。另存为csv格式,然后导入Navicat里。 $ S# {( `8 c- J$ V9 |: B# ~
& h" t3 s, D |% S) ^' g
3、总数据量。
& g' S5 m4 _# I% M; j$ m! s
$ L9 D- b2 s0 a( f3 v/ u 4、分析各个区域出租房屋数及占比。 1 d7 }2 U# L$ a7 Z) V" k9 h
4 s+ x! ?& {& a+ z6 }' I
5、各个区域出租房屋的平均面积。
" \- F& f5 ]4 W8 Q& x; Y: k; M + q( q" v% f* W" @- x) ~
6、出租房屋的层级划分。按整楼高。
9 b" T1 e5 D1 n+ E7 l5 m2 P8 X2 u. I
% D: ^3 _$ j6 b; Y, `- J! b; Z 7、距地铁站的距离。
! M$ x. Z* Y% x+ K& q9 j2 z# N 项目总结爬取到的数据量有些太少了,并且感觉很不全面。要想真正提高自己的技术水平,还需要多应用。自己接触的数据分析项目还是比较少,感觉有点无从下手,不知道应该分析哪些东西才是有价值的,现实情况中,做数据分析还需多学习些业务知识,与业务相结合的分析才能分析对方向,才能分析出有价值的东西。
- l0 e: n g3 u- E6 _" I& m( a$ b/ E- O. R
0 q! d8 l# u j2 _, s1 a
' Q9 W9 ~4 m9 o; w ^8 l
$ i j3 N2 A2 C
|