久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

SQL自學總結(jié)

 太極混元天尊 2018-07-08

因為工作原因,,要和數(shù)據(jù)庫打交道,,除了公司內(nèi)網(wǎng)自帶的指標平臺、可供下載固定格式固定內(nèi)容的有限張表之外,,更多情況下需要自己從數(shù)據(jù)庫中靈活的取數(shù),,因此必須迅速學習和使用SQL語言。事實上,,作為使用最為廣泛的數(shù)據(jù)庫語言,,SQL是有些明顯的優(yōu)點的:通用性強,幾乎所有重要的DSMS都支持SQL,,針對不同的數(shù)據(jù)庫,,如hivesql、mysql,、sql server,、oracle等,sql語法總體上大同小異,只是細微處的差別,;簡單易學,,關(guān)鍵詞很少,且貼近英文語法,,普通的使用,,一到兩周應該可以初步使用。我們公司使用的是ADHOC(advanced data handler for on-line control)平臺下的,,hiveSQL語法,,我的學習也是先基于標準SQL語法學習的。為了鼓勵大家,,我想說我也是純小白一枚,,零基礎(chǔ),現(xiàn)在談?wù)勎业膶W習順序和一點心得,。

首先聲明,,我們公司使用的數(shù)據(jù)庫,使用的代碼結(jié)構(gòu)并不復雜,,不需要很高級的語句,,只用最基本的select、join,、group by就可以,,只要你語法正確、能順利跑下來,,就可以了,。所以,一開始我就奔著實用的態(tài)度選取資料學習的,;大而全的專業(yè)書籍直接pass,、高級技巧先放在一邊,號召“打好基礎(chǔ)”,、一來就推薦好幾本類似《數(shù)據(jù)庫基礎(chǔ)》的純理論基礎(chǔ)大部頭也只能棄之不用,。經(jīng)過仔細搜索,我確定的方法是:紙質(zhì)書一本《SQL必知必會(第4版)》(Ben Forta),,在線刷題網(wǎng)站一個SQLZOO,,http:///wiki/SELECT_basics/zh。書看兩遍,,題刷兩遍,,就能實現(xiàn)掌握基礎(chǔ)知識,大約70%,?吧,。學完這些,,就可以硬著頭皮開始嘗試取數(shù)了,當然剛開始會有很多報錯,,但是通過錯誤能學到更多,、進步更快。這時要想進階的話,,書可以看更全更專業(yè)一些的,,刷題的話,可能要找找英文網(wǎng)站或者用一個數(shù)據(jù)庫管理軟件自己創(chuàng)建數(shù)據(jù)庫然后練習,。關(guān)于自學方法和資料網(wǎng)上一搜一大堆,,可以自己關(guān)注下吧,這里不多說哦,。

SQL自學總結(jié)

寧可少活二十年 立志拿下SQL!

我想分享的是我學習的一點總結(jié),,和初始階段經(jīng)過的一些雷區(qū),。

首先說語句結(jié)構(gòu)。SQL 語句有一個讓大部分人都感到困惑的特性,,就是SQL 語句的執(zhí)行順序跟其語句的語法順序并不一致,。當然也溫馨提示下,并非所有的數(shù)據(jù)庫對 SQL 語句使用相同的解析方式,,這時具體情況具體對待吧,,如果出現(xiàn)報錯,可以查閱相關(guān)幫助文檔或咨詢度娘,。

SQL自學總結(jié)

SQL執(zhí)行順序

如圖所示,,我們書寫的時候,要注意關(guān)鍵字的順序,,比如select,,from寫完后,要先where,,然后group by,,然后having,order by永遠是放在最后面,。但是實際執(zhí)行的時候,,系統(tǒng)先跳過select,從from開始,、加載需要處理的表格,,然后where進行初步過濾,注意這個過濾是在分組前進行過濾,,然后通過group by進行分組,,再利用having進行分組后的過濾,、篩選滿足條件的組,然后才是select及其之后的語句,。理解了這一點,,也就很容易理解一些語法規(guī)定了,例如:where條件中不能跟聚合函數(shù),,而having后面可以,;執(zhí)行順序where>聚合函數(shù)(sum,min,max,avg,count)>having,order by是最后的顯示結(jié)果進行排序,,必須放于最后,,等等規(guī)定。

