You are on page 1of 72

Introduction to…

MySQL
Database Server

ภาควิชาวิศวกรรมคอมพิวเตอร คณะวิศวกรรมศาสตร
มหาวิทยาลัยเชียงใหม
1.! บทที่ 1 Database Management System

1.1.!ความหมายของระบบฐานขอมูล
ระบบฐานขอมูลคือ โครงสรางสารสนเทศ (Information) ทีป่ ระกอบดวยขอมูลตางๆ เชน ขอมูลของ
ลูกคาของบริษัท ขอมูลรายการสินคา เปนตน ซึ่งขอมูลเหลานี้สามารถรวมเปนหัวขอที่สัมพันธกันได ระบบ
ฐานขอมูลไดสรางวิธกี ารสําหรับการรวบรวมรายการ ขอมูลที่เกี่ยวของกับงานนั้นๆเขาดวยกัน สรางวิธี
สําหรับการเก็บและบํารุงรักษาขอมูลเหลานัน้
ระบบฐานขอมูลประกอบดวยสวนประกอบ 2 สวนคือ
1.ระบบจัดการฐานขอมูล (Database Management System (DBMS)) เปนโปรแกรมที่ใชเพื่อจัด
ระเบียบและบํารุงรักษารายการของขอมูลเหลานี้
2.แอปพลิเคชัน่ ฐานขอมูล (Database Application) เปนโปรแกรมที่ชวยใหเราดู และแกไขขอมูลที่
ถูกเก็บอยูใน DBMS
โดยปกติทง่ั DBMS และ Database Application จะทํางานอยูบ นเครือ่ งเดียวกัน สวนมากทัง้ สอง
สวนจะถูกรวมอยูภายในโปรแกรมเดียวกัน แตขณะนี้ความสนใจสวนมากไดมุงไปที่เทคโนโลยีในการปฎิวัติ
DBMS คือเทคโนโลยี Client/Server นัน่ เอง

1.2.!ขอดีในการใชโปรแกรมระบบจัดการฐานขอมูล
(1)! ลดความซํ้าซอนของฐานขอมูล
(2)! ลดความผิดพลาดของขอมูล ในกรณีที่เรามีการจัดเก็บขอมูลไวหลายๆแหง การเปลีย่ นแปลงแกไข
ขอมูลจะเกิดปญหาวาขอมูลไมเหมือนกัน ทําใหการทํางานผิดพลาดและเกิดความเสียหายได ซึง่
ระบบฐานขอมูลสามารถลดปญหาเหลานีไ้ ดอยางดี
(3)! สามารถใชขอมูลรวมกันได ทําใหประหยัดคาใชจายและลดความผิดพลาด
(4)! ควบคุมความเปนมาตรฐานของขอมูลได การจัดเก็บขอมูลที่มีศูนยกลางที่เดียวทําใหสามารถควบ
คุมรูปแบบของขอมูลได ทําใหขอ มูลเปนอันหนึง่ อันเดียวกัน งายตอการดูแลรักษา
(5)! ความปลอดภัยในการเก็บรักษาขอมูล เนื่องจากการเก็บขอมูลไวที่ศูนยกลางขอมูลที่เดียวจึงทําให
สามารถควบคุมและจัดสรรระดับของผูใ ชทเ่ี ขามาขอใชขอ มูลได เชนการกําหนดรหัสผานใหการเขา
มาใชขอ มูล แบงระดับความปลอดภัยของผูเขามาใชขอมูล
(6)! สามารถควบคุมความถูกตองของขอมูลไดโดยงาย
1.3.!Relational Database
เปน DBMS ประเภทหนึ่งที่นิยมใชในปจจุบัน ในระบบ RDM ขอมูลจะถูกจัดระเบียบเปนเซตในทาง
คณิตศาสตรในโครงสรางของตาราง ฟลดขอมูลแตละตัวจะเปนคอลัมนในตาราง และแตละเรคอรดจะกลาย
เปนแถวในตาราง
Relation Database มีขอ ดีทสี่ าคั
ํ ญคือ ความยืดหยุนที่สมบูรณในการกลาวถึงความสัมพันธระหวาง
รายการขอมูลที่แตกตางกัน การตัดสินใจหลักๆของผูอ อกแบบฐานขอมูลคือการกําหนดตาราง Relation
Database ถือวาเปนฐานขอมูลแบบทีน่ ําไปสูก ารพัฒนาระบบ Client/Server ซึ่งจะ
กลาวถึงในหัวขอตอไป
2.! บทที่ 2 ระบบฐานขอมูลแบบ Client/Server
ระบบ Client/Server นีเ้ ปนการแยกการทํางานของ Font-end กับ Back-end ออกจากกันโดยผูใช
สามารถที่จะทําการทํางานกับฐานขอมูลไดโดยไมจําเปนตองทํางานอยูที่เครื่องที่ทําหนาทีเ่ ก็บฐานขอมูลอยู
นัน้ เราจะเรียกวา Back-end ในการนําเสนอระบบนีอ้ ยางไรนัน้ ขึน้ กับ Platform ที่ Font-end กับ Back-end
ทํางานอยู และระดับการจัดการทีถ่ กู แบงออกเปน 2 สวน

+,-'.$ +,-'.$

"#$#%#&'!(')*')

+,-'.$

รูปที่ 2.1 แสดงโครงสรางของระบบ Client/Server Database

2.1.!ขอดี ของระบบฐานขอมูลแบบ Client/Server


(1)! การแบงแยกการจัดการระหวางระบบของ Client และ Database Server ออกจากกันโดยการ
จัดการฐานขอมูลจะถูกทําทีส่ ว นของ Back-end สวน DBMS จะถูกจัดการอยูท ่ี Server ทําให
สามารถทําการขยายการใชงานของเครื่องคอมพิวเตอรที่มีขนาดเล็กหรือชาเกินกวาที่จะ
สามารถทําการ Run DBMS ทีซ่ บั ซอนบนเครือ่ งนัน้
(2)! ชวยลดโหลด(Load)ใหกบั ระบบ Nerwork ทีเ่ ชือ่ มตอไดดวยแทนที่จะตองทําการสงขอมูลทัง้
หมดไปและกลับผานทางสายแลน(LAN) ไปยังเครื่องที่ทําการติดตอเขามาทําใหการจราจรบน
สายสงลดนอยลงเหลือเพียงแคการสง Query มาจาก Client มายังตัวทีเ่ ปนฐานขอมูล เพือ่
ทํางานอยางใดอยางหนึ่ง เมื่อ Server ไดรบั Query ที่สงมาก็จะทําการคํานวณและสงผลลัพธ
กลับไปยัง Client เพียงเทานั้น
(3)! การทํางานของโปรแกรมไมขึ้นกับเครื่องที่ทํางาน ผูใชจะไมถูกจํากัดบนเครือ่ งระบบใดระบบ
หนึง่ เทานัน้ สามารถนําเอาโปรแกรมไปทํางานบนเครือ่ งคอมพิวเตอรเครือ่ งไหนก็ไดและ
สามารถทํางานไดกับระบบปฎิบัติการไดหลายตัวไมวาจะเปน MS-Windows,IBM
OS/2,MS/PC-Dos เปนตนนอกจากนี้ Client และ Server ก็ไมจําเปนตองใชฐานขอมูลเดียวกัน
(4)! การรักษาความถูกตองของขอมูล ในปจจุบันระบบ Database Server สวนมากทํางานบน
DBMS ทีใ่ ชการจัดการแบบ Relation DBMS เมือ่ ผูใ ชตองการที่จะทําการแกไขคาของขอมูล
จะตองทําการ Log In เขามาใชงานที่ Server กอนทําใหขอมูลไมกระจัดกระจาย และมีความถูก
ตองอยูเ สมอ
(5)! การปกปองขอมูล ที่เครื่องที่ทาหน
ํ าที่ในการเก็บขอมูล (Server) บางครั้งอาจมีการเขารหัสที่
เก็บไฟลโดยขอมูลถูกเขารหัสเพือ่ ปองกันการดูจากภายนอก DBMS ได

2.2.!ขอเสียของระบบ Client/Server
(1)! การเพิ่มคาใชจายในการจัดการและเตรียมบุคลากรที่จะทําหนาที่บํารุงรักษา Database Server
เมือ่ จํานวนผูใชมีมากขึ้นหรือเมื่อฐานขอมูลมีขนาดใหญมากขึ้น นอกจากนีก้ ารฝกฝนผูค วบคุม
ระบบยังเปนคาใชจายที่เพิ่มขึ้นในตอนเริ่มตนดวย เนื่องจากคนที่เขามาทํางานอาจจะไมคุนเคย
กับระบบที่ทําอยู
(2)! การเพิ่มคาใชจายทางดาน Hardware ก็จะเพิม่ ขึน้
3.! บทที่ 3 เกีย่ วกับ MySQL
MySQL เปน SQL ( Structured Queries Language ) database server ซึง่ SQL เปน database
language ทีน่ ยิ มมากภาษาหนึ่ง เปน database server ขนาดเล็ก ซึ่งเหมาะกับ applications ทีม่ ขี นาด
เล็ก และ ปานกลาง อีกทัง้ ยังสนับสนุน standard SQL (ANSI) MySQL ถูกเขียนขึ้นมาใชไดในหลาย
platform ของคอมพิวเตอร ทั้ง Unix และ Windows
ในโลก MySQL เปนการสราง client/server ทีป่ ระกอบดวย server daemon ‘mysqld’ และ client
programs/libraries ทีแ่ ตกตางกัน ความสามารถที่สําคัญของ MySQL คือ ความเร็ว และ ความทนทาน (
robustness ) MySQL ถูกสรางเปนกลุม ของ routine ทีใ่ ชสาหรั
ํ บตอบสนองการใชงานซึง่ ในปจจุบนั MySQL
ยังคงทําการพัฒนาอยูอ ยางตอเนือ่ ง คุณสามารถดูรายละเอียดเพิ่มเติมของ MySQL ไดจาก web site หลัก
ของ MySQL http://www.mysql.com
การติดตัง้ MySQL ในปจจุบัน นัน้ ทําไดงายมาก โดยเฉพาะ หากคุณใช Mandrake 7 เมือ่ คุณ
install mandrake 7 MySQL จะถูกติดตั้งมาใหเรียบรอยแลว
หากตองการติดตัง้ MySQL binary version ใหพิมพคําสัง่ ดังนี้
shell> gunzip < mysql-VERSION-OS.tar.gz | tar xvf -
shell> ln -s mysql-VERSION-OS mysql
shell> cd mysql
shell> scripts/mysql_install_db
shell> bin/safe_mysqld &
หากตองการติดตัง้ MySQL แบบ RPM ตองใช file ดังนี้
•! MySQL-VERSION.i386.rpm สําหรับโปรแกรม MySQL server.
•! MySQL-client-VERSION.i386.rpm สําหรับโปรแกรม MySQL client

วิธกี ารติดตั้งโปรแกรม ใหพิมพดังนี้


shell> rpm -i MySQL-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm

หากตองการติดตัง้ เพียงแคโปรแกรม client ใหพมิ พ


shell> rpm -i MySQL-client-VERSION.i386.rpm
4.! บทที่ 4 ระบบการจัดการกับสิทธิการเขาถึงขอมูล

4.1!ความรูพ้ืนฐานเกีย่ วกับ user-name และ รหัสผาน ใน MySQL


•! User-name ใน MySQL ไมใช user-name ทีใ่ ชในระบบ UNIX แตโดยปกติเมือ่ มีการ connect
ไปยัง MySQL server แลว user-name บน UNIX จะถูกใชเปนคา user-name เริม่ ตน โดยผูใ ช
สามารถระบุ user-name ของ MySQL โดยใช option –u username ได
User-name ใน MySQL มีความยาวไดสงู สุด 16 ตัวอักษร
•! รหัสผานของ user ใน MySQL ไมใชรหัสผานของ user ทีใ่ ชในระบบ UNIX

4.2!ความรูพ้ืนฐานเกีย่ วกับการ connect MySQL server


MySQL client สามารถ connect ไปยัง MySQL server โดยใชคาสั
ํ ง่ ดังนี้
Shell> mysql [-h hostname] [-u username] [-pyourpassword]
Shell> mysql [--host=hostname] [--user=username] [--password=yourpassword]

โดยคามาตรฐานสําหรับ client มีดังนี้


หากไมมกี ารระบุ option –h hostname มาตรฐานจะเปน localhost
หากไมมกี ารระบุ option –u username มาตรฐานจะเปน UNIX user-name

การใช option –p โดยไมระบุ password MySQL client จะใหผูใชปอน password ดังนี้


Shell> mysql –u username –p
Enter password: *********

ในระบบ UNIX ผูใชสามารถระบุคาเริ่มตนในการ connect MySQL server ไดโดยระบุภายในไฟล .my.cnf ใน


home directory เชน
[client]
host=hostname
user=username
password=yourpassword

เมือ่ มีการระบุ password ในไฟลดงั กลาว ควรกําหนดสิทธิในการเขาถึงไฟลใหเปน 400 หรือ 600

4.3!ความรูพ้ืนฐานเกีย่ วกับ Privileges system


หนาทีห่ ลักของ privileges system คือการตรวจสอบสิทธิของ user ในการ connect MySQL
server,การใช query พืน้ ฐานเชน select, insert, update และ delete นอกจากนั้น privileges system
ยังใชในการจัดการสิทธิของ anonymous user, การเพิ่มสิทธิในการใช function พิเศษ เชน LOAD DATA
INFILE และการบริหารระบบ MySQL
4.4!ความรูพ้ืนฐานเกีย่ วกับ Privileges table
Privileges table ประกอบไปดวย 3 table หลักๆ คือ
(1)! host table ใชในการกําหนดสิทธิวา host ใดมีสทิ ธิทาอะไรกั
ํ บ database ใดบาง โดยมี field ดัง
นี้
•! Host – สามารถ connect จาก client ใดไดบาง
•! Db – database ใดที่สามารถใชงานได
•! Select_priv – สามารถใช query SELECT ไดหรือไม (Y/N)
•! Insert_priv – สามารถใช query INSERT ไดหรือไม (Y/N)
•! Update_priv – สามารถใช query UPDATE ไดหรือไม (Y/N)
•! Delete_priv – สามารถใช query DELETE ไดหรือไม (Y/N)
•! Create_priv – สามารถใช query CREATE ไดหรือไม (Y/N)
•! Drop_priv – สามารถใช query DROP ไดหรือไม (Y/N)
เชน client host ชือ่ cpe, database ทีต่ อ งการใชงานชือ่ student จะใชคําสั่งดังนี้เพื่อให client
จากcpe สามารถใชงาน student ได

mysql> insert into


-> host(host,db,Select_priv,Insert_priv,Update_priv,
-> Delete_priv,Create_priv,Drop_priv)
-> values('localhost','student','Y', 'Y', 'Y', 'Y', 'Y', 'Y');

mysql> insert into


-> host(host,db,Select_priv,Insert_priv,Update_priv,
-> Delete_priv,Create_priv,Drop_priv)
values('cpe','student','Y', 'Y', 'Y', 'Y', 'Y', 'Y');

โดยรูปแบบ field host ที่ใชไดคือ localhost, hostname, เลข IP, ตัวอักษรที่ใช wildcard เชน
cp% หมายถึงชื่อ host ที่ขึ้นตนดวย cp เปนตน
(2)! user table ใชในการกําหนดสิทธิวา user ใด สามารถใชงาน client ไดจาก host ใด และ
สามารถจะทําอะไรไดบา ง โดยมี field ดังนี้
Host – สามารถ connect จาก client ใดไดบาง
User – username ใดสามารถ connect ได
Select_priv – สามารถใช query SELECT ไดหรือไม (Y/N)
Insert_priv – สามารถใช query INSERT ไดหรือไม (Y/N)
Update_priv – สามารถใช query UPDATE ไดหรือไม (Y/N)
Delete_priv – สามารถใช query DELETE ไดหรือไม (Y/N)
Create_priv – สามารถใช query CREATE ไดหรือไม (Y/N)
Drop_priv – สามารถใช query DROP ไดหรือไม (Y/N)
Reload_priv – สามารถใช query RELOAD ไดหรือไม (Y/N)
Shutdown_priv – สามารถสัง่ shutdown MySQL server ไดหรือไม (Y/N)
Process_priv – สามารถสัง่ list คําสัง่ ทีก่ ําลังประมวลผลบน server ไดหรือไม (Y/N)
File_priv – user สามารถเขียนไฟลลงบน server ไดหรือไม (Y/N)
(3)! db table ใชในการกําหนดสิทธิวา database ใด สามารถใชงานโดย user ใด จาก client ใด
และสามารถจะทําอะไรไดบา ง โดยมี field ดังนี้
•! Host – สามารถ connect จาก client ใดไดบาง
•! Db – database ใดทีส่ ามารถใชงานได
•! User – username ใดสามารถ connect ได
•! Select_priv – สามารถใช query SELECT ไดหรือไม (Y/N)
•! Insert_priv – สามารถใช query INSERT ไดหรือไม (Y/N)
•! Update_priv – สามารถใช query UPDATE ไดหรือไม (Y/N)
•! Delete_priv – สามารถใช query DELETE ไดหรือไม (Y/N)
•! Create_priv – สามารถใช query CREATE ไดหรือไม (Y/N)
•! Drop_priv – สามารถใช query DROP ไดหรือไม (Y/N)

4.5!ระบบรักษาความปลอดภัยทั่วไป
ระบบรักษาความปลอดภัยใน MySQL จะสามารถกําหนด หรือปรับเปลีย่ น ไดจาก Access Control
Lists (ACL-s), SSL แตสิ่งที่สําคัญทีส่ ดุ ก็คอื การใชงาน MySQL อยางปลอดภัย เมื่อ MySQL
หลักการการใชงาน MySQL ใหปลอดภัย
(1)! ทําความเขาใจกับ ACL-s การ GRANT หรือ REVOKE ควรทําโดยระมัดระวัง ไมควร GRANT
สิทธิใด ๆ ใหแกผูใชโดยไมจาเป ํ น ควรตัง้ รหัสผานสําหรับการเขาสูร ะบบโดย account root
เสมอ การตรวจสอบสิทธิตาง ๆ ของผูใชสามารถทําไดโดยใชคําสัง่ SHOW GRANTS
(2)! การเก็บรหัสผานควรมีการเขารหัสเสมอ ทําไดโดยใช MD5( ) หรือ hashing function
(3)! รหัสผานไมควรมีคําศัพทที่มีอยูในพจนานุกรมภาษาอังกฤษ เชน xfish98
(4)! MySQL server ควรทํางานอยูห ลังระบบ firewall โดยปองกัน port 3306 ของ MySQL ใหมี
การเขาถึงจาก client เทาที่จาเป ํ น
(5)! การพัฒนาโปรแกรมประยุกตซึ่งติดตอกับ MySQL ควรมีการตรวจสอบความถูกตองเสมอ การ
ตรวจสอบที่จําเปนสําหรับแตละประเภทของโปรแกรมประยุกตมีดังนี้
(5.1)! โปรแกรมประยุกตซึ่งทํางานผาน www
-! ทดสอบการปอนคา %22 (“), %27(‘)
-! ทดสอบการปอนคาทีเ่ ปนตัวอักษร, space, สัญลักษณตา ง ๆ ลงใน field ทีเ่ ปนตัวเลข
-! ทดสอบขนาดของ data กอนสงไปประมวลผลยัง MySQL server
(5.2)! โปรแกรมประยุกตซึ่งมีการใชงาน PHP3
-! ตรวจสอบการใช function addslashes()
(5.3)! โปรแกรมประยุกตซึ่งมีการใชงาน MySQL C API
-! ตรวจสอบการเรียกใช API mysql_escape()
(5.4)! โปรแกรมประยุกตซึ่งมีการใชงาน MySQL++
-! ตรวจสอบการใช escape และ quote ในการ query
(6)! การสงขอมูลผานระบบเน็ตเวิรก ควรมีการเขารหัสโดยใช SSL

4.6!การปองกัน MySQL ใหปลอดภัยจาก crackers


(1)! ตัง้ รหัสผานสําหรับผูใชทุกคนเสมอ โดยการตัง้ หรือเปลีย่ นรหัสผานสามารถทําไดดงั นี้
Shell> mysql –u username mysql
Mysql> UPDATE user SET Password=PASSWORD(‘new_password’) WHERE
user=’username’;
Mysql> FLUSH PRIVILEGES;

(2)! ไมควรสั่งให MySQL deamon ทํางาน โดยเปน process ของ root


(3)! กําหนดสิทธิ Script ไฟล mysql.server ใหสามารถอานไดเฉพาะ root เทานัน้ เมื่อมีการ
กําหนดรหัสผานของ UNIX root ใน script ดังกลาว
(4)! กําหนดสิทธิในการอาน/เขียน directory ที่ใชเก็บ database ใหแก UNIX user ทีเ่ ปนเจาของ
process MySQL deamon เทานัน้
(5)! ไมควรกําหนดสิทธิ process ใหแก user ทุกคน
(6)! ไมควรกําหนดสิทธิ file ใหแก user ทุกคน

4.7!เมื่อสิทธิของผูใ ชถกู เปลีย่ นแปลง จะมีผลตอผูใ ชเมือ่ ใด ?


เมื่อ mysqld start , ขอมูลใน grant table จะถูกอานเก็บไวในหนวยความจํา เพือ่ นําไปใชงาน
การแกไขขอมูลใน grant tables โดยใชคําสัง่ GRANT, REVOKE หรือ SET PASSWORD จะทําใหสิทธิที่ถูก
แกไขมีผลใชไดทันที
ถาคุณแกไข grant tables โดยการใชคําสัง่ INSERT หรือ UPDATE คุณจําเปนตองใชคําสัง่
FLUSH PRIVILEGES หรือ run mysqladmin flush-privileges เพื่อบอกให server reload grant tables ไม
เชนนัน้ สิทธิตางๆ ที่คุณแกไขจะไมมีผลใดๆ จนกวาคุณจะ restart server
เมื่อ server รับรูว า grant tables ถูกเปลีย่ นแปลง, client ทีต่ ดิ ตออยูก บั server ในขณะนัน้ ๆ จะได
รับผลกระทบดังนี้
•! สิทธิการใชงาน Table และ column จะมีผลตอ client เมื่อ client request ครั้งตอไป
•! สิทธิการใชงาน Database จะมีผลตอ client เมื่อ client เรียกใชคําสัง่ USE db_name ในครั้งตอไป
สวนการเปลีย่ นแปลงสิทธิอน่ื ๆ นอกเหนือจากนี้จะมีผลตอ client เมื่อ client connect มายัง server ครั้งตอไป
4.8!การ set up สิทธิการใช MySQL เริม่ ตน
หลังจากติดตัง้ MySQL, คุณสามารถ set up access privileges เริ่มตนของ MySQL ไดโดยการ
run script/mysql_install_db ซึง่ script/mysql_install_db จะทําการ start up mysqld server จากนัน้ ก็จะ
กําหนดคาเริม่ ตนของ grant table ดังนี้ :
•! The MySQL root user จะเปน superuser ซึ่งสามารถทําทุกอยางได และการติดตอกับ server จะ
ตองทําจาก localhost เทานัน้ Note: password เริม่ ตนของ root จะถูกกําหนดเปนว empty นัน้ คือ
ทุกๆ คนสามารถ connect มายัง server โดยใช user root แบบไมตองใช password ได
•! An anonymous user ถูกสรางใหสามารถทําอะไรก็ไดกบั databases ทีช่ ื่อ ‘test’ หรือ ขึ้นตนดวย
‘test_’ การติดตอกับ server ตองทําจาก local host เทานัน้
•! สิทธิ อืน่ เชน user ธรรมดาไมสามารถ ใช mysqladmin shutdown หรือ mysqladmin processlist
ได
เมื่อคุณ install MySQL เสร็จ สิง่ แรกทีค่ ณุ ควรทําคือการกําหนด password สําหรับ root user โดยใชวิธีการ
ดังนี้

shell> mysql -u root mysql


mysql> UPDATE user SET Password=PASSWORD('new_password')
WHERE user='root';
mysql> FLUSH PRIVILEGES;

ใน MySQL 3.22 , คุณสามารถใชคําสัง่ SET PASSWORD ไดดงั นี้


shell> mysql -u root mysql
mysql> SET PASSWORD FOR root=PASSWORD('new_password');

อีกวิธีในการ set password ของ root คือ


shell> mysqladmin -u root password new_password

4.9!การเพิ่มผูใช และ การจัดการกับสิทธิของผูใ ช


คุณสามารถเพิม่ user ไดโดยใช 2 วิธี คือ
(1)! ใช GRANT statement
(2)! เปลีย่ นแปลง MySQL grant tables โดยตรง
ซึง่ วิธีที่สมควรใชมากกวา คือ วิธีที่ (1) เพราะเปนวิธที ร่ี ดั กุม และ เกิดขอผิดพลาดไดนอ ยกวา
ตัวอยางการ add new user โดยใชวิธีที่ (1) ซึง่ ผูท ส่ี ามารถ add new user ได จะตอง connect เปน
root กอน, root user จะตอง insert สิทธิ สําหรับ mysql database และ reload administrative privilege
คุณสามารถเพิ่มผูใชไดโดยการใชคําสัง่ GRANT ดังนี้ :
shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO ooh@localhost
IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO ooh@"%"
IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;
คําสัง่ GRANT เหลานีเ้ ปนการสราง new users ขึน้ มาใหม 3 users

ooh
เปน full superuser ซึง่ สามารถ connect มายัง server จากทีไ่ หนก็ได แตตองใช password
‘something’ ในการติดตอกับ server
admin
เปน user ทีส่ ามารถ connect จาก local host โดยไมใช password และสามารถใชสทิ ธิในการ
reload และ process MySQL ได นัน้ คือ admin สามารถ run คําสัง่ mysqladmin reload, mysqladmin
refresh และ mysql flush-* ได แตไมสามารถใช Database ไหนได ซึ่งมันสามารถถูก grant ไดภายหลังโดย
ใช GRANT statement
dummy
user สามารถ connect โดยไมใช password แตตองจาก local host เทานัน้ สิทธิทั่วไปถูก set ให
เปน ‘N’

คุณสามารถ add ขอมูลของ user เหลานีไ้ ดโดยตรง โดยใช INSERT statements และ บอกให server reload
grant tables
shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','ooh',PASSWORD('something'),
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user VALUES('%','ooh',PASSWORD('something'),
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user SET Host='localhost',User='admin',
Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;

ตัวอยางตอไปนี้ เปนการเพิม่ user ชือ่ “custom” ซึง่ สามารถ connect เขา server จาก host
localhost, server.domain และ cpe.cmu. user นี้ ตองการเขาถึง (access) เพียง database stuinfo จาก
localhost, database lecturerinfo จาก cpe.cmu และ database transcript จากทั้ง 3 host โดยใช password
‘manager’
การ setup สิทธิตางๆ ของ user โดยการใช GRANT statements , ทําไดดงั นี้ :
shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON stuinfo.*
TO custom@localhost
IDENTIFIED BY 'manager';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON lecturerinfo.*
TO custom@cpe.cmu
IDENTIFIED BY 'manager';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON transcript.*
TO custom@'%'
IDENTIFIED BY 'manager';
หรือจะ set up สิทธิของ user จากการแกไขที่ grant table โดยตรงก็ได ดังนี้ :
shell> mysql --user=root mysql

mysql> INSERT INTO user (Host,User,Password)


VALUES('localhost','custom',PASSWORD('manager'));
mysql> INSERT INTO user (Host,User,Password)
VALUES('server.domain','custom',PASSWORD('manager'));
mysql> INSERT INTO user (Host,User,Password)
VALUES('cpe.cmu','custom',PASSWORD('manager'));
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES
('localhost','stuinfo','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES
('whitehouse.gov','lecturerinfo','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES('%','transcript','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;

คําสัง่ INSERT 3 คําสัง่ แรก เปนการ add ขอมูลลงใน user table เพื่ออนุญาติให user custom สามารถ
connect มายัง server โดยมาจาก host ทีแ่ ตกตางกันได ดวย password ‘stupid’ แตยงั ไมใหสิทธิตางๆ แก
custom

คําสัง่ INSERT อีก 2 คําสั่งตอมา เปนการ add ขอมูลลงใน db table เพื่อใหสิทธิตางๆ แก custom สําหรับ
database ชื่อ bankaccount, expenses and customer โดยการ access เขามาใช database กระทําไดจาก
host ทีเ่ จาะจงไวเทานัน้ ซึ่งวิธีนี้จะตองทําการ reload grant table ใหกบั server ใหม โดยการใชคําสัง่
FLUSH PRIVILEGES ในบรรทัดสุดทาย เพื่อใหสิทธิตางๆ สามารถใชไดเลย

ถาคุณตองการเจาะจง user ในการ access จากเครือ่ งใดๆ ก็ไดใน domain เดียวกัน คุณสามารถใชคําสัง่
GRANT ดังนี้ :
mysql> GRANT ...
ON *.*
TO myusername@"%.mydomainname.com"
IDENTIFIED BY 'mypassword';
g r ant tables :
mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;

4.10! วิธีการกําหนด passwords


จากตัวอยางในหัวขอที่ผานมาจะเห็นไดวาเมื่อคุณ INSERT หรือ UPDATE password คุณตองใช
function PASSWORD() เพือ่ เขารหัส password เนือ่ งจากการกระทําเชนนี้ ทําให password ถูกเก็บลง
table ในแบบทีถ่ ูกเขารหัส เพือ่ ความปลอดภัยของขอมูล
หากคุณลืมใช function PASSWORD() , password ก็จะถูกเก็บในรูปแบบของตัวหนังสือ
(plaintext)
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
VALUES('%','jeffrey','biscuit');
mysql> FLUSH PRIVILEGES;

จากคําสัง่ นี้ ผลลัพธทไ่ี ดคอื คําวา ‘biscuit’ จะถูกเก็บเปน password ใน user table เมื่อ user jeffrey
พยายาม connect มายัง server โดยใช password นี้, mysql client จะ encrypt password ทีส่ ง เขามาโดยใช
function PASSWORD() และสงผลลัพธกลับไปให server และ server ก็จะทําการเปรียบเทียบคาใน user
table ซึง่ เปนคา ‘biscuit’ กับ password ทีถ่ กู สงมาแบบเขารหัสซึ่งไมใชคา ‘biscuit’ ผลลัพธของการเปรียบ
เทียบก็ผิด ดังนัน้ server จึงไมยอมให user login เขามาได

shell> mysql -u jeffrey -pbiscuit test


Access denied

วิธีการใช INSERT statement ทีถ่ กู ตอง ควรเขียนดังนี้ :


mysql> INSERT INTO user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));

หรือคุณจะใช PASSWORD() สําหรับ SET PASSWORD statements ก็ได ดังนี้ :


mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');

ถาคุณ set password โดยใช GRANT ... IDENTIFIED BY statement หรือ ใช คําสัง่ mysqladmin
password ก็ไมจําเปนตองใช function PASSWORD() เนือ่ งจากมันจะทําการเขารหัสใหโดยอัตโนมัติ ดังนี้ :
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';

หรือ ใช mysqladmin


shell> mysqladmin -u jeffrey password biscuit
5.! บทที่ 5 Language Reference

5.1.! วิธีการเขียนสตริง และ ตัวเลข

5.1.1.! สตริง
สตริง คือ ตัวอักขระที่นามาเขี
ํ ยนเรียงกัน ซึ่งจะถูกลอมดวยเครื่องหมาย single quote (‘’)
หรือ double quote (“”) ก็ได เชน
'a string'
"another string"

สําหรับสัญลักษณพิเศษบางอยางที่ใชใน string ทีเ่ รียกวา escape character นัน้ ตองใช


เครือ่ งหมาย backslash (‘\’) ซึง่ escape character ใน MySQL นัน้ มีดังตอไปนี้

Escape character Meaning


\0 NULL character
\n newline character
\t Tab character
\r Carriage return character
\b Backspace character
\’ Single quote character
\” Double quote character
\\ Backslash character
\% Wildcard character
\_ Wildcard character

วิธกี ารที่จะเขียน string ที่มี quotes รวมอยูด ว ย มีหลายวิธี ดังนี้


•! เครื่องหมาย ‘ ใน string ทีอ่ ยูในเครื่องหมาย ‘’ สามารถเขียนดวย ’’
•! เครื่องหมาย “ ใน string ทีอ่ ยูในเครื่องหมาย “” สามารถเขียนดวย "".
•! คุณสามารถใชเครื่องหมาย ‘\’ อยูขางหนา quote character ก็ได
•! เครื่องหมาย ‘ ใน string ทีอ่ ยูในเครื่องหมาย !" สามารถเขียนไดเลย
•! เครื่องหมาย “ ใน string ทีอ่ ยูในเครื่องหมาย ‘’ ก็สามารถเขียนไดเลย
mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";


+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "This\nIs\nFour\nlines";


+--------------------+
| This
Is
Four
lines |
+--------------------+

5.1.2.! ตัวเลข
interger number คือ กลุมของตัวเลขที่เรียงตอกัน สวน float number นัน้ จะมีการใช
เครื่องหมาย . เพือ่ ทําการแยกสวนทศนิยมออก โดยทั้ง interger และ float numbers นั้นสามารถมี
คาเปนลบได กําหนดโดยใชเครื่องหมาย – นําหนา ดังตัวอยางตอไปนี้
1221
0
-32
294.42
-32032.6809e+10
148.00
จะเห็นไดวา เลขจํานวนเต็มนัน้ สามารถอางอยูใ นรูปของ float number ไดเชนกัน

5.1.3.! เลขฐานสิบหก
MySQL นัน้ สามารถอางถึงตัวเลขฐานสิบหกได เมื่อ MySQL ทําการประมวลผลแลวจะ
สามารถแปลงเลขฐานสิบหกเปนเลขฐานสิบ หรือแปลงเปนอักขระก็ได โดยเลขฐานสิบหกสองตัวติด
กันจะถูกแปลงเปนอักขระหนึง่ ตัว ดังตัวอยางตอไปนี้
mysql> SELECT 0xa+0
-> 10
mysql> select 0x5061756c;
-> Paul

5.1.4.! NULL value


NULL values หมายถึง ไมมีคา ซึ่งแตกตางจากคาศูนยในระบบตัวเลข หรือ empty string
ในขอมูลประเภท string โดย NULL สามารถอางไดโดยใสเครือ่ งหมาย backslash นําหนา ดังนี้ \N
5.1.5.! Database, table, index, column, alias names
ในการตัง้ ชือ่ database, table, index, column และ alias นัน้ มีกฎในการตั้งชื่อ ดังตารางตอไปนี้

Identifier max length Allowed characters


Database 64 ใชอกั ขระใดก็ไดทอ่ี นุญาตใหใชในการตัง้ directory name ยกเวนเครื่องหมาย /
Table 64 ใชอกั ขระใดก็ไดทอ่ี นุญาตใหใชในการตัง้ file name ยกเวนเครื่องหมาย / หรือ .
Column 64 ใชอกั ขระใดก็ได
Alias 255 ใชอกั ขระใดก็ได
หมายเหตุ หากวาชือ่ ของ database หรือ table หรือ column หรือ alias นัน้ ไปตรงกับชื่อคําสัง่ เฉพาะของ
MySQL แลว จะสามารถอางถึงไดโดยตองใสเครื่องหมาย ' ' ครอบชื่อนั้นๆไวเสมอ ดังตัวอยางตอไปนี้

SELECT * from `select` where `select`.id > 100;

สําหรับการอางถึง columns นัน้ สามารถทําไดตามกฎเกณฑดังในตารางตอไปนี้

Column reference Meaning


col_name เปนการอางถึง Column col_name ใน table ทีก่ าลั ํ งถูกใชอยู
tbl_name.col_name อางถึง Column col_name จาก table tbl_name ของ database ที่กาลั ํ งเรียกใชอยู
db_name.tbl_name. อางถึง Column col_name จาก table tbl_name ของ database db_name. สามารถ
col_name อางแบบนี้ไดเฉพาะ MySQL 3.22 หรือรุนที่ใหมกวา
`column_name` เปนการอางถึง column ทีม่ ชี อ่ื เหมือนกับคําสัง่ เฉพาะของ MySQL

เราไมจําเปนที่จะตองอางถึง tbl_name หรือ db_name.tbl_name นอกเสียจากวาเกิดกรณี


ทีท่ าให
ํ เกิดความสับสนขึ้นมาได ยกตัวอยางเชน table t1 และ t2 นั้นมี column ชือ่ c เหมือนกัน ดัง
นั้นในการอางถึงในการทํา query นั้นเราทําการเลือกใชทง้ั สอง table แลวจะทําใหเกิดความสับสน
หากทําการอางถึง column c เนื่องจากไมไดมี column c เพียงอันเดียว ดังนัน้ เวลาอางถึง column c
นั้นจําเปนตองอางวาเปน t1.c หรือ t2.c ในทํานองเดียวกัน ถาหากมี table t ใน database db1 และ
db2 เราตองทําการอางถึง columns ในทัง้ สอง table นั้นก็จําเปนตองทําการอางชือ่ database ดวย
ดังเชน db1.t.col_name หรือ db2.t.col_name

5.1.6.! Case sensitivity in names


ใน MySQL นัน้ databases และ tables จะมีลกั ษณะเชนเดียวกับ directory และ file ใน
directory นัน้ ดังนั้นในการตั้งชื่อ databases และ tables นัน้ สําหรับระบบปฏิบัติการ unix นัน้
อักขระตัวพิมพใหญและตัวพิมพเล็กจะมีความแตกตางกัน ถือเปนคนละตัวกัน แตในระบบปฏิบัติ
การ Win32 นัน้ อักขระตัวพิมพใหญหรือเล็กนัน้ เหมือนกัน
หมายเหตุ ถึงแมวาชื่อของ database และ table นัน้ จะไมเกิดปญหาในการอางชือ่ ดวยตัว
พิมพเล็กหรือตัวพิมพใหญก็ตาม เราไมควรที่จะอางถึง database และ table โดยใชทั้งตัวพิมพเล็ก
และตัวพิมพใหญพรอมๆกันในการทํา query ครัง้ หนึง่ ๆ จากตัวอยางตอไปนี้เราไมสามารถอางถึง
table ดวยชื่อ my_table และ MY_TABLE ในการทํา query อันเดียวกันได
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

สวน Column names นั้นจะสามารถอางถึงไดโดยตองระบุถึงชื่อของ column ใหถกู ตอง


โดยอักขระตัวพิมพเล็กและตัวพิมพใหญนั้นมีความแตกตางกัน ไมวาจะเปนระบบ unix หรือ Win32
การทํา alias บน table ก็ตอ งอางถึงดวยตัวพิมพเล็กหรือตัวพิมพใหญอยางใดอยางหนึ่ง
เทานัน้ ในการทํา query ครัง้ หนึง่ ดังตัวอยางตอไปนี้ จะเห็นไดวาไมสามารถอางถึง table เดียวกัน
ดวยชื่อ A และ a ได

mysql> SELECT col_name FROM tbl_name AS a


WHERE a.col_name = 1 OR A.col_name = 2;

แตการทํา alias บน column นัน้ จะไมเกิดปญหาถึงแมวาเราจะอางดวยทั้งตัวพิมพเล็กหรือ


ตัวพิมพใหญ

5.2.! ชนิดของขอมูลคอลัมน
Column ทีส่ ามารถมีไดใน MySQL แตละชนิดตองการเนือ้ ทีใ่ นการเก็บขอมูลตางกัน ดังนี้

5.2.1.! ขอมูลชนิดตัวเลข
Column type Storage required
TINYINT 1 byte
SMALLINT 2 bytes
MEDIUMINT 3 bytes
INT 4 bytes
INTEGER 4 bytes
BIGINT 8 bytes
FLOAT(X) 4 if X <= 24 or 8 if 25 <= X <= 53
FLOAT 4 bytes
DOUBLE 8 bytes
DOUBLE PRECISION 8 bytes
REAL 8 bytes
DECIMAL(M,D) M bytes (D+2, if M < D)
NUMERIC(M,D) M bytes (D+2, if M < D)
5.2.2.! ขอมูลชนิดวันที่ และ เวลา
Column type Storage required
DATE 3 bytes
DATETIME 8 bytes
TIMESTAMP 4 bytes
TIME 3 bytes
YEAR 1 byte

หากไมมีขอมูลใน column ชนิด date และ time (Zero value) คาที่เก็บลงใน column แสดงดังตารางตอไปนี้
Column type ``Zero'' value
DATETIME '0000-00-00 00:00:00'
DATE '0000-00-00'
TIMESTAMP 00000000000000 (length depends on display size)
TIME '00:00:00'
YEAR 0000

5.2.3.! ขอมูลชนิดสตริง
Column type Storage required
CHAR(M) M bytes, 1 <= M <= 255
VARCHAR(M) L+1 bytes, where L <= M and 1 <= M <= 255
TINYBLOB, TINYTEXT L+1 bytes, where L < 2^8
BLOB, TEXT L+2 bytes, where L < 2^16
MEDIUMBLOB,
L+3 bytes, where L < 2^24
MEDIUMTEXT
LONGBLOB,
L+4 bytes, where L < 2^32
LONGTEXT
ENUM('value1','value2',... 1 or 2 bytes, depending on the number of enumeration values (65535
) values maximum)
1, 2, 3, 4 or 8 bytes, depending on the number of set members (64
SET('value1','value2',...)
members maximum)
5.3.! Functions for use in SELECT and WHERE clauses
select_expression หรือ where_definition ในประโยค SQL สามารถจะใสนิพจนใดที่ใชฟงกชันดัง
ทีจ่ ะอธิบายตอไปได นิพจนทม่ี ี NULL จะไดคา ทีเ่ ปน NULL เสมอ เวนแตวาในนิพจนนั้นจะมีฟงกชันและ
ตัวกระทําตัวอืน่ อยูใ นนัน้ (หมายเหตุ หามมีชองวางหรือวงเล็บในชื่อฟงกชัน)

ตัวอยาง

mysql> select MOD(29,9);


-> 2

5.3.1 ฟงกชนั การรวมกลุม


( ... ) วงเล็บ ใชในการจัดลําดับของการประมวลผลในนิพจน ตัวอยางเชน
mysql> select 1+2*3;
-> 7
mysql> select (1+2)*3;
-> 9

5.3.2 ตัวกระทําทางคณิตศาสตรทว่ั ไป
ประกอบดวยตัวกระทําทางคณิตศาสตรที่ใชกันบอยๆ เชน +, -, * , /
ตัวอยาง
+ : การบวก
mysql> select 3+5;
-> 8
- : การลบ
mysql> select 3-5;
-> -2
* : การคูณ
mysql> select 3*5;
-> 15
mysql> select 18014398509481984*18014398509481984.0;
-> 324518553658426726783156020576256.0
mysql> select 18014398509481984*18014398509481984;
-> 0
ผลลัพธของนิพจนสดุ ทายไมถกู ตองเพราะวาผลลัพธของการคูณเลขจํานวนเต็มเกินคาในชวงการ
คํานวณของ BIGINT 64 บิท
/ : การหาร
mysql> select 3/5;
-> 0.60
การหารดวยคาศูนย ผลลัพธจะไดเปนคา NULL
mysql> select 102/(1-1);
-> NULL

5.3.3 Bit functions


MySQL ใช BIGINT 64 บิทในการกระทําแบบบิทดังนั้นตัวกระทําจึงมีขนาดใหญสดุ ได
64 บิท
ตัวกระทําทางบิท ไดแก

|###$##Bitwise OR
mysql> select 29 | 15;
-> 31

& : Bitwise AND


mysql> select 29 & 15;
-> 13

<< : การเลือ่ นตัวเลขจํานวนเต็มไปทางซาย


mysql> select 1 << 2
-> 4

>> : การเลือ่ นตัวเลขจํานวนเต็มไปทางซาย


mysql> select 4 >> 2
-> 1

~ : เปลี่ยนคาบิททั้งหมดใหเปนคาตรงกันขาม
mysql> select 5 & ~1
-> 4
BIT_COUNT(N)

สงกลับจํานวนบิทที่ใชในการนับเลขจํานวน N
mysql> select BIT_COUNT(29);
-> 4

5.3.4 Logical operations


ฟงกชันตรรกทั้งหมดจะสงคากลับเปน 1 (จริง) หรือ 0 (เท็จ) เทานัน้
ฟงกชันทางตรรก ไดแก
NOT : !

NOT จะสงคา 1 กลับถาอารกวิ เมนตเปน 0 และสง 0 กลับถาอารกวิ เมนตเปนหนึง่ ถาเปน NOT


NULL จะสงกลับคา NULL เชน
mysql> select NOT 1;
-> 0
mysql> select NOT NULL;
-> NULL
mysql> select ! (1+1);
-> 0
mysql> select ! 1+1;
-> 1

OR : ||

OR จะสงคา 0 ถามีอารกิวเมนตที่เปน 1 หรือ NULL มิฉะนั้นจะสงคา 1 ตัวอยางเชน


mysql> select 1 || 0;
-> 1
mysql> select 0 || 0;
-> 0
mysql> select 1 || NULL;
-> 1

AND : &&

AND จะสงคา 0 ถามีอารกิวเมนตที่เปน 0 หรือ NULL มิฉะนั้นจะสงคา 1 ตัวอยางเชน


mysql> select 1 && NULL;
-> 0
mysql> select 1 && 0;
-> 0

5.3.5 Comparison operators


ผลการเปรียบเทียบไดคา เปน 1 หรือ 0 หรือ NULL เทานัน้ ฟงกชันเหลานี้ใชไดกับตัว
เลขและตัวอักษร ถาเปนตัวอักษรมันจะถูกแปลงใหเปนตัวเลขและจากตัวเลขเปนตัวอักษรถาจํา
เปน
MySQL จะทําการเปรียบเทียบโดยอาศัยกฎตอไปนี้
•! ถามีอารกวิ เมนตหนึ่งตัวหรือมากกวาเปน NULL ผลลัพธจะออกมาเปน NULL ยกเวนตัว
กระทํา <=>
•! ถาอารกิวเมนตทั้งสองตัวในการเปรียบเทียบเปนตัวอักษร มันก็จะถูกเปรียบเทียบเปนตัว
อักษร
•! ถาอารกวิ เมนตทง้ั สองตัวเปนตัวเลข ก็จะเปรียบเทียบเปนตัวเลข
•! คาเลขฐานสิบหกจะถูกทําเปนเลขฐานสองของตัวอักษรในกรณีที่ไมไดทาการเปรี
ํ ยบเทียบ
กับตัวเลข
•! ถาอารกิวเมนตตัวหนึ่งเปนคอลัมน TIMESTAMP หรือ DATETIME และอารกิวเมนตตัว
อืน่ เปนคาคงที่ คาคงที่จะถูกแปลงเปน timestamp กอนที่จะทําการเปรียบเทียบ
ตัวอยาง

mysql> SELECT 1 > '6x';


-> 0
mysql> SELECT 7 > '6x';
-> 1
mysql> SELECT 0 > 'x6';
-> 0
mysql> SELECT 0 = 'x6';
-> 1

ตัวกระทําเปรียบเทียบ ไดแก
= : Equal
mysql> select 1 = 0;
-> 0
mysql> select '0' = 0;
-> 1
mysql> select '0.0' = 0;
-> 1
mysql> select '0.01' = 0;
-> 0
mysql> select '.01' = 0.01;
-> 1

<> : != : Not equal


mysql> select '.01' <> '0.01';
-> 1
mysql> select .01 <> '0.01';
-> 0
mysql> select 'zapp' <> 'zappp';
-> 1

<= : Less than or equal


mysql> select 0.1 <= 2;
-> 1

< : Less than


mysql> select 2 <= 2;
-> 1

>= : Greater than or equal


mysql> select 2 >= 2;
-> 1

> : Greater than


mysql> select 2 > 2;
-> 0

<=> : Null safe equal


mysql> select 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1 1 0

IS NULL และ IS NOT NULL

ใชตรวจสอบวาคาเปน NULL หรือ NOT NULL


mysql> select 1 IS NULL, 0 IS NULL, NULL IS NULL:
-> 0 0 1
mysql> select 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
-> 1 1 0

expr BETWEEN min AND max

ถา expr มีคา มากกวาหรือเทากับคา min และ expr มีคานอยกวาหรือเทากับคา max


BETWEEN จะสงคา 1 มิฉะนั้นเปน 0
การเปรียบเทียบแบบนี้มีคาเทากับนิพจน (min <= expr AND expr <= max)
mysql> select 1 BETWEEN 2 AND 3;
-> 0
mysql> select 'b' BETWEEN 'a' AND 'c';
-> 1
mysql> select 2 BETWEEN 2 AND '3';
-> 1
mysql> select 2 BETWEEN 2 AND 'x-3';
-> 0

expr IN (value,...)

การเปรียบเทียบนีจ้ ะสงคา 1 ถา expr คือคาใดๆ ในรายการที่อยูขางหลังคําวา IN มิฉะนั้นก็จะสง


คา 0 ตัวอยาง
mysql> select 2 IN (0,3,5,'wefwf');
-> 0
mysql> select 'wefwf' IN (0,3,5,'wefwf');
-> 1
expr NOT IN (value,...)

มีคาเทากับ NOT (expr IN (value,...)).

ISNULL(expr)

ถา expr เปน NULL, ISNULL() จะสงคา 1, มิฉะนั้นจะสงคา 0.


mysql> select ISNULL(1+1);
-> 0
mysql> select ISNULL(1/0);
-> 1

COALESCE(list)

สงคาของตัวแรกในวงเล็บที่ไมใช NULL ตัวอยาง


mysql> select COALESCE(NULL,1);
-> 1
mysql> select COALESCE(NULL,NULL,NULL);
-> NULL

INTERVAL(N,N1,N2,N3,...)

สงกลับคา 0 ถา N < N1, และ 1 ถา N < N2 อารกิวเมนตทุกตัวจะถูกมองเปนตัวเลขจํานวน


เต็ม และมีขอกําหนดวา N1 < N2 < N3 < ... < Nn เพื่อใหฟงกชันนี้ทํางานไดอยางถูกตอง ตัวอยาง
mysql> select INTERVAL(23, 1, 15, 17, 30, 44, 200);
-> 3
mysql> select INTERVAL(10, 1, 10, 100, 1000);
-> 2
mysql> select INTERVAL(22, 23, 30, 44, 200);
-> 0

5.3.6 การเปรียบเทียบสตริง

โดยทัว่ ไปแลว การเปรียบเทียบสตริงจะแบงแยกตัวใหญตัวเล็ก


การเปรียบเทียบสตริงจะไดคา 0(เท็จ) หรือ 1 (จริง) โดยการใช LIKE ในการเปรียบเทียบ คุณ
สามารถใชอักขระ ตอไปนีใ้ นรูปแบบการเปรียบเทียบได
% แทนตัวอักขระตั้งแตศูนยตัวขึ้นไป
_ แทนอักขระตัวเดียว

ตัวอยาง
mysql> select 'David!' LIKE 'David_';
-> 1
mysql> select 'David!' LIKE '%D%v%';
-> 1
ถาตองการเปรียบเทียบอักขระตัวเดียวดวยการระบุอกั ขระ ใหใช “\” นําหนาอักขระที่ตองการจะ
เปรียบเทียบในรูปแบบ

\% แทนอักขระ % หนึ่งตัว
\_ แทนอักขระ _ หนึ่งตัว

ตัวอยาง
mysql> select 'David!' LIKE 'David\_';
-> 0
mysql> select 'David_' LIKE 'David\_';
-> 1
ในการกําหนกอักขระ ESCAPE ตัวอื่น ใหใชประโยค ESCAPE ในการกําหนด เชน
mysql> select 'David_' LIKE 'David|_' ESCAPE '|';
-> 1

expr NOT LIKE pat [ESCAPE 'escape-char'] มีความหมายเชนเดียวกับประโยค


NOT (expr LIKE pat [ESCAPE 'escape-char']).
expr REGEXP pat

expr RLIKE pat

ทัง้ สีป่ ระโยคขางตนนี้ ใชในการเปรียบเทียบนิพจนสตริง expr กับรูปแบบ pat RLIKE เปนคํา


เหมือนของ REGEXP ใชไดกบั mSQL ตัวอยาง

mysql> select 'Monty!' REGEXP 'm%y%%';


-> 0
mysql> select 'Monty!' REGEXP '.*';
-> 1
mysql> select 'new*\n*line' REGEXP 'new\\*.\\*line';
-> 1
mysql> select "a" REGEXP "A", "a" REGEXP BINARY "A";
-> 1 0

expr NOT REGEXP pat

expr NOT RLIKE pat

มีความหมายเหมือนกับประโยค NOT (expr REGEXP pat).


STRCMP(expr1,expr2)

STRCMP()

จะใหคา 0 ถาสตริงเหมือนกัน ใหคา -1 ถาอารกิวเมนตตัวแรกมีคานอยกวาตัวที่สอง มิฉะนั้นได


คา 1 ตัวอยาง
mysql> select STRCMP('text', 'text2');
-> -1
mysql> select STRCMP('text2', 'text');
-> 1
mysql> select STRCMP('text', 'text');
-> 0

5.3.7 Cast operators

BINARY

ตัวกระทํา BINARY ใชในการกําหนดสตริงทีต่ อ ทายใหเปนเลขฐานสองของสตริง วิธชี วยใหการ


เปรียบเทียบคอลัมนเปนแบบ case sensitive ตัวอยาง
mysql> select "a" = "A";
-> 1
mysql> select BINARY "a" = "A";
-> 0
5.38ฟงกชันควบคุมทิศทางการทํางาน

IFNULL(expr1,expr2)

ถา expr1 ไมใช NULL, IFNULL() จะใหคา expr1, มิฉะนั้นจะใหคา expr2. IFNULL() จะใหคา ตัว
เลขหรือสตริง ขึ้นอยูกับวาใชแบบไหน ตัวอยาง
mysql> select IFNULL(1,0);
-> 1
mysql> select IFNULL(0,10);
-> 0
mysql> select IFNULL(1/0,10);
-> 10
mysql> select IFNULL(1/0,'yes');
-> 'yes'

IF(expr1,expr2,expr3)

ถา expr1 เปนจริง (TRUE) โดยที่ (expr1 <> 0 and expr1 <> NULL) แลว IF() จะใหคา expr2,
มิฉะนั้นจะใหคา expr3. IF() จะใหคา ตัวเลขหรือสตริงขึน้ อยูก บั วาคาไหนถูกใช ตวอยาง

mysql> select IF(1>2,2,3);


-> 3
mysql> select IF(1<2,'yes','no');
-> 'yes'
mysql> select IF(strcmp('test','test1'),'yes','no');
-> 'no'
expr1 ถูกคํานวนโดยใชเปนเลขจํานวนเต็ม ซึง่ หมายความวาถาคุณใชเปน floating-point หรือ
สตริงคุณก็สามารถใชฟง กชนั นีด้ ว ยการเปรียบเทียบได ตัวอยาง
mysql> select IF(0.1,1,0);
-> 0
mysql> select IF(0.1<>0,1,0);
-> 1
5.3.9 ฟงกชนั ทางคณิตศาสตร
ฟงกชนั ทางคณิตศาสตรทั้งหมดจะใหคาเปน NULL หากเกิดขอผิดพลาดขึน้
- : เครื่องหมายลบ เปลีย่ นคาเลขลบใหเปนบวก และเปลีย่ นคาบวกใหเปนลบ ตัวอยาง
mysql> select - 2;
-> -2

ABS(X)

ใหคา สัมบูรณของ X ตัวอยางเชน


mysql> select ABS(2);
-> 2
mysql> select ABS(-32);
-> 32

SIGN(X)

ใหคา บวกหรือลบของอารกวิ เมนต ขึน้ อยูก บั วาคานัน้ เปนลบหรือบวก ตัวอยาง


mysql> select SIGN(-32);
-> -1
mysql> select SIGN(0);
-> 0
mysql> select SIGN(234);
-> 1

MOD(N,M) : %

ใหคา เศษจากการหาร N ดวย M ตัวอยาง เชน


mysql> select MOD(234, 10);
-> 4
mysql> select 253 % 7;
-> 1
mysql> select MOD(29,9);
-> 2
FLOOR(X)

ใหคา เลขจํานวนเต็มที่ใหญที่สุดที่ไมมากเกิน X ตัวอยางเชน


mysql> select FLOOR(1.23);
-> 1
mysql> select FLOOR(-1.23);
-> -2

CEILING(X)

ใหคา เลขจํานวนเต็มที่เล็กที่สุดที่ไมนอยกวา X ตัวอยางเชน


mysql> select CEILING(1.23);
-> 2
mysql> select CEILING(-1.23);
-> -1

ROUND(X)

ใหคา เลขจํานวนเต็มทีเ่ อา X มาปดเศษแแลว ตัวอยางเชน


mysql> select ROUND(-1.23);
-> -1
mysql> select ROUND(-1.58);
-> -2
mysql> select ROUND(1.58);
-> 2

ROUND(X,D)

ใหคาเลข X ทีม่ ีจํานวนทศนิยมเทากับ D ตําแหนง ตัวอยางเชน


mysql> select ROUND(1.298, 1);
-> 1.3
mysql> select ROUND(1.298, 0);
-> 1
EXP(X)

ใหคา เอกซโพเนนเชียลของ X เชน


mysql> select EXP(2);
-> 7.389056
mysql> select EXP(-2);
-> 0.135335

LOG(X)

ใหคา ลอการิทมึ ของ X ตัวอยางเชน


mysql> select LOG(2);
-> 0.693147
mysql> select LOG(-2);
-> NULL

LOG10(X)

ใหคา ลอการิทมึ ฐาน 10 ของ X ตัวอยางเชน


mysql> select LOG10(2);
-> 0.301030
mysql> select LOG10(100);
-> 2.000000
mysql> select LOG10(-100);
-> NULL

POW(X,Y)

POWER(X,Y)

ใหคา ของ X ยกกําลัง Y ตัวอยางเชน


mysql> select POW(2,2);
-> 4.000000
mysql> select POW(2,-2);
-> 0.250000
SQRT(X)

ใหคา สแควรทู ของ X ตัวอยางเชน


mysql> select SQRT(4);
-> 2.000000
mysql> select SQRT(20);
-> 4.472136

PI()

ใหคา ของ PI ตัวอยางเชน


mysql> select PI();
-> 3.141593

COS(X)

ใหคา โคซายของ X, เมื่อ X มีหนวยเปนเรเดียน ตัวอยาง


mysql> select COS(PI());
-> -1.000000

SIN(X)

ใหคา ซายของ X, เมื่อ X มีหนวยเปนเรเดียน ตัวอยาง


mysql> select SIN(PI());
-> 0.000000

TAN(X)

ใหคา แทนของ X, เมื่อ X มีหนวยเปนเรเดียน ตัวอยาง


mysql> select TAN(PI()+1);
-> 1.557408
ACOS(X)

ใหคา อารคโคซายอง X ตัวอยาง


mysql> select ACOS(1);
-> 0.000000
mysql> select ACOS(1.0001);
-> NULL
mysql> select ACOS(0);
-> 1.570796

ASIN(X)

ใหคาอารคซายของ X ตัวอยางเชน
mysql> select ASIN(0.2);
-> 0.201358
mysql> select ASIN('foo');
-> 0.000000

ATAN(X)

ใหคาอารคแทนเจนทของ X ตัวอยาง
mysql> select ATAN(2);
-> 1.107149
mysql> select ATAN(-2);
-> -1.107149

ATAN2(X,Y)

ใหคาอารคแทนเจนทของตัวแปร X และ Y ตัวอยางเชน


mysql> select ATAN(-2,2);
-> -0.785398
mysql> select ATAN(PI(),0);
-> 1.570796
COT(X)

ใหคา โคแทนเจนทของ X ตัวอยางเชน


mysql> select COT(12);
-> -1.57267341
mysql> select COT(0);
-> NULL

RAND()
RAND(N)
ใหคา เลข floating-point สุมในชวงของ 0 ถึง 1.0 คา N ถาใสจะเปน seed value ตัวอยางเชน
mysql> select RAND();
-> 0.5925
mysql> select RAND(20);
-> 0.1811
mysql> select RAND(20);
-> 0.1811
mysql> select RAND();
-> 0.2079
mysql> select RAND();
-> 0.7888

5.3.1.! ฟงกชนั เกีย่ วกับสตริง

ASCII(str)
Return รหัส ASCII ของตัวอักษรทีอ่ ยูซ า ยสุดของ string str
Return NULL ถา str เปน empty string
mysql> select ASCII('2');
-> 50
mysql> select ASCII(2);
-> 50
mysql> select ASCII('dx');
-> 100
BIN(N)
Return คา Binary ของ N ซึง่ N สามารถมีคาไดเทากับ BIGINT
Returns NULL ถา N เปน NULL
mysql> select BIN(12);
-> '1100'

OCT(N)
Return คา Octal ของ N ซึง่ N สามารถมีคาไดเทากับ BIGINT
Return NULL ถา N เปน NULL
mysql> select OCT(12);
-> '14'

HEX(N)
Return คา Hexadecimal ของ N ซึง่ N สามารถมีคาไดเทากับ BIGINT
Return NULL ถา N เปน NULL
mysql> select HEX(255);
-> 'FF'

CHAR(N,...)
Return string ของรหัส ASCII N
mysql> select CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> select CHAR(77,77.3,'77.3');
-> 'MMM'

LENGTH(str)
Return ความยาวของ string str

mysql> select LENGTH('text');


-> 4
LOCATE(substr,str)

POSITION(substr IN str)
Return ตําแหนงของ ตัวอักษรตัวแรกของ substring substr ใน string str.
Return 0 ถา substr ไมอยูใน str
mysql> select LOCATE('bar', 'foobarbar');
-> 4
mysql> select LOCATE('xbar', 'foobar');
-> 0

LOCATE(substr,str,pos)
Return ตําแหนงของ ตัวอักษรตัวแรกของ substring substr ใน string str โดยเริ่มคนหาตั้งแต
ตําแหนง pos
Return 0 ถา substr ไมอยูใน str
mysql> select LOCATE('bar', 'foobarbar',5);
-> 7

INSTR(str,substr)
เหมือนกับ LOCATE เพียงแตสลับที่ argument
Return ตําแหนงของ ตัวอักษรตัวแรกของ substring substr ใน string str
Return 0 ถา substr ไมอยูใน str
mysql> select INSTR('foobarbar', 'bar');
-> 4
mysql> select INSTR('xbar', 'foobar');
-> 0

LPAD(str,len,padstr)
Return string str ซึง่ จะเติมตัวอักษรทางซายของ str ดวยเครื่องหมาย padstr จน string มีความ
ยาวเทากับ len ตัวอักษร
mysql> select LPAD('hi',4,'??');
-> '??hi'
RPAD(str,len,padstr)
Return string str ซึง่ จะเติมตัวอักษรทางขวาของ str ดวยเครื่องหมาย padstr จน string มีความ
ยาวเทากับ len ตัวอักษร

mysql> select RPAD('hi',5,'?');


-> 'hi???'

LEFT(str,len)
Return ตัวอักษรทีอ่ ยูด า นซายสุดของ string str จํานวน len ตัวอักษร
mysql> select LEFT('foobarbar', 5);
-> 'fooba'

RIGHT(str,len)
Return ตัวอักษรทีอ่ ยูด า นขวาสุดของ string str จํานวน len ตัวอักษร
mysql> select RIGHT('foobarbar', 4);
-> 'rbar'

SUBSTRING(str,pos,len)

SUBSTRING(str FROM pos FOR len)

MID(str,pos,len)
Return string ทีม่ คี วามยาวเทากับ len ตัวอักษร จาก str เริ่มจากตําแหนง pos
mysql> select SUBSTRING('Quadratically',5,6);
-> 'ratica'

SUBSTRING(str,pos)

SUBSTRING(str FROM pos)


Returns substring จาก str โดยเริ่มตั้งแตตําแหนงที่ pos
mysql> select SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> select SUBSTRING('foobarbar' FROM 4);
-> 'barbar'
LTRIM(str)
Returns str ทีไ่ มมีชองวางอยูดานหนา str
mysql> select LTRIM(' barbar');
-> 'barbar'

RTRIM(str)
Returns str ทีไ่ มมีชองวางอยูดานหลัง str
mysql> select RTRIM('barbar ');
-> 'barbar'

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)


Return str ทีถ่ กู ตัดตัวอักษร remstr ทีอ่ ยูด า นหนา(LEADIN) หรือ ดานหลัง (TRAILING) หรือทั้ง 2
ดานของ str ออกไปแลว
mysql> select TRIM(' bar ');
-> 'bar'
mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx'
mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar'
mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx'

LCASE(str)

LOWER(str)
Return str ทีเ่ ปนตัวอักษรพิมพเล็กทั้งหมด
mysql> select LCASE('QUADRATICALLY');
-> 'quadratically'

UCASE(str)

UPPER(str)
Return str ทีเ่ ปนตัวอักษรพิมพเล็กทั้งหมด
mysql> select UCASE('Hej');
-> 'HEJ'
5.3.2.! ฟงกชน่ั เกีย่ วกับวันที่ และ เวลา

DAYOFMONTH(date)
Return วันที่ใน 1 เดือน (1 ถึง 31)
mysql> select DAYOFMONTH('1998-02-03');
-> 3

DAYOFYEAR(date)
Return วันที่ ใน 1 ป (1 ถึง 366)
mysql> select DAYOFYEAR('1998-02-03');
-> 34

MONTH(date)
Return เดือนที่ใน 1 ป (1 ถึง 12)
mysql> select MONTH('1998-02-03');
-> 2

DAYNAME(date)
Return ชือ่ วัน ใน 1 อาทิตย
mysql> select DAYNAME("1998-02-05");
-> 'Thursday'

MONTHNAME(date)
Return ชือ่ เดือน
mysql> select MONTHNAME("1998-02-05");
-> 'February'
YEAR(date)
Return ปสําหรับวันที่ ซึง่ อยูในชวง 1000-9999
mysql> select YEAR('98-02-03');
-> 1998

HOUR(time)
Return ชัว่ โมง จาก 0 ถึง 23
mysql> select HOUR('10:05:03');
-> 10

MINUTE(time)
Return นาที จาก 0 ถึง 59
mysql> select MINUTE('98-02-03 10:05:03');
-> 5

SECOND(time)
Return วินาที จาก 0 ถึง 59
mysql> select SECOND('10:05:03');
-> 3

DATE_FORMAT(date,format)
รูปแบบของวันที่ที่ MySQL สามารถแสดงได ซึง่ ใช string ในตารางขางลางเปนตัวกําหนดรูปแบบ

%M Month name (January..December)


%W Weekday name (Sunday..Saturday)
%D Day of the month with english suffix (1st, 2nd, 3rd, etc.)
%Y Year, numeric, 4 digits
%y Year, numeric, 2 digits
%X Year for the week where Sunday is the first day of the week, numeric, 4 digits, used with '%V'
%x Year for the week, where Monday is the first day of the week, numeric, 4 digits, used with '%v'
%a Abbreviated weekday name (Sun..Sat)
%d Day of the month, numeric (00..31)
%e Day of the month, numeric (0..31)
%m Month, numeric (01..12)
%c Month, numeric (1..12)
%b Abbreviated month name (Jan..Dec)
%j Day of year (001..366)
%H Hour (00..23)
%k Hour (0..23)
%h Hour (01..12)
%I Hour (01..12)
%l Hour (1..12)
%i Minutes, numeric (00..59)
%r Time, 12-hour (hh:mm:ss [AP]M)
%T Time, 24-hour (hh:mm:ss)
%S Seconds (00..59)
%s Seconds (00..59)
%p AM or PM
%w Day of the week (0=Sunday..6=Saturday)
%U Week (0..53), where Sunday is the first day of the week
%u Week (0..53), where Monday is the first day of the week
%V Week (1..53), where Sunday is the first day of the week. Used with '%X'
%v Week (1..53), where Monday is the first day of the week. Used with '%x'
%% A literal `%'.

ตัวอยาง
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> select DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'

TIME_FORMAT(time,format)
ใชเหมือนกับ DATE_FORMAT แตใชบอกเวลา
CURDATE()

CURRENT_DATE
Return วันที่ปจจุบัน
mysql> select CURDATE();
-> '2000-02-05'

CURTIME()

CURRENT_TIME
Return เวลาปจจุบัน
mysql> select CURTIME();
-> '23:50:26'
mysql> select CURTIME() + 0;
-> 235026

NOW()

SYSDATE()

CURRENT_TIMESTAMP
Return ทัง้ วันที่ และ เวลา ในรูปแบบ 'YYYY-MM-DD HH:MM:SS' หรือ YYYYMMDDHHMMSS
mysql> select NOW();
-> '2000-02-05 23:50:26'
mysql> select NOW() + 0;
-> 20000205235026

5.4.! CREATE DATABASE syntax


รูปแบบของคําสัง่ CREATE DATABASE มีดังนี้
CREATE DATABASE db_name
สําหรับ MySQL , database จะถูกสรางเปน directory อยูภายใต data directory ของ MySQL ซึง่ file ใน
directory ก็คอื table ใน database นัน่ เอง.
5.5.! DROP DATABASE syntax
รูปแบบคําสัง่ DROP DATABASE มีดังนี้
DROP DATABASE [IF EXISTS] db_name
Drop database เปนการลบทุกๆ ตารางใน database และ ลบ database ดวย คาที่สงกลับมาจากคําสัง่ drop
database คือ จํานวน file ทีถ่ ูกลบจาก database directory ซึง่ โดยปกติแลว จํานวน file ทีถ่ กู ลบจะเทากับ 3
เทาของจํานวนตาราง นัน่ คือ 1 ตาราง จะประกอบดวย file นามสกุล .MYD , .MYI และ .frm

5.6.! CREATE TABLE syntax


รูปแบบคําสัง่ ของการสรางตารางดวยคําสัง่ CREATE TABLE มีดังนี้

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]


[table_options] [select_statement]

รูปแบบของ create_definition ไดแก


col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
[PRIMARY KEY] [reference_definition]
หรือ PRIMARY KEY (index_col_name,...)
หรือ KEY [index_name] (index_col_name,...)
หรือ INDEX [index_name] (index_col_name,...)
หรือ UNIQUE [INDEX] [index_name] (index_col_name,...)
หรือ [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...)
[reference_definition]
หรือ CHECK (expr)

รูปแบบของ type ไดแก


TINYINT[(length)] [UNSIGNED] [ZEROFILL]
หรือ SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
หรือ MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
หรือ INT[(length)] [UNSIGNED] [ZEROFILL]
หรือ INTEGER[(length)] [UNSIGNED] [ZEROFILL]
หรือ BIGINT[(length)] [UNSIGNED] [ZEROFILL]
หรือ REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
หรือ DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
หรือ FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
หรือ DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
หรือ NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
หรือ CHAR(length) [BINARY]
หรือ VARCHAR(length) [BINARY]
หรือ DATE
หรือ TIME
หรือ TIMESTAMP
หรือ DATETIME
หรือ TINYBLOB
หรือ BLOB
หรือ MEDIUMBLOB
หรือ LONGBLOB
หรือ TINYTEXT
หรือ TEXT
หรือ MEDIUMTEXT
หรือ LONGTEXT
หรือ ENUM(value1,value2,value3,...)
หรือ SET(value1,value2,value3,...)

รูปแบบของ index_col_name:
col_name [(length)]

รูปแบบของ reference_definition:
REFERENCES tbl_name [(index_col_name,...)]
[MATCH FULL | MATCH PARTIAL]
[ON DELETE reference_option]
[ON UPDATE reference_option]

รูปแบบ reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

รูปแบบของ table_options:
TYPE = {ISAM | MYISAM | HEAP}
หรือ AUTO_INCREMENT = #
หรือ AVG_ROW_LENGTH = #
หรือ CHECKSUM = {0 | 1}
หรือ COMMENT = "string"
หรือ MAX_ROWS = #
หรือ MIN_ROWS = #
หรือ PACK_KEYS = {0 | 1}
หรือ PASSWORD = "string"
หรือ DELAY_KEY_WRITE = {0 | 1}
หรือ ROW_FORMAT= { default | dynamic | static | compressed }
รูปแบบของ select_statement:
[IGNORE | REPLACE] SELECT ... (Some legal select statement)

CREATE TABLE ใชในการสรางตารางตามชื่อที่กําหนดไวในฐานขอมูลที่กําลังเปดอยู กฏการตั้งชื่อตาราง


อนุญาติใหตงั้ ชือ่ ที่มีความยาวไดไมเกิน 64 ตัวอักษร และหามใชอักขระ “/” หรือ “.” ในชื่อตาราง อาจเกิดขอ
ความแสดงขอผิดพลาดไดถาตารางอางถึงไมไดอยูในฐานขอมูลปจจุบัน

ใน MySQL 3.22 หรือหลังจากนัน้ ชือ่ ตารางสามารถถูกกําหนดเปน db_name.tbl.name วิธนี ี้ใชไดทั้งฐาน


ขอมูลที่เปดอยูและที่ยังไมไดเปด ใน MySQL 3.23 คุณสามารถใช Keyword ชัว่ คราวตอนสรางตารางได
ตารางชั่วครางจะถูกลบโดยอัตโนมัติถาการเชื่อมตอมีปญหาและในการเชื่อมตอแตละครั้งชื่อถูกใชเฉพาะใน
การเชือ่ มตอครัง้ นัน้ ๆ หมายความวาการเชื่อมตอสองครั้งที่ตางกันจะสามารถใชชื่อตารางชั่วคราวที่เหมือน
กันไดโดยไมเกิดการซํ้าซอน คือตารางที่มีอยูจะถูกซอนไวจนกวาตารางชั่วคราวจะถูกลบ ดังนั้นตารางชั่ว
คราวจึงสามารถมีชื่อซํ้ากับตารางที่มีอยูแลวได

ใน MySQL 3.23 หรือหลังจากนัน้ คุณสามารถใช keyword IF NOT EXISTS ในการกําจัดขอผิดพลาดถา


หากวามีตารางนัน้ อยู สังเกตวาไมมีการตรวจสอบวาโครงสรางตารางเหมือนกันหรือไม แตละตาราง
tbl_name ถูกแทนดวยบางไฟลในไดเรกทอรีฐานขอมูล ตัวอยาง ตารางชนิด MyISAM จะมี

ไฟล จุดมุงหมาย
tbl_name.frm Table definition (form) file
tbl_name.MYD Data file
tbl_name.MYI Index file

สําหรับขอมูลเพิ่มเติมในเรื่องคุณสมบัติของคอลัมนชนิดตางๆ กัน อานไดในหัวขอ Column types

5.7.! ALTER TABLE syntax


รูปแบบคําสัง่ ของ ALTER TABLE เปนดังนี้

ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...]

รูปแบบของ alter_specification:
ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
หรือ ADD INDEX [index_name] (index_col_name,...)
หรือ ADD PRIMARY KEY (index_col_name,...)
หรือ ADD UNIQUE [index_name] (index_col_name,...)
หรือ ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
หรือ CHANGE [COLUMN] old_col_name create_definition
หรือ MODIFY [COLUMN] create_definition
หรือ DROP [COLUMN] col_name
หรือ DROP PRIMARY KEY
หรือ DROP INDEX index_name
หรือ RENAME [AS] new_tbl_name
หรือ table_options

ALTER TABLE ใชในการเปลีย่ นแปลงโครงสรางของตารางทีม่ อี ยู ตัวอยางเชน คุณสามารถจะเพิม่ หรือลบ


คอลัมน สรางหรือทําลายดรรชนี เปลี่ยนชนิดของคอลัมนที่มีอยูแลว หรือเปลี่ยนชื่อคอลัมนหรือแมแตชื่อ
ตารางเอง คุณสามารถเปลีย่ นคอมเมนตของตารางและชนิดของตารางไดดว ย

ถาคุณใช ALTER TABLE ในการเปลีย่ นขอกําหนดของคอลัมนแต DESCRIBE tbl_name กําหนดไววา


คอลัมนของคุณตองไมถกู เปลีย่ นแปลงใดๆ ก็เปนไปไดท่ี MySQL จะไมเปลีย่ นแปลงคอลัมนใหตามคําสัง่
ของคุณ ยกตัวอยาง ถาคุณพยายามจะเปลี่ยนตัวแปรแบบ VARCHAR ไปเปน CHAR MySQL จะยังคง
ใช VARCHAR ถาตารางมีคอลัมนที่ความยาวสามารถแปรผันได

ALTER TABLE ทํางานโดยการสรางชุดจําลองชั่วคราวของตารางตนแบบ การเปลี่ยนแปลงจะถูกทําบนชุด


จําลองนี้ จากนั้นตารางตนแบบจะถูกลยและเปลี่ยนชื่อตารางใหมใหเหมือนอันเดา ดังนัน้ การปรับปรุงใดๆ
จะถูกประยุกตโดยตรงกับตารางใหมนี้โดยไรขอผิดพลาดใดๆ ทัง้ สิน้ ขณะที่ ALTER TABLE กําลังทํางาน
ตารางตนแบบจะถูกอานโดยไคลเอนทอน่ื ๆ การปรับปรุงและการเขียนลงตารางจะถูกหยุดไวจนกวาตาราง
ใหมจะพรอมใช

•! ในการใช ALTER TABLE คุณจําเปนใช select, insert, delete, update, create และ drop กับตาราง
•! IGNORE เปนสวนขยายของ MySQL บน ANSI SQL92 ถูกใชในการควบคุมวา ALTER TABLE จะ
ทํางานไดอยางไร ถามีการซํ้าซอนของคียหลักในตารางใหม ถาไมมีการระบุ IGNORE ตารางจําลอง
จะถูกยกเลิกและการเปลีย่ นแปลงใดก็จะสูญหาย แตถามีการระบุ IGNORE แถวที่มีการซํ้าซอนบนคีย
หลักจะถูกเลือกเฉพาะแถวแรก สวนแถวอื่นถูกลบ
•! คุณสามารถใชประโยค ADD, ALTER, DROP และ CHANGE ไดหลายประโยคในประโยค ALTER
TABLE ประโยคเดียว
•! MODIFY เปนสวนขยายของ ORACKE ทีใ่ ชกับ ALTER TABLE
•! คุณสามารถเปลี่ยนชื่อคอลัมนโดยใชประโยค CHANGE old_col_name create_definition ในการทํา
เชนนีต้ องกําหนดชื่อคอลัมนเกาและใหมและชนิดของคอลัมนปจจุบันไวดวย ดัวอยาง
เมือ่ ตองการเปลีย่ นชือ่ คอลัมนจาก a เปน b
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
เมือ่ ตองการเปลีย่ นชนิดคอลัมนแตคงชือ่ เดิม
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
ใน MySQL 3.22.16a คุณสามรถใช MODIFY ในการเปลีย่ นชนิดคอลัมนโดยไมตอ งเปลีย่ นชือ่
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
•! ใน MySQL 3.22 หรือหลังจากนั้น คุณสามารถใช FIRST หรือ ADD … AFTER col_name ในการเพิม่
คอลัมน ณ ตําแหนงที่ตองการภายในตาราง

5.8.! DROP TABLE syntax


รูปแบบของคําสัง่ DROP TABLE เปนดังนี้

DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]


DROP TABLE ใชในการลบตารางไดมากกวาหนึง่ ขอมูลทั้งหมดในตารางและขอกําหนดตางๆในตารางจะ
ถูกลบ ดังนั้นจึงควรระวังเมื่อใชคําสัง่ นี้

ใน MySQL 3.22 หรือหลังจากนัน้ คุณสามารถใช keyword IF EXISTS เพือ่ เปนการปองกันขอผิดพลาด


อันจะเกิดจากกรณีทไ่ี มมตี ารางนัน้ อยูจ ริง

5.9.! DELETE syntax


รูปแบบคําสัง่ DELETE มีดังนี้

DELETE [LOW_PRIORITY] FROM tbl_name [WHERE where_definition] [LIMIT rows]

DELETE จะทําการลบแถวจาก tbl_name ทีก่ าหนดไว


ํ ในเงือ่ นไขใน where_condition และสงกลับจํานวน
เรคคอรดทีถ่ กู ลบ ถาคุณใชคําสัง่ DELETE โดยไมมีประโยค WHERE แถวทัง้ หมดจะถูกลบ
DELETE deletes rows from tbl_name that satisfy the condition given by where_definition, and
returns the number of records deleted.

5.10.! SELECT syntax


รูปแบบของคําสัง่ SELECT มีดังนี้

SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]


[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
[PROCEDURE procedure_name] ]

SELECT ใชในการคนหาแถวขอมูลจากตารางทีต่ อ งการ select_expression ใชในการกําหนดคอลัมนท่ี


ตองการจะคนหา SELECT อาจจะใชในการคนหาแถวโดยไมตอ งอางถึงตารางใดเลยก็ได ตวอยาง

mysql> SELECT 1 + 1;
-> 2

keyword ทัง้ หมดทีใ่ ชตอ งเรียงตามลําดับตามรูปแบบที่ใหดานบน ตัวอยางเชน ประโยค HAVING ตองตาม


หลังประโยค GROUP BY และตองมากอนประโยค ORDER BY
•! นิพจน SELECT สามารถใชคํายอ AS ได โดยใชกับชื่อคอลัมนและใชกับประโยค ORDER BY หรือ
HAVING ได ตัวอยางเชน

mysql> select concat(last_name,', ',first_name) AS full_name from mytable ORDER BY


full_name;

mysql> select t1.name, t2.salary from employee AS t1, info AS t2


where t1.name = t2.name;

mysql> select t1.name, t2.salary from employee t1, info t2


where t1.name = t2.name;

•! ประโยค FROM table_reference ใชกาหนดวํ าตองการใชตารางใดในการคนขอมูล ถาเรียกมากกวา


หนึ่งตาราง เรียกวาเปนการทํา Join รายละเอียดดูวธิ กี ารใช Join
•! การเลือกคอลัมนทต่ี อ งการใหแสดงออกมาอาจทําไดโดยการใชประโยค ORDER BY โดยใชชื่อคอลัมน
ชือ่ ยอของคอลัมนหรือตําแหนงคอลัมน ตําแหนงคอลัมนเริ่มจาก 1 ตัวอยางเชน

mysql> select college, region, seed from tournament


ORDER BY region, seed;

mysql> select college, region AS r, seed AS s from tournament


ORDER BY r, s;

mysql> select college, region, seed from tournament


ORDER BY 2, 3;
ในการเรียงลําดับในทางตรงขาง ใหเพิ่ม keyword DESC (descending) ขางหลังชื่อคอลัมนใน
ประโยค ORDER BY ถาไมกําหนดการเรียงจะเปนแบบ ASC (ascending) คือเรียงจากนอยไป
มาก
•! ประโยค HAVING สามารถในการอางถึงคอลัมนหรือชือ่ ยอใน select_expression ตัวอยางเชน

mysql> select col_name from tbl_name HAVING col_name > 0;


Write this instead:

mysql> select col_name from tbl_name WHERE col_name > 0;


In MySQL 3.22.5 or later, you can also write queries like this:

mysql> select user,max(salary) from users


group by user HAVING max(salary)>10;
•! ประโยค SEKECT … INTO OUTFILE ‘file_name’ เปนการเลือกแถวขอมูลเพือ่ เก็บลงไฟล ไฟลนี้จะ
ถูกสรางทีเ่ ครือ่ งเซิรฟ เวอร และตองเปนไฟลที่ไมเคยมีมากอน

5.11.! JOIN syntax


รูปแบบของ Join ทีใ่ ชในประโยค SELECT มีดังนี้

table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference INNER JOIN table_reference
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional_expr
table_reference LEFT [OUTER] JOIN table_reference USING (column_list)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr }

รูปแบบของ LEFT OUTER JOIN ดังแสดงขางตนเปนแบบที่ใชกับ ODBC ไดเทานัน้

•! ตารางที่อางถึงอาจจะเปนชื่อยอ โดยใช tbl_name AS alias_name หรือ tbl_name alias_name. ก็ได


ตัวอยางเชน

mysql> select t1.name, t2.salary from employee AS t1, info AS t2


where t1.name = t2.name;
•! INNER JOIN และ , (จุลภาค) มีความหมายเดียวกัน คือ เปนการทํา JOIN แบบเต็มระหวางตารางที่ใช
ปกติแลว จะตองกําหนดวาตารางจะถูกเชื่อมอยางไรเงื่อนไขในประโยค WHERE
•! ถาไมมีตารางตามที่ระบุใน LEFT JOIN แถวขอมูลที่คอลัมนทั้งหมดเปน NULL จะถูกใชเปนตารางที่
ตองการ ซึ่งคุณสามารถใชในการหาเรคคอรดในตารางที่ไมมีอยูในตารางอื่นได ตัวอยางเชน

mysql> select table1.* from table1


LEFT JOIN table2 ON table1.id=table2.id
where table2.id is NULL;
ตัวอยางนี้ คนหาแถวขอมูลทั้งหมดในตาราง table1 ทีม่ ีคา id ไมมีในตาราง table2 โดยสมมติ
ฐานทีว่ า table2 ไมมีขอมูล id ทีเ่ ปน NULL
•! ประโยค USING (column-list) ใชในการใหชอ่ื คอลัมนทต่ี อ งมีอยูใ นทัง้ สองตาราง เชน

A LEFT JOIN B USING (C1,C2,C3,...)

ประโยคขางตนมีความหมายเดียวกับประโยคขางลางนี้

A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...

•! NATURAL LEFT JOIN เปนการ join สองตารางเหมือนกับ LEFT JOIN ทีใ่ ช USING
•! STRAIGHT_JOIN เหมือนกับการใช JOIN ยกเวนแตวา ตารางทางดานซายจะถูกอานกอนเสมอ

ตัวอยาง
mysql> select * from table1,table2 where table1.id=table2.id;
mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id;
mysql> select * from table1 LEFT JOIN table2 USING (id);
mysql> select * from table1 LEFT JOIN table2 ON table1.id=table2.id
LEFT JOIN table3 ON table2.id=table3.id;

5.12.! INSERT syntax


รูปแบบการใชคําสัง่ INSERT มีดังนี้

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]


[INTO] tbl_name [(col_name,...)]
VALUES (expression,...),(...),...
or INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
or INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name
SET col_name=expression, col_name=expression, ...

INSERT ใชในการเพิม่ แถวขอมูลลงไปในตารางทีม่ อี ยูแ ลว รูปแบบ INSERT… VALUES ใชในการเพิม่


แถวขอมูลโดยการอิงกับคาที่ระบุในประโยค สวนรูปแบบ INSERT … SELECT ใชในการเพิม่ แถวขอมูล
ดวยขอมูลที่มาจากตารางอื่น (เลือกไดมากกวาหนึง่ )

ในนิพจนอาจจะอางถึงคอลัมนใดๆทีถ่ กู กําหนดไวแลวในเรคคอรดขอมูล ตัวอยางเชน

mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);

ถาคุณกําหนด keyword LOW_PRIORITY การทําตามคําสัง่ INSERT จะถูกทําภายหลังจนกวาจะไมมีลูก


ขายใดกําลังอานขอมูลจากตาราง ในกรณีนี้ลูกขายจะตองรอจนกวาประโยค INSERT จะถูกทําจนเสร็จ ซึง่
อาจจะใชเวลานานถาหากตารางกําลังถูกใชงานอยางหนัก ซึ่งจะตรงขามกับประโยค INSERT DELAYED
ทีย่ อมใหลูกขายทํางานตอจนกระทัง่ เสร็จ

ถา keyword IGNORE ถูกกําหนดใหประโยค INSERT พรอมกับแถวขอมูลหลายแถว แถวที่คาซํ้ากับคีย


หลักจะถูกเพิกเฉยและไมถกู เพิม่ เขาไปในตาราง แตถาไมกําหนด keyword IGNORE การ INSERT จะถูก
ยกเลิกทันทีที่พบวามีคาซํ้ากันของคียหลัก

5.13.! REPLACE syntax


รูปแบบการใช REPLACE มีดังนี้

REPLACE [LOW_PRIORITY | DELAYED]


[INTO] tbl_name [(col_name,...)]
VALUES (expression,...)
or REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
SELECT ...
or REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
SET col_name=expression, col_name=expression,...

REPLACE ใชเหมือนกับ INSERT ตางกันเพียงแคถาทีเรคคอรดใดในตารางมีคาคียหลักเหมือนกับเรคคอรด


ใหมทต่ี อ งการจะเพิม่ เรคคอรดเกาจะถูกลบทิ้งกอนที่จะใสเรคคอรดใหมเขาไป
5.14.! LOAD DATA INFILE syntax
รูปแบบการใช LOAD DATA INFILE มีดังนี้

LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]


INTO TABLE tbl_name
[FIELDS
[TERMINATED BY '\t']
[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]]
[LINES TERMINATED BY '\n']
[IGNORE number LINES]
[(col_name,...)]

LOCAL หมายถึง file ทีถ่ กู อานถูกเก็บไวที่ client ซึง่ จะทําใหเครื่องทํางานชาลง เนือ่ งจาก server จะตองไป
อาน file จากเครือ่ ง client ถาไมมีคําวา LOCAL , file จะตองถูกเก็บไวท่ี server และ การอาน
text files ทีอ่ ยูบน server file จะตองอยูใ น database directory หรือเปน file ที่ user ทุกคนสามารถเปด
อานได นัน่ คือถาคุณตองการอาน file จาก server คุณจะตองกําหนด file privilege บน server host.

ถา LOW_PRIORITY ถูกกําหนด หมายถึงการทําคําสัง่ LOAD DATA จะถูกเลื่อนออกไปจนกระทั่งไมมี


clients เครือ่ งใดอานขอมูลจากตาราง

การหาตําแหนงของ file บน server นัน้ server จะตองทราบ pathname ของ file เพื่อหาตําแหนงของ
file โดยใชกฎดังนี้ :
•! ถา pathname เปนแบบ absolute path, server จะใช pathname ในการคนหา file
•! ถา pathname เปนแบบ relative pathname, server จะคนหา file นัน้ โดยอางอิง จาก directory
ของ data ใน server
•! ถา file name ไมไดกําหนด path มาดวย, server จะคนหา file จาก database directory ของ
database ทีใ่ ชปจจุบัน

IGNORE number LINES ใชสําหรับทําให MySQL ไมสนใจขอมูล number บรรทัดของสวนหัวขอ file เชน
ขอมูลบรรทัดทีเ่ ปนชือ่ ของ column เปนตน

mysql> LOAD DATA INFILE "/tmp/file_name" into table test IGNORE 1 LINES;
5.15.! UPDATE syntax
รูปแบบการใช UPDATE มีดังนี้

UPDATE [LOW_PRIORITY] tbl_name SET col_name1=expr1,col_name2=expr2,...


[WHERE where_definition] [LIMIT #]

UPDATE ใชในการปรับปรุงคอลัมนในตารางที่มีอยูดวยคาใหม ประโยค SET ใชกําหนดวาคอลัมนใดจถูก


เปลีย่ นแปลงและคาใดที่จะถูกใช ประโยค WHERE ใชกาหนดว
ํ าแถวใดที่จะถูกปรับปรุง ถาไมกําหนดแลว
ทุกๆ แถวจะถูกปรับปรุงหมด

ถา LOW_PRIORITY ถูกกําหนด การทํางานตามคําสัง่ UPDATE จะถูกเลือ่ นออกไปจนกระทัง่ ไมมลี กู ขาย


ใดกําลังอานขอมูลจากตาราง

ตัวอยาง
mysql> UPDATE persondata SET age=age+1;

คอลัมน age ในตาราง persondata ถูกเพิ่มคาขึ้นหนึ่ง จากคาเดิมของมัน

5.16.! USE syntax


รูปแบบการใช USE มีดังนี้

USE db_name

ประโยค USE db_name ใชในการบอก MySQL วาใหใชฐานขอมูลชื่อ db_name เปนฐานขอมูลหลักในการ


ทําแบบสอบถาม ฐานขอมูลทีก่ ําหนดนี้จะถูกใชไปจนกระทั่งสิ้นสุดการทํางาน หรือจนกวาคําสัง่ USE จะถูก
เรียกใชอีกครั้ง

ตัวอยาง
mysql> USE db1;
mysql> SELECT count(*) FROM mytable; # selects from db1.mytable
mysql> USE db2;
mysql> SELECT count(*) FROM mytable; # selects from db2.mytable

ในการทําใหฐานขอมูลหนึ่งเปนฐานขอมูลหลักในความหมายของคําสัง่ USE ไมไดหมายความวาคุณไม


สามารถใชฐานขอมูลอืน่ ได เพียงแตเปนการกําหนดฐานขอมูลหลักในการทํางานเทานัน้ ตัวอยางขางลางจะ
แสดงใหเห็นวาสามารถเขาถึงตารางจากฐานขอมูลคนละตัวได
mysql> USE db1;
mysql> SELECT author_name,editor_name FROM author,db2.editor
WHERE author.editor_id = db2.editor.editor_id;

5.17.! SHOW syntax


รูปแบบการใช SHOW มีดังนี้

SHOW DATABASES [LIKE wild]


or SHOW TABLES [FROM db_name] [LIKE wild]
or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild]
or SHOW TABLE STATUS
or SHOW STATUS

wild หมายถึง wildcard characters คือ ‘%’ และ ‘_’


SHOW ใชดูขอมูลเกี่ยวกับ database, table, columns และ server สําหรับการอางอิงชื่อตารางนั้น
คุณสามารถอางอิงโดยใช db_name.tbl_name แทน tbl_name FROM db_name syntax.
ดังตัวอยาง 2 บรรทัดนี้ ที่มีความหมายเหมือนกัน

mysql> SHOW COLUMNS FROM mytable FROM mydb;


mysql> SHOW COLUMNS FROM mydb.mytable;

•! SHOW DATABASES แสดงรายชื่อของ database ทัง้ หมดที่มีใน MySQL server host


•! SHOW TABLES แสดงรายชื่อของ table ทัง้ หมดที่มีใน database ที่กาหนด
ํ โดยคุณสามารถใชคํา
สัง่ mysqlshow db_name เพือ่ แสดงรายชื่อของ table ทัง้ หมดใน db_name นัน้ ๆ ไดเชนกัน
•! SHOW COLUMNS แสดงรายชื่อของ column ทัง้ หมดใน table ที่กาหนด ํ
•! SHOW TABLE STATUS แสดงขอมูลของแตละ table ซึ่งคุณสามารถใชคําสัง่ mysqlshow --status
db_name ไดเชนกัน
•! SHOW STATUS แสดงขอมูลเกีย่ วกับสถานะการทํางานของ server

5.18.! DESCRIBE syntax


รูปแบบการใช DESCRIBE มีดังนี้
{DESCRIBE | DESC} tbl_name {col_name | wild}

DESCRIBE ใชแสดงขอมูลเกีย่ วกับ columns ของ table tbl_name โดยที่ col_name อาจเปนตัว
อักษร หรือ ‘%’ และ ‘_’ (wildcard character)
5.19.! GRANT และ REVOKE syntax

GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]


ON {tbl_name | * | *.* | db_name.*}
TO user_name [IDENTIFIED BY 'password']
[, user_name [IDENTIFIED BY 'password'] ...]
[WITH GRANT OPTION]

REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]


ON {tbl_name | * | *.* | db_name.*}
FROM user_name [, user_name ...]

คําสัง่ GRANT and REVOKE อนุญาติให admin ใหสทิ ธิ และ เพิกถอนสิทธิใหกับ MySQL users ซึง่ ระดับ
ของสิทธิในการใชงาน MySQL มีทงั้ หมด 4 ระดับ ดังนี้ :
(1)! Global level เปนสิทธิที่ใชกับทุก database บน server ซึง่ ขอมูลเกีย่ วกับสิทธิระดับ
ทัว่ ไปเก็บไวใน mysql.user table
(2)! Database level เปนสิทธิเกี่ยวกับทุกตารางใน database ที่กาหนดให
ํ , ขอมูลเกีย่ วกับ
สิทธิระดับ database จะถูกเก็บไวใน mysql.db และ mysql.host table
(3)! Table level เปนสิทธิเกี่ยวกับทุกๆ column ใน table ทีก่ าหนดให
ํ ขอมูลเกี่ยวกับ
สิทธิระดับ table จะถูกเก็บไวใน mysql.tables_priv table
(4)! Column level เปนสิทธิเกีย่ วกับ column แตละ column ใน table ทีก่ าหนดให
ํ ซึ่งจะ
ถูกเก็บไวใน mysql.columns table

ชนิดของสิทธิที่สามารถใชไดในคําสัง่ GRANT และ REVOKE คือ :


ALL PRIVILEGES FILE RELOAD
ALTER INDEX SELECT
CREATE INSERT SHUTDOWN
DELETE PROCESS UPDATE
DROP REFERENCES USAGE

ALL : มีสทิ ธิครบทั้งหมด


USAGE : ไมมีสิทธิใดๆ เลย

ชนิดของสิทธิทใ่ี ชสําหรับ table คือ SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT,
INDEX and ALTER.

ชนิดของสิทธิทใ่ี ชสําหรับ column คือ SELECT, INSERT and UPDATE.


คุณสามารถกําหนด global privileges โดยใช ON *.* syntax และ สามารถกําหนด database privileges
โดยใช ON db_name.* syntax.

เพือ่ ใหการกําหนดสิทธิของ user สะดวกขึน้ , MySQL สนับสนุนการกําหนดคาของ user_name ในรูปแบบ


ของ user@host ซึง่ ถาคุณตองการระบุ user string ทีม่ ตี วั อักษรพิเศษเชน ‘-‘ หรือ host string ทีม่ ตี ัวอักษร
พิเศษ หรือ wildcard character(เชน ‘%’) คุณสามารถใชเครื่องหมาย quote ทีช่ ื่อ user และ host ได เชน
‘test-user’@’test-hostname’ เปนตน

คุณสามารถใชเครื่องหมาย wildcards ใน host name ได เชน user@”%.cmu.ac.th” หมายถึงผูใชชื่อ user


สําหรับทุกๆ host ใน cmu.ac.th domain และ user@”203.146.57.%” หมายถึงผูใชชื่อ user สําหรับทุก
host ใน class C subnet 144.155.166

5.20.! CREATE INDEX syntax


รูปแบบการใชคําสัง่ CREATE INDEX มีดังนี้

CREATE [UNIQUE] INDEX index_name ON tbl_name (col_name[(length)],... )

คําสั่งนี้นิยมใชรวมกับคําสัง่ ALTER TABLE ซึง่ โดยทั่วไปแลว คุณสามารถสราง index ใหกบั ตารางขอมูล


ไดในตอนแรกที่ตารางถูกสรางโดยการใชคําสัง่ CREATE TABLE. คําสัง่ CREATE INDEX อนุญาติใหคุณ
เพิม่ index ใหกบั ตาราง

สําหรับ column ทีม่ ชี นิดขอมูลเปน CHAR และ VARCHAR , เราสามารถสราง index ใหกบั ขอมูลทัง้ 2
ชนิดโดยใชเพียงสวนหนึ่งของ columns ได เชน หากตองการใหสราง index โดยใชตัวอักษร 10 ตัวแรกของ
column ชื่อ name ใหใชคําสัง่ ดังนี้ :

mysql> CREATE INDEX part_of_name ON customer (name(10));

5.21.! DROP INDEX syntax


รูปแบบการใชคําสัง่ DROP INDEX มีดังนี้

DROP INDEX index_name ON tbl_name


DROP INDEX drops the index named index_name from the table tbl_name.

คําสั่งนี้ใชรวมกับ ALTER TABLE เพือ่ ลบ index ออกจาก column ทีต่ อ งการ


5.22.! COMMENT syntax
MySQL อนุญาติใชสัญลักษณ
# หรือ – เพือ่ ใชเริ่มตนเขียน comment จนถึงสิน้ สุดบรรทัด
/* ใชเริ่มตนเขียน comment จนถึงสิน้ สุดทีส่ ญ
ั ลักษณ */
เชน :

mysql> select 1+1; # This comment continues to the end of line


mysql> select 1+1; -- This comment continues to the end of line
mysql> select 1 /* this is an in-line comment */ + 1;
mysql> select 1+
/*
this is a
multiple-line comment
*/
1;

5.23.! MySQL reserved words


MySQL มีคําที่สงวนไว ซึ่งคุณไมสามารถนําคําเหลานี้ไปตั้งเปนชื่อตารางหรือ column ได ซึง่ คําดัง
กลาว ไดแก คําที่เปนชนิดของของมูลใน MySQL , คําที่เปนชื่อ function ทีม่ ใี หใชใน MySQL (เชน
TIMESTAMP,GROUP) เปนตน คุณสามารถใชชื่อ function ตัง้ ชื่อตารางหรือ column ไดเหมือนกัน แต
เวลาเรียกใช function นัน้ ๆ ตองไมใหมีชองวางระหวางชื่อ function กับ เครือ่ งหมายวงเล็บเปดเด็ดขาด
คําตางๆ ในตารางดานลาง เปนคําทีส่ งวนสําหรับ MySQL ซึง่ สวนใหญก็ไมสามารถใชตั้งชื่อตาราง
หรือ column ไดตามมาตรฐานของ ANSI SQL92 ดวยเชนกัน
action add aggregate all
alter after and as
asc avg avg_row_length auto_increment
between bigint bit binary
blob bool both by
cascade case char character
change check checksum column
columns comment constraint create
cross current_date current_time current_timestamp
data database databases date
datetime day day_hour day_minute
day_second dayofmonth dayofweek dayofyear
dec decimal default delayed
delay_key_write delete desc describe
distinct distinctrow double drop
end else escape escaped
enclosed enum explain exists
fields file first float
float4 float8 flush foreign
from for full function
global grant grants group
having heap high_priority hour
hour_minute hour_second hosts identified
ignore in index infile
inner insert insert_id int
integer interval int1 int2
int3 int4 int8 into
if is isam join
key keys kill last_insert_id
leading left length like
lines limit load local
lock logs long longblob
longtext low_priority max max_rows
match mediumblob mediumtext mediumint
middleint min_rows minute minute_second
modify month monthname myisam
natural numeric no not
null on optimize option
optionally or order outer
outfile pack_keys partial password
precision primary procedure process
processlist privileges read real
references reload regexp rename
replace restrict returns revoke
rlike row rows second
select set show shutdown
smallint soname sql_big_tables sql_big_selects
sql_low_priority_updates sql_log_off sql_log_update sql_select_limit
sql_small_result sql_big_result sql_warnings straight_join
starting status string table
tables temporary terminated text
then time timestamp tinyblob
tinytext tinyint trailing to
type use using unique
unlock unsigned update usage
values varchar variables varying
varbinary with write when
where year year_month zerofill

สัญลักษณจากตารางดานบนบางตัวไมสามารถใชตั้งเปนชื่อตารางหรือคอลัมนได ตามมาตรฐานของ
ANSI SQL แตสําหรับ MySQL สามารถใชได สัญลักษณเหลานัน้ ไดแก
•! ACTION
•! BIT
•! DATE
•! ENUM
•! NO
•! TEXT
•! TIME
•! TIMESTAMP
6.! บทที่ 6 MyODBC

6.1!การ install MyODBC บน Windows


(1)! unzip file myodbc-2_50_22-win95.zip
(2)! double click ที่ file setup.exe เพือ่ install program

รูปที่ (1) Installation Window

(3)! เมื่อ setup เสร็จแลว คุณจะเห็นหนาตาง Data Sources ดังรูปที่ (2) ใหเลือก sample-MySQL
แลวกดปุม Setup เพือ่ setup Myodbc

รูปที่ (2) Data Sources Window

(4)! คุณจะเห็นหนาตางสําหรับ Default configuration ของ MyODBC ดังรูปที่ (3) ใหใสราย


ละเอียดของ MySQL server ดังนี้
•! Windows DSN name : ใหใสชอ่ื ของ ODBC ทีค่ ณ ุ สรางขึน้
•! MySQL host (name or IP): ใสชอ่ื เครือ่ ง หรือ IP ของเครือ่ งทีเ่ ปน MySQL server
•! MySQL database name: ใสชื่อ database ทีต่ องการติดตอดวย
•! User: ใสชื่อ user เพือ่ login MySQL server
•! Password: ใสรหัสผาน
•! Port: port ทีต่ อ งการติดตอดวย ไมจําเปนตองใส (default = 3306)

(5)! กดปุม OK จากนั้นจะเห็น Data Sources Windows อีกครัง้ ใหกดปุม close

รูปที่ (3) วิธกี ารใสขอมูลลงไปใน Configuration

6.2!การสราง DSN ของ ODBC ไดหลาย DSN เพือ่ ใชใน application ตางกัน
(1)! เปด Control Panel
(2)! Double click ทีไ่ อคอน ODBC Data Sources 32 bits
(3)! Click ที่ tab User DSN
(4)! Click ที่ปุม Add
(5)! เลือก MySQL ในหนาจอ Create New Data Source จากนั้น click ปุม finish
(6)! คุณจะเห็นหนาตาง TCX MySQL Driver default configuration ดังรูปที่ (3) ซึง่ คุณสามารถ config
คาตางๆ ได
6.3!การใช Microsoft Access เชือ่ มตอกับ MySQL
วิธกี ารเชื่อมโยงขอมูลกันระหวาง Access กับ MySQL จะใช ODBC เปนตัวเชื่อม ซึ่งแบงไดเปน 2 กรณี
คือ
6.3.1! การ Link table
คุณสามารถดึงขอมูลจาก MySQL มาดูใน access ได ขอมูลที่อยูใน MySQL จะ
แสดงใหคุณดูในรูปแบบของขอมูลใน Access ดวยวิธีการดังนี้
(1)! สราง DSN ที่สําหรับ database ของ MySQL ทีค่ ณ ุ ตองการติดตอดวย
(2)! ใช Microsoft office เปด database ทีต่ องการจะ link table มาจาก MySQL
(3)! click ที่ file -> get external data -> Link Table…
(4)! เลือก File of type เปน ODBC database
(5)! เลือก tab Machine Data Source
(6)! คุณจะเห็น ODBC ทีม่ ใี หเลือก ดังรูปที่ (4) ใหเลือก DSN ทีค่ ณ
ุ ตองการ
(7)! เลือก table ที่ตองการ Link เขามาใน Access

รูปที่ (4) Select Data Source Window

6.3.2.! import/ export table


การ import/export นี้ เปรียบเสมือนการคัดลอกขอมูลระหวาง Microsoft Access กับ
MySQL ซึง่ วิธกี ารเรียกใช ODBC ก็เหมือนกับวิธีการ Link table
•! Import -> เปนการดึงขอมูลจาก MySQL มาเก็บไวใน Microsoft Access
•! Export -> เปนการสงขอมูลจาก Microsoft Access ไปเก็บไวใน MySQL
7.! บทที่ 7 วิธีใชงาน MySQL เบือ้ งตน

7.1!การ connect และ disconnect MySQL server


การ connect ไปยัง server จะตองใช MySQL user name และ password ถา server run อยูบน
เครือ่ งอืน่ คนตองบอก host name ของเครือ่ ง server ดวย
shell> mysql -h host -u user -p
Enter password: ********

เครื่องหมาย ******** จะปรากฏแทนที่ password ของคุณ เมือ่ คุณปอน password หากคุณสามารถ login
เขามาได คุณจะเห็น mysql> prompt ซึง่ หมายถึง MySQL พรอมที่จะรับคําสัง่ จากคุณ
shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 459 to server version: 3.22.20a-log

Type 'help' for help.

mysql>

หลังจากคุณสามารถ connect ไปยัง MySQL server ไดแลว คุณสามารถ disconnect ไดโดยพิมพคําวา quit
หรือกดปุม Control-D
mysql> QUIT
Bye

7.2!การพิมพคําสั่งเพื่อดึงขอมูลจาก database (Entering Queries)


ในขั้นตน ใหพิมพคําสัง่ เพือ่ ถาม version ของ MySQL server และ วันที่ปจจุบันของเครื่อง ตามตัว
อยางขางลางแลวกดปุม Enter

mysql> SELECT VERSION(), CURRENT_DATE;


+--------------+--------------+
| version() | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19 |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>

การ query ขอมูลขางตนแสดงใหเห็นวิธีการพิมพคําสั่งใหกับ MySQL ดังนี้ :


•! ทุกๆ คําสัง่ ทีป่ ระกอบดวย SQL statement จะตองปดทายดวยเครือ่ งหมาย semicolon (;)
•! เมือ่ คุณพิมพคําสัง่ แลวกด Enter, MySQL จะสงคําสั่งไปยัง server เพือ่ ประมวลผลและจากนัน้ ก็
แสดงผลลัพธกลับมาใหที่หนาจอ พรอมทัง้ แสดง mysql> อีกครัง้ เพือ่ รอรับคําสั่งครั้งใหม
•! mysql แสงผลลัพธของการ query ในรูปแบบของตาราง แถวแรกของตารางคือชือ่ ของ column หรือ
expression ทีค่ ุณปอนเขาไป สวนแถวถัดไปจะเปนผลลัพธที่ไดจากการ query
•! mysql จะแสดงจํานวนแถว (records) ทีไ่ ดจากการ query และ ใชเวลาในการ query นานเทาใด ซึง่
จะทําใหเราทราบถึงประสิทธิภาพของ server ไดอยางคราวๆ

Keywords ทีใ่ ชอาจพิมพโดยใชตัวเล็กหรือตัวใหญก็ได เชน :

mysql> SELECT VERSION(), CURRENT_DATE;


mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

คุณสามารถใช mysql ในการคํานวณกได เชน :

mysql> SELECT SIN(PI()/4), (4+1)*5;


+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
| 0.707107 | 25 |
+-------------+---------+

คําสั่งที่ปอนเขาไปใน mysql> prompt ไมจําเปนตองอยูบรรทัดเดียวกันทั้งหมด เนือ่ งจาก mysql จะพิจารณา


วา ทุกคําสัง่ ตองสิน้ สุดดวยเครือ่ งหมาย semicolon(;) เชน

mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+--------------------+--------------+
| USER() | CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18 |
+--------------------+--------------+

จากตัวอยางขางตน จะเห็นวา prompt ของ mysql เปลีย่ นจาก mysql> เปน -> เมือ่ คุณกดปุม enter
โดยที่ยังไมใสเครื่องหมาย semicolon หากคุณตองการยกเลิกคําสั่งที่คุณพิมพไปแลว คุณ
สามารถยกเลิกไดโดยการพิมพ \c

mysql> SELECT
-> USER()
-> \c
mysql>

เมื่อคุณยกเลิกคําสัง่ แลว prompt -> ก็จะกลับมาเปน mysql> เพือ่ รอรับคําสั่งใหมตอไป

Prompt ความหมาย
mysql> พรอมรับคําสัง่ ตอไป
-> รอรับคําสัง่ บรรทัดตอไป
‘> รอรับคําสัง่ บรรทัดตอไป ซึ่งจะตองมีเครื่องหมาย single quote ในคําสัง่ ดวย
“> รอรับคําสัง่ บรรทัดตอไป ซึ่งจะตองมีเครื่องหมาย double quote ในคําสัง่ ดวย
ตารางแสดงรูปแบบของ prompt ที่คุณสามารถพบไดใน MySQL
7.3!ตัวอยางของการ query

7.3.1! การสรางตาราง
ใหทดลองสรางตารางชือ่ shop เพือ่ เก็บราคาของหนังสือ สําหรับแตละตัวแทนจําหนาย
CREATE TABLE shop (
article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
dealer CHAR(20) DEFAULT '' NOT NULL,
price DOUBLE(16,2) DEFAULT '0.00' NOT NULL,
PRIMARY KEY(article, dealer));

INSERT INTO shop VALUES


(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),
(3,'D',1.25),(4,'D',19.95);
Okay, so the example data is:
SELECT * FROM shop

+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001 | A | 3.45 |
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | B | 1.45 |
| 0003 | C | 1.69 |
| 0003 | D | 1.25 |
| 0004 | D | 19.95 |
+---------+--------+-------+

7.3.2! การสราง และ ใชงาน database


(1)! การสราง database
ถา administrator สราง database ใหคณ ุ ในตอนที่ set up permission, คุณสามารถใชมันไดเลย
หากยัง คุณตองสราง database ขึน้ มาเอง ดังนี:้

mysql> CREATE DATABASE student;

สําหรับการใชงานบน Linux, ชื่อของ database เปนแบบ case sensitive นัน้ คือ database student ไม
เหมือนกับ Student และ ไมเหมือนกับ STUDENT ซึ่งการตั้งชื่อ table ก็ใชกฎเดียวกันดวย
การสราง database จะสรางขึน้ มาในครัง้ แรกเพียงครัง้ เดียวเทานัน้ แตการใชงานแตคุณตองเลือก
database กอนที่จะใชงานทุกครั้ง

(2)! การใชงาน database

mysql> USE student


Database changed

อีกวิธีคือ ระบุ database ทีต่ องการใชงาน ตอน login ใช MySQL Server เลย
shell> mysql -h host -u user -p database_name
Enter password: ********
7.4!การ Load ขอมูลจากไฟล ลงไปใน ตาราง
สมมติวา เราสราง database ชื่อ petshop และสราง table ชื่อ pet โดยใช syntax ดังนี้

mysql> CREATE DATABASE petshop;


mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

หลักจากมี database และ สราง table ไดแลว เราจําเปนตองเรียนคําสัง่ LOAD DATA และ
INSERT เพือ่ นําขอมูลเขาไปเก็บใน table สมมติวาคุณสราง table pet โดยมีรายละเอียดของตารางและ
ขอมูล ดังนี้

name owner species sex birth death


Fluffy Harold cat f 1993-02-04
Claws Gwen cat m 1994-03-17
Buffy Harold dog f 1989-05-13
Fang Benny dog m 1990-08-27
Bowser Diane dog m 1998-08-31 1995-07-29
Chirpy Gwen bird f 1998-09-11
Whistler Gwen bird 1997-12-09
Slim Benny snake m 1996-04-29

ถาคุณมีแต table วางๆ วิธีการงายๆ ที่จะ load ขอมูลเขา table คือ การสราง text file ซึง่ ประกอบ
ดวยแถวสําหรับสัตวแตละชนิด จากนั้นทําการ load ขอมูลใน file เขาไปไวใน table เชน สราง file ชื่อ
pet.txt ที่มี 1 record ตอ 1 บรรทัด ซึ่งคาแตละคาแยกจากการดวยเครื่องหมาย tab เรียงตามลําดับใน create
table statement สําหรับ column ใดๆ ที่ไมมีขอมูลอยู ใหใสเครื่องหมาย \N เชน

Whistler Gwen bird \N 1997-12-09 \N

การ load text file ชื่อ pet.txt ไปเก็บใน pet table ใชคําสัง่

mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;

ถาคุณตองการเพิม่ record เขาไปดวยการ INSERT ใหใชคําสัง่

mysql> INSERT INTO pet


-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);

โดยที่คาที่จะ insert เขาไป จะตองเรียงตาม column เหมือนกัน CREATE TABLE statement คาใดไมมี ให
ใช NULL เติมแทน
7.5!การดึงขอมูลออกมาจากตาราง
คําสัง่ SELECT ถูกใชในการดึงขอมูลออกมาจากตาราง รูปแบบทั่วไปของคําสัง่ select เขียนไดดงั นี้
SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy

what_to_select บอกวา select ขอมูลอะไร อาจเปนชื่อ column หรือ * ซึง่ หมายถึงทุก


column ก็ได which_table บอกวา จะ select ขอมูลจากตารางไหน
The WHERE clause เปนตัวเลือก ไมจําเปนตองพิมพ
conditions_to_satisfy เปนตัวกําหนดเงื่อนไขของขอมูลที่จะดึงมาจากตาราง

7.5.1! เลือกขอมูลทั้งตาราง
วิธีการ select ขอมูลทั้งหมดมาจากตาราง

mysql> SELECT * FROM pet;


+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1998-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+--------+---------+------+------------+------------+

7.5.2! เลือกขอมูลเฉพาะบางแถว (บาง records)


มีการใสเงื่อนไขลงไปใน WHERE clause เชน เลือกขอมูลของสัตวเลี้ยงที่ชื่อ “Bowser” เทานัน้

mysql> SELECT * FROM pet WHERE name = "Bowser";


+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
เลือกขอมูลของสัตวเลี้ยงที่เกิดหลังจากป 1999

mysql> SELECT * FROM pet WHERE birth >= "1998-1-1";


+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+

คุณสามารถใสเงื่อนไขหลายๆ เงือ่ นไขรวมกันได โดยใชคําเชื่อมเชน AND , OR

mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+

mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird";


+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+----------+-------+---------+------+------------+-------+

mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")
-> OR (species = "dog" AND sex = "f");
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+

7.5.3! เลือกขอมูลเฉพาะบางคอลัมน
คุณสามารถเลือกขอมูลออกมาเฉพาะ columns ได โดยการระบุชอ่ื columns ใน SELECT
statement
mysql> SELECT name, birth FROM pet;
+----------+------------+
| name | birth |
+----------+------------+
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
ตองการหาชื่อเจาของสัตวเลี้ยง
mysql> SELECT owner FROM pet;
+--------+
| owner |
+--------+
| Harold |
| Gwen |
| Harold |
| Benny |
| Diane |
| Gwen |
| Gwen |
| Benny |
| Diane |
+--------+

ตองการหาชื่อเจาของสัตวเลี้ยงโดยไมตองการใชแสดงชื่อซํ้ากันใน record ใหใชคําสัง่ DISTINCT:


mysql> SELECT DISTINCT owner FROM pet;
+--------+
| owner |
+--------+
| Benny |
| Diane |
| Gwen |
| Harold |
+--------+

7.6!การใช Pattern matching


SQL pattern matching ใช ‘_’ แทนที่ตัวอักษรใดๆ 1 ตัว และ `%' แทนที่ตัวอักษรใดๆ กี่ตัวก็ได
สําหรับ MySQL, SQL patterns เปนการ match แบบ case insensitive เมื่อคุณใช SQL patterns ใหใช คํา
วา LIKE หรือ NOT LIKE ในการเปรียบเทียบ ตัวอยางเชน

หาชือ่ ทีข่ น้ึ ตนดวย ‘b’ :


mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
หาชือ่ ทีล่ งทายดวย ‘fy’ :
mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+

หาชื่อที่มี ‘w’ อยูตําแหนงใดก็ได ในชื่อ :


mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+

หาชือ่ ทีป่ ระกอบดวยตัวอักษรอะไรก็ได จํานวน 5 ตัวอักษร ใหใชสัญลักษณ ‘_’ :


mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+

7.7!การนับจํานวนแถวของของขอมูลที่ถูก select
ใช function COUNT() ในการนับจํานวนแถวที่ query ได โดยใชรวมกับ SELECT statement:
mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+

ถาตองการ query ชือ่ เจาของ และ จํานวนสัตวเลี้ยงที่แตละคนมีอยู:


mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner | COUNT(*) |
+--------+----------+
| Benny | 2 |
| Diane | 2 |
| Gwen | 3 |
| Harold | 2 |
+--------+----------+
สารบัญ
1. บทที่ 1 Database Management System....................................................................................... 1
1.1. ความหมายของระบบฐานขอมูล ........................................................................................... 1
1.2. ขอดีในการใชโปรแกรมระบบจัดการฐานขอมูล ..................................................................... 1
1.3. Relational Database.......................................................................................................... 1
2. บทที่ 2 ระบบฐานขอมูลแบบ Client/Server..................................................................................... 2
2.1. ขอดี ของระบบฐานขอมูลแบบ Client/Server ....................................................................... 2
2.2. ขอเสียของระบบ Client/Server............................................................................................ 3
3. บทที่ 3 เกี่ยวกับ MySQL............................................................................................................... 4
4. บทที่ 4 ระบบการจัดการกับสิทธิการเขาถึงขอมูล............................................................................. 5
4.1 ความรูพน้ื ฐานเกีย่ วกับ user-name และ รหัสผาน ใน MySQL................................................... 5
4.2 ความรูพ น้ื ฐานเกีย่ วกับการ connect MySQL server ................................................................. 5
4.3 ความรูพ น้ื ฐานเกีย่ วกับ Privileges system ................................................................................ 5
4.4 ความรูพ น้ื ฐานเกีย่ วกับ Privileges table.................................................................................... 6
4.5 ระบบรักษาความปลอดภัยทั่วไป................................................................................................ 7
4.6 การปองกัน MySQL ใหปลอดภัยจาก crackers ......................................................................... 8
4.7 เมือ่ สิทธิของผูใชถูกเปลี่ยนแปลง จะมีผลตอผูใชเมื่อใด ?............................................................ 8
4.8 การ set up สิทธิการใช MySQL เริ่มตน .................................................................................... 9
4.9 การเพิ่มผูใช และ การจัดการกับสิทธิของผูใช ............................................................................. 9
4.10 วิธีการกําหนด passwords................................................................................................. 11
5. บทที่ 5 Language Reference..................................................................................................... 13
5.1. วิธีการเขียนสตริง และ ตัวเลข............................................................................................ 13
5.1.1. สตริง ........................................................................................................................... 13
5.1.2. ตัวเลข ......................................................................................................................... 14
5.1.3. เลขฐานสิบหก.............................................................................................................. 14
5.1.4. NULL value ................................................................................................................ 14
5.1.5. Database, table, index, column, alias names ........................................................... 15
5.1.6. Case sensitivity in names.......................................................................................... 15
5.2. ชนิดของขอมูลคอลัมน ....................................................................................................... 16
5.2.1. ขอมูลชนิดตัวเลข ......................................................................................................... 16
5.1.2. ขอมูลชนิดวันที่ และ เวลา ............................................................................................ 17
5.1.3. ขอมูลชนิดสตริง ........................................................................................................... 17
5.3. Functions for use in SELECT and WHERE clauses...................................................... 18
5.1.1. ฟงกชันเกี่ยวกับสตริง ................................................................................................... 33
5.1.2. ฟงกชั่นเกี่ยวกับวันที่ และ เวลา.................................................................................... 38
5.4. CREATE DATABASE syntax.......................................................................................... 41
5.5. DROP DATABASE syntax .............................................................................................. 42
5.6. CREATE TABLE syntax................................................................................................. 42
5.7. ALTER TABLE syntax..................................................................................................... 44
5.8. DROP TABLE syntax...................................................................................................... 46
5.9. DELETE syntax ............................................................................................................... 46
5.10. SELECT syntax ............................................................................................................... 46
5.11. JOIN syntax..................................................................................................................... 48
5.12. INSERT syntax................................................................................................................ 49
5.13. REPLACE syntax ............................................................................................................ 50
5.14. LOAD DATA INFILE syntax............................................................................................ 51
5.15. UPDATE syntax .............................................................................................................. 52
5.16. USE syntax...................................................................................................................... 52
5.17. SHOW syntax.................................................................................................................. 53
5.18. DESCRIBE syntax........................................................................................................... 53
5.19. GRANT และ REVOKE syntax......................................................................................... 54
5.20. CREATE INDEX syntax .................................................................................................. 55
5.21. DROP INDEX syntax ...................................................................................................... 55
5.22. COMMENT syntax .......................................................................................................... 56
5.23. MySQL reserved words................................................................................................... 56
6. บทที่ 6 MyODBC ....................................................................................................................... 59
6.1 การ install MyODBC บน Windows ....................................................................................... 59
6.2 การสราง DSN ของ ODBC ไดหลาย DSN เพื่อใชใน application ตางกัน ................................ 60
6.3 การใช Microsoft Access เชื่อมตอกับ MySQL........................................................................ 61
6.3.2. import/ export table.................................................................................................... 61
7. บทที่ 7 วิธีใชงาน MySQL เบื้องตน.............................................................................................. 62
7.1 การ connect และ disconnect MySQL server........................................................................ 62
7.2 การพิมพคําสัง่ เพือ่ ดึงขอมูลจาก database (Entering Queries) ............................................... 62
7.3 ตัวอยางของการ query ........................................................................................................... 64
7.3.1 การสรางตาราง............................................................................................................ 64
7.3.2 การสราง และ ใชงาน database................................................................................... 64
7.4 การ Load ขอมูลจากไฟล ลงไปใน ตาราง................................................................................ 65
7.5 การดึงขอมูลออกมาจากตาราง ................................................................................................ 66
7.5.1 เลือกขอมูลทัง้ ตาราง .................................................................................................... 66
7.5.2 เลือกขอมูลเฉพาะบางแถว (บาง records)..................................................................... 66
7.5.3 เลือกขอมูลเฉพาะบางคอลัมน....................................................................................... 67
7.6 การใช Pattern matching........................................................................................................ 68
7.7 การนับจํานวนแถวของของขอมูลที่ถูก select .......................................................................... 69

You might also like