75
第4第 MySQL

第 4 章

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

Page 1: 第 4 章

第 4 章

MySQL

Page 2: 第 4 章

大綱 MySQL 資料庫概述 MySQL 基礎操作 基本 SQL 指令 進階 SQL 指令 其他操作介面 結論

Page 3: 第 4 章

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 ...... 等等。

Page 4: 第 4 章

MySQL 資料庫概述 Cont. MySQL 並不是一個 Open Source 的軟體計畫,因為

其版權在某些情況下是需要付費的,例如將它與其他產品包裝販售。不過,大體上來說,個人、教育單位及非營利事業使用它是免費的,而 MySQL 所收取的授權費主要來協助 MySQL 研發所需,使 MySQL 得以更加茁壯。

在 MySQL 4.0 之後, MySQL也支援了 Unicode(UTF-8)字元集,徹底解決了長久以來因為中文 BIG5碼所造成的『許功蓋』等亂碼問題。同時亦支援子查詢的功能,搭配其極快的查詢效率與許多 third-party周邊,足敷一般中型資料庫伺服器之所需,同時也是一極佳的資料庫入門磚。

Page 5: 第 4 章

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 等多種資料庫連接方式。 可以處理擁有上千萬筆記錄的大型資料庫。

Page 6: 第 4 章

MySQL 授權模式 目前, MySQL AB公司對 MySQL提供了兩種授權模式,分別是:

商業授權( The Commercial License): 自由軟體授權( The Open Source License):

在商業授權模式下,亦即商業出售的套件包含 MySQL資料庫伺服器,或所提供的商業服務中使用到 MySQL資料庫伺服器,均屬商業授權範圍。必須向 MySQL AB公司購買授權方能運用。

在自由軟體授權下,亦即學術、研究或個人非營利用途上,可自由使用。但如針對 MySQL原始碼有任何修改,不可以此修改販售營利,而需將改進成果回饋給開放原始碼社群,關於此部分更詳盡的內容,請參閱 GPL合約。

Page 7: 第 4 章

安裝 / 設定注意事項 在 MySQL資料庫內碼的設定上,由於 4.0版後, MySQL開始支

援 UTF-8,徹底解決中文亂碼的問題,在此選擇第二項『 Best support for multilingualism 』、或第三項並選擇 UTF-8 即可。

Page 8: 第 4 章

基礎操作:進入 MySQL 最簡單進入 MySQL的方法,便是由『開始』 ->『 MySQL』 -

>『 MySQL Server 4.1』 ->『 MySQL Command Line Client』,點選『 MySQL Command Line Client』,便可進入密碼確認畫面,鍵入密碼(本書設定 root密碼為 123456 ),按下 Enter鍵即以 MySQL Client連線 MySQL資料庫。

Page 9: 第 4 章

基礎操作:密碼變更 在一開始時初始化設定時,我們將 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』,密碼即變更成功。

Page 10: 第 4 章

基礎操作:帳號與權限 例:新增來自 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';

Page 11: 第 4 章

基礎 SQL:建立與刪除資料庫 建立一個資料庫,名稱為 db 請以 root登入資料庫,並鍵入以下指令(注意: MySQL指令結尾均需

有分號): mysql>create database db;

mysql>show databases; 則結果應為:

+----------+| Database |+----------+| db || mysql || test |+----------+

Page 12: 第 4 章

基礎 SQL:建立與刪除資料庫 資料庫的名字最好只使用 ASCII中的 ANU字符:即 26

個大寫英文字母、 26個小寫英文字母、 10個數目字和底線符號 _ 。不要超過 64 個字元。並請絕對不要使用中文。

資料庫的名字不可以由數目字開頭。

如果 MySQL Server的作業系統規定檔案名的大小寫字母視為不同,則資料庫的名稱大小寫亦會被視為不同。如果 MySQL安裝在 Windwos上,則 db、 Db與 DB都是指同一個資料庫。但如安裝在 Linux或 UNIX系統上,則 db和 DB是兩個不同的資料庫名稱。

Page 13: 第 4 章

