|
8 q) X6 `* [% w' U/ C: y- A 第四关的内容是我期盼已久的,虽然学过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题找出所有首都和其國家名字,而首都要有國家名字中出現。 8 J) l4 O* d1 Z, ?" E- J; z
SELECT capital,name FROM world WHERE capital LIKE concat(%,name,%);
+ F9 c5 y# W9 G5 a 2、第1章:第15题"Monaco-Ville"是合併國家名字 "Monaco" 和延伸詞"-Ville",顯示國家名字,及其延伸詞,如首都是國家名字的延伸。 ! c, ]: y; {8 t- K' W1 t
SELECT name,REPLACE(capital,name, ) FROM world WHERE capital LIKE concat(name,_%);
* ^4 c0 d0 S6 s2 P: Z1 ~2 }! p$ N 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。 * s) ]" }6 _) `2 v0 D' z
SELECT name,continent,
T- s1 }7 S" @" S* x5 P CASE WHEN continent=Oceania THEN Australasia
! u; L g f3 H1 p$ x* j WHEN continent=Eurasia THEN Europe/Asia6 h( S x1 S3 y. Z1 @6 P0 J
WHEN name=Turkey THEN Europe/Asia
+ @) t! U+ `& V5 S) w WHEN continent=Caribbean AND name LIKE B% THEN North America
+ V8 g# ^7 A+ P, c WHEN continent=Caribbean AND name NOT LIKE B% THEN South America
4 o4 C i2 E8 }+ K4 g+ W" C, G4 j ELSE continent END8 M$ j0 o/ u/ y
FROM world
- ~" \0 P8 D& m: r# U& R) }5 }% l ORDER BY name; `. ]/ c+ L/ w0 h, M2 }" G
4 S! X) E* T7 v5 E/ c$ d- @
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. C( Q. e, O* ?6 i- i
SELECT winner,subject
2 z& w* V2 ^7 z( G; Z FROM nobel
: u$ J# e' H: C% D0 c' F Y WHERE yr=1984: E6 ^* _; {7 L4 h
ORDER BY subject IN (Physics,Chemistry),subject,winner;
7 I) L L3 l1 P4 b# _3 V
3 S0 n6 C9 G1 Q6 g 5、第4章:第5题顯示歐洲的國家名稱name和每個國家的人口population百分比,以德國的人口的百分比作人口顯示。 8 T3 m' U) M6 u5 F. w, [& H0 K
SELECT name,
( w7 f7 f$ a2 C: K1 @% \ CONCAT(ROUND(population*100/(SELECT population FROM world WHERE name=Germany),0),%) _( q! R- {5 T& d
AS population
8 C. _7 z7 t. g3 L4 ~2 } FROM world WHERE continent=Europe;
' T2 X$ C# N Y c! y
( T8 I6 m' S7 V) k. d( Y7 X 6、第5章:关于nobel表的SUM和COUNT练习第11题列出誰獲得多於一個獎項(Subject)。 . ^7 g9 S* a$ p& Q
SELECT winner FROM nobel GROUP BY winner HAVING COUNT(DISTINCT(subject))>1; : ~! f: \( ~) K$ u$ i3 m s
7、第6章:第12题每一場德國GER有參與的賽事中,列出賽事編號 matchid, 日期date 和德國的入球數字。原题要求列出的是德国的入球次数,所以此处必须添加条件teamid=GER % R% z$ x# l j" e! m8 D# r
SELECT matchid,mdate,count(teamid)
( J* N* f, V3 ^4 D; L8 \ FROM game JOIN goal ON matchid=id
* r' D+ O% n1 {5 ?& w+ A6 L WHERE (team1 = GER OR team2 = GER) aAND teamid=GER GROUP BY matchid,mdate; j0 |) I% U. i8 k! h1 O
' H- m/ V9 w6 _% p5 t: p, u 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. " ~# I P; B0 G( r Z! S0 B
SELECT mdate,team1,5 f* Q) p& w' T4 ^; b# F, q
SUM(CASE WHEN teamid=team1 THEN 1 ELSE 0 END): c2 ]6 l5 v% A5 w& W) s7 j
score1,8 j7 \$ T- W9 ~/ v4 V. c& x' f
team2," _# P$ |" q7 f! e2 A
SUM(CASE WHEN teamid=team2 THEN 1 ELSE 0 END )
6 ~6 x. r1 C9 p# Y0 ^ score2
9 g% @+ A: a2 E6 q4 r- @ FROM game LEFT JOIN goal ON matchid = id. z! a* M% w% s
GROUP BY mdate, matchid, team1,team2, q8 d# E0 T" ~) `( x7 \7 W
ORDER BY mdate, matchid, team1,team2
E6 V/ I# g/ S) M6 { 总结SQLZOO里的题目做了90%,有个别很复杂的我没有做,大概有五六道。经过这一段时间的学习以及最近在公司做的数据分析项目,对SQL的应用,我个人的理解如果不是专门做数据库的人员,不需要掌握太复杂的,但是基本的知识应该反复温习、练习、复习以及应用。
4 I; a& ?! N+ T4 m- q9 y 最近做的项目就是根据数据的唯一编号从数据库里取数据,公司的数据库管理员已经写好很多Views,其实我是从Views里取的数据。 用SQL做上海地区出租房屋情况的分析分析需求:
; l; T I3 t- j5 {/ h0 a9 m4 v 1、上海出租房分布情况:各区域房源数目,平均面积,楼层情况,交通方便情况。在某如网站上爬取的数据,由于网站限制,租金字段爬不下来,只能就分布区域,面积等分析。 4 t" r; D3 e7 d' h' x0 q$ u; B
2、爬取数据后先在excel里做数据处理、数据清洗,在这里有的字符型数据需要通过“分列”转化为数字型数据。另存为csv格式,然后导入Navicat里。
: f; L9 t" {- G' Q/ O
, w. }8 v2 K! H+ y5 m$ f3 p7 Z2 l1 o0 x 3、总数据量。
) |& G/ m- q% k) f# }; B 5 D. i4 u- L2 H
4、分析各个区域出租房屋数及占比。
% v/ B E D5 d6 r* {
4 Y# N z0 o5 X4 a5 T2 m& r. R2 W 5、各个区域出租房屋的平均面积。 8 o+ U5 l$ T) [, v( W3 g' t1 a$ K
. q [+ ?* }3 G: }; [" ~* d9 E2 {) F* [
6、出租房屋的层级划分。按整楼高。 4 A Z, ?/ ]1 u0 i
: k! k& X# y, m- m2 B- O b
7、距地铁站的距离。
# b$ L/ b9 ]8 L; A, b4 z4 M 项目总结爬取到的数据量有些太少了,并且感觉很不全面。要想真正提高自己的技术水平,还需要多应用。自己接触的数据分析项目还是比较少,感觉有点无从下手,不知道应该分析哪些东西才是有价值的,现实情况中,做数据分析还需多学习些业务知识,与业务相结合的分析才能分析对方向,才能分析出有价值的东西。 " G6 E0 Q/ t; j7 |9 J$ l
% ^! r& U# H: s: O+ _+ R1 R9 `
6 P7 ~4 ]! h/ m& Z' p* `% f7 [
! C& D& D. o5 E: Z2 w: M5 p8 j( c
4 o3 t! W3 r& [7 x |