|
, M0 s: B. w7 C- F- j 第四关的内容是我期盼已久的,虽然学过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题找出所有首都和其國家名字,而首都要有國家名字中出現。 $ t% S O& M5 O" S0 T( G) s1 y+ f
SELECT capital,name FROM world WHERE capital LIKE concat(%,name,%);
4 u5 b1 a3 ~5 v& S5 ^ 2、第1章:第15题"Monaco-Ville"是合併國家名字 "Monaco" 和延伸詞"-Ville",顯示國家名字,及其延伸詞,如首都是國家名字的延伸。
. a( d) v, L- _' P SELECT name,REPLACE(capital,name, ) FROM world WHERE capital LIKE concat(name,_%);
# Q- \2 }: k6 o* @ |8 C 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。
# X4 N, p# r5 R- f3 p SELECT name,continent,
8 S& Q, C! {) U T CASE WHEN continent=Oceania THEN Australasia
; s5 c* o5 ^/ b! K" j( a+ B, W WHEN continent=Eurasia THEN Europe/Asia
' ]3 k$ x& e, H! G2 i, h2 ? WHEN name=Turkey THEN Europe/Asia# d2 G0 C; M( [! ^1 U5 f& f1 @% E
WHEN continent=Caribbean AND name LIKE B% THEN North America# @* ~: [# N5 _" J2 `2 E( c. n+ D
WHEN continent=Caribbean AND name NOT LIKE B% THEN South America' Z4 C. W9 ~' X4 ^
ELSE continent END
, O! `: K9 r9 C# d6 p' G FROM world
4 I3 G" y1 K) c: D1 @* U. |, {3 e ORDER BY name;
; q8 D p9 A) v% e- X- G2 u/ t/ d
9 z: ~* x% ?7 P3 V# a9 O 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.
3 J9 A6 q3 N: [6 Y( C3 D+ Y, g SELECT winner,subject
' |. y/ ?0 H0 K5 Z( d; v3 P FROM nobel
+ C$ J3 _: Z3 V5 n: E: V' L) S WHERE yr=1984
) Q7 S% ~" H) F: E+ _$ B6 _0 |) W ORDER BY subject IN (Physics,Chemistry),subject,winner;
! Q$ y$ [+ z( d # B9 {( s9 O7 ^: X& M" _% P9 D
5、第4章:第5题顯示歐洲的國家名稱name和每個國家的人口population百分比,以德國的人口的百分比作人口顯示。
6 c% e; \( n; X4 l. D' r4 y SELECT name,* q: @. [2 B3 c) k( X
CONCAT(ROUND(population*100/(SELECT population FROM world WHERE name=Germany),0),%)
7 |: e( x. Q6 w l! ~7 R AS population
# \/ b, `% O! B FROM world WHERE continent=Europe;
- }2 j7 e% D1 U f' f( E 9 `, c& I D3 J: Q& L" M
6、第5章:关于nobel表的SUM和COUNT练习第11题列出誰獲得多於一個獎項(Subject)。 8 W/ s) P `+ O1 `
SELECT winner FROM nobel GROUP BY winner HAVING COUNT(DISTINCT(subject))>1;
% y6 l2 _& s0 j/ {) m" } 7、第6章:第12题每一場德國GER有參與的賽事中,列出賽事編號 matchid, 日期date 和德國的入球數字。原题要求列出的是德国的入球次数,所以此处必须添加条件teamid=GER 6 J) S+ e3 ]9 R3 \ P h6 L
SELECT matchid,mdate,count(teamid)& _, `* F4 L# q3 `/ V) e0 a. M3 k
FROM game JOIN goal ON matchid=id/ W1 `( W% _- Z) y0 _4 d
WHERE (team1 = GER OR team2 = GER) aAND teamid=GER GROUP BY matchid,mdate;7 A/ ^- ~( i; C/ m) k$ \1 i% V
) @6 `5 u0 ?) }5 H 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. : C; ~! c j- X; Q2 E8 b5 E
SELECT mdate,team1,
6 W0 ?8 T5 w7 q3 k SUM(CASE WHEN teamid=team1 THEN 1 ELSE 0 END)
. I" R5 C1 N" A% I score1,
; ~, Y/ q9 O) H' f3 t0 d1 _ team2," ~2 W7 q+ ]* i; y* ^. B
SUM(CASE WHEN teamid=team2 THEN 1 ELSE 0 END ). t( K" |9 V; Y" ]( |& f
score2
' y/ e1 K; |" C* w3 G2 I FROM game LEFT JOIN goal ON matchid = id/ i/ p/ j; D4 k/ Y. W. q% |( G
GROUP BY mdate, matchid, team1,team2
" A6 i5 I. d1 W. J5 g ORDER BY mdate, matchid, team1,team2% h9 r) n, L4 C( e9 [, P4 j
总结SQLZOO里的题目做了90%,有个别很复杂的我没有做,大概有五六道。经过这一段时间的学习以及最近在公司做的数据分析项目,对SQL的应用,我个人的理解如果不是专门做数据库的人员,不需要掌握太复杂的,但是基本的知识应该反复温习、练习、复习以及应用。
3 a, B) D# c9 F* d( s) B) t 最近做的项目就是根据数据的唯一编号从数据库里取数据,公司的数据库管理员已经写好很多Views,其实我是从Views里取的数据。 用SQL做上海地区出租房屋情况的分析分析需求: + H3 Q4 D9 m3 X/ `! V# j$ x( N
1、上海出租房分布情况:各区域房源数目,平均面积,楼层情况,交通方便情况。在某如网站上爬取的数据,由于网站限制,租金字段爬不下来,只能就分布区域,面积等分析。
$ q m- h5 C @# q2 [5 N% d6 V 2、爬取数据后先在excel里做数据处理、数据清洗,在这里有的字符型数据需要通过“分列”转化为数字型数据。另存为csv格式,然后导入Navicat里。
; H6 @! W, i. y) l( |- |- @
D8 T# l* t1 s% p 3、总数据量。
3 @3 @3 X" p0 L, F. ^ 3 \# G& s* y! C' \ t8 R
4、分析各个区域出租房屋数及占比。 8 M- b( A( `$ T8 B
$ o' S" K5 n* b: w# b 5、各个区域出租房屋的平均面积。
, W7 B& I# I9 S9 a* A% Q* k3 i, N 8 z1 ^2 o) j) C& \- n2 ^
6、出租房屋的层级划分。按整楼高。 " ?" z% v9 ?# P6 b
( N, i" F& m. T% X 7、距地铁站的距离。 ) [% h" {$ P- W; w7 y. L
项目总结爬取到的数据量有些太少了,并且感觉很不全面。要想真正提高自己的技术水平,还需要多应用。自己接触的数据分析项目还是比较少,感觉有点无从下手,不知道应该分析哪些东西才是有价值的,现实情况中,做数据分析还需多学习些业务知识,与业务相结合的分析才能分析对方向,才能分析出有价值的东西。 " y) G" V$ ^5 g" r+ ~6 P
+ ~4 I) a, @+ V/ h$ A: G5 x3 Q- p4 q& I
" Z7 Y% N. |- ~2 h
2 \9 H+ i, B7 J! @: w
d* o! u! A. r) F6 h! \7 l4 m |