Upload
mari-compton
View
98
Download
0
Embed Size (px)
DESCRIPTION
第 4 章. MySQL. 大綱. MySQL 資料庫概述 MySQL 基礎操作 基本 SQL 指令 進階 SQL 指令 其他操作介面 結論. MySQL 資料庫概述. MySQL 是一個運作速度相當快、支援多執行緒( multithread)、 與多使用者同時上線操作,且功能相當強大的關聯式資料庫管理系統( relational database management system, RDBMS), 由 Mysql AB 公司開發,其官方網站在 http://www.mysql.com/。 - PowerPoint PPT Presentation
Citation preview
第 4 章
MySQL
大綱 MySQL 資料庫概述 MySQL 基礎操作 基本 SQL 指令 進階 SQL 指令 其他操作介面 結論
MySQL 資料庫概述 MySQL 是一個運作速度相當快、支援多執行緒
( multithread)、與多使用者同時上線操作,且功能相當強大的關聯式資料庫管理系統( relational database management system, RDBMS),由 Mysql AB公司開發,其官方網站在 http://www.mysql.com/。
透過許多驅動程式的支援, MySQL 可以很容易與 C、 C++、 Java、 Perl、 PHP、 JSP、 ASP等語言做資料連結,也提供了多種不同平台的版本,使 MySQL可以運行於多種平台上,例如: Solaris、 Linux、 FreeBSD、 OS/2、 Windows ...... 等等。
MySQL 資料庫概述 Cont. MySQL 並不是一個 Open Source 的軟體計畫,因為
其版權在某些情況下是需要付費的,例如將它與其他產品包裝販售。不過,大體上來說,個人、教育單位及非營利事業使用它是免費的,而 MySQL 所收取的授權費主要來協助 MySQL 研發所需,使 MySQL 得以更加茁壯。
在 MySQL 4.0 之後, MySQL也支援了 Unicode(UTF-8)字元集,徹底解決了長久以來因為中文 BIG5碼所造成的『許功蓋』等亂碼問題。同時亦支援子查詢的功能,搭配其極快的查詢效率與許多 third-party周邊,足敷一般中型資料庫伺服器之所需,同時也是一極佳的資料庫入門磚。
MySQL 特性 使用 C 和 C++語言撰寫,並使用了多種編譯器進行測試,原始碼
可移植性極佳。 支持 AIX、 FreeBSD 、 HP-UX、 Linux、 Mac OS、 Novell
Netware 、 OpenBSD 、 OS/2 Wrap 、 Solaris 、 Windows等多種操作系統與硬體平台
為多種程式語言語言提供了操作之 API。這些程式語言語言包括C、 C++、 Eiffel、 Java、 Perl、 PHP、 Python、 Ruby和 Tcl等。
具備多執行緒功能,充分利用 CPU資源。 最佳化的的 SQL 查詢機制,有效地提高查詢速度。 提供 Unicode 多國語言支援。 提供 TCP/IP、 ODBC 和 JDBC 等多種資料庫連接方式。 可以處理擁有上千萬筆記錄的大型資料庫。
MySQL 授權模式 目前, MySQL AB公司對 MySQL提供了兩種授權模式,分別是:
商業授權( The Commercial License): 自由軟體授權( The Open Source License):
在商業授權模式下,亦即商業出售的套件包含 MySQL資料庫伺服器,或所提供的商業服務中使用到 MySQL資料庫伺服器,均屬商業授權範圍。必須向 MySQL AB公司購買授權方能運用。
在自由軟體授權下,亦即學術、研究或個人非營利用途上,可自由使用。但如針對 MySQL原始碼有任何修改,不可以此修改販售營利,而需將改進成果回饋給開放原始碼社群,關於此部分更詳盡的內容,請參閱 GPL合約。
安裝 / 設定注意事項 在 MySQL資料庫內碼的設定上,由於 4.0版後, MySQL開始支
援 UTF-8,徹底解決中文亂碼的問題,在此選擇第二項『 Best support for multilingualism 』、或第三項並選擇 UTF-8 即可。
基礎操作:進入 MySQL 最簡單進入 MySQL的方法,便是由『開始』 ->『 MySQL』 -
>『 MySQL Server 4.1』 ->『 MySQL Command Line Client』,點選『 MySQL Command Line Client』,便可進入密碼確認畫面,鍵入密碼(本書設定 root密碼為 123456 ),按下 Enter鍵即以 MySQL Client連線 MySQL資料庫。
基礎操作:密碼變更 在一開始時初始化設定時,我們將 root密碼設為 123456,如果日後
要改變指令也很容易,只要在 DOSDOS下下鍵入以下指令即可:
mysqladmin -h localhost -u root --password password mysqladmin -h localhost -u root --password password 新密碼新密碼
在出現 Enter password:時,鍵入原密碼。
例如,原本 root密碼是『 123456』,要改成『 abcdef』,則鍵入:
mysqladmin -h localhost -u root --password password mysqladmin -h localhost -u root --password password abcdefabcdef
在出現 Enter password:時,鍵入『 123456』,密碼即變更成功。
基礎操作:帳號與權限 例:新增來自 localhost的帳號 user,密碼為 123456,並給予全部權限(等同於 root ):
指令: GRANT ALL PRIVILEGES ON *.* TO user@localhost IDENTIFIED BY '123456';
例:新增來自 localhost的帳號 dbuser,密碼為 123456,僅給予管理 db資料庫的所有權限:
指令: GRANT ALL ON db.* TO dbuser@localhost IDENTIFIED BY '123456';
例:變更來自 localhost的帳號 dbuser,密碼為 123456,取消管理 db資料庫的所有權限:
指令: REVOKE ALL ON db.* FROM dbuser@localhost IDENTIFIED BY '123456';
基礎 SQL:建立與刪除資料庫 建立一個資料庫,名稱為 db 請以 root登入資料庫,並鍵入以下指令(注意: MySQL指令結尾均需
有分號): mysql>create database db;
mysql>show databases; 則結果應為:
+----------+| Database |+----------+| db || mysql || test |+----------+
基礎 SQL:建立與刪除資料庫 資料庫的名字最好只使用 ASCII中的 ANU字符:即 26
個大寫英文字母、 26個小寫英文字母、 10個數目字和底線符號 _ 。不要超過 64 個字元。並請絕對不要使用中文。
資料庫的名字不可以由數目字開頭。
如果 MySQL Server的作業系統規定檔案名的大小寫字母視為不同,則資料庫的名稱大小寫亦會被視為不同。如果 MySQL安裝在 Windwos上,則 db、 Db與 DB都是指同一個資料庫。但如安裝在 Linux或 UNIX系統上,則 db和 DB是兩個不同的資料庫名稱。
基礎 SQL:選用資料庫 在使用 MySQL內,同一時間只能選用一個資料庫進行操作。假
設 db是資料庫的名字,則欲操作 db資料庫,則執行以下指令:
mysal>use db;
MySQL應回應:
Database changed
此時,即使用此一資料庫,要注意的是,如登入 MySQL時並未選用任何資料庫, MySQL並不會主動幫使用者選擇任一資料庫。
基礎 SQL:選用資料庫 如果想要知道目前正在使用的資料庫,則執行以下指令:
mysql>select database();
MySQL 會做如下回應:
+------------+| database() |+------------+| dbname |+------------+
基礎 SQL:得知目前狀態 mysql>select now( );
得知現在的日期和時間。
mysql>select user( ); 得知目前登入 MySQL的使用者。
mysql>select version( ); 得知目前的 MySQL 版本。
在 MySQL中的指令和函式,都不分大小寫
基礎 SQL:建立表格 建立表格的基本語法是:
create table 表格名稱 (field1, field2, ..., fieldN );
在選用表格名稱時,其定義規則與限制和資料庫名稱選用是一樣的。
表格的名字最好只使用 ASCII 中的 ANU 字符: 26 個大寫英文字母、 26 個小寫英文字母、 10 個數目字和底線符號 _ 。不可使用中文,亦不要超過 64 個字元。
表格名不能以數目字開頭。 通常應假設表格名是大小寫有分別的;例如 abc 和 Abc 是兩個不
同的表格名,為避免混淆,以下所有表格名稱與欄位名稱均使用小寫。
基礎 SQL:建立表格 Cont. 例如: mysql>create table abc (number int, name
char(10));
如要檢視表格架構,則執行 mysql>desc abc;
則得到以下結果:
+--------+----------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+----------+------+-----+---------+-------+| number | int(11) | YES | | NULL | || name | char(10) | YES | | NULL | |+--------+----------+------+-----+---------+-------+
基礎 SQL:刪除表格 刪除表格的指令是:
mysql>drop table 表格名稱 ;
此一指令如同 drop database,是一個無法反悔且無法救回的指令,且 MySQL不會再度確認,而是在執行此一指令後立即刪除。因此要小心此一指令。
基礎 SQL:建立表格練習+-------+------------------+-----+----+-------+--------------+| Field | Type |Null |Key |Default|Extra
|+-------+------------------+-----+----+-------
+--------------+| id | int(10) unsigned | |PRI |NULL |
auto_increment|| name | char(20) | | | |
|| phone | char(32) |YES | |NULL |
|+-------+------------------+----------+-------
+--------------+
試建立以下表格
基礎 SQL:資料輸入 insert into 表格名稱 values (欄位 1之值 , 欄位 2之值 , ... , 欄位 N 之值 );
其中「表格名稱」代表一個以存在資料庫中的表格,「欄位 n」代表第 n 個欄位的值,而 1 <= n <= N。要注意的是,敘述中的 , 數量必須與欄位數量 -1吻合。
基礎 SQL:資料輸入 Cont. 而欄位的值 (value) 必須符合當初宣告那個欄位的資料型態。
如果是數值類型態(例如整數、無號整數、浮點數),則直接寫數目字即可。如果是文字類型態 (例如固定長度字串或不定長度字串 ),則必須以一對單引號或雙引號將其框選,方能正確辨識(考量到日後撰寫 PHP需要,以下 SQL指令中文字框選均以單引號行之)。
如果是日期,也需以一對單引號框起,而日期的標準寫法是以 2006-02-25 代表西元 2006 年二月二十五日。在 MySQL中並不認得「民國」年數,但可在日後撰寫程式時透過運算得到。
而如果一個欄位是空的,不管它的型態是什麼,都可以 NULL輸入。
基礎 SQL:建立 user 資料表create table user (serial int unsigned auto_increment primary key,
name varchar(10) not null,gender enum('F', 'M') not null,birthday date,phone char(20));
基礎 SQL:建立 user 資料表 id是一個無號整數,且為主要鍵值、並具自動增加
( auto_increment)功能,通常每個資料表都會有一個可供找出一獨一無二的資料列之序號,避免資料相同時無法判斷之窘境。
enum 是宣告一個使用者自定的列舉型態。例如 enum('F', 'M') 意指此一欄位的值,只可以是 'F' 或 'M' 兩種字串。再例如enum('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'),意指這個欄位的值,只准許是 'Mon' ... 等七種字串。
為什麼 phone欄位要宣告 20 個字元?似乎 char(13) 就足敷需求。因為考慮到未來或許需包含分機號碼在內。例如 (02)2783-5611-75815等等,所以還是宣告長一點比較安全。此亦點出在資料庫設計上,資料長度要有預留空間。應在系統容許的範圍內,盡量考慮到未來的擴充性。
基礎 SQL:輸入資料 在 user 表格中插入資料
insert into user values (NULL, '黃蓉 ', 'F', '1975-10-13', '0922123456');
基礎 SQL:輸入資料 檢視 user的內容:執行以下指令:
mysql>select * from user;
+--------+------+--------+------------+------------+| serial | name | gender | birthday | phone |+--------+------+--------+------------+------------+| 1 | 黃蓉 | F | 1975-10-13 | 0922123456 |+--------+------+--------+------------+------------+1 row in set (0.00 sec)
基礎 SQL:輸入資料 再增加幾筆資料:
insert into user values (NULL, '楊過 ', 'M', '1964-08-12', '0921456789');insert into user values (NULL, '郭靖', 'M', '1955-01-23', '0923000123');insert into user values (NULL, '小昭', 'F', '1988-12-25', '0924987654');
新增完後檢視檢果,請注意 serial序號欄位的變化。
+--------+------+--------+------------+------------+| serial | name | gender | birthday | phone |+--------+------+--------+------------+------------+| 1 | 黃蓉 | F | 1975-10-13 | 0922123456 || 2 | 楊過 | M | 1964-08-12 | 0921456789 || 3 | 郭靖 | M | 1955-01-23 | 0923000123 || 4 | 小昭 | F | 1988-12-25 | 0924987654 |+--------+------+--------+------------+------------+
基礎 SQL:查閱表格select * from user;
其結果為:
+--------+------+--------+------------+------------+| serial | name | gender | birthday | phone |+--------+------+--------+------------+------------+| 1 | 黃蓉 | F | 1975-10-13 | 0922123456 || 2 | 楊過 | M | 1964-08-12 | 0921456789 || 3 | 郭靖 | M | 1955-01-23 | 0923000123 || 4 | 小昭 | F | 1988-12-25 | 0924987654 |+--------+------+--------+------------+------------+
基礎 SQL:查閱表格 Cont.僅查詢使用者姓名,即執行以下指令:
mysql>select name from user;
其結果為:
+------+| name |+------+| 黃蓉 || 楊過 || 郭靖 || 小昭 |+------+
基礎 SQL:查閱表格 Cont.同時查詢使用者姓名與電話號碼,即執行以下指令:
mysql>select name,phone from user;
其結果為:
+------+------------+| name | phone |+------+------------+| 黃蓉 | 0922123456 || 楊過 | 0921456789 || 郭靖 | 0923000123 || 小昭 | 0924987654 |+------+------------+
基礎 SQL:刪除資料一次刪除某一表格內的全部資料,指令如下:
mysql>delete from 表格名稱 ;
以 user表格為例,要刪除 user表格內所有資料,指令為:
mysql>delete from user;
基礎 SQL:刪除資料 Cont.只刪除特定的某筆資料,便需要指定條件,指令如下:
delete from 表格名稱 where 欄位名稱 = V;
這樣, MySQL 就會把「欄位」值是 V 的資料都整筆刪除掉。以下是一個完整的資料插入與刪除動作範例,先插入一筆範例資料:
insert into user values (NULL, '方證', 'M', '1930-12-25', '0920965347');
插入完成後,如要刪除此筆資料,則執行以下指令:
delete from user where name = '方證';或delete from user where phone = '0920965347';
兩者均可
基礎 SQL:變更資料 所謂修改資料,是指某筆資料已經存在,只是要更改那筆資料某些欄位的值。其基本語法是:
update 表格 set 欄位 1 = V1 where 欄位 2 = V2
基礎 SQL:變更資料 Cont.先插入一筆資料:
insert into user values (NULL, '令狐沖', 'M', '1975-05-05', '0929098987');
變更其電話:
update user set phone = '0938765642' where name= ' 令狐沖';
當然,透過名字來辨識,可能會發生同名同姓的問題,因此,較佳方式是由序號來辨識:
update user set phone = '0938763332' where serial= 10;
基礎 SQL:變更資料 Cont. 亦改兩個欄位,以 , 區分欲修改之欄位即可,例如:
update user set phone = '0938763332' , birthday = '1998-10-10' where serial= 10;
基礎 SQL:回溯指令 在 MySQL 的 MySQL Command Line Client裡,按向上的箭頭可以回溯前一列字串。依此類推可以一直向前回溯,也可以按向下的箭頭返回。
如果回溯的字串本身是一個完整的指令 (有頭有尾有分號 ),那麼,按 Enter 就能執行。您也可以用左、右箭頭,或是 Backspace 或 Delete 按鍵來修改那一列的字串。
基礎 SQL:表格結構修改 要在 user資料表中新增一個郵遞區號zipcode的欄位,作法如下:
mysql>alter table user add zipcode int unsigned;
修改 user 資料表名稱為 usr:
mysql>alter table user rename usr;
基礎 SQL:表格結構修改 Cont. 修改 user 資料表 phone 欄位型態為 VARCHAR(30):
mysql>alter table user modify phone varchar(30);
修改 user 資料表 phone 欄位名稱為 mobile 並且型態修改為 VARCHAR(20):
mysql>alter table user change phone mobile varchar(20);
基礎 SQL:表格結構修改 Cont. 刪除 user 資料表的 name 欄位
mysql>alter table user drop name;
增加 user 資料表 address 欄位
mysql>alter table user add address char(100);
基礎 SQL:匯入資料 在使用腳本程式時,需切換到命令提示字元下執行,指令如下:
mysql資料庫名稱 -h 機器位置 -u 使用者位置 -p <腳本程式所在位置
基礎 SQL:匯入資料 Cont. 在 C 槽根目錄下,建立 create_zip.sql,內容如下:
drop table if exists zip;create table zip (id smallint unsigned not null auto_increment primary
key,zip int unsigned,zone char(10),area char(10));
匯入指令如下:在 db 資料庫中建立 zip 表格 mysql db -h localhost -u root -p < c:\create_zip.sql
基礎 SQL:匯入資料 Cont. 匯入全臺郵遞區號資料 將 insert_zip.sql放在 C 槽根目錄下
mysql db -h localhost -u root -p < c:\insert_zip.sql
基礎 SQL:匯出資料 既然 MySQL能夠批次匯入資料,自然也能夠批次匯出
資料,此功能尤其在資料備份時最為有用,如同批次匯入,批次匯出功能亦需切換到命令提示字元下執行,指令如下:
mysqldump資料庫名稱 -h 機器位置 -u 使用者位置 -p > 匯出目標檔
基礎 SQL:匯出資料 Cont. 例如,我們要把整個 db資料庫(連同資料庫內的資料),完全匯出到 c:\db_bak.sql檔案中,則指令如下:
mysqldump db -h localhost -u root -p > c:\db_bak.sql
基礎 SQL:匯出資料 Cont. 如果只要匯出資料表的結構(不要內含資料),則指令如下:
mysqldump db –d -h localhost -u root -p > c:\db_bak.sql
二進位欄位(如 LONGBLOB,提供在資料庫中儲存大量二進位型態資料的功能),則這種型態的資料,無法被匯出到備份檔中
進階 SQL:進階查詢 查詢所有桃園縣內的郵遞區號、表格編號、地區 mysql>select * from zip where zone=‘桃園縣’ ;
查詢所有桃園縣內的郵遞區號、地區 mysql>select zip, area from zip where zone='桃園縣 ';
進階 SQL:進階查詢 Cont. 如果要查詢地區名叫做「東勢」的郵遞區號和它所在的縣市,指令為:
mysql>select zip, zone, area from zip where area=‘東勢’ ;
便可列出所有非臺北市的郵遞區號。
select zip from zip where zone != '臺北市 ';
進階 SQL:進階查詢 Cont. 進行有條件查詢
select 輸出欄位 from 表格 where 子句 ;
數值類型的比較
mysql>select * from ZIP where zip = 100;
mysql>select * from ZIP where zip <= 100;
mysql>select * from ZIP where zip > 980;
進階 SQL:進階查詢 Cont. 字元(字串)類型的比較
mysql>select * from ZIP where zone like '嘉義 %'; mysql>select * from ZIP where area like '中 %'; mysql>select * from ZIP where area like '%和 '; mysql>select * from ZIP where area like '%和 %'; mysql>select * from ZIP where area like '臺%市 '; <-- <-- 錯錯
誤指令誤指令mysql>select * from ZIP where area not like '臺北%'; mysql>select zip,zone,area from ZIP where zone like '臺
中 %' and area = '東勢 '; mysql>select zip,zone,area from ZIP where zip >= 350
and zip <= 359; mysql>select * from ZIP where zone like '%海%' or area
like '%海%';
進階 SQL:接合 Join 重新建立 user 表格
drop table user;
create table user (serial int unsigned auto_increment primary key,name varchar(10) not null,gender enum('F', 'M') not null,birthday date,phone char(20)
);alter table user add zipcode int unsigned;
進階 SQL:接合 Join Cont. 並新增兩筆資料
insert into user values (NULL, '喬峰 ', 'M', '1966-08-11', '0929763995', '726');
insert into user values (NULL, '慕容 ', 'M', '1975-04-04', '0929843956', '542');
進階 SQL:接合 Join Cont. 基本接合指令
select * from user join zip;
此時將出現 728 筆不具意義的資料
進階 SQL:有條件的接合 user表格與 zip表格真正有效的關聯,其實是郵遞區號,也就是當 user表格的 zipcode欄位對應到zip表格的 zip欄位時,這筆資料才有意義。
為了找到有意義的資料,我們可以加入 where指令做抽取,指令如下:
mysql> select * from user join zip where user.zipcode=zip.zip;
進階 SQL:有條件的接合 Cont. 輸出結果精簡化,便可列出 user表格內每個用戶的居住地,指令如下:
mysql> select user.*,zip.zone,zip.area from user join zip where user.zipcode=zip.zip;
進階 SQL:有條件的接合 Cont. 在執行這個指令時, MySQL動作如下:
執行 user join zip,以產生一張臨時表格。
在臨時表格中執行 where 子句,抽出 user 中 zipcode 欄位的值與 zip 中 zip 相同者。
在抽出的資料中,挑選指定的欄位,並輸出。
進階 SQL:單向接合 建立 customers表格與 orders表格並輸入資料
如果想查詢所有顧客,並得知客戶所訂購的產品,若使用一般的接合,則只會列出有訂東西的客戶:
select customers.id, customers.name, orders.id
from customers join orderswhere customers.id = orders.customerid;
進階 SQL:單向接合 Cont. NULL 出現在資料表內是是很常見的,常會有資料遺失或缺少,或是代表某些特殊意義。但在某些情況下,我們希望能將這些資料列出來,好讓我們知道並不是沒有這種人,而是沒有資料所導致。
而單邊接合的意義即是有方向性的接合動作,例如 A left join B on 某欄位,則意指以 A 為準去交集B,得出的結果一定包含(等於或大於)所有 A 的資料。此時如果 B 中的資料不足以對應 A 的資料的話,便會出現 NULL值。
進階 SQL:單向接合 Cont. 單邊接合的意義即是有方向性的接合動作,例如 A left join B on 某欄位,則意指以 A 為準去交集B,得出的結果一定包含(等於或大於)所有 A 的資料。此時如果 B 中的資料不足以對應 A 的資料的話,便會出現 NULL值。
select customers.id, customers.name, orders.id
from customers left join orders on customers.id = orders.customerid;
進階 SQL:單向接合 Cont. 一般接合結果+----+--------+----+| id | name | id |+----+--------+----+| 1 | Smith | 1 || 2 | Wang | 2 || 3 | Arthur | 3 || 3 | Arthur | 4 || 4 | Jones | 5 |+----+--------+----+
單向接合結果+----+--------+------+| id | name | id |+----+--------+------+| 1 | Smith | 1 || 2 | Wang | 2 || 3 | Arthur | 3 || 3 | Arthur | 4 || 4 | Jones | 5 || 5 | Tomas | NULL |+----+--------+------+
進階 SQL:單向接合 Cont.若只列出未訂購客戶的清單,亦即判斷 NULL值(使用 isnull()函式),
指令如下:
select customers.id, customers.name, orders.id from customers left join orders on customers.id = orders.customerid
where isnull(orders.id);
+----+-------+------+| id | name | id |+----+-------+------+| 5 | Tomas | NULL |+----+-------+------+
進階 SQL:萬用字元 萬用字元 萬用字元 %%,在此再進一步說明: % 需放在引號內,代表任何
長度為零到任意多個字元,例如: ' 民 %' 可以代表「民權」、「民生」、「民」、「民國西路」,還有「民間藝術」也是。
另一萬用字元:底線符號 底線符號 __ ,類似檔案系統中的 ? ,可以代替任一個英數字元或半個中文字,例如: '大漢 __' 可表示「大漢街」、「大漢溪」 等。但是「大漢」及「大漢民族」都不是符合的字串。
另外,要通知 MySQL 程式把 % 或 _ 當萬用字元來解讀,則必須使用運算子 like 或 not like , = 或 != 無法判斷 % 與 _ 萬用字元。
進階 SQL:運算函式 MAX(column):取出指定欄位中的最大值。 MIN(column):取出指定欄位中的最小值。 SUM(column):計算指定欄位的和。 AVG(column):計算指定欄位的平均值。 STD(column):計算指定欄位的標準差。
進階 SQL:運算函式 Cont. mysql>select AVG(zip) from zip;
+----------+| AVG(zip) |+----------+| 584.9203 |+----------+
進階 SQL:運算函式 Cont. 計算 zip 在 100 與 300 之間的平均值,指令如下:
mysql>select AVG(zip) from zip where zip >= 100 and zip <= 300;
其結果如下:
+----------+| AVG(zip) |+----------+| 214.1667 |+----------+
進階 SQL:排序與分類 列出各縣市的最大郵遞區號,指令如下:
mysql>select zone, MAX(zip) from ZIP group by zone;
進階 SQL:排序與分類 Cont. having子句是可以視為群組化時的where子句,也就是在群組化時,我們便可設定一些篩選條件
例如我們群組化時,只挑選郵遞區號小於 300者,則指令如下:
mysql>select zone, COUNT(zip) from zip group by zone having MAX(zip) < 300;
進階 SQL:排序與分類 Cont. 要列出郵遞區號小於 300且為台北縣市的資料,指令為:
mysql>select zone, COUNT(zip) from zip where zone like '臺北 %' group by zone having MAX(zip) < 300;
進階 SQL:排序與分類 Cont. 而排序在資料庫中也是相當重要的功能,只需加上「 order by 欄位名稱」即可。如要排序各個縣市的郵遞區號數量時,指令如下:
mysql>select zone, COUNT(zip) as cnt_zip from ZIP group by zone order by cnt_zip;
即可得到由小排到大的郵遞區號數量表。
進階 SQL:排序與分類 Cont. 若要由大排到小,只需加上 desc ,便可使資料作降冪排列:
mysql>select zone, COUNT(zip) as cnt_zip from ZIP group by zone order by cnt_zip desc;
要注意的是, COUNT(zip)不能直接拿來做排序的欄位名稱,必須給予他一個別名,才能在 order by中使用
進階 SQL:欄位別名 由 COUNT()、 MAX()等等函式所動態產生的欄位,因為不存在原始的表格架構中,所以我們要運用時,必須給予一個別名,才能對他進行運算,
例如:要求取每個縣市的平均郵遞區號並排序的話,指令如下:
mysql>select zone, AVG(zip) as avg_zip from ZIP group by zone order by avg_zip;
此時欄位名稱已從 AVG(zip)改變成 avg_zip,此一 avg_zip便是我們所給予的別名。
進階 SQL:欄位別名 Cont. 透過別名的功能,改變為易懂的欄位名稱,舉例如下:
mysql> select name as '姓名 ', birthday as '出生年月日 ', phone as '電話 ' from user;
則可得到以下結果:
+------+------------+------------+| 姓名 | 出生年月日 | 電話 |+------+------------+------------+| 喬峰 | 1966-08-11 | 0929763995 || 慕容 | 1975-04-04 | 0929843956 |+------+------------+------------+
進階 SQL:欄位別名 Cont. 別名也可達到簡化指令的效果,以查詢客戶訂單為例,本來的指
令是:
select customers.id, customers.name, orders.id from customers left join orders on customers.id = orders.customerid;
如改以別名來命名 table,將 customers命名為 a , orders命名為 b,則指令可簡化為:
select a.id, a.name, b.id from customers as a left join orders as bon a.id = b.customerid;
MySQL 其他操作介面 phpMyAdmin
MySQL 其他操作介面 Cont. mysql-fornt
結論 MySQL 操作語法大部分均符合標準 SQL 語法,因此藉由 MySQL 操作練習,未來可應用於大部分的 SQL 資料庫。
藉由實際撰寫 SQL 敘述,在未來實際撰寫 PHP 程式之 SQL 敘述時,有極大的助益。
標準 SQL 語法遠較本章所述之廣泛,需藉由閱讀 SQL說明與多加練習以熟練之。
本章結束 謝謝 !!