其次,,是一些關(guān)鍵而重要的關(guān)鍵詞的使用,。

(1)LIKE關(guān)鍵字,Like中最好只用%通配符,。例如,,要顯示包含單詞“United”為名稱的國家:WHERE name LIKE '%United%';(正確),WHERE name LIKE '*United*'(報錯),。很多朋友會問,,為什么我在以上查詢時用“%”而不用“*”?我也查了資料,,表明:%表示包含零個或更多字符的任意字符串,。在搜索串中,%表示任何字符出現(xiàn)任意次數(shù),。百分號很兼容,,但是其他的通配符都不一定兼容。也有說,,星號往往使用在首尾的時候,,例如姓張的名字:’張*’,或以強結(jié)尾:’*強’,,等等,。但為了保險起見,我建議以后在使用like關(guān)鍵字時,,優(yōu)先用%通配符,。另外,注意“或”的用法,,例如:提取以A或B開頭的國家名稱,,

where name like ’A%’ or ’B%’(錯誤),where name like ('A%' or 'B%' )(錯誤),,

WHERE name LIKE 'A%' OR name LIKE 'B%';(正確),。

(2)In,,當結(jié)果不止一個時使用。例如:where name in (‘France’, ‘Germany’, ‘Italy’),,這里,,一是注意要用圓括號,二是,,內(nèi)容如果是字符串,,要用英文狀態(tài)下的單引號。這里還有些雷區(qū),,例如題目:選取在阿根廷Argentina及澳大利亞 Australia所在的洲份中,,

where continent in(select continent from world where name in ('Argentina','Australia‘) ) (正確)

注意:這里,嵌套括號中的結(jié)果不止一個,,就要用in(),而不能用等于=號,,否則出錯。類似的,,>,,<,>=等等,,后面都只能跟一個值,如果值多于一個,,要用all,,例如:where 25000000>= all(select population from world b where b.continent = a.continent ),如果省了all,,則會報錯,。

另外有一個雷區(qū),in的對立面并不是NOT IN,!not in等價的含義是<> all,,例如In(‘A’,’B’):A或者B;not in (‘A’,’B’):不是A且B,。為避免混淆,,最好盡量避免或使用not in。

(3)關(guān)于聚集函數(shù),。為方便數(shù)據(jù)統(tǒng)計的檢索,,SQL給出了5個聚集函數(shù)(aggregate function),COUNT,,SUM,,AVG,MAX,,MIN,,計算并返回一個值,。SQL的聚集函數(shù)在各種主要SQL實現(xiàn)中得到了相當一致的支持。聚集函數(shù)使用語法簡單,,尤其當group by與聚合函數(shù)配合,,十分好用!要求什么的聚合函數(shù),,就先按照它來group by,,然后直接count即可。不過,,也有一些雷區(qū)要注意:

①在不用聚合函數(shù)的時候,,單獨用group by,group by 子句中必須包含所有的列,,否則會報錯,,但此時雖然成功執(zhí)行了,group by在這里并沒有發(fā)揮任何的作用,,完全可以不用,;若不用聚合函數(shù),就是按照group by后面字段的順序,,把相同內(nèi)容歸納在一起

③如果只有聚合函數(shù),,而沒有g(shù)roup by,則聚合函數(shù)用于聚合整個結(jié)果集 (匹配WHERE子句的所有行),,相當于只分一組,。

④where后面不能放聚合函數(shù)!無論是count還是sum,。那么如何解決呢,,使用HAVING關(guān)鍵字!例如:having sum(amount) >100

⑤order by 后面是可以跟聚合函數(shù)的,,即可以用聚合函數(shù)排序,。

另外,除了Count(*)函數(shù)外,,所有的聚合函數(shù)都忽略NULL值,。

(4)注意語句末尾的分號!SQL是不區(qū)分大小寫的,,也會忽略所有的空格,。所以,SQL語句可以寫成多行,,但是寫成長長的一行也是完全沒有錯的,。但是,每一句話結(jié)束,,如果不加分號,,則出錯,。這里注意,select,,create table,,insert into 語句都是完整的一句話,分號結(jié)束,。例如:

create table games (yr int,city varchar(255)) ;

insert into games (yr,city) values (2004,'Athens') ;

insert into games (yr,city) values (2008,'Beijing') ;

insert into games (yr,city) values (2012,'London') ;

SELECT * FROM games;

平時若只有一句話(例如select),,可能沒加分號也能執(zhí)行,但如果涉及創(chuàng)建表,、插入,、改寫,必須注意分號,。值得一提的是case when語句,,case when語句分為簡單case函數(shù)和case搜索函數(shù),具體含義自行百度,,但是例如:SELECT name, (逗號不可丟,!case when本質(zhì)上還是一個字段的選取?。〤ASE WHEN continent=‘Oceania’ THEN (不用加continent=) 'Australasia’ ELSE continent (不可省) END,。最后的End容易丟,千萬不要忘記,。

(5)最后,,說兩個典型小問題的解決方法,看了很受啟發(fā),。一是,最后排序時若要將某一類放在最前或最后,,可以利用case when,,巧妙的引用輔助列,幫助排序,。例如:

①ORDER BY (case when subject in ('Physics','Chemistry') then 1 else 0 end ), subject, winner

結(jié)果:科目為(‘Physics’,’Chemistry’) 的排在最后,,其余科目按subject升序排列,

②ORDER BY (case when subject in ('Physics','Chemistry') then 1 else 0 end ) desc, yr desc, winner

結(jié)果:將(‘Physics’,’Chemistry’) 排在最前,;同一科目種類時,,按年份從新到老;同一科目,、同一年份時,,按獲獎?wù)呙稚蚺帕小?/p>

二是,一個經(jīng)典問題:分組后取每組的前幾條記錄,。這里看一個例子吧,。

例:已知一個表,, StudentGrade (stuid--學號, subid--課程號, grade--成績)。PRIMARY KEY (stuid, subid),。

想要:查詢每門課程的前2名成績,。

方法①:

select distinct * from studentgrade as t1

where stuid in

(select top 2 stuid from studentgrade as t2

where t1.subid=t2.subid

order by t2.grade desc) order by subid, grade desc

思路:相同的表格自聯(lián)結(jié),第二個表格將相同學科的所有學生按成績排序-倒序,,選取前二,。注意,mysql不支持select top n的語法,!但是mysql可用limit來實現(xiàn)相關(guān)功能,。

方法②:

select * from StudentGrade a

where (select count(1) from studentGrade b

where b.subId=a.subId and b.grade >= a.grade) <>

思路:第一個>=號,限制了查詢條件是相同科目下成績從大往小排,,第二個<>

注意,,這里大于等于、小于等于容易弄錯,,尤其是第二個,。

方法③:

select * from StudentGrade a

where (select count(1) from StudentGrade b

where b.subid=a.subid and b.grade> a.grade) <>

order by subId, grade desc

思路:這兩張表思路相同:相同表格自聯(lián)結(jié),返回相同學科并且成績大于a表的影響行數(shù),。這就是查詢條件,,再按 subId,grade 排序。

SQL才入手兩周,,學習代碼一定要實踐,,一定要實踐,一定要實踐(重要的事情說三遍),!畢竟不是科班出身,,學習不夠系統(tǒng),只能通過不斷實踐總結(jié)和不斷踩雷排雷來進步了,,但是,,重復重復重復,是時候發(fā)揚匠心精神了,!

SQL自學總結(jié)

如切如磋 如琢如磨 數(shù)據(jù)人也要有匠心,!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多