|
% i- d& B3 M m9 z) o! z2 z- ?! y 第四关的内容是我期盼已久的,虽然学过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题找出所有首都和其國家名字,而首都要有國家名字中出現。
9 R# G. I) A! D7 G( S- H2 I& @ SELECT capital,name FROM world WHERE capital LIKE concat(%,name,%);
# q) c( }# y3 ]$ @# P2 i 2、第1章:第15题"Monaco-Ville"是合併國家名字 "Monaco" 和延伸詞"-Ville",顯示國家名字,及其延伸詞,如首都是國家名字的延伸。 % X- b5 y; H! N' D7 U( ]4 B+ X
SELECT name,REPLACE(capital,name, ) FROM world WHERE capital LIKE concat(name,_%); ; R0 O5 t7 b4 o2 G( v$ G S
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。 ; c& R2 I/ I2 s( t. x* R4 {
SELECT name,continent,! a. O/ F7 G; h2 t, J% S9 ?, ~5 J
CASE WHEN continent=Oceania THEN Australasia
! y& K6 N. Q0 j9 B) P WHEN continent=Eurasia THEN Europe/Asia
! D& q% M& O- ^; w WHEN name=Turkey THEN Europe/Asia
* d/ W$ [# I. e5 [ WHEN continent=Caribbean AND name LIKE B% THEN North America
' b3 m9 C% h3 V( }( q WHEN continent=Caribbean AND name NOT LIKE B% THEN South America
/ s/ n( E3 }+ w4 d' k. k. V# S ELSE continent END+ ?( q* c. M. I) f) }9 B
FROM world0 H1 x, N/ q$ |! S2 V5 b9 K
ORDER BY name; O- C+ D) u) K4 T W
- g, ^, w6 R; t6 m, x! Z
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. % Y! t$ g/ c1 I- I
SELECT winner,subject
8 ~- x% c7 @2 s+ Z4 q, |- X FROM nobel5 B$ k( m4 b- r* J7 W3 F* d
WHERE yr=1984/ C1 B4 q" v+ _% U: I4 {9 w& U
ORDER BY subject IN (Physics,Chemistry),subject,winner; v+ ?; }9 w! G, I/ O
' R6 o9 u, Q% i+ Z) v: Y 5、第4章:第5题顯示歐洲的國家名稱name和每個國家的人口population百分比,以德國的人口的百分比作人口顯示。
) d a# C H% A5 p SELECT name,
* X: E$ J+ D& R2 H" x2 o CONCAT(ROUND(population*100/(SELECT population FROM world WHERE name=Germany),0),%)! P, r" Q% [: C
AS population
- }5 ^8 O3 G; r! j0 Z+ l) D FROM world WHERE continent=Europe;8 d( B/ R9 V( T1 x
3 l* G' ~) A$ n( W, ? 6、第5章:关于nobel表的SUM和COUNT练习第11题列出誰獲得多於一個獎項(Subject)。 + e: ]8 a! Z& E- a
SELECT winner FROM nobel GROUP BY winner HAVING COUNT(DISTINCT(subject))>1; ( ^, G7 l2 ]- S, i7 M9 J! f; C
7、第6章:第12题每一場德國GER有參與的賽事中,列出賽事編號 matchid, 日期date 和德國的入球數字。原题要求列出的是德国的入球次数,所以此处必须添加条件teamid=GER
' p6 M& c; p" H3 ]- R9 R SELECT matchid,mdate,count(teamid)
( y l( v$ o: a( T. j) {4 r! ` FROM game JOIN goal ON matchid=id7 \5 \, X# G1 A7 h# w) t
WHERE (team1 = GER OR team2 = GER) aAND teamid=GER GROUP BY matchid,mdate; J; B( D ?% o& ~8 W( z
) I7 ^2 [# y( c: i* k% c1 s/ ~9 t: n
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.
# X w v) \8 G& ? Y. z0 ^ SELECT mdate,team1,
5 A6 k, g |) i- c6 F, t! e SUM(CASE WHEN teamid=team1 THEN 1 ELSE 0 END)2 o3 X3 Q* H. C! u
score1,
8 k- m3 w3 M. N& A- {/ `; d; ]8 I3 U9 t team2,
v; l7 O1 v; M+ \7 z SUM(CASE WHEN teamid=team2 THEN 1 ELSE 0 END )
; r+ k7 X; O$ N score23 o9 q5 o( _4 t% U% U
FROM game LEFT JOIN goal ON matchid = id
$ g8 d& w: ^8 \. [4 o6 K GROUP BY mdate, matchid, team1,team2. F' i5 q z+ U
ORDER BY mdate, matchid, team1,team2/ \: O7 g7 y% T8 u/ F2 [
总结SQLZOO里的题目做了90%,有个别很复杂的我没有做,大概有五六道。经过这一段时间的学习以及最近在公司做的数据分析项目,对SQL的应用,我个人的理解如果不是专门做数据库的人员,不需要掌握太复杂的,但是基本的知识应该反复温习、练习、复习以及应用。
G, i8 {; C8 _- d9 l) J# A' \; b 最近做的项目就是根据数据的唯一编号从数据库里取数据,公司的数据库管理员已经写好很多Views,其实我是从Views里取的数据。 用SQL做上海地区出租房屋情况的分析分析需求: ) }2 S w) ]. d: [9 f. g$ ^
1、上海出租房分布情况:各区域房源数目,平均面积,楼层情况,交通方便情况。在某如网站上爬取的数据,由于网站限制,租金字段爬不下来,只能就分布区域,面积等分析。
% K% A2 \ Z: {5 \- P: `0 V! k U5 d 2、爬取数据后先在excel里做数据处理、数据清洗,在这里有的字符型数据需要通过“分列”转化为数字型数据。另存为csv格式,然后导入Navicat里。 / e9 _+ K- S" a3 N+ U) b6 ^
5 K9 O V0 g7 y8 j( s6 X! R7 b 3、总数据量。
8 k/ z" P& q2 y# T e2 u
0 O2 o$ r9 u6 D! t7 a 4、分析各个区域出租房屋数及占比。
* x! t! G* c/ L9 `3 g" P
$ e$ x9 ~( {7 o! j5 I N' c 5、各个区域出租房屋的平均面积。
m4 x" x6 `. Z `0 K/ e5 r* C) B ' O3 G. a* u2 s/ u. S& ?& r
6、出租房屋的层级划分。按整楼高。 ; E+ N+ Q$ Z2 E6 F
& B9 Y" {( g5 J3 J3 `! n 7、距地铁站的距离。 0 r0 ~" `" s; {: A3 q
项目总结爬取到的数据量有些太少了,并且感觉很不全面。要想真正提高自己的技术水平,还需要多应用。自己接触的数据分析项目还是比较少,感觉有点无从下手,不知道应该分析哪些东西才是有价值的,现实情况中,做数据分析还需多学习些业务知识,与业务相结合的分析才能分析对方向,才能分析出有价值的东西。
$ J( J7 n2 }$ M: q2 @1 X( B4 m
/ x3 ?5 s' C4 w+ @; M
4 j- E3 I: h1 _3 Q
5 ]# s8 X2 v/ ]8 W; M/ r6 e+ U9 f2 r& U9 [
|