หน้าเว็บ

วันอาทิตย์ที่ 23 พฤศจิกายน พ.ศ. 2557

คำสั่ง SQL

คำสั่ง SQL









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

     ภาษา 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

ดูชื่อและชนิดข้อมูลของแต่ละตาราง
mysql > describe <ชื่อ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’;
การสืบค้นข้อมูล หรือการดูข้อมูล
 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 ทีหลัง
การคำนวณเกี่ยวกับวันที่
 ตัวแปร DATE เป็น string ที่มีการเก็บเป็นรูปแบบ YYYY-MM-DD ตัวแปรชนิด DATE สามารถนำมาเทียบค่ากันได้ในระดับ ASCII
CURDATE() จะเป็น function ที่ส่งค่าออกมาเป็นข้อมูลรูปแบบ DATE (YYYY-MM-DD)
YEAR(<ข้อมูลชนิดdate>) ส่งค่าออกมาเป็นข้อมูลรูปแบบของปี (YYYY)
MONTH(<ข้อมูลชนิดdate>) ส่งค่าออกมาเป็นข้อมูลรูปแบบของเดือน (MM)
DAY(<ข้อมูลชนิดdate>)  ส่งค่าออกมาเป็นข้อมูลรูปแบบของวัน (DD)
RIGHT(<ข้อมูลชนิดstring>, <จำนวนตัวเลข>) ส่งค่าออกมาจำนวนเท่ากับที่เราต้องการตัดออกมาจาก string นั้นๆ โดยเริ่มนับจากทางขวา
LEFT(<ข้อมูลชนิดstring>, <จำนวนตัวเลข>) ส่งค่าออกมาจำนวนเท่ากับที่เราต้องการตัดออกมาจาก string นั้นๆ โดยเริ่มนับจากทางซ้าย
ตัวอย่าง
ex1. ต้องการปีของวันปัจจุบัน  YEAR( CURDATE() )
ex2. ต้องการเดือนและวันของปัจจุบัน RIGHT( CURDATE(),5 )
 [5 ในที่นี้คือนับจากทางขวามือมา YYYY-MM-DD ก็จะได้ ​MM-DD มา]
การใช้ตัวแปร NULL ในเงื่อนไข
 ใช้คำสั่ง xxx IS NOT NULL เช่นต้องการดูสิ่งมีชีิวิตที่ไม่มีเพศ
 SELECT *
 FROM   human
 WHERE sex IS NOT NULL;
การตั้งชื่อเป็นชื่อที่เราต้องการ
 หมายถึงเวลา select บางทีคนทั่วไปอาจจะไม่เข้าใจว่าคืออะไร เราจึงมีคำสั่ง AS ช่วย เช่น
 SELECT name AS ‘NAME-SURNAME’
 FROM   human;
COUNT การนับจำนวน + GROUP BY การจัดกลุ่ม
 COUNT ใช้ในการนับจำนวนของตารางต่างๆ จะใช้คู่กับ GROUP BY ได้ดีเพราะจะช่วยในการจัดกลุ่มชุดข้อมูลได้ดีขึ้น
 SELECT <อื่นๆ> COUNT(*)
 FROM <ชื่อtable>
 WHERE <เงื่อนไข>
 GROUP BY <จัดกลุ่มโดยใช้อะไร>
เช่นต้องการนับจำนวนคนในแต่ละเพศ
 SELECT sex , COUNT(*)
 FROM   human
 GROUP BY sex;
SET การกำหนดตัวแปร
 SET @<ชื่อตัวแปร> = <ค่า>
 เช่น  SET @A1 = ‘Natsu Sencho’;
  SET @A2 = 1999-09-09’;
การใช้คำสั่ง JOIN
 การ JOIN คือการนำตารางที่มีความสัมพันธ์ของข้อมูลในแต่ละฟิลมาเชื่อมโยงกัน
 การ JOIN มี 2 แบบคือ
 1. INNER JOIN
 2. OUTER JOIN  |--- LEFT JOIN
    |--- RIGHT JOIN
INNER JOIN
 คือการ JOIN โดยไม่สนใจค่า NULL จะดูเพียงตัวที่เหมือนกันเท่านั้น
สมมติมีตาราง 2 อันชื่อ Ltable และ ​Rtable นำมา JOIN กันโดยมีข้อมูลที่ซ้ำกันคือ id
 -- JOIN โดยใช้ ON
 SELECT *
 FROM Ltable INNER JOIN Rtable ON Ltable.id = Rtable.id;
 -- หรือ JOIN โดยใช้ USING
 SELECT *
 FROM Ltable INNER JOIN Rtable USING (id);

กรณีพิเศษที่ตัวแปรหรือชื่อ Column ซ้ำกันก็สามาใช้ NATURAL JOIN ได้ อย่างในที่นี้เรารุ้ว่า id นั้นซ้ำกันเราก็ไม่ต้องใส่เงื่อนไขใดๆ แต่ใช้ Natural Join เข้ามาช่วยโดย
 SELECT *
 FROM Ltable NATURAL JOIN Rtable;
OUTER JOIN
LEFT JOIN
 คือการ JOIN โดยใช้ตัวทางซ้ายเป็นหลักคือ จะแสดงตัวทางซ้ายทุกตัวและนำข้อมูลขวามาเชื่อม
 SELECT *
 FROM Ltable LEFT JOIN Rtable ON Ltable.id = Rtable.id;
RIGHT JOIN
 คือการ JOIN โดยใช้ตัวทางขวาเป็นหลักคือ จะแสดงตัวทางขวาทุกตัวและนำข้อมูลขวามาเชื่อม
 SELECT *
 FROM Ltable RIGHT JOIN Rtable ON Ltable.id = Rtable.id;
นอกจากวิธีการ JOIN ยังมีวิธีที่เรียกว่า Cartesian Product ซึ่งไม่ได้อทิบายไว้ในทีนี้
ถ้ามีโอกาศจะนั่งทำตัวอย่างให้ดูให้เห็นได้ชัดกว่านี้นะครับ แต่ผมสรุปแบบคร่าวๆ ให้พอดู
รวมคำศัพท์คำสั่งที่เจอเพจนี้
CREATE  สร้างdatabase, table
INSERT  ใส่ข้อมูล
UPDATE  อัพเดตข้อมูล
SELECT  ต้องการจะดูอะไรบ้าง
FROM    จากที่ไหน
WHERE   เงื่อนไขอย่างไร
COUNT(*)  นับจำนวนของฟิลข้อมูล
GROUP BY  จัดกลุ่มข้อมูล
ORDER BY  เรียงลำดับข้อมูลโดย
JOIN    เชื่อมตาราง
DISTINCT  ตัดตัวซ้ำ
AS      ใช้คำใหม่ให้กระทัดรัดขึ้น
SET     กำหนดตัวแปร
CURDATE() วันที่ปัจจุบัน
YEAR()  ปี
MONTH() เดือน
DAY()   วัน
RIGHT() ตัดคำจากทางขวา
LEFT()  ตัดคำจากทางซ้าย

*       ทั้งหมด

สรุปคำสั่ง SQL
ในส่วนการสรุปรูปแบบทั่วไปของประโยคคำสั่ง SQL แต่ระบบฐานข้อมูลแต่ละระบบอาจจะสนับสนุนหรือไม่สนับสนุนต้องดูคู่มือของ่ระบบฐานข้อมูลนั้นประกอบด้วย
ALTER TABLE tablename [ADD| DROP| MODIFY] columnname; (ดูเพิ่มเติม1, ดูเพิ่มเติม2 ) ใช้สำหรับการเพิ่ม, แก้ไข หรือลบ คอลัมน์ของ table และเปลี่ยนข้อความ เช่น ประเภทข้อมูล ของคอลัมน์ที่มีอยู่ การเลือก ADD, DROP หรือ MODIFY เลือกได้อย่างเดียว
COMMIT; (ดูเพิ่มเติม) บันทึกการเปลี่ยนแปลงเข้าสู่ฐานข้อมูล
CREATE [UNIQUE] INDEX indexname
ON tablename (columnname); (ดูเพิ่มเติม1, ดูเพิ่มเติม2 ) UNIQUE เป็นตัวเลือกการสร้างดัชนีแบบไม่ซ้ำ
CREATE TABLE tablename
(columnname1 datatype [size] [constraint], columnname2 datatype [size] [constraint], . .); (ดูเพิ่มเติม1, ดูเพิ่มเติม2) เป็นคำสั่งสร้าง table การกำหนด size ขึ้นกับประเภทข้อมูล constraint ที่สามารถกำหนดได้ คือ NULL หรือ NOT NULL, UNIQUE (บังคับให้ค่าไม่ซ้ำ), PRIMARY KEY (ระบุ primary key ของ table), CHECK (การยอมให้ตรวจสอบข้อมูลที่มีการเปลี่ยนแปลง), DEFULT (ให้แทรกค่าเมื่อมีการเพิ่มแถวข้อมูล), FOREIGN KEY (กำหนด foreign key ของ table)

CREATE VIEW tablename AS select statement; (ดูเพิ่มเติม) สร้าง view

DELETE FROM tablename WHERE condition; (ดูเพิ่มเติม) ลบข้อมูล

INSERT INTO tablename (column1, column2,..)
VALUES (value1, value2,..); (ดูเพิ่มเติม)

ROLLBACK;(ดูเพิ่มเติม) เรียกข้อมูลเดิมกลับมา จากการเปลี่ยนแปลงข้อมูลที่เกิดขึ้น โดยสามารถเรียกกลับจาก COMMIT ครั้งสุดท้าย

SELECT [ALL | DISTINCT] column1[,column2]
FROM table1[,table2]
[WHERE conditions]
[GROUP BY column-list]
[HAVING conditions]
[ORDER BY column-list [ASC | DESC] ]; (ดูเพิ่มเติม) โดย ASC | DESC ให้เลือกวิธีเรียงลำดับข้อมูล

UPDATE tablename
SET column1 = value1, column2 = value2, ..
[WHERE condition]; (ดูเพิ่มเติม) ถ้าไม่มี WHERE clause จะเปลี่ยนค่าตามที่กำหนดทั้งหมด
ตัวอย่างคำสั่ง SQL ใน Visual Basic
คำสั่ง Select
คำสั่ง Select ใช้เป็นประโยคคำสั่งในการส่งออกเรคคอร์ด ตามเกณฑ์ในการเลือก
ไวยากรณ์

SELECT fieldname1, fieldname2,...
FROM tablename1, tablename2,...
[Where Condition]
[Group By]
[Having]
[Order By];
[ ] ตัวเลือก

แสดงทุกฟิลด์และทุกเรคคอร์ด ใน table เดียว เช่นการข้อทั้งหมดใน table ชื่อ publishers
SELECT * FROM Publishers ;

แสดงบางฟิลด์ ซึ่งชื่อฟิลด์ ที่มีเครื่องหมายพิเศษ หรือมีการเว้นวรรคให้อยู่ในวงเว็บก้ามปู [ ]
SELECT PubID, [Company Name], Address FROM Publishers;

แสดงฟิลด์ที่เป็น expression และตั้งชื่อใหม่ (ให้ใช้ As)
SELECT Author, 2000 - [Year Born] As Age FROM Authors;

การใช้ฟังก์ชัน aggregate
SELECT COUNT ([Year Born]) FROM Authors;

การเลือกเฉพาะเรคคอร์ด ที่ต้องการด้วย WHERE clause
SELECT Name, City FROM Publishers WHERE State = ‘CA’;

การเลือกเฉพาะเรคคอร์ดด้วย WHERE Clause หลายเงื่อนไขต้องเชื่อมด้วย AND หรือ OR เช่น state เป็น CA และ Name ขึ้นต้นด้วย M
SELECT * FROM Publishers WHERE State = ‘CA’ AND name LIKE ‘m%’;

การเรียงและจัดกลุ่ม

การเรียงใช้ ORDER BY clause
SELECT * FROM Publishers ORDER BY [Company Name] ;

การเรียงจากน้อยไปมากให้ใช้คีย์เวิร์ด DESC ต่อท้ายฟิลด์ต้องการเรียงจากน้อยไปมาก
SELECT * FROM Publishers ORDER BY State, City DESC;

การจัดกลุ่มใช้ GROUP BY Clause
SELECT [Year Published], Count (*) As Title In Year FROM Titles
GROUP BY [Year Published];

ให้แสดงจำนวนหนังสือใน 10 ปีสุดท้าย
SELECT TOP 10 [Year Published], COUNT (*) As Title In Year FROM Titles
GROUP BY [Year Published] ORDER BY [Year Published] DESC;

การคัดเลือกด้วยเขื่อนไขของ HAVING Clause เช่น แสดงเฉพาะที่มีจำนวนหนังสือมากกว่า 50
SELECT [Year Published], COUNT (*) As Title In Year FROM Titles
GROUP BY [Year Published] HAVING COUNT ((*) >50);

คิวรี่ย่อย

คิวรี่ย่อย เป็นการใช้ประโยคคำสั่ง Select ภายในประโยคคำสั่ง Select อีกคำสั่งสำหรับการค้นหาที่ซับซ้อน
SELECT * FROM Title WHERE Pub ID =
(SELECT pubID FROM Publishers WHERE Name = ‘MACMILLIAN’);

JOIN

JOIN ใช้สำหรับการดึงข้อมูลจาก 2 table ที่สัมพันธ์กับผ่านฟิลด์ร่วม ถ้าแถวของ table แรกแสดงตามฟิลด์ของ table ที่สอง ให้ใช้ ON clause ในคำสั่ง JOIN
SELECT Title.Title, Titles. [Year Published], Publishers.Name FROM Titles
INNER JOIN Publishers ON Titles.PubID = Publishers.PubID

การใช้ไวยากรณ์ tablename.fieldname เช่น Titles.PubID เมื่อชื่อฟิลด์มีอยู่ใน 2 table ที่เชื่อมกัน

นอกจากมี LEFT JOIN สำหรับการแสดงเรคคอร์ดของ table แรกทั้งหมดถึงแม้จะมีเรคคอร์ดของ table แรกมีค่าของฟิลด์ที่ไม่ตรงกับฟิลด์เชื่อมของ table ที่สอง
SELECT Titles.Title, Titles.[Year Published], Publishers.Name FROM Titles
LEFT JOIN Publishers ON Titles.PubID = Publishers.PubID;

RIGHT JOIN สำหรับการแสดงเรคคอร์ดของ table ที่สองทั้งหมด ถึงแม้ว่าจะมีเรคคอร์ดของ table ที่สองมีค่าของฟิลด์ที่ไม่ตรงกับฟิลด์เชื่อมของ table แรก

UNION

การนำ table 2 ต่อกัน สามารถทำได้โดยใช้คีย์เวิร์ด UNION
SELECT Name, Address, City FROM Customers
UNION SELECT CompanyName, Address, City FROM Suppliers

คำสั่ง Insert Into

คำสั่ง INERT INTO ใช้ในประโยคคำสั่งสำหรับการเพิ่มเรคคอร์ดใหม่

ไวยากรณ์
INERT INTO tablename [(fieldname1, fieldname2,...)]
VALUES (value1, value 2,...);
[ ] ตัวเลือก

หมายเหตุจำนวน value ต้องเท่ากับ fieldname
INERT INTO Authors (Author, [Year Born] VALUES (‘Frank Whale’, 1960);

คำสั่ง Update

คำสั่ง UPDATE ใช้ในประโยคคำสั่งสำหรับการปรับปรุงค่าในเรคคอร์ด

ไวยากรณ์
UPDATE tablename
SET fieldname = expression
WHERE [condition];
[ ] ตัวเลือก

UPDATE Authors SET [Year Born] = 1961 WHERE Author = ‘Frank Whale’;
              


 ที่มา http://www.snru.ac.th/tblog/wp-content/uploads/2010/03/SQT_WONGVIANL.pdf