mysql开始全部日记,MySQL学习日记—节选SQLZOO习题(1)
前言
最近的開發任務是要從零開始搭建一個網站,剛開始是準備做一個純前端頁面,但是出于后期維護和拓展的考慮,最后還是準備使用MVC框架來搭建,那么開發的第一步就是要建立數據庫了,因此這段時間也在學習MySQL。
之后也會記錄下網站開發的動態,相信這次開發可以讓我熟悉掌握整個網站開發的流程,也能更加深入地理解MVC、數據庫等相關技術。
這個系列主要記錄在SQLZOO上的部分經典和困難的習題答案,并附上相關知識點的解析。
書寫規范
在正式開始之前,先交代一下SQL的常用書寫規范:
多條SQL語句是使用分號(;)隔開的(注意是英文分號)。單條語句的句尾可以不加分號,但如果是使用命令行輸入時,則必須加上分號表示結束該語句。本系列將使用分號結束每個語句。
SQL是不區分大小寫的,不過為了使得SQL語句易于閱讀和調試,SQL關鍵字最好還是使用大寫。本系列關鍵字將會大寫標注(圖形化界面往往會自動識別關鍵字并轉化為大寫)。
在處理SQL語句時,所有空格都會被忽略掉。將SQL語句按關鍵字分配成多行將更容易閱讀和調試。
在SQL語句中如果遇到表或者數據項名稱與關鍵字名稱雷同,應當給操作對象名添加引號(’ '/ " ")。SQL不大區分單引號和雙引號,不過如果字符串本身帶有了單引號,那么就只能添加雙引號了。
SELECT basics
查詢數據
通用查詢語法如下:
SELECT column_name1,column_name2,...
FROM table_name
[WHERE condition1 [and/or] condition2 ...]
首先,SELECT語句可以查詢單列和多列數據,查詢多列時使用逗號(,)將不同的column_name隔開。如果要查詢表中的所有列,直接將column_name替換為星號通配符(*)即可。
WHERE語句可以篩選出指定條件的數據項。同樣也能添加多個條件,同時滿足基本的邏輯關系:與和或。
題1.修改此例子,以顯示德國 Germany 的人口。
SELECT population
FROM world
WHERE name='Germany';
同時,在SQL語句中,SELECT后的項目也是可以直接進行數值計算的。
題2.修改此例子,查詢面積為 5,000,000 以上平方公里的國家,對每個國家顯示她的名字和人均國內生產總值(gdp/population)。
SELECT name,gdp/population
FROM world
WHERE area>5000000;
條件篩選(過濾數據)
IN操作符常在WHERE子句中出現,用來指定條件范圍,對范圍中每個條件都可以進行匹配,滿足一個即可。
題3.顯示“Ireland 愛爾蘭”,“Iceland 冰島”,“Denmark 丹麥”的國家名稱和人口。
SELECT name,population
FROM world
WHERE name in ("Ireland","Iceland","Denmark");
BETWEEN與AND連用作為范圍查詢條件,將檢索出包含邊界以及邊界內的數據項。
題4.修改此例子,以顯示面積為 200,000 及 250,000 之間的國家名稱和該國面積。
SELECT name,area
FROM world
WHERE area BETWEEN 200000 AND 250000;
SELECT from WORLD
LIKE子句
LIKE操作符常在WHERE子句中出現,與通配符進行搭配對數據進行模糊查詢。LIKE可以使用OR關聯多個模糊條件進行查詢。
百分號通配符(%)可以代替任意長度的字符,而下劃線通配符(_)則只能代替一位字符。
題6.顯示包含單詞“United”為名稱的國家。
SELECT name
FROM world
WHERE name LIKE '%United%';
復合條件
WHERE子句中的條件可以有多層嵌套。
題8.顯示以人口或面積為大國的國家,但不能同時兩者。顯示國家名稱,人口和面積。
SELECT name,population,area
FROM world
WHERE (area>=3000000 AND population<250000000)
OR (population>=250000000 AND area<3000000);
ROUND()函數
ROUND() 函數用于把數值字段舍入為指定的小數位數。語法如下:
SELECT ROUND(column_name,decimals)
FROM table_name;
第一個參數填入要舍入的字段,第二個參數(decimals)填入要返回的小數位數。如果填入參數只有第一個,那么將會返回該參數四舍五入的整數。
題9.對於南美顯示以百萬計人口,以十億計2位小數GDP。
SELECT name,ROUND(population/1000000,2),
ROUND(gdp/1000000000,2)
FROM world
WHERE continent='South America';
如果第二個參數填入負數,則表示用科學計數法,以十進制為基礎,參數大小表示乘方次數。
題10.顯示萬億元國家的人均國內生產總值,四捨五入到最近的$ 1000
SELECT name,ROUND(gdp/1000000000,-3)
FROM world
WHERE gdp>=1000000000000;
流程控制CASE
流程控制不是很常用(因為MySQL必知必會這本書都沒收錄),可以做一個了解。
CASE語句相當于常用編程語言中的If…else語句,用于條件分支選擇,也經常與ELSE進行搭配使用。語法為:
SELECT CASE WHEN condition1 THEN value1
[WHEN condition2 THEN value2]
...
ELSE def_value
END
FROM table_name;
題12.Show the name and the continent - but substitute Eurasia for Europe and Asia; substitute America - for each country in North America or South America or Caribbean. Show countries beginning with A or B
SELECT name,
CASE WHEN continent in ('Europe','Asia') THEN 'Eurasia'
WHEN continent in ('North America' ,'South America' , 'Caribbean') THEN 'America'
ELSE continent
END AS continent
FROM world
WHERE name like 'A%' or 'B%';
其中使用了AS命令給這個分支語句的列重新命名為continent。
題13.Put the continents right…
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.
SELECT name,continent,
CASE WHEN continent='Oceania' THEN 'Australasia'
WHEN continent in ('Eurasia','Turkey') THEN 'Europe/Asia'
WHEN continent='Caribbean' AND name LIKE 'B%' THEN 'North America'
WHEN continent='Caribbean' AND name NOT LIKE 'B%' THEN 'South America'
ELSE continent
END AS new_continent
FROM world;
題13無論如何提交總是會報錯,但是答案應該沒錯(最近這個網站更新了,現在沒錯了)。里面的NOT LIKE表示排除該模糊條件的查詢。
SELECT from Nobel
不等號
WHERE子句的不等號使用大于小于號(<>)來表示,當然也可以用不等號(!=)來表示。
題9.查看1980年獲獎者,但不包括化學獎(Chemistry)和醫學獎(Medicine)。
SELECT *
FROM nobel
WHERE yr=1980 AND subject <> 'Chemistry' AND subject <> 'Medicine';
雙引號
使用雙引號來標識具有單引號的字符串。
題12.查找尤金?奧尼爾EUGENE O’NEILL得獎的所有細節 Find all details of the prize won by EUGENE O’NEILL
SELECT *
FROM nobel
WHERE winner="EUGENE O'NEILL";
排序
使用order by關鍵字對檢索后的數據進行排序,在后面添加關鍵字ASC表示升序排列,DESC表示降序排列。可以添加多個排序項,用逗號隔開,具體的語法如下:
SELECT field1, field2,...fieldN
FROM table_name1, table_name2...
[WHERE condition]
ORDER BY field1 [ASC [DESC][默認 ASC]], [field2...]
當然不一定排序條件要求必須是要查詢的列。
題13.列出爵士的獲獎者、年份、獎頁(爵士的名字以Sir開始)。先顯示最新獲獎者,然後同年再按名稱順序排列。
SELECT winner,yr,subject
FROM nobel
WHERE winner like "Sir%"
ORDER BY yr DESC,winner ASC;
如果需要實現諸如將某些特定的項排到最前或者最后,需要借助IN操作符使排序列數據量化為0或1的值。舉例說明:
題14.Show the 1984 winners and subject ordered by subject and winner name; but list Chemistry and Physics last.
SELECT winner,subject
FROM nobel
WHERE yr=1984
ORDER BY subject IN ('Physics','Chemistry'),subject,winner;
其實本質上IN操作符可以看做是一個判斷符,滿足條件的項就會返回1,不滿足則返回0,在order by后面添加上該項計算結果,那么值為0的就會排在值為1的前面了。
總結
這一章節主要介紹了檢索查詢數據中最常規的一些操作,總體來看還是比較簡單的。所以當一個CRUD boy還是很容易的,不是嗎?
參考資料
《MySQL必知必會》
總結
以上是生活随笔為你收集整理的mysql开始全部日记,MySQL学习日记—节选SQLZOO习题(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信H5公众号支付问题-(get_bra
- 下一篇: 从小鹿茶自立门户,看新式茶饮下沉市场的变