基本上我都教如何使用 mysql
但其實資料庫都一樣啦,除了各式資料庫有些特殊的語法與型別之外
https://downloads.mysql.com/archives/installer/
選擇 Archived Versions
版本 5.7.29
Windows (x86, 32-bit), MSI Installer
(mysql-installer-community-5.7.29.0.msi)
環境準備工作完成
表格是資料庫的基礎,由欄位組合而成的,儲存在表格中的每一筆紀錄就擁有這些欄位的資料。
以儲存城市資料(city)來說,設計表格的人認為此資料需要包含編號、名稱、國家代碼、區域和人口數量,所以為 city 表格設計了這些欄位(column)
而儲存在表格中的每一筆資料稱為「列(row)」或「紀錄(record)」:
設計表格時,通常會指定一個欄位為「主索引鍵(primary key)」,是唯一的
大部份時候都是設定自動遞增的整數
跟程式語言一樣,資料庫中可以儲存各種不同的資料,SQL也提供許多不同的「資料型態」。
第一種是數值,為了更精準的保存數值資料,SQL提供整數與小數兩種數值型態
還有「字串」與「日期」
在SQL敘述中使用字串、日期資料的時候,字串、日期資料的前後要使用單引號或雙引號「'
」 「"
」
另外一種在資料庫中比較特殊的資料型態是「NULL」,是用來表示「沒有」的資料。
在執行資料庫的操作中,查詢算是最常見也是最複雜的工作
下列是查詢敘述的基本語法:
SELECT [...] FROM [...] WHERE [...] GROUP BY [...] HAVING [...] ORDER BY [...] LIMIT [...]
使用「SELECT」搭配各種子句來查詢時,要特別注意子句使用的順序
SELECT 'NCYU', 1+1
這樣的用法跟資料庫一點關係都沒有,它只不過把你輸入的內容顯示出來而已
但有時候很好用w
一般查詢敘述,查詢資料表中的資料
所以「SELECT」會搭配「FROM」來使用,
而「SELECT」後面可以指定「*」表示要查詢指定表格的所有欄位
SELECT * FROM world.city
有時候並不需要查詢一個表格中所有的欄位,可以在「SELECT」後面自己指定需要的欄位
SELECT Name, ContryCode FROM city
優先序 | 運算子 | 說明 | 範例 | 結果 |
---|---|---|---|---|
1 | % | 餘數 | 7 % 3 | 1 |
1 | * | 乘 | 7 * 3 | 21 |
1 | / | 除 | 7 / 3 | 2.333 |
1 | DIV | 除(整數) | 7 DIV 3 | 2 |
2 | + | 加 | 7 + 3 | 10 |
2 | - | 減 | 7 – 3 | 4 |
SELECT Name, CountryCode AS CC FROM world.city
通常一般欄位取別名是比較沒必要的。
如果是運算式的話,通常就要幫它取一個欄位別名來取代原來一大串的運算式。
像是計算人口密度
SELECT Population/SurfaceArea AS PopulationDensity FROM word.country
資料庫最大的好處就是可以隨時依照需要查詢部份紀錄資料,你可以搭配「WHERE」子句執行查詢條件的設定
SELECT * FROM city WHERE CountryCode='TWN'
要使用「WHERE」執行查詢條件的設定,會使用下列基礎的比較運算子:
運算子 | 說明 |
---|---|
= | 等於 |
!= | 不等於 |
< | 小於 |
<= | 小於等於 |
> | 大於 |
>= | 大於等於 |
可以執行以下命令,看會出現什麼結果
SELECT * FROM city WHERE Population < 800
意義?
SELECT * FROM city WHERE Population <= 8000
條件設定,有時候並不會太複雜;不過很常遇到在一個查詢的需求中,需要一個以上的條件
優先順序 | 運算子 | 說明 |
---|---|---|
1 | NOT | 非 |
2 | && | 而且 |
2 | AND | 而且 |
3 | || | 或 |
3 | OR | 或 |
3 | XOR | 互斥 |
如果想要查詢國家代碼是「TWN」,而且人口數量小於十萬的城市?
SELECT * FROM city WHERE Population <= 100000 AND CountryCode = 'TWN'
小練習:
檢查一下第3個練習的結果,看是不是所以的人口都小於十萬人呢?
如果不是,看看哪裡做錯了!
如果查詢條件中,有「AND」和「OR」同時出現的話,就要依照你的需要,視情況加上左右刮號來控制條件的設定,因為在邏輯運算子的介紹中,它們也同樣有「優先順序」的。
SELECT * FROM city WHERE Population >= 100000 AND Population <= 110000
等價於
SELECT * FROM city WHERE Population BETWEEN 100000 AND 110000
有沒有比較好懂呢?
SELECT * FROM city WHERE CountryCode = 'TWN' OR CountryCode = 'USA' OR CountryCode = 'JPN'
等價於
SELECT * FROM city WHERE CountryCode IN ('TWN', 'USA', 'JPN')
一樣有更好懂嗎?
SELECT * FROM city WHERE Name = 'w'
上面這段命令是啥意思?
那如果我要 w 開頭的城市名稱呢?
SELECT * FROM city WHERE Name LIKE 'w%'
上列語法中,在「LIKE」後面的「樣版」字串中,會使用到下列兩種「樣版字元」:
SELECT * FROM city WHERE Name LIKE 'w%'
上列的查詢條件中
「w%」表示第一個字元是「w」就符合條件
「%w」表示最後一個字元是「w」就符合條件
最後一個「%w%」表示不論在什麼位置有「w」字元,都符合條件
一般的查詢通常會有資料排序上的需求,所以你會使用「ORDER BY」子句
如果想要查詢時依照人口數量排序的話
SELECT * FROM city ORDER BY Population
以上是由小到大,當然可以由大到小
SELECT * FROM city ORDER BY Population DESC
當然我們可以用兩個以上的欄位做排序
比方說先依照國家代碼的名稱做字典排序、在依照人口由大到小排序
SELECT * FROM city ORDER BY CountryCode, Population DESC
備註:在 MySQL 5.6 之後,不能使用沒有被 Select 的出來做排序
使用「LIMIT」子句指定回傳紀錄的數量,像是一般論壇的分頁
輸出USA中前3個最常用的語言
SELECT * FROM CountryLanguage WHERE CountryCode = 'USA' ORDER BY Percentage DESC LIMIT 3
在一個查詢敘述執行以後,資料庫不會幫你檢查回傳的資料是否重複(回傳的兩筆紀錄資料完全一樣)
但可以在「SELECT」子句後面可以讓你設定「回傳的資料是否重複」
輸出不重複的各大洲
SELECT DISTINCT Continent FROM country
有時間再說…
群組函式可以很容易的查詢需要的統計與分析資訊:
以上可以直接用,會把整個Table是做一個Group
可以根據欄位的內容進行分組
像是
根據洲名取該洲的總人數
SELECT Continent, SUM(Population) AS Population_sum FROM country GROUP BY Continent
根據地區取地區的總人數
SELECT Region, SUM(Population) AS Population_sum FROM country GROUP BY Region
在一般的查詢中,查詢條件在 WHERE 就好,
但經過 Group 運算式計算過後的值,就得使用 HAVING
像是要取得所有地區總人口超過十億的
SELECT Region, SUM(Population) Population_sum FROM country GROUP BY Region HAVING Population_sum > 1000000000
在「world」資料庫的「country」表格中,儲存世界上所有的國家資料,其中有一個欄位「Capital」用來儲存首都資料,不過它只是儲存一個編號;
另外在「city」表格中,儲存世界上所有的城市資料,它主要的欄位有城市編號和城市的名稱:
有兩種方式可以使用
SELECT country.Code, country.Capital, city.Name FROM country, city WHERE country.Capital = city.id
SELECT country.Code, country.CApital, city.Name FROM country INNER JOIN city ON country.Capital = city.id
資料庫當然不只查詢,增、修、刪也是很重要的
INSERT [INTO] 表格名 VALUE (資料, ...)
注意這種方法資料塞入的順序要與定義時的順序一樣
INSERT [INTO] 表格名 [(欄位名稱, ...)] VALUE (資料, ...)
這種方法就要依照自己定義的欄位順序,沒有指定的欄位就會自動塞入 NULL
舉個例子,嘉義大學變成所謂的學園都市了(?
Example:
INSERT INTO `city` (`Name`, `CountryCode`) VALUES ('NCYU','TWN')
也因為這樣的規定,所以有些新增敘述在語法上雖然沒有錯誤,如果違反表格設計上的規定,同樣會造成錯誤
UPDATE 表格名稱 SET 欄位名稱=(運算式|資料) [, ...]
使用「UPDATE」敘述的時候,通常會搭配使用「WHERE」子句,用來指定要修改的紀錄
UPDATE 表格名稱 SET 欄位名稱=(運算式|資料) [, ...] WHERE [條件]
注意,如果你忘記了 WHERE 的話,會把所有的紀錄全部一起修改
舉個例子,現在台灣人口大爆炸好了,你要把台灣的人口改成 1 億,要怎處理
UPDATE `country` SET Population=100000000 WHERE `Code`='TWN'
舉個例子2,現在海平面上升,每個國家土地都減少了 1/5 ,那該如何更新?
UPDATE `country` SET SurfaceArea=SurfaceArea*0.8
DELETE FROM 表格名稱 [WHERE 條件]
使用「DELETE」敘述的時候,通常會搭配使用「WHERE」子句,用來指定要修改的紀錄
注意,如果你忘記了 WHERE 的話,會把所有的紀錄全部一起刪除
一樣舉個例子,學園都市要合併回嘉義市,那如何把剛剛新增的資料刪除。
DELETE FROM `city` WHERE Name='NCYU'
要注意的是,如果有很多 Name 都叫 NCYU 就都會一起被刪除喔~~
小練習:
提示:刪除前可以使用 SELECT 來看看要刪除的資料,以免下錯指令喔
END~~
REF:
MySQL超新手入門- 張益裕
下課回家啦