วันอังคารที่ 16 ธันวาคม พ.ศ. 2557

คำสั่ง MySQL

คำสั่ง MySQL

ในบทนี้จะไดเรียนรูเกี่ยวกับคําสั่งตางๆ ใน MySQL ซึ่งเปนการรวมคําสั่งทั้งหมดไมวาจะเปนคําสั่งที่ใช
สําหรับการกําหนด (Data Definition Language), คําสั่งที่ใชสําหรับทํางานขอมูล (Data Manipulation Language)
และคําสั่งที่ใชสําหรับการควบคุมการทํางาน (Data Control Language)


คําสั่ง CREATE DATABASE
CREATE DATABASE demo
เปนคําสั่งสราง database ชื่อ db_name ขึ้นมาใหมในกรณีที่มี database นั้นอยูแลว ก็จะปรากฏขาวสาร
แสดงความผิดพลาด (Error Message) Can't create database 'demo'. Database exists


คําสั่ง DROP DATABASE
DROP DATABASE demo
เปนคําสั่งลบ database ชื่อ db_name ออกไปจากระบบ


คําสั่ง CREATE TABLE
CREATE TABLE phonebook (id INT (4) NOT NULL
AUTO_INCREMENT, fname VARCHAR (35) , lname VARCHAR (35) ,
email VARCHAR (50) , office VARCHAR (200) , province CHAR (2) ,
PRIMARY KEY(id), UNIQUE(id), INDEX(id)) ศูนยเทคโนโลยีสารสนเทศและการสื่อสาร สป. การใชงานฐานขอมูล MySQL 57
โดยทั่วไปขนาดของตารางขอมูลหนึ่งๆ จะมีขนาดไมเกิน 2หรือ 4ขึ้นอยูกับระบบปฏิบัติการ เรา
สามารถทําใหประหยัดเนื้อที่ไดอีกโดยการบีบอัด (PACK) ขอมูลดัชนีซึ่งสามารถใหบีบอัดโดยกําหนดคา
PACK_KEYS=1 การบีบอัดนี้จะทําใหการทํางานชาลง แตก็ประหยัดเนื้อที่ขึ้น และตามปกติถาผูใชไมได
กําหนดใหบีบอัดขอมูลที่เปนสตริงหรือตัวอักษรก็จะไดรับการบีบอัดขอมูลอยูแลว สําหรับขอมูลตัวเลขคาการ
ทํางานปกติจะไมรับการบีบอัดเวนแตกําหนดการบีบอัดดวย
การใช UNION จะใชกรณีที่ตองการรวมตารางขอมูลหลายๆ ตารางเขาดวยกันเปนอันเดียว ซึ่งจะทํางาน
กับตารางประเภท MERGE เทานั้น
คําสั่ง ALTER TABLE
ALTER TABLE phonebook ADD tel VARCHAR(30)
 ALTER TABLE เปนคําสั่งสําหรับการปรับเปลี่ยนแกไขโครงสรางของตารางขอมูลเชน การเพิ่ม-ลบ
ฟลดการสราง-ลบดัชนีการเปลี่ยนประเภทขอมูลของฟลดการเปลี่ยนชื่อฟลดเปนตน


คําสั่ง RENAME TABLE
RENAME TABLE phonebook to phone
เปนคําสั่งเพื่อเปลี่ยนชื่อตารางขอมูลเปนชื่อใหม


คําสั่ง DROP TABLE
DROP TABLE phonebook
เปนคําสั่งเพื่อใหลบตารางขอมูลออกจากระบบ สําหรับออปชัน RESTRICT และ CASCADE ยังไม
สามารถงานไดในปจจุบัน เนื่องจากเปนความสามารถที่มีแผนจะรองรับในอนาคต สําหรับการใชคําสั่ง DROP
TABLE จะตองใหความระมัดระวังในการใชงานเปนอยางยิ่งโดยเฉพาะการทํางานกับตารางขอมูลประเภทnontransaction
เพราะจะทําการ commit การทางานโดยอ ํ ัตโนมัติ
คําสั่ง OPTIMIZE TABLE
OPTIMIZE TABLE phonebook ศูนยเทคโนโลยีสารสนเทศและการสื่อสาร สป. การใชงานฐานขอมูล MySQL58
เปนคําสั่งสําหรับจัดระเบียบขอมูลใหเปนระเบียบ หรือการทําดีแฟรกเมนตนั่นเองนั่นเอง เพราะถา
ตารางขอมูลมีการใชงานมานาน มีการใชงานที่ทําใหขอมูลมีการเปลี่ยนแปลงความยาว หรือเปลี่ยนขนาดของเนื้อ
ที่เก็บขอมูลโดยเฉพาะกับขอมูลประเภทท่ียืดหยุนไปตามขอมูลเชน VARCHAR, BLOB หรือ TEXT การใช
คําสั่ง OPTIMIZE TABLE ก็จะชวยใหมีการจัดระเบียบขอมูลใหดียิ่งขึ้น หากปลอยระยะเวลานานๆ จะเกิด
ชองวางระหวางขอมูลการอานขอมูลของสื่อจะไมราบรื่น ชา เนื่องจากเสียเวลาในการกระโดดขามชองวางนั้น
นั่นเอง


คําสั่ง DELETE
DELETE FROM phonebook WHERE id=4
เปนคําสั่งสําหรับลบขอมูลจากตาราง โดยสามารถกําหนดเงื่อนไขสําหรับการลบไดซึ่งถาไมไดระบุ
เงื่อนไขจะเปนการลบขอมูลทั้งหมดออกจากตารางและถาอยูใน AUTOCOMMIT mode (กรณีปกติทั่วไป) จะไม
สามารถทําการยกเลิกการลบครั้งนี้ได


คําสั่ง TRUNCATE
TRUNCATE phonebook
เปนคําสั่งที่ใหผลเชนเดียวกับ DELETE FROM table_name แตมีขอแตกตางดังนี้
- จะทําการดรอปตารางขอมูลกอน แลวทําการสรางใหมซึ่งจะใหผลที่เร็วกวาการลบ
ตารางทั้งหมด
- การทํางานเปน non-transaction ไมสามารถทําการยกเลิกได
คําสั่ง SELECT
SELECT id, fname FROM phonebook ORDER BY fname DESC
เปนคําสั่งสําหรับการแสดงผล หรือการดึงขอมูลจากตาราง โดยสามารถกําหนดเงื่อนไข รูปแบบและ
วิธีการไดอยางหลากหลายการดึงขอมูลสามารถระบุวาจะเลือกจากตารางเดียว หรือหลายตารางก็ได
การใชLIMIT rows ก็จะชวยกําหนดใหทําการดึงขอมูลจากตารางไดไมเกินจํานวนแถว rows ที่ระบุ
การใชคําสั่งคียเวิรดตามหลัง SELECT จะตองใชใหถูกตอง มีบางคียเวิรดที่ตองใชเรียงลําดับกัน เชน
HAVING clause ตองใชตามหลัง GROUP BY clause และใชกอน ORDER BY clause เปนตน
ตามปกติหากไมไดระบุวิธีการจัดเรียงขอมูลก็จะเปนการเรียงจากนอยไปมาก (Ascending) หรือคียเวิรด
ASC แตถาตองการเรียงจากมากไปนอย (Descending) ใหใชคียเวิรด DESC ศูนยเทคโนโลยีสารสนเทศและการสื่อสาร สป. การใชงานฐานขอมูล MySQL 59
การใชคียเวิรด HAVING จะใชในกรณีรวมกับ GROUP BY ซึ่งก็เปนการกําหนดเงื่อนไขในการดึง
ขอมูลดวยคําสั่ง SELECT
SELECT id,fname FROM phonebook GROUP BY fname HAVING id>2


คําสั่ง INSERT
INSERT INTO phonebook (id, fname, lname, email, office, province)
VALUES (6, 'sineenat', 'phradmali', 'sineenat@health.moph.go.th', 'ศทส.', '12')
เปนคําสั่งสําหรับการเพิ่มแถวขอมูล หรือระเบียนใหมเขาตารางขอมูล


คําสั่ง UPDATE
UPDATE phonebook SET office= 'ศูนยเทคโนโลยีสารสนเทศและการสื่อสาร' WHERE id=6
เปนคําสั่งเพื่อทําการเปลี่ยนแปลงขอมูลในตารางใหเปนตามที่ตองการ
คําสั่ง USE
USE demo
 USE เปนคําสั่งสําหรับเลือกใช database SHOW TABLES แสดงตารางที่อยูใน database demo
ทั้งหมด
คําสั่ง FLUSH
FLUSH TABLES phonebook
เปนคําสั่งที่ใชสําหรับการลบหนวยความจําภายใน (Internal Cache) ที่ใชงาน ทั้งนี้การใชคําสั่ง FLUSH
จะอนุญาตเฉพาะ user ที่มีสิทธิ์ (Privilege) เทานั้น
Flush_option สามารถระบุไดดังนี้
 HOSTS ทําการลาง hose cache table เพื่อปรับปรุงขอมูลของ host หรือ client ที่
 คอนเน็กตเขาใชงาน ซึ่งอาจมีการเปลี่ยนแปลง IP address หรืออื่นๆ
 โดยเมื่อทําการ flush เรียบรอยแลวก็จะอนุญาตให host นั้นๆ ทําการศูนยเทคโนโลยีสารสนเทศและการสื่อสาร สป. การใชงานฐานขอมูล MySQL 60
 คอนเน็กตเขามาใหมอีกครั้งหนึ่ง
LOGS ปดและเปด log files ใหม
PRIVILEGES ทําการ reload สิทธิ์ตางๆ ของ user จาก grant tables ของ MySQL Server
TABLES ปด tables ทั้งหมด หากตารางใดยังถูกเปดอยูก็จะถูก force ใหปดลง


คําสั่ง SHOW
SHOW DATABASES
เปนคําสั่งสําหรับแสดงรายละเอียด (Information) ของ databases, tables, columns หรือ สถานะตางๆ
ของ Server
แสดงรายละเอียดของ Databases, Tables, Columns และ Indexes
 SHOW DATABASES แสดงรายชื่อ databases ทั้งหมดในระบบฐานขอมูล
SHOW TABLES แสดงรายชื่อ tables ทั้งหมดของ current database
SHOW OPEN TABLES แสดงรายชื่อ tables ที่ถูกเปดอยูในปจจุบัน
SHOW COLUMNS แสดงรายละเอียดฟลดทั้งหมดใน table นั้น
 (ใหผลลัพธเชนเดียวกับคําสั่ง DESCRIBE)
SHOW FIELDS ใหผลลัพธเชนเดียวกับ SHOW COLUMNS
SHOW INDEX แสดงรายละเอียดวามีดัชนีอะไรบางสําหรับ table นั้นๆ
SHOW KEYS ใหผลลัพธเชนเดียวกับ SHOW INDEX
คําสั่ง GRANT และ REVOKE
GRANT ALL PRIVILEGES ON demo TO user1@localhost WITH GRANT OPTION
REVOKE ALL PRIVILEGES ON demo FROM user1@localhost
- คําสั่ง GRANT เปนคําสั่งสําหรับการกําหนดสิทธิ์หรือความสามารถใดๆ ใหกับ user
- คําสั่ง REVOKE หรือคําสั่งที่ตรงกันขามกับ GRANT คือเปนการถอนหรือยกเลิกสิทธิ์ใดๆ จาก
user
การใชคําสั่ง GRANT หรือ REVOKE จะอนุญาตเฉพาะผูบริหารระบบในการกําหนดสิทธิ์ตางๆ สําหรับ
ผูใช ศูนยเทคโนโลยีสารสนเทศและการสื่อสาร สป. การใชงานฐานขอมูล MySQL 61
 MySQL จะแบงสิทธิ์ (Privilege) เปน 4 ระดับ คือ
1. Global level
ระดับบนสุด ครอบคลุมทุก database รายละเอียดสําหรับสิทธิ์ของระดับนี้จะถูกเก็บไวในตาราง
mysql.user
2. Database level
ระดับ database ครอบคลุมเฉพาะใน database อันใดอันหนึ่ง เชน ความสามารถในการกระทําใดๆ
ภายใน database นั้นๆ รายละเอียดสําหรับสิทธิ์ของระดับนี้จะถูกเก็บไวในตาราง mysql.db และ mysql.host
3. Table level
ระดับ table ครอบคลุมเฉพาะภายในตารางนั้นๆ เชน ความสามารถในการกระทํากับ table นั้นๆ
สามารถทําการ select, insert, delete, update ไดหรือไม เปนตน รายละเอียดสําหรับสิทธิ์ของระดับนี้จะถูกเก็บอยู
ในตาราง mysql.tables_priv
4. Column level
ระดับ column ครอบคลุมเฉพาะฟลดใดฟลดหนึ่งภายในตารางขอมูลรายละเอียดสําหรับสิทธิ์ของระดับ
นี้จะถูกเก็บอยูในตาราง mysql.columns_priv
รายละเอียด priv_type มดีังตอไปนี้
ALL PRIVILEGES FILE RELOAD
ALTER INDEX SELECT
CREATE INSERT SHUTDOWN
DELETE PROCESS UPDATE
DROP USAGE
- เราสามารถใช ALL หรือ ALL PRIVILEGES ไดอยางใดอยางหนึ่ง
USAGE มีความหมายเทากับ no privileges โดยใชกรณีที่เราตองการ create user และกําหนดใหมี
สิทธิ์เปน no privileges
- การถอนสิทธิ์การ GRANT ของ user ใดๆ ใหใช priv_type เปน GRANT OPTION
ตัวอยาง: REVOKE GRANT OPTION ON … FROM …;
- การใช priv_type สําหรับ table: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP,
GRANT, INDEX และ ALTER
- การใช priv_type สําหรับฟลด SELECT, INSERT, UPDATE
- การกาหนดส ํ ิทธิ์ระดับ database ใช ON *.*
- สําหรับ user_name สามารถระบุไดถึงโฮสตที่ใชงาน เชน mysql@localhost หรือ root@’%’
 ศูนยเทคโนโลยีสารสนเทศและการสื่อสาร สป. การใชงานฐานขอมูล MySQL 62

วันอังคารที่ 9 ธันวาคม พ.ศ. 2557

คำสั่ง SQL เบื้องต้น

คำสั่ง SQL เบื้องต้น by natsu


ก่อนอื่นต้องบอกเลยครับว่ามันไม่ได้ดีมากนักสำหรับหน้าเวปนี้เพราะผมอ่านหนังสือและสรุปอย่างคร่าวๆ แล้วรูปแบบมันอาจจะเพี้ยนๆ เพราะผมเขียนใน PAGE แล้วเอา COPY and PASTE ลงเล้ย แบบไม่แก้ไขอันใด tab มั่วไปหมด ถ้าผิดพลาดประการใดต้องขออภัยด้วยครับ

ภาษา SQL นั้นไม่เป็น case sensitive (ตัวเล็ก ตัวใหญ่มีค่าเท่ากัน) และในแต่ละคำสั่งจะถูกปิดด้วย ; (semi-colon) 

(วิธีการลง SQL ใน Window7 : http://natsusencho.blogspot.com/2012/07/mysql-window7.html)

มาเริ่มกันเลย
การเข้าใช้ให้เราเปิด cmd ขึ้นมาและ
$ mysql -u root -p
จากนั้นใส่ password ลงไป
จะเข้าสู่การใช้

mysql > (เราจะพิมพ์คำสั่งต่างๆลงไป)

ถ้าต้องการออกใช้
mysql > quit
mysql > show databases;  แสดง  databases ทั้งหมดที่เราสร้างขึ้น

mysql > use <ชื่อ database> เป็นการเข้าใช้ database นั้นๆ
mysql > SELECT database(); ดู database ที่เรากำลังใช้อยู่
mysql > show tables;  แสดงตารางทั้งหมดที่เราสร้างขึ้นใน database ที่ use

สร้าง DATABASE
mysql > create database  <ชื่อdatabase>;
 เช่น create database world;

สร้าง table
mysql > create table <ชื่อtable> (<ชื่อข้อมูล> <ชนิดข้อมูล>, ... );
 เช่น create table human (name VARCHAR(20), birth DATE, sex CHAR(1));
ชนิดข้อมูล เช่น
 VARCHAR(n) - ข้อมูลชนิด string เก็บแบบ linked list เหมาะสมกับข้อมูลที่มีความยาวที่ไม่แน่นอน
 CHAR(n) - ข้อมูลชนิด string เก็บแบบ array เหมาะสมกับข้อมูลที่มีความยาวที่แน่นอน
 INT - จำนวนเต็ม

 DATE - ข้อมูลชนิดพิเศษของ SQL ใช้เก็บวันที่ มีรูปแบบเป็น YYYY-MM-DD

การใส่ข้อมูลลงไปใน table สร้างและลบ table


การใส่ข้อมูลลงไปใน table
1. ใช้คำสั่ง load data จากไฟล์ที่เราเตรียมไว้ โดย default จะแบ่งเนื้อหาโดยใช้ tab แบบนี้จะมีปัญหาเรื่องการใช้ข้อมูลชนิด NULL ซึ่งใช้ \N แทน
 mysql > load data local infile ‘natsu.txt’ into table pet;

2.INSERT ใส่ทีละข้อมูล เหมาะกับข้อมูลที่น้อยๆ ที่เราเพิ่มเติมเข้าไป เช่น
 mysql > INSERT INTO pet VALUES (‘natsusencho’, ‘1992-03-25’, ‘M’);

3. *ทำ SQL script คือเตรียมไฟล์คำสั่ง sql ไว้แล้วนำมาทำการ source ทีเดวเช่น
ส่วนตัวแนะนำวิธีนี้เพราะเราเขียนทั้งหมดทีเดียวไม่ต้องมาใส่ทีละคำสั่ง นึกออกให้เสร็จที่เดียวแล้ว run ทีเดียวทั้งหมด
  ---- file natsu.sql ----
 CREATE TABLE IF NOT EXISTS human (
        name   VARCHAR(20),
        birth DATE, 
  sex CHAR(1) );
 INSERT INTO human VALUES 
       ( 'NatsuSencho',   '1992-03-25', 'M'),
       ( 'Slime',   '1999-03-03', NULL ),
   ( ‘HeyFemale’ , ‘1993-12-25’ , ‘F’);
 ----- file natsu.sql -----
 หลังจากสร้างเสร็จแล้วก้ลองใช้คำสั่ง
 mysql > source natsu.sql;
 ก็จะได้ตาราง world หน้าที่มีข้อมูล 3 ตัว
 create table IF NOT EXISTS human
 คำว่า IF NOT EXISTS หมายถึงการสร้าง table นี้ถ้ายังไม่มี table นี้ ถ้ามีแล้วก็ไม่ต้องสร้าง
มีสร้างก็ต้องมีลบ การลบ table ใช้คำสั่ง
 mysql > DELETE FROM <ชื่อtable>;

หลังจากที่สร้างเป็นแล้วต้องสามารถแก้ไขข้อมูลได้
 mysql > UPDATE <ชื่อtable> 
  SET <ชื่อข้อมูล> = <ข้อมูลใหม่>
  WHERE <เงื่อนไขอื่นๆ>;

 เช่น UPDATE human SET name = ‘HeyGirl’ WHERE name = ‘HeyFemale’;

การสืบค้นข้อมูล หรือการดูข้อมูล ORDER BY เรียงลำดับข้อมูล การจัดกลุ่มข้อมูล

การสืบค้นข้อมูล หรือการดูข้อมูล
 SELECT <สิ่งที่ต้องการ>
 FROM   <ชื่อtable>
 WHERE <เงื่อนไขอื่นๆ>
เช่นต้องการชื่อของข้อมูลในตาราง human ที่มีมีเพศชาย
 SELECT name
 FROM   human
 WHERE sex = ‘M’; 
ต้องการดูข้อมูลทั้งหมดในตาราง human [* คือทั้งหมด]
 SELECT *
 FROM   human;
ซึ่งการกำหนดเงื่อนไขนั้นเราสามารถใช้ตัวแปรทางคณิตศาสตร์ตรรกะ มาช่วยได้เช่น
 AND และ
 OR หรือ
 < น้อยกว่า
 > มากกว่า
 <= น้อยกว่าหรือเท่ากับ
 >= มากกว่าหรือเท่ากับ
 <> ไม่เท่ากับ
 UNION การนำ 2 ตารางมาเชื่อมต่อกันตัดตัวซ้ำ
 UNION ALL การนำ 2 ตารางมาเชื่อมกันโดยไม่ตัดตัวซ้ำ
 INTERSECT ข้อมูลที่ซ้ำกัน
DISTINCT คือการตัดตัวที่ซ้ำกันออก
เช่น SELECT DISTINCT sex
 FROM   human;
ORDER BY เรียงลำดับข้อมูล การจัดกลุ่มข้อมูล
เรียงลำดับจากมากไปน้อย (descending order)
เช่น SELECT *
 FROM   human
 ORDER BY name;
เรียงลำดับจากน้อยไปมาก (descending order)
เช่น SELECT *
 FROM   human
 ORDER BY name DESC;
ถ้าต้องการมากกว่าอันนึงก็ย่อมได้
เช่น SELECT *
 FROM   human
 ORDER BY name , sex DESC ;
แบบนี้จะจัดตามชื่อแบบ ascending ก่อนแล้วจะมาจัดเพศแบบ descending ทีหลัง