基礎 SQL:選用資料庫 在使用 MySQL內,同一時間只能選用一個資料庫進行操作。假

設 db是資料庫的名字,則欲操作 db資料庫,則執行以下指令:

mysal>use db;

MySQL應回應:

Database changed

此時,即使用此一資料庫,要注意的是,如登入 MySQL時並未選用任何資料庫, MySQL並不會主動幫使用者選擇任一資料庫。

Page 14: 第 4 章

基礎 SQL:選用資料庫 如果想要知道目前正在使用的資料庫,則執行以下指令:

mysql>select database();

MySQL 會做如下回應:

+------------+| database() |+------------+| dbname |+------------+

Page 15: 第 4 章

基礎 SQL:得知目前狀態 mysql>select now( );

得知現在的日期和時間。

mysql>select user( ); 得知目前登入 MySQL的使用者。

mysql>select version( ); 得知目前的 MySQL 版本。

在 MySQL中的指令和函式,都不分大小寫

Page 16: 第 4 章

基礎 SQL:建立表格 建立表格的基本語法是:

create table 表格名稱 (field1, field2, ..., fieldN );

在選用表格名稱時,其定義規則與限制和資料庫名稱選用是一樣的。

表格的名字最好只使用 ASCII 中的 ANU 字符: 26 個大寫英文字母、 26 個小寫英文字母、 10 個數目字和底線符號 _ 。不可使用中文,亦不要超過 64 個字元。

表格名不能以數目字開頭。 通常應假設表格名是大小寫有分別的;例如 abc 和 Abc 是兩個不

同的表格名,為避免混淆,以下所有表格名稱與欄位名稱均使用小寫。

Page 17: 第 4 章

基礎 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 | |+--------+----------+------+-----+---------+-------+

Page 18: 第 4 章

基礎 SQL:刪除表格 刪除表格的指令是:

mysql>drop table 表格名稱 ;

此一指令如同 drop database,是一個無法反悔且無法救回的指令,且 MySQL不會再度確認,而是在執行此一指令後立即刪除。因此要小心此一指令。

Page 19: 第 4 章

基礎 SQL:建立表格練習+-------+------------------+-----+----+-------+--------------+| Field | Type |Null |Key |Default|Extra

|+-------+------------------+-----+----+-------

+--------------+| id | int(10) unsigned | |PRI |NULL |

auto_increment|| name | char(20) | | | |

|| phone | char(32) |YES | |NULL |

|+-------+------------------+----------+-------

+--------------+

試建立以下表格

Page 20: 第 4 章

基礎 SQL:資料輸入 insert into 表格名稱 values (欄位 1之值 , 欄位 2之值 , ... , 欄位 N 之值 );

其中「表格名稱」代表一個以存在資料庫中的表格,「欄位 n」代表第 n 個欄位的值,而 1 <= n <= N。要注意的是,敘述中的 , 數量必須與欄位數量 -1吻合。

Page 21: 第 4 章

基礎 SQL:資料輸入 Cont. 而欄位的值 (value) 必須符合當初宣告那個欄位的資料型態。

如果是數值類型態(例如整數、無號整數、浮點數),則直接寫數目字即可。如果是文字類型態 (例如固定長度字串或不定長度字串 ),則必須以一對單引號或雙引號將其框選,方能正確辨識(考量到日後撰寫 PHP需要,以下 SQL指令中文字框選均以單引號行之)。

如果是日期,也需以一對單引號框起,而日期的標準寫法是以 2006-02-25 代表西元 2006 年二月二十五日。在 MySQL中並不認得「民國」年數,但可在日後撰寫程式時透過運算得到。

而如果一個欄位是空的,不管它的型態是什麼,都可以 NULL輸入。

Page 22: 第 4 章

基礎 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));

Page 23: 第 4 章

基礎 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等等,所以還是宣告長一點比較安全。此亦點出在資料庫設計上,資料長度要有預留空間。應在系統容許的範圍內,盡量考慮到未來的擴充性。

Page 24: 第 4 章

基礎 SQL:輸入資料 在 user 表格中插入資料

insert into user values (NULL, '黃蓉 ', 'F', '1975-10-13', '0922123456');

Page 25: 第 4 章

基礎 SQL:輸入資料 檢視 user的內容:執行以下指令:

mysql>select * from user;

+--------+------+--------+------------+------------+| serial | name | gender | birthday | phone |+--------+------+--------+------------+------------+| 1 | 黃蓉 | F | 1975-10-13 | 0922123456 |+--------+------+--------+------------+------------+1 row in set (0.00 sec)

Page 26: 第 4 章

基礎 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 |+--------+------+--------+------------+------------+

Page 27: 第 4 章

基礎 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 |+--------+------+--------+------------+------------+

Page 28: 第 4 章

基礎 SQL:查閱表格 Cont.僅查詢使用者姓名,即執行以下指令:

mysql>select name from user;

其結果為:

+------+| name |+------+| 黃蓉 || 楊過 || 郭靖 || 小昭 |+------+

Page 29: 第 4 章

基礎 SQL:查閱表格 Cont.同時查詢使用者姓名與電話號碼,即執行以下指令:

mysql>select name,phone from user;

其結果為:

+------+------------+| name | phone |+------+------------+| 黃蓉 | 0922123456 || 楊過 | 0921456789 || 郭靖 | 0923000123 || 小昭 | 0924987654 |+------+------------+

Page 30: 第 4 章

基礎 SQL:刪除資料一次刪除某一表格內的全部資料,指令如下:

mysql>delete from 表格名稱 ;

以 user表格為例,要刪除 user表格內所有資料,指令為:

mysql>delete from user;

Page 31: 第 4 章

基礎 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';

兩者均可

Page 32: 第 4 章

基礎 SQL:變更資料 所謂修改資料,是指某筆資料已經存在,只是要更改那筆資料某些欄位的值。其基本語法是:

update 表格 set 欄位 1 = V1 where 欄位 2 = V2

Page 33: 第 4 章

基礎 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;

Page 34: 第 4 章

基礎 SQL:變更資料 Cont. 亦改兩個欄位,以 , 區分欲修改之欄位即可,例如:

update user set phone = '0938763332' , birthday = '1998-10-10' where serial= 10;

Page 35: 第 4 章

基礎 SQL:回溯指令 在 MySQL 的 MySQL Command Line Client裡,按向上的箭頭可以回溯前一列字串。依此類推可以一直向前回溯,也可以按向下的箭頭返回。

如果回溯的字串本身是一個完整的指令 (有頭有尾有分號 ),那麼,按 Enter 就能執行。您也可以用左、右箭頭,或是 Backspace 或 Delete 按鍵來修改那一列的字串。

Page 36: 第 4 章

基礎 SQL:表格結構修改 要在 user資料表中新增一個郵遞區號zipcode的欄位,作法如下:

mysql>alter table user add zipcode int unsigned;

修改 user 資料表名稱為 usr:

mysql>alter table user rename usr;

Page 37: 第 4 章

基礎 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);

Page 38: 第 4 章

基礎 SQL:表格結構修改 Cont. 刪除 user 資料表的 name 欄位

mysql>alter table user drop name;

增加 user 資料表 address 欄位

mysql>alter table user add address char(100);

Page 39: 第 4 章

基礎 SQL:匯入資料 在使用腳本程式時,需切換到命令提示字元下執行,指令如下:

mysql資料庫名稱 -h 機器位置 -u 使用者位置 -p <腳本程式所在位置

Page 40: 第 4 章

基礎 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

Page 41: 第 4 章

基礎 SQL:匯入資料 Cont. 匯入全臺郵遞區號資料 將 insert_zip.sql放在 C 槽根目錄下

mysql db -h localhost -u root -p < c:\insert_zip.sql

Page 42: 第 4 章

基礎 SQL:匯出資料 既然 MySQL能夠批次匯入資料,自然也能夠批次匯出

資料,此功能尤其在資料備份時最為有用,如同批次匯入,批次匯出功能亦需切換到命令提示字元下執行,指令如下:

mysqldump資料庫名稱 -h 機器位置 -u 使用者位置 -p > 匯出目標檔

Page 43: 第 4 章

基礎 SQL:匯出資料 Cont. 例如,我們要把整個 db資料庫(連同資料庫內的資料),完全匯出到 c:\db_bak.sql檔案中,則指令如下:

mysqldump db -h localhost -u root -p > c:\db_bak.sql

Page 44: 第 4 章

基礎 SQL:匯出資料 Cont. 如果只要匯出資料表的結構(不要內含資料),則指令如下:

mysqldump db –d -h localhost -u root -p > c:\db_bak.sql

二進位欄位(如 LONGBLOB,提供在資料庫中儲存大量二進位型態資料的功能),則這種型態的資料,無法被匯出到備份檔中

Page 45: 第 4 章

進階 SQL:進階查詢 查詢所有桃園縣內的郵遞區號、表格編號、地區 mysql>select * from zip where zone=‘桃園縣’ ;

查詢所有桃園縣內的郵遞區號、地區 mysql>select zip, area from zip where zone='桃園縣 ';

Page 46: 第 4 章

進階 SQL:進階查詢 Cont. 如果要查詢地區名叫做「東勢」的郵遞區號和它所在的縣市,指令為:

mysql>select zip, zone, area from zip where area=‘東勢’ ;

便可列出所有非臺北市的郵遞區號。

select zip from zip where zone != '臺北市 ';

Page 47: 第 4 章

進階 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;

Page 48: 第 4 章

進階 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 '%海%';

Page 49: 第 4 章

進階 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;

Page 50: 第 4 章

進階 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');

Page 51: 第 4 章

進階 SQL:接合 Join Cont. 基本接合指令

select * from user join zip;

此時將出現 728 筆不具意義的資料

Page 52: 第 4 章

進階 SQL:有條件的接合 user表格與 zip表格真正有效的關聯,其實是郵遞區號,也就是當 user表格的 zipcode欄位對應到zip表格的 zip欄位時,這筆資料才有意義。

為了找到有意義的資料,我們可以加入 where指令做抽取,指令如下:

mysql> select * from user join zip where user.zipcode=zip.zip;

Page 53: 第 4 章

進階 SQL:有條件的接合 Cont. 輸出結果精簡化,便可列出 user表格內每個用戶的居住地,指令如下:

mysql> select user.*,zip.zone,zip.area from user join zip where user.zipcode=zip.zip;

Page 54: 第 4 章

進階 SQL:有條件的接合 Cont. 在執行這個指令時, MySQL動作如下:

執行 user join zip,以產生一張臨時表格。

在臨時表格中執行 where 子句,抽出 user 中 zipcode 欄位的值與 zip 中 zip 相同者。

在抽出的資料中,挑選指定的欄位,並輸出。

Page 55: 第 4 章

進階 SQL:單向接合 建立 customers表格與 orders表格並輸入資料

如果想查詢所有顧客,並得知客戶所訂購的產品,若使用一般的接合,則只會列出有訂東西的客戶:

select customers.id, customers.name, orders.id

from customers join orderswhere customers.id = orders.customerid;

Page 56: 第 4 章

進階 SQL:單向接合 Cont. NULL 出現在資料表內是是很常見的,常會有資料遺失或缺少,或是代表某些特殊意義。但在某些情況下,我們希望能將這些資料列出來,好讓我們知道並不是沒有這種人,而是沒有資料所導致。

而單邊接合的意義即是有方向性的接合動作,例如 A left join B on 某欄位,則意指以 A 為準去交集B,得出的結果一定包含(等於或大於)所有 A 的資料。此時如果 B 中的資料不足以對應 A 的資料的話,便會出現 NULL值。

Page 57: 第 4 章

進階 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;

Page 58: 第 4 章

進階 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 |+----+--------+------+

Page 59: 第 4 章

進階 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 |+----+-------+------+

Page 60: 第 4 章

進階 SQL:萬用字元 萬用字元 萬用字元 %%,在此再進一步說明: % 需放在引號內,代表任何

長度為零到任意多個字元,例如: ' 民 %' 可以代表「民權」、「民生」、「民」、「民國西路」,還有「民間藝術」也是。

另一萬用字元:底線符號 底線符號 __ ,類似檔案系統中的 ? ,可以代替任一個英數字元或半個中文字,例如: '大漢 __' 可表示「大漢街」、「大漢溪」 等。但是「大漢」及「大漢民族」都不是符合的字串。

另外,要通知 MySQL 程式把 % 或 _ 當萬用字元來解讀,則必須使用運算子 like 或 not like , = 或 != 無法判斷 % 與 _ 萬用字元。

Page 61: 第 4 章

進階 SQL:運算函式 MAX(column):取出指定欄位中的最大值。 MIN(column):取出指定欄位中的最小值。 SUM(column):計算指定欄位的和。 AVG(column):計算指定欄位的平均值。 STD(column):計算指定欄位的標準差。

Page 62: 第 4 章

進階 SQL:運算函式 Cont. mysql>select AVG(zip) from zip;

+----------+| AVG(zip) |+----------+| 584.9203 |+----------+

Page 63: 第 4 章

進階 SQL:運算函式 Cont. 計算 zip 在 100 與 300 之間的平均值,指令如下:

mysql>select AVG(zip) from zip where zip >= 100 and zip <= 300;

其結果如下:

+----------+| AVG(zip) |+----------+| 214.1667 |+----------+

Page 64: 第 4 章

進階 SQL:排序與分類 列出各縣市的最大郵遞區號,指令如下:

mysql>select zone, MAX(zip) from ZIP group by zone;

Page 65: 第 4 章

進階 SQL:排序與分類 Cont. having子句是可以視為群組化時的where子句,也就是在群組化時,我們便可設定一些篩選條件

例如我們群組化時,只挑選郵遞區號小於 300者,則指令如下:

mysql>select zone, COUNT(zip) from zip group by zone having MAX(zip) < 300;

Page 66: 第 4 章

進階 SQL:排序與分類 Cont. 要列出郵遞區號小於 300且為台北縣市的資料,指令為:

mysql>select zone, COUNT(zip) from zip where zone like '臺北 %' group by zone having MAX(zip) < 300;

Page 67: 第 4 章

進階 SQL:排序與分類 Cont. 而排序在資料庫中也是相當重要的功能,只需加上「 order by 欄位名稱」即可。如要排序各個縣市的郵遞區號數量時,指令如下:

mysql>select zone, COUNT(zip) as cnt_zip from ZIP group by zone order by cnt_zip;

即可得到由小排到大的郵遞區號數量表。

Page 68: 第 4 章

進階 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中使用

Page 69: 第 4 章

進階 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便是我們所給予的別名。

Page 70: 第 4 章

進階 SQL:欄位別名 Cont. 透過別名的功能,改變為易懂的欄位名稱,舉例如下:

mysql> select name as '姓名 ', birthday as '出生年月日 ', phone as '電話 ' from user;

則可得到以下結果:

+------+------------+------------+| 姓名 | 出生年月日 | 電話 |+------+------------+------------+| 喬峰 | 1966-08-11 | 0929763995 || 慕容 | 1975-04-04 | 0929843956 |+------+------------+------------+

Page 71: 第 4 章

進階 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;

Page 72: 第 4 章

MySQL 其他操作介面 phpMyAdmin

Page 73: 第 4 章

MySQL 其他操作介面 Cont. mysql-fornt

Page 74: 第 4 章

結論 MySQL 操作語法大部分均符合標準 SQL 語法,因此藉由 MySQL 操作練習,未來可應用於大部分的 SQL 資料庫。

藉由實際撰寫 SQL 敘述,在未來實際撰寫 PHP 程式之 SQL 敘述時,有極大的助益。

標準 SQL 語法遠較本章所述之廣泛,需藉由閱讀 SQL說明與多加練習以熟練之。

Page 75: 第 4 章

本章結束 謝謝 !!