, X$ r& x% ^1 B. `0 F$ K; P: H% O* b
第四关的内容是我期盼已久的,虽然学过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题找出所有首都和其國家名字,而首都要有國家名字中出現。
* }+ L- y8 t' b; r; J, h H SELECT capital,name FROM world WHERE capital LIKE concat(%,name,%); 0 `4 p% J6 p' B
2、第1章:第15题"Monaco-Ville"是合併國家名字 "Monaco" 和延伸詞"-Ville",顯示國家名字,及其延伸詞,如首都是國家名字的延伸。
3 r. V3 a, i% r& m SELECT name,REPLACE(capital,name, ) FROM world WHERE capital LIKE concat(name,_%); 1 u' W% U8 z! f @( R6 k* J/ @1 `
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。
O! ^& n' P; p5 N V: \9 q0 W SELECT name,continent,
1 C5 Q% `; V m$ }/ H) g0 u CASE WHEN continent=Oceania THEN Australasia$ p3 e$ c: Q( Q7 r6 k
WHEN continent=Eurasia THEN Europe/Asia
/ X" W- L4 _% Q( f# D0 W2 M2 E WHEN name=Turkey THEN Europe/Asia
* ]1 v4 l" ~# S- g+ G; E1 e+ W WHEN continent=Caribbean AND name LIKE B% THEN North America
, [0 z% v: @; h6 n WHEN continent=Caribbean AND name NOT LIKE B% THEN South America- I9 [3 T1 Y5 j5 C/ g. l
ELSE continent END9 I0 v, v8 V# v9 A
FROM world
% V- _3 c+ q' z/ y/ G! _ ORDER BY name;6 z" j2 p+ \! L' t! k, V# P F
0 m# I$ s8 A" f 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.
; L0 ]' p! I( P3 |* j1 S SELECT winner,subject. @9 L8 f! Q) P2 t
FROM nobel
. y% b: \3 B# q' o' ]9 s WHERE yr=1984) ]+ M e% p# e
ORDER BY subject IN (Physics,Chemistry),subject,winner;* i/ V. f1 A, w6 W
. x* |. D. s7 N& U6 Z 5、第4章:第5题顯示歐洲的國家名稱name和每個國家的人口population百分比,以德國的人口的百分比作人口顯示。
* @4 t l2 v' {) w/ \: w) S SELECT name,
1 s: h9 V' D: s$ T4 Y4 g( O0 Q- F CONCAT(ROUND(population*100/(SELECT population FROM world WHERE name=Germany),0),%)
. Q& r) d5 O; Q$ ^# c+ L1 @, O AS population: s8 V& K' y" A8 E3 g; S Z1 E
FROM world WHERE continent=Europe; l1 p3 }/ A+ O. t y
3 G1 u8 j% ?% r5 w0 G
6、第5章:关于nobel表的SUM和COUNT练习第11题列出誰獲得多於一個獎項(Subject)。 ) T# t, y/ Q7 M) s+ @4 E5 V1 u
SELECT winner FROM nobel GROUP BY winner HAVING COUNT(DISTINCT(subject))>1;
" D+ o3 M3 L% L$ h/ N4 y8 g* }4 k 7、第6章:第12题每一場德國GER有參與的賽事中,列出賽事編號 matchid, 日期date 和德國的入球數字。原题要求列出的是德国的入球次数,所以此处必须添加条件teamid=GER ; M9 A7 Y% W6 s
SELECT matchid,mdate,count(teamid)
3 i0 G0 Q& l/ y7 R" Z% @# l# [ FROM game JOIN goal ON matchid=id
# M P, v( Q, Q7 b5 X/ { WHERE (team1 = GER OR team2 = GER) aAND teamid=GER GROUP BY matchid,mdate;1 k4 J8 e$ D4 s: Z: v! I+ N4 i
: k- _' g; X Z7 z- L) @ 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.
2 t7 X/ z1 ?+ O% O$ w SELECT mdate,team1,9 [; G5 M$ A z' F
SUM(CASE WHEN teamid=team1 THEN 1 ELSE 0 END)
* S! {9 \0 `# u9 k0 |0 D$ L/ I score1,
) v" T% l# D4 K) K2 z team2,/ _. y% _+ J! E* P g
SUM(CASE WHEN teamid=team2 THEN 1 ELSE 0 END )8 s; K* t0 ]9 p x
score2
& P& W' B1 i* g7 q# d/ P, N) Y z FROM game LEFT JOIN goal ON matchid = id
+ y' C/ S) P, n6 i* U+ v GROUP BY mdate, matchid, team1,team26 _6 F9 @* P2 ~ D9 [3 T( {* Y; P
ORDER BY mdate, matchid, team1,team2
, Y# j% H6 r+ V. P0 D' T) H 总结SQLZOO里的题目做了90%,有个别很复杂的我没有做,大概有五六道。经过这一段时间的学习以及最近在公司做的数据分析项目,对SQL的应用,我个人的理解如果不是专门做数据库的人员,不需要掌握太复杂的,但是基本的知识应该反复温习、练习、复习以及应用。
! v0 r! s8 V# @6 p 最近做的项目就是根据数据的唯一编号从数据库里取数据,公司的数据库管理员已经写好很多Views,其实我是从Views里取的数据。 用SQL做上海地区出租房屋情况的分析分析需求: 5 N/ H7 \8 X% _% A/ t& v. A
1、上海出租房分布情况:各区域房源数目,平均面积,楼层情况,交通方便情况。在某如网站上爬取的数据,由于网站限制,租金字段爬不下来,只能就分布区域,面积等分析。 ! C8 @" K/ N. Q; `3 ^6 B( U
2、爬取数据后先在excel里做数据处理、数据清洗,在这里有的字符型数据需要通过“分列”转化为数字型数据。另存为csv格式,然后导入Navicat里。
* i6 v3 y/ A% t$ A0 I : @9 v4 D- x; G+ l4 U8 y
3、总数据量。
$ j1 H- K9 e5 L, q4 [2 \/ d5 C + n! a) z& z" D. I1 w- K8 a
4、分析各个区域出租房屋数及占比。
, X7 z) w' n. F) ^$ w" I8 S$ o( F) e6 ^ $ x6 ?" Y9 B1 G
5、各个区域出租房屋的平均面积。 + B5 X1 {, u# W- J
, ^; [ P) o. r5 s$ n, A 6、出租房屋的层级划分。按整楼高。 9 L6 d# x( h. m" P3 E2 z9 Y/ ^
' T2 x1 y- ]+ n* G9 E8 n
7、距地铁站的距离。 - ^! t; ]; c n: v
项目总结爬取到的数据量有些太少了,并且感觉很不全面。要想真正提高自己的技术水平,还需要多应用。自己接触的数据分析项目还是比较少,感觉有点无从下手,不知道应该分析哪些东西才是有价值的,现实情况中,做数据分析还需多学习些业务知识,与业务相结合的分析才能分析对方向,才能分析出有价值的东西。 2 D2 ^% q* m8 F- [+ _3 s; D: z
0 W9 q2 c1 H0 u1 U5 A4 f- ?6 \! P0 L2 x
8 e+ T& F8 |9 Y8 a; s3 u( b5 X! j- ?9 h4 k5 D
$ p2 I$ [! \) q
|