พื้นฐานของภาษา SQL ประกอบด้วยตัวดำเนินการ ซึ่งแบ่งออกเป็นหลายกลุ่มตามเงื่อนไขตามฟังก์ชันที่พวกเขาทำ
กลุ่มคำสั่งต่อไปนี้สามารถแยกแยะได้ (ไม่ใช่ทุกคำสั่ง SQL ที่แสดงไว้):
คำสั่ง DDL (Data Definition Language) - คำสั่งสำหรับกำหนดวัตถุฐานข้อมูล
· สร้าง SCHEMA - สร้างสคีมาฐานข้อมูล
· DROP SHEMA - ลบสคีมาฐานข้อมูล
· สร้างตาราง - สร้างตาราง
ALTER TABLE - เปลี่ยนตาราง
· DROP TABLE - ลบตาราง
· สร้างโดเมน - สร้างโดเมน
เปลี่ยนโดเมน - เปลี่ยนโดเมน
· DROP DOMAIN - ลบโดเมน
· CREATE COLLATION - สร้างลำดับ
· DROP COLLATION - ลบลำดับ
· สร้างมุมมอง - สร้างมุมมอง
· DROP VIEW - ลบมุมมอง
ตัวดำเนินการ DML (Data Manipulation Language) - ตัวดำเนินการจัดการข้อมูล
· SELECT - เลือกแถวจากตาราง
INSERT - เพิ่มแถวลงในตาราง
· UPDATE - เปลี่ยนแถวในตาราง
· DELETE - ลบแถวในตาราง
กระทำ - กระทำ มีการเปลี่ยนแปลง
· ROLLBACK - ย้อนกลับการเปลี่ยนแปลงที่ทำ
ผู้ดำเนินการปกป้องและจัดการข้อมูล
· สร้างการยืนยัน - สร้างข้อจำกัด
· DROP ASSERION - ลบข้อจำกัด
· GRANT - ให้สิทธิ์แก่ผู้ใช้หรือแอปพลิเคชันเพื่อจัดการอ็อบเจ็กต์
REVOKE - เพิกถอนสิทธิ์ผู้ใช้หรือแอปพลิเคชัน
นอกจากนี้ ยังมีกลุ่มตัวดำเนินการสำหรับการตั้งค่าพารามิเตอร์เซสชัน รับข้อมูลเกี่ยวกับฐานข้อมูล ตัวดำเนินการ SQL แบบคงที่ และตัวดำเนินการ SQL แบบไดนามิก
สิ่งที่สำคัญที่สุดสำหรับผู้ใช้คือคำสั่งการจัดการข้อมูล (DML)
ตัวอย่างการใช้ตัวดำเนินการจัดการข้อมูล
INSERT - การแทรกแถวลงในตาราง
ตัวอย่างที่ 1- การแทรกหนึ่งแถวลงในตาราง:
ค่านิยม(4, "อีวานอฟ");
UPDATE - อัปเดตแถวในตาราง
ตัวอย่างที่ 3- อัปเดตหลายแถวในตาราง:
SET PNAME = "พุชนิคอฟ"
โดยที่ P.PNUM = 1;
DELETE - การลบแถวในตาราง
ตัวอย่างที่ 4- การลบหลายแถวในตาราง:
โดยที่ P.PNUM = 1;
ตัวอย่างการใช้คำสั่ง SELECT
จริงๆ แล้วคำสั่ง SELECT นั้นสำคัญที่สุดสำหรับผู้ใช้และสำคัญที่สุด ตัวดำเนินการที่ซับซ้อน SQL. มีไว้สำหรับดึงข้อมูลจากตารางเช่น ในความเป็นจริงมันใช้หนึ่งในวัตถุประสงค์หลักของฐานข้อมูล - เพื่อให้ข้อมูลแก่ผู้ใช้
คำสั่ง SELECT จะถูกดำเนินการเสมอกับบางตารางที่เป็นส่วนหนึ่งของฐานข้อมูล
ความคิดเห็น- ในความเป็นจริง ฐานข้อมูลไม่เพียงแต่มีตารางที่เก็บไว้อย่างถาวรเท่านั้น แต่ยังมีตารางชั่วคราวและสิ่งที่เรียกว่ามุมมองอีกด้วย มุมมองเป็นเพียงนิพจน์ SELECT ที่จัดเก็บไว้ในฐานข้อมูล จากมุมมองของผู้ใช้ มุมมองคือตารางที่ไม่ได้จัดเก็บอย่างถาวรในฐานข้อมูล แต่จะ "ปรากฏขึ้น" เมื่อมีการเข้าถึง จากมุมมองของคำสั่ง SELECT ทั้งตารางถาวรและตารางและมุมมองชั่วคราวจะมีลักษณะเหมือนกันทุกประการ แน่นอนว่า เมื่อระบบดำเนินการคำสั่ง SELECT จริงๆ ความแตกต่างระหว่างตารางที่เก็บไว้และมุมมองจะถูกนำมาพิจารณาด้วย แต่ความแตกต่างเหล่านี้ ที่ซ่อนอยู่จากผู้ใช้
ผลลัพธ์ของคำสั่ง SELECT จะเป็นตารางเสมอ ดังนั้นผลลัพธ์ของคำสั่ง SELECT จึงคล้ายคลึงกับตัวดำเนินการของพีชคณิตเชิงสัมพันธ์ ตัวดำเนินการพีชคณิตเชิงสัมพันธ์ใดๆ สามารถแสดงได้ ในลักษณะที่เหมาะสมกำหนดโดยคำสั่ง SELECT ความซับซ้อนของคำสั่ง SELECT นั้นถูกกำหนดโดยข้อเท็จจริงที่ว่ามันมีความสามารถทั้งหมดของพีชคณิตเชิงสัมพันธ์ เช่นเดียวกับ คุณสมบัติเพิ่มเติมซึ่งใน พีชคณิตเชิงสัมพันธ์เลขที่
คำสั่งการดำเนินการคำสั่ง SELECT
เพื่อทำความเข้าใจว่าผลลัพธ์ของการดำเนินการคำสั่ง SELECT ได้มาอย่างไร ให้พิจารณาแผนภาพแนวคิดของการดำเนินการ โครงการนี้เป็นแนวคิดล้วนๆ เพราะ รับประกันว่าผลลัพธ์จะเหมือนกับการทำทีละขั้นตอนตามโครงร่างนี้ ในความเป็นจริง ผลลัพธ์ที่แท้จริงจะได้มาจากอัลกอริธึมที่ซับซ้อนมากขึ้นซึ่ง DBMS หนึ่งๆ “เป็นเจ้าของ”
ขั้นตอนที่ 1: การดำเนินการคำสั่ง SELECT เดียว
หากผู้ดำเนินการประกอบด้วย คำหลัก UNION, EXCEPT และ INTERSECT จากนั้นแบบสอบถามจะถูกแบ่งออกเป็นแบบสอบถามอิสระหลายรายการ ซึ่งแต่ละแบบสอบถามจะดำเนินการแยกกัน:
ขั้นตอนที่ 1 (จาก)- ผลคูณคาร์ทีเซียนโดยตรงของตารางทั้งหมดที่ระบุในส่วนคำสั่ง FROM ที่ต้องการจะถูกคำนวณ จากขั้นตอนที่ 1 เราได้รับตาราง A
ขั้นตอนที่ 2 (ที่ไหน)- หากมีส่วนคำสั่ง WHERE ในคำสั่ง SELECT ตาราง A ที่ได้รับในขั้นตอนที่ 1 จะถูกสแกน นิพจน์เงื่อนไขที่กำหนดในส่วนคำสั่ง WHERE จะถูกประเมินสำหรับแต่ละแถวจากตาราง A เฉพาะแถวที่นิพจน์เงื่อนไขส่งคืนเท่านั้น ค่าจริงรวมอยู่ในผลลัพธ์ด้วย หากละเว้นส่วนคำสั่ง WHERE ให้ไปที่ขั้นตอนที่ 3 โดยตรง หากนิพจน์แบบมีเงื่อนไขเกี่ยวข้องกับเคียวรีย่อยที่ซ้อนกัน จะถูกประเมินตามสคีมาแนวคิดนี้ จากขั้นตอนที่ 2 เราได้ตาราง B
ขั้นตอนที่ 3 (จัดกลุ่มตาม)- หากมี GROUP BY clause อยู่ในคำสั่ง SELECT แถวของตาราง B ที่ได้รับในขั้นตอนที่สองจะถูกจัดกลุ่มตามรายการการจัดกลุ่มที่ระบุไว้ใน GROUP BY clause หากละเว้น GROUP BY clause ให้ตรงไปที่ขั้นตอนที่ 4 จากขั้นตอนที่ 3 เราจะได้ตาราง C
ขั้นตอนที่ 4 (มี)- หากคำสั่ง SELECT มีคำสั่งย่อย HAVING ดังนั้นกลุ่มที่ไม่เป็นไปตามนิพจน์เงื่อนไขที่กำหนดในคำสั่งย่อย HAVING จะถูกแยกออก หากละเว้นส่วน HAVING ให้ตรงไปยังขั้นตอนที่ 5 จากขั้นตอนที่ 4 เราจะได้ตาราง D
ขั้นตอนที่ 5 (เลือก)- แต่ละกลุ่มที่ได้รับในขั้นตอนที่ 4 จะสร้างแถวผลลัพธ์หนึ่งแถวดังนี้ นิพจน์สเกลาร์ทั้งหมดที่ระบุในส่วนคำสั่ง SELECT จะได้รับการประเมิน ตามกฎสำหรับการใช้ GROUP BY clause นิพจน์สเกลาร์ดังกล่าวจะต้องเหมือนกันสำหรับทุกแถวภายในแต่ละกลุ่ม สำหรับแต่ละกลุ่ม จะมีการคำนวณค่าของฟังก์ชันรวมที่ระบุในส่วน SELECT หากไม่มี GROUP BY clause แต่มี SELECT clause ฟังก์ชันรวมก็ถือว่ามีกลุ่มเดียวเท่านั้น หากไม่มีทั้งส่วนคำสั่ง GROUP BY หรือฟังก์ชันการรวม จะถือว่ามีจำนวนกลุ่มมากเท่ากับจำนวนแถวที่เลือกไว้ ในขณะนี้- จากผลลัพธ์ของขั้นตอนที่ 5 เราได้ตาราง E ซึ่งมีคอลัมน์มากเท่าที่มีองค์ประกอบแสดงอยู่ในส่วน SELECT และเลือกแถวได้มากเท่ากลุ่ม
ขั้นตอนที่ 2 การดำเนินการ UNION, EXCEPT, INTERSECT
หากคำสั่ง SELECT มีคีย์เวิร์ด UNION, EXCEPT และ INTERSECT ตารางที่เป็นผลลัพธ์จากระยะที่ 1 จะถูกผสาน ลบ หรือตัดกัน
ขั้นตอนที่ 3 การเรียงลำดับผลลัพธ์
หากคำสั่ง SELECT มีคำสั่งย่อย ORDER BY แถวของตารางที่ได้รับในขั้นตอนก่อนหน้านี้จะถูกเรียงลำดับตามรายการเรียงลำดับที่ให้ไว้ในคำสั่งย่อย ORDER BY
ในส่วนแรก เราได้สัมผัสภาษา DML เพียงเล็กน้อยแล้ว โดยใช้คำสั่งเกือบทั้งหมด ยกเว้นคำสั่ง MERGEฉันจะพูดถึง DML ตามลำดับของฉันเองซึ่งพัฒนาจากประสบการณ์ส่วนตัว ระหว่างทาง ฉันจะพยายามพูดถึงสถานที่ที่ "ลื่น" ที่ควรค่าแก่การมุ่งเน้น สถานที่ "ลื่น" เหล่านี้มีความคล้ายคลึงกันในภาษาท้องถิ่นหลายภาษาของ SQL
เพราะ หนังสือเรียนนี้มีไว้สำหรับผู้อ่านที่หลากหลาย (ไม่เพียง แต่โปรแกรมเมอร์เท่านั้น) ดังนั้นบางครั้งคำอธิบายก็เหมาะสมเช่น ยาวและน่าเบื่อ นี่คือวิสัยทัศน์ของฉันเกี่ยวกับเนื้อหา ซึ่งส่วนใหญ่ได้รับในทางปฏิบัติอันเป็นผลมาจากกิจกรรมทางวิชาชีพ
เป้าหมายหลัก หนังสือเรียนเล่มนี้ทีละขั้นตอนพัฒนาความเข้าใจที่สมบูรณ์เกี่ยวกับสาระสำคัญของภาษา SQL และสอนวิธีใช้โครงสร้างอย่างถูกต้อง ผู้เชี่ยวชาญในสาขานี้อาจสนใจที่จะอ่านเนื้อหานี้ บางทีพวกเขาอาจจะสามารถเรียนรู้สิ่งใหม่ๆ สำหรับตัวเอง หรือบางทีมันอาจจะมีประโยชน์ในการอ่านเพื่อฟื้นฟูความทรงจำ ฉันหวังว่าทุกคนจะพบว่ามันน่าสนใจ
เพราะ DML ในภาษาถิ่นฐานข้อมูล MS SQL มีความสัมพันธ์อย่างใกล้ชิดกับไวยากรณ์ของโครงสร้าง SELECT ดังนั้นฉันจะเริ่มพูดถึง DML ด้วย ในความคิดของฉัน โครงสร้าง SELECT เป็นโครงสร้างที่สำคัญที่สุดในภาษา DML เพราะ เนื่องจากข้อมูลหรือชิ้นส่วนข้อมูลที่จำเป็นจึงถูกดึงมาจากฐานข้อมูล
ภาษา DML มีโครงสร้างดังต่อไปนี้:
- เลือก – การเลือกข้อมูล
- INSERT – การแทรกข้อมูลใหม่
- อัปเดต – อัปเดตข้อมูล
- DELETE – การลบข้อมูล
- MERGE – การรวมข้อมูล
ในส่วนนี้ เราจะดูเฉพาะไวยากรณ์พื้นฐานของคำสั่ง SELECT ซึ่งมีลักษณะดังนี้:
เลือก column_list หรือ * จากแหล่งที่มา โดยที่ตัวกรอง ORDER BY sort_expression
หัวข้อของคำสั่ง SELECT นั้นกว้างมาก ดังนั้นในส่วนนี้ ฉันจะเน้นเฉพาะโครงสร้างพื้นฐานเท่านั้น ฉันเชื่อว่าหากไม่รู้พื้นฐานดีพอ คุณจะไม่สามารถเริ่มศึกษาโครงสร้างที่ซับซ้อนกว่านี้ได้ เพราะ... จากนั้นทุกอย่างจะหมุนรอบการออกแบบพื้นฐานนี้ (แบบสอบถามย่อย การรวม ฯลฯ)
นอกจากนี้ ในส่วนนี้ ฉันจะพูดถึงข้อเสนอ TOP ด้วย ฉันไม่ได้ตั้งใจระบุประโยคนี้ในรูปแบบพื้นฐานเพราะ... มันถูกนำไปใช้แตกต่างกันในภาษา SQL ที่ต่างกัน
หากภาษา DDL มีความคงที่มากกว่านี้ เช่น ด้วยความช่วยเหลือ โครงสร้างที่เข้มงวดจะถูกสร้างขึ้น (ตาราง ความสัมพันธ์ ฯลฯ) จากนั้นภาษา DML มีลักษณะเป็นไดนามิก ที่นี่คุณจะได้รับผลลัพธ์ที่ถูกต้องในรูปแบบต่างๆ
การฝึกอบรมจะดำเนินต่อไปในโหมดทีละขั้นตอน เช่น เมื่ออ่านคุณควรพยายามทำตัวอย่างด้วยมือของคุณเองทันที จากนั้นคุณวิเคราะห์ผลลัพธ์ที่ได้รับและพยายามทำความเข้าใจอย่างสังหรณ์ใจ หากมีบางสิ่งยังไม่ชัดเจน เช่น ความหมายของฟังก์ชัน ให้ขอความช่วยเหลือจากอินเทอร์เน็ต
ตัวอย่างจะแสดงอยู่ในฐานข้อมูล Test ซึ่งสร้างขึ้นโดยใช้ DDL+DML ในส่วนแรก
สำหรับผู้ที่ไม่ได้สร้างฐานข้อมูลในส่วนแรก (เนื่องจากไม่ใช่ทุกคนอาจสนใจภาษา DDL) จึงสามารถใช้สคริปต์ต่อไปนี้:
ทดสอบสคริปต์สร้างฐานข้อมูล
การสร้างฐานข้อมูล CREATE DATABASE Test GO - ทำให้ฐานข้อมูล Test ปัจจุบัน USE Test GO - สร้างตารางอ้างอิง CREATE TABLE Positions(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Positions คีย์หลัก, ชื่อ nvarchar(30) ไม่เป็นโมฆะ) สร้างแผนกตาราง (ID int IDENTITY(1,1) ไม่เป็นโมฆะข้อจำกัด PK_แผนกคีย์หลัก ชื่อ nvarchar(30) ไม่เป็นโมฆะ) GO -- กรอกตารางอ้างอิงด้วยข้อมูล SET IDENTITY_INSERT ตำแหน่งบน INSERT ตำแหน่ง ( ID,ชื่อ)ค่า (1,N"นักบัญชี"), (2,N"ผู้อำนวยการ"), (3,N"โปรแกรมเมอร์"), (4,N"โปรแกรมเมอร์อาวุโส") SET IDENTITY_INSERT ตำแหน่ง OFF GO SET IDENTITY_INSERT แผนก ON INSERT แผนก(ID,ชื่อ)ค่า (1,N"การบริหาร"), (2,N"การบัญชี"), (3,N"IT") SET IDENTITY_INSERT แผนก OFF GO -- สร้างตารางที่มีพนักงาน สร้างตาราง พนักงาน (ID int ไม่เป็น NULL, ชื่อ nvarchar (30), วันเกิด, อีเมล nvarchar (30), PositionID int, DepartmentID int, วันที่จ้างงาน ไม่ใช่ NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME(), ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (ID), CONSTRAINT FK_Employees_DepartmentID คีย์ต่างประเทศ (ID แผนก) การอ้างอิงแผนก (ID), CONSTRAINT FK_Employees_PositionID คีย์ต่างประเทศ (ID ตำแหน่ง) ตำแหน่งอ้างอิง (ID), CONSTRAINT FK_Employees_ManagerID คีย์ต่างประเทศ (ID ผู้จัดการ) การอ้างอิงพนักงาน (ID), CONSTRAINT s_Email UNIQUE (อีเมล), ข้อ จำกัด CK_Emp loyees_ID CHECK (ID ระหว่าง 1,000 ถึง 1999), INDEX IDX_Employees_Name(ชื่อ)) GO -- กรอกข้อมูลด้วย INSERT Employees (ID,Name,Birthday,Email,PositionID,DepartmentID,ManagerID)VALUES (1000,N"Ivanov I.I.","19550219 , " [ป้องกันอีเมล]",2,1,NULL), (1001,N"เปตรอฟ พี.พี.","19831203"," [ป้องกันอีเมล]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [ป้องกันอีเมล]",1,2,1000), (1003,น"อันดรีฟ เอ.เอ.","19820417"," [ป้องกันอีเมล]",4,3,1000)
เพียงเท่านี้เราก็พร้อมที่จะเริ่มเรียนรู้ภาษา DML แล้ว
SELECT – ตัวดำเนินการเลือกข้อมูล
ก่อนอื่น สำหรับตัวแก้ไขแบบสอบถามที่ใช้งานอยู่ ให้ทำการทดสอบฐานข้อมูลปัจจุบันโดยเลือกฐานข้อมูลในรายการแบบเลื่อนลงหรือใช้คำสั่ง "USE Test"เริ่มจากรูปแบบพื้นฐานที่สุดของ SELECT:
เลือก * จากพนักงาน
ในแบบสอบถามนี้ เราขอให้ส่งคืนคอลัมน์ทั้งหมด (ระบุด้วย "*") จากตารางพนักงาน - คุณสามารถอ่านได้ว่า "เลือก all_fields จากตารางพนักงาน" หากมีดัชนีแบบคลัสเตอร์ ข้อมูลที่ส่งคืนมักจะเรียงลำดับตามนั้น ในกรณีนี้ตามคอลัมน์ ID (แต่สิ่งนี้ไม่สำคัญ เนื่องจากในกรณีส่วนใหญ่ เราจะระบุการเรียงลำดับใน อย่างชัดเจนตัวคุณเองโดยใช้ ORDER BY ...):
บัตรประจำตัวประชาชน | ชื่อ | วันเกิด | อีเมล | รหัสตำแหน่ง | รหัสแผนก | HireDate | รหัสผู้จัดการ |
---|---|---|---|---|---|---|---|
1000 | อีวานอฟ ไอ.ไอ. | 1955-02-19 | [ป้องกันอีเมล] | 2 | 1 | 2015-04-08 | โมฆะ |
1001 | เปตรอฟ พี.พี. | 1983-12-03 | [ป้องกันอีเมล] | 3 | 3 | 2015-04-08 | 1003 |
1002 | ซิโดรอฟ เอส.เอส. | 1976-06-07 | [ป้องกันอีเมล] | 1 | 2 | 2015-04-08 | 1000 |
1003 | Andreev A.A. | 1982-04-17 | [ป้องกันอีเมล] | 4 | 3 | 2015-04-08 | 1000 |
โดยทั่วไปเป็นเรื่องที่ควรค่าแก่การบอกว่าในภาษา MS SQL มากที่สุด รูปแบบที่เรียบง่าย เลือกแบบสอบถามอาจไม่มีบล็อก FROM ซึ่งในกรณีนี้คุณสามารถใช้เพื่อรับค่าบางอย่างได้:
SELECT 5550/100*15, SYSDATETIME() - รับวันที่ของระบบฐานข้อมูล SIN(0)+COS(0)
(ไม่มีชื่อคอลัมน์) | (ไม่มีชื่อคอลัมน์) | (ไม่มีชื่อคอลัมน์) |
---|---|---|
825 | 2015-04-11 12:12:36.0406743 | 1 |
โปรดทราบว่านิพจน์ (5550/100*15) ให้ผลลัพธ์ 825 แม้ว่าเราจะคำนวณด้วยเครื่องคิดเลข ค่าก็จะเป็น (832.5) ผลลัพธ์ที่ได้คือ 825 เนื่องจากในนิพจน์ของเราตัวเลขทั้งหมดเป็นจำนวนเต็ม ดังนั้นผลลัพธ์จึงเป็นจำนวนเต็ม เช่น (5550/100) ให้ 55 ไม่ใช่ (55.5)
โปรดจำไว้ว่าตรรกะต่อไปนี้ใช้งานได้ใน MS SQL:
- ทั้งหมด / ทั้งหมด = ทั้งหมด (เช่นในกรณีนี้มี การหารจำนวนเต็ม)
- จริง / จำนวนเต็ม = จริง
- จำนวนเต็ม / จริง = จริง
เลือก 123/10, -- 12 123./10, -- 12.3 123/10 --12.3
ในที่นี้ (123.) = (123.0) ในกรณีนี้ 0 สามารถละทิ้งได้ และเหลือเพียงจุดเท่านั้น
กับคนอื่นๆ การดำเนินการทางคณิตศาสตร์ใช้ตรรกะเดียวกัน เพียงแต่ว่าในกรณีของการแบ่งความแตกต่างเล็กน้อยนี้มีความเกี่ยวข้องมากกว่า
ดังนั้นควรใส่ใจกับประเภทข้อมูล คอลัมน์ตัวเลข- หากเป็นจำนวนเต็มและคุณต้องการผลลัพธ์ที่แท้จริง ให้ใช้การแปลงหรือใส่จุดหลังตัวเลขที่ระบุเป็นค่าคงที่ (123.)
คุณสามารถใช้ฟังก์ชัน CAST หรือ CONVERT เพื่อแปลงฟิลด์ได้ ตัวอย่างเช่น ลองใช้ช่อง ID ซึ่งเป็นประเภท int:
SELECT ID, ID/100, -- การหารจำนวนเต็มจะเกิดขึ้นที่นี่ CAST(ID AS float)/100, -- ใช้ฟังก์ชัน CAST เพื่อแปลงเป็น ประเภทลอย CONVERT(float,ID)/100, -- ใช้ฟังก์ชัน CONVERT เพื่อแปลงเป็น float ID/100 -- ใช้การแปลงโดยระบุว่าตัวส่วนเป็นจำนวนจริงจากพนักงาน
บัตรประจำตัวประชาชน | (ไม่มีชื่อคอลัมน์) | (ไม่มีชื่อคอลัมน์) | (ไม่มีชื่อคอลัมน์) | (ไม่มีชื่อคอลัมน์) |
---|---|---|---|---|
1000 | 10 | 10 | 10 | 10.000000 |
1001 | 10 | 10.01 | 10.01 | 10.010000 |
1002 | 10 | 10.02 | 10.02 | 10.020000 |
1003 | 10 | 10.03 | 10.03 | 10.030000 |
เพียงแค่บันทึกในฐานข้อมูล ORACLE ไม่สามารถยอมรับไวยากรณ์ที่ไม่มีบล็อก FROM ได้ เพื่อจุดประสงค์นี้ จะใช้ตารางระบบ DUAL ซึ่งมีหนึ่งบรรทัด:SELECT 5550/100*15, -- และใน ORACLE ผลลัพธ์จะเท่ากับ 832.5 sysdate, sin(0)+cos(0) FROM DUAL
บันทึก.ชื่อตารางใน RDB หลายรายการอาจนำหน้าด้วยชื่อสคีมา:SELECT * FROM dbo.Employees -- dbo – ชื่อสคีมา
สคีมาเป็นหน่วยทางลอจิคัลของฐานข้อมูลซึ่งมีชื่อเป็นของตัวเอง และช่วยให้คุณสามารถจัดกลุ่มอ็อบเจ็กต์ฐานข้อมูล เช่น ตาราง มุมมอง ฯลฯ ภายในตัวมันเองได้
คำจำกัดความของสคีมาในฐานข้อมูลที่แตกต่างกันอาจแตกต่างกัน ในบางกรณี สคีมาจะเกี่ยวข้องโดยตรงกับผู้ใช้ฐานข้อมูล เช่น ในกรณีนี้ เราสามารถพูดได้ว่าสคีมาและผู้ใช้เป็นคำพ้องความหมาย และวัตถุทั้งหมดที่สร้างขึ้นในสคีมานั้นเป็นวัตถุโดยพื้นฐานแล้ว ผู้ใช้ที่กำหนด- ใน MS SQL สคีมาเป็นหน่วยลอจิคัลอิสระที่สามารถสร้างได้ด้วยตัวเอง (ดู CREATE SCHEMA)
ตามค่าเริ่มต้น สคีมาหนึ่งจะถูกสร้างขึ้นในฐานข้อมูล MS SQL ด้วยชื่อ dbo (เจ้าของฐานข้อมูล) และออบเจ็กต์ที่สร้างขึ้นทั้งหมดจะถูกสร้างขึ้นตามค่าเริ่มต้นในสคีมานี้ ดังนั้น หากเราระบุชื่อของตารางในการสืบค้น ตารางนั้นก็จะถูกค้นหาใน dbo schema ของฐานข้อมูลปัจจุบัน หากเราต้องการสร้างวัตถุในสคีมาเฉพาะ เราจะต้องเติมชื่อวัตถุด้วยชื่อสคีมา เช่น “CREATE TABLE schema_name.table_name(...)”
ในกรณีของ MS SQL ชื่อสคีมาอาจนำหน้าด้วยชื่อของฐานข้อมูลที่มีสคีมาอยู่:
เลือก * จาก Test.dbo.Employees --database_name.schema_name.table
คำชี้แจงนี้จะมีประโยชน์ ตัวอย่างเช่น หาก:สคีมาเป็นเครื่องมือที่สะดวกมากซึ่งมีประโยชน์ในการพัฒนาสถาปัตยกรรมฐานข้อมูล โดยเฉพาะฐานข้อมูลขนาดใหญ่
- ในคำขอเดียวเราเข้าถึงวัตถุที่อยู่ในนั้น แผนการที่แตกต่างกันหรือฐานข้อมูล
- คุณต้องถ่ายโอนข้อมูลจากสคีมาหรือฐานข้อมูลหนึ่งไปยังอีกสคีมาหรือฐานข้อมูลอื่น
- เมื่ออยู่ในฐานข้อมูลเดียว คุณจะต้องขอข้อมูลจากฐานข้อมูลอื่น
- ฯลฯ
นอกจากนี้ อย่าลืมว่าในข้อความคำขอ เราสามารถใช้ความคิดเห็นทั้งบรรทัดเดียว “-- ... ” และความคิดเห็นหลายบรรทัด “/* ... */” หากคำขอมีขนาดใหญ่และซับซ้อน ความคิดเห็นสามารถช่วยให้คุณหรือบุคคลอื่นจดจำหรือเข้าใจโครงสร้างของคำขอได้อย่างมาก
หากมีคอลัมน์จำนวนมากในตาราง และโดยเฉพาะอย่างยิ่งหากยังมีแถวจำนวนมากในตาราง บวกกับหากเรากำลังทำการสืบค้นไปยังฐานข้อมูลผ่านเครือข่าย ก็ควรจะเลือกด้วยรายการโดยตรงของ ฟิลด์ที่คุณต้องการ คั่นด้วยเครื่องหมายจุลภาค:
เลือก ID ชื่อจากพนักงาน
เหล่านั้น. ที่นี่เราบอกว่าเราเพียงต้องส่งคืนฟิลด์ ID และชื่อจากตารางเท่านั้น ผลลัพธ์จะเป็นดังนี้ (โดยวิธีการเพิ่มประสิทธิภาพที่นี่ตัดสินใจใช้ดัชนีที่สร้างโดยฟิลด์ชื่อ):
บัตรประจำตัวประชาชน | ชื่อ |
---|---|
1003 | Andreev A.A. |
1000 | อีวานอฟ ไอ.ไอ. |
1001 | เปตรอฟ พี.พี. |
1002 | ซิโดรอฟ เอส.เอส. |
เพียงแค่บันทึกบางครั้งการดูวิธีการดึงข้อมูลอาจมีประโยชน์ เช่น การค้นหาว่ามีการใช้ดัชนีใดบ้าง ซึ่งสามารถทำได้โดยคลิกปุ่ม “แสดงแผนการดำเนินการโดยประมาณ” หรือตั้งค่า “รวมแผนการดำเนินการจริง” (ในกรณีนี้เราจะสามารถดูได้ แผนที่แท้จริงตามลำดับ หลังจากดำเนินการตามคำขอแล้วเท่านั้น):การวิเคราะห์แผนการดำเนินการมีประโยชน์มากเมื่อปรับแบบสอบถามให้เหมาะสม ช่วยให้คุณค้นหาดัชนีที่ขาดหายไปหรือดัชนีใดที่ไม่ได้ใช้เลยและสามารถลบออกได้
หากคุณเพิ่งเริ่มเรียนรู้ DML ตอนนี้สิ่งนี้ไม่สำคัญสำหรับคุณ เพียงจดไว้และคุณสามารถลืมมันได้อย่างปลอดภัย (บางทีคุณอาจไม่ต้องการมันเลย) - เป้าหมายเริ่มแรกของเราคือการเรียนรู้พื้นฐานของภาษา DML และ เรียนรู้วิธีใช้อย่างถูกต้อง และการเพิ่มประสิทธิภาพเป็นศิลปะที่แยกจากกันอยู่แล้ว บางครั้ง สิ่งที่สำคัญกว่านั้นคือคุณเพียงแค่มีคำถามที่เขียนอย่างถูกต้องซึ่งส่งคืนผลลัพธ์ที่ถูกต้องจากมุมมองของหัวเรื่อง และบุคคลแต่ละคนก็ได้ปรับให้เหมาะสมแล้ว ขั้นแรก คุณต้องเรียนรู้วิธีเขียนแบบสอบถามอย่างถูกต้อง โดยใช้วิธีใดก็ได้เพื่อให้บรรลุเป้าหมาย เป้าหมายหลักที่คุณต้องบรรลุในตอนนี้คือเพื่อให้ข้อความค้นหาของคุณแสดงผลลัพธ์ที่ถูกต้อง
การตั้งค่านามแฝงของตาราง
เมื่อแสดงรายการคอลัมน์ สามารถนำหน้าด้วยชื่อของตารางที่อยู่ในบล็อก FROM:เลือก Employees.ID, Employees.Name จากพนักงาน
แต่ไวยากรณ์นี้มักจะใช้งานไม่สะดวกเพราะว่า ชื่อตารางอาจยาวได้ เพื่อวัตถุประสงค์เหล่านี้ โดยปกติจะระบุและใช้ชื่อที่สั้นกว่า - นามแฝง:
เลือก emp.ID,emp.Name จากพนักงาน AS emp
หรือ
SELECT emp.ID,emp.Name จาก Employees emp -- สามารถละคีย์เวิร์ด AS ได้ (ฉันชอบตัวเลือกนี้มากกว่า)
emp ในที่นี้คือนามแฝงสำหรับตารางพนักงานที่สามารถใช้ในบริบทของคำสั่ง SELECT นี้ เหล่านั้น. เราสามารถพูดได้ว่าในบริบทของคำสั่ง SELECT นี้ เราจะตั้งชื่อใหม่ให้กับตาราง
แน่นอน ในกรณีนี้ ผลลัพธ์การสืบค้นจะเหมือนกับ "SELECT ID,Name FROM Employees" ทุกประการ เหตุใดจึงจำเป็นจะชัดเจนในภายหลัง (ไม่แม้แต่ในส่วนนี้) สำหรับตอนนี้เราเพียงจำไว้ว่าชื่อคอลัมน์สามารถนำหน้า (ชี้แจง) ได้โดยตรงด้วยชื่อตารางหรือใช้นามแฝง ที่นี่คุณสามารถใช้หนึ่งในสองสิ่งนั่นคือ หากคุณตั้งชื่อแทน คุณจะต้องใช้ชื่อนั้น แต่คุณไม่สามารถใช้ชื่อตารางได้อีกต่อไป
เพียงแค่บันทึกใน ORACLE อนุญาตเฉพาะตัวเลือกในการระบุนามแฝงของตารางโดยไม่มีคีย์เวิร์ด AS เท่านั้น
DISTINCT – ละทิ้งแถวที่ซ้ำกัน
คำสำคัญ DISTINCT ใช้เพื่อละทิ้งแถวที่ซ้ำกันออกจากผลลัพธ์แบบสอบถาม โดยคร่าวๆ ลองจินตนาการว่าดำเนินการค้นหาโดยไม่มีตัวเลือก DISTINCT ก่อน จากนั้นจึงละทิ้งรายการที่ซ้ำกันทั้งหมดออกจากผลลัพธ์ ให้เราสาธิตสิ่งนี้เพื่อความชัดเจนยิ่งขึ้นโดยใช้ตัวอย่าง:มาสร้างตารางชั่วคราวสำหรับการสาธิต สร้างตาราง #Trash(ID int NOT NULL PRIMARY KEY, Col1 varchar(10), Col2 varchar(10), Col3 varchar(10)) - fill ตารางนี้ขยะทุกประเภท INSERT #Trash(ID,Col1,Col2,Col3)VALUES (1,"A", "A", "A"), (2,"A", "B", "C"), ( 3, "C", "A", "B"), (4, "A", "A", "B"), (5, "B", "B", "B"), (6, "ก", "ก", "ข", (7, "ก", "ก", "ก"), (8, "ค", "ก", "ข"), (9, "ค , "A", "B"), (10, "A", "A", "B"), (11, "A", NULL, "B"), (12, "A", NULL, "B ") -- มาดูกันว่าแบบสอบถามส่งคืนอะไรโดยไม่มีตัวเลือก DISTINCT SELECT Col1,Col2,Col3 FROM #Trash -- มาดูกันว่าแบบสอบถามส่งคืนอะไรด้วยตัวเลือก DISTINCT SELECT DISTINCT Col1,Col2,Col3 FROM #Trash -- ลบ ตารางชั่วคราว DROP TABLE #Trash
สายตาจะมีลักษณะเช่นนี้ (รายการที่ซ้ำกันทั้งหมดจะถูกทำเครื่องหมายด้วยสีเดียวกัน):
ตอนนี้เรามาดูกันว่าสิ่งนี้สามารถนำไปใช้ได้ที่ไหน โดยใช้ตัวอย่างที่เป็นประโยชน์มากขึ้น - เราจะส่งคืนเฉพาะตัวระบุแผนกที่ไม่ซ้ำกันจากตารางพนักงาน (เช่น เราจะค้นหา ID ของแผนกที่พนักงานลงทะเบียนไว้):
เลือก DepartmentID ที่แตกต่างจากพนักงาน
ที่นี่เรามี 4 บรรทัดเพราะ... ไม่มีชุดค่าผสมที่ซ้ำกัน (DepartmentID, PositionID) ในตารางของเรา
กลับมาที่ DDL กันสักครู่
เนื่องจากเราเริ่มจะหมดข้อมูลสำหรับตัวอย่างการสาธิต และเราต้องการพูดคุยให้ครอบคลุมและชัดเจนยิ่งขึ้น เรามาขยายตาราง Employess ของเรากันสักหน่อย นอกจากนี้ จำ DDL เล็กๆ น้อยๆ ดังที่พวกเขาพูดว่า “การทำซ้ำเป็นบ่อเกิดของการเรียนรู้” และอีกอย่าง เรามากระโดดไปข้างหน้าอีกครั้งและใช้คำสั่ง UPDATE:เราสร้างคอลัมน์ใหม่ ALTER TABLE Employees ADD LastName nvarchar(30), -- นามสกุล FirstName nvarchar(30), -- ชื่อจริง MiddleName nvarchar(30), -- ชื่อกลาง เงินเดือนลอยตัว, -- และเงินเดือนแน่นอนในบางหน่วย BonusPercent float -- เปอร์เซ็นต์สำหรับการคำนวณโบนัสจากเงินเดือน GO -- กรอกข้อมูล (ข้อมูลบางส่วนถูกละเว้นโดยเจตนา) อัปเดตพนักงาน SET LastName=N"Ivanov", FirstName=N"Ivan", MiddleName=N"Ivanovich", เงินเดือน=5,000 เปอร์เซ็นต์โบนัส= 50 โดยที่ ID=1,000 -- Ivanov I.I. อัพเดท พนักงาน SET LastName=N"Petrov",FirstName=N"Petr",MiddleName=N"Petrovich", เงินเดือน=1500,BonusPercent= 15 WHERE ID=1001 -- Petrov P.P. อัปเดตพนักงาน SET LastName=N"Sidor",FirstName=N"Sidor",MiddleName=NULL, เงินเดือน=2500,BonusPercent=NULL WHERE ID=1002 -- Sidorov S.S. อัปเดตพนักงาน SET LastName=N"Andreev",FirstName=N"Andrey",MiddleName=NULL, เงินเดือน=2000,BonusPercent= 30 WHERE ID=1003 -- Andreev A.A.
ตรวจสอบให้แน่ใจว่าข้อมูลได้รับการอัปเดตเรียบร้อยแล้ว:
เลือก * จากพนักงาน
บัตรประจำตัวประชาชน | ชื่อ | … | นามสกุล | ชื่อ | ชื่อกลาง | เงินเดือน | โบนัสเปอร์เซ็นต์ |
---|---|---|---|---|---|---|---|
1000 | อีวานอฟ ไอ.ไอ. | อีวานอฟ | อีวาน | อิวาโนวิช | 5000 | 50 | |
1001 | เปตรอฟ พี.พี. | เปตรอฟ | ปีเตอร์ | เปโตรวิช | 1500 | 15 | |
1002 | ซิโดรอฟ เอส.เอส. | ซิโดรอฟ | ซีดอร์ | โมฆะ | 2500 | โมฆะ | |
1003 | Andreev A.A. | อันดรีฟ | อันเดรย์ | โมฆะ | 2000 | 30 |
การตั้งค่านามแฝงสำหรับคอลัมน์แบบสอบถาม
ฉันคิดว่าการแสดงที่นี่ง่ายกว่าการเขียน:SELECT -- ตั้งชื่อให้กับคอลัมน์จากการคำนวณ LastName+" "+FirstName+" "+MiddleName AS Full Name, -- การใช้งาน เครื่องหมายคำพูดคู่, เพราะ มีการใช้ช่องว่าง HireDate AS "วันที่รับ" -- การใช้วงเล็บเหลี่ยม เพราะ ใช้พื้นที่วันเกิด AS [ วันเกิด], -- คำว่า AS ไม่จำเป็น เงินเดือน ZP จากพนักงาน
ชื่อเต็ม | วันที่รับสมัคร | วันเกิด | ซีพี |
---|---|---|---|
อีวานอฟ อีวาน อิวาโนวิช | 2015-04-08 | 1955-02-19 | 5000 |
เปตรอฟ เปตรอฟ เปโตรวิช | 2015-04-08 | 1983-12-03 | 1500 |
โมฆะ | 2015-04-08 | 1976-06-07 | 2500 |
โมฆะ | 2015-04-08 | 1982-04-17 | 2000 |
ดังที่เราเห็น นามแฝงของคอลัมน์ที่เราระบุจะแสดงอยู่ในส่วนหัวของตารางผลลัพธ์ จริงๆ แล้ว นี่คือจุดประสงค์หลักของชื่อแทนคอลัมน์
โปรดทราบ เพราะ. พนักงาน 2 คนสุดท้ายไม่ได้ระบุชื่อกลาง (ค่า NULL) ดังนั้นผลลัพธ์ของนิพจน์ “LastName+” "+FirstName+" "+MiddleName" ก็ส่งคืน NULL มาให้เราเช่นกัน
หากต้องการรวม (เพิ่ม, ต่อ) สตริงใน MS SQL จะใช้สัญลักษณ์ “+”
โปรดจำไว้ว่านิพจน์ทั้งหมดที่เกี่ยวข้องกับ NULL (เช่น หารด้วย NULL และบวกด้วย NULL) จะส่งคืนค่า NULL
เพียงแค่บันทึก
ในกรณีของ ORACLE ตัวดำเนินการ “||” จะใช้ในการเชื่อมสตริงเข้าด้วยกัน และการต่อข้อมูลจะเป็น "||FirstName||" สำหรับ ORACLE เป็นที่น่าสังเกตว่ามีไว้เพื่อ ประเภทสตริงมีข้อยกเว้นสำหรับพวกเขา NULL และสตริงว่าง "" เป็นสิ่งเดียวกันดังนั้นใน ORACLE นิพจน์ดังกล่าวจะกลับมาสำหรับพนักงาน 2 คนสุดท้าย "Sidorov Sidor" และ "Andrey Andreev" สักครู่ เวอร์ชันของออราเคิล 12c เท่าที่ฉันรู้ ไม่มีตัวเลือกที่จะเปลี่ยนแปลงพฤติกรรมนี้ (หากฉันผิด โปรดแก้ไขให้ฉันด้วย) ตรงนี้มันยากสำหรับฉันที่จะตัดสินว่าสิ่งนี้ดีหรือไม่ดี เพราะ... ในบางกรณี ลักษณะการทำงานของสตริง NULL จะสะดวกกว่า เช่น ใน MS SQL และในกรณีอื่นๆ เช่น ใน ORACLEใน ORACLE นามแฝงของคอลัมน์ทั้งหมดที่แสดงไว้ด้านบนก็ใช้ได้เช่นกัน ยกเว้น [...]
เพื่อไม่ให้รั้วการก่อสร้างโดยใช้ฟังก์ชัน ISNULL ใน MS SQL เราสามารถใช้ฟังก์ชัน CONCAT ได้ ลองพิจารณาและเปรียบเทียบ 3 ตัวเลือก:
เลือกนามสกุล+" "+FirstName+" "+MiddleName FullName1, -- 2 ตัวเลือกสำหรับการแทนที่ NULL เส้นว่าง"" (เราได้รับพฤติกรรมเช่นเดียวกับใน ORACLE) ISNULL(LastName,"")+" "+ISNULL(FirstName,"")+" "+ISNULL(MiddleName,"") FullName2, CONCAT(LastName," ", ชื่อ, " ",ชื่อกลาง) ชื่อเต็ม3 จากพนักงาน
ชื่อเต็ม1 | ชื่อเต็ม2 | ชื่อเต็ม3 |
---|---|---|
อีวานอฟ อีวาน อิวาโนวิช | อีวานอฟ อีวาน อิวาโนวิช | อีวานอฟ อีวาน อิวาโนวิช |
เปตรอฟ เปตรอฟ เปโตรวิช | เปตรอฟ เปตรอฟ เปโตรวิช | เปตรอฟ เปตรอฟ เปโตรวิช |
โมฆะ | ซิโดรอฟ ซิดอร์ | ซิโดรอฟ ซิดอร์ |
โมฆะ | อันดรีฟ อันเดรย์ | อันดรีฟ อันเดรย์ |
ใน MS SQL สามารถระบุนามแฝงได้โดยใช้เครื่องหมายเท่ากับ:
SELECT "Reception date"=HireDate, -- นอกเหนือจาก "..." และ […] คุณสามารถใช้ "..." [วันเกิด]=วันเกิด ZP=เงินเดือน จากพนักงาน
การใช้คีย์เวิร์ด AS หรือเครื่องหมายเท่ากับเพื่อระบุนามแฝงอาจเป็นเรื่องของรสนิยมมากกว่า แต่เมื่อวิเคราะห์คำขอของผู้อื่น ความรู้นี้จะมีประโยชน์
สุดท้ายนี้ฉันจะบอกว่าเป็นการดีกว่าที่จะตั้งชื่อนามแฝงโดยใช้เฉพาะตัวอักษรละตินและตัวเลขเพื่อหลีกเลี่ยงการใช้ “…”, “…” และ […] นั่นคือใช้กฎเดียวกันกับที่เราใช้เมื่อตั้งชื่อตาราง . นอกจากนี้ ในตัวอย่าง ฉันจะใช้เฉพาะชื่อดังกล่าวเท่านั้น และไม่มี “…”, “…” และ […]
ตัวดำเนินการทางคณิตศาสตร์ SQL พื้นฐาน
ลำดับความสำคัญของการดำเนินการ ตัวดำเนินการทางคณิตศาสตร์เช่นเดียวกับในวิชาคณิตศาสตร์ หากจำเป็น สามารถเปลี่ยนลำดับการใช้ตัวดำเนินการได้โดยใช้วงเล็บ - (a+b)*(x/(y-z))
และฉันขอย้ำอีกครั้งว่าการดำเนินการใด ๆ ที่ใช้ NULL จะสร้าง NULL เช่น: 10+NULL, NULL*15/3, 100/NULL - ทั้งหมดนี้จะส่งผลให้เป็น NULL เหล่านั้น. พูดง่ายๆ ความหมายไม่แน่นอนไม่สามารถให้ได้ ผลลัพธ์ที่แน่นอน- คำนึงถึงสิ่งนี้เมื่อเขียนแบบสอบถามของคุณและหากจำเป็น ให้จัดการค่า NULL โดยใช้ฟังก์ชัน ISNULL และ COALESCE:
เลือก ID,ชื่อ, เงินเดือน/100*BonusPercent AS Result1, -- โดยไม่ต้องประมวลผลค่า NULL เงินเดือน/100*ISNULL(BonusPercent,0) AS Result2, -- ใช้ฟังก์ชัน ISNULL Salary/100*COALESCE(BonusPercent,0) AS Result3 - - ใช้ฟังก์ชัน COALESCE จากพนักงาน
ฉันจะบอกคุณเล็กน้อยเกี่ยวกับฟังก์ชัน COALESCE:
COALESCE (expr1, expr2, ..., exprn) - ส่งกลับค่าแรกที่ไม่ใช่ NULL จากรายการค่า
SELECT COALESCE(f1, f1*f2, f2*f3) val -- ในกรณีนี้ ค่าที่สามจะถูกส่งกลับจาก (SELECT null f1, 2 f2, 3 f3) q
ส่วนใหญ่ฉันจะมุ่งเน้นไปที่การพูดคุยเกี่ยวกับโครงสร้าง DML และส่วนใหญ่ ฉันจะไม่พูดถึงฟังก์ชันที่จะปรากฏในตัวอย่าง หากคุณไม่เข้าใจว่าฟังก์ชันใดทำหน้าที่อะไร ให้ค้นหาคำอธิบายบนอินเทอร์เน็ต คุณสามารถค้นหาข้อมูลตามกลุ่มของฟังก์ชันได้ในคราวเดียว เช่น โดยการถาม "MS" ในการค้นหาของ Google สตริง SQLฟังก์ชั่น", "MS SQL ฟังก์ชันทางคณิตศาสตร์" หรือ "มส ฟังก์ชัน SQLการประมวลผลเป็นโมฆะ" มีข้อมูลมากมายเกี่ยวกับฟังก์ชันต่างๆ และคุณสามารถค้นหาได้ง่าย ตัวอย่างเช่น ในไลบรารี MSDN คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชัน COALESCE ได้:
การตัดจาก MSDNการเปรียบเทียบ COALESCE และ CASEนิพจน์ COALESCE เป็นทางลัดทางวากยสัมพันธ์สำหรับนิพจน์ CASE ซึ่งหมายความว่า COALESCE(expression1,...n) ถูกเขียนใหม่โดยเครื่องมือเพิ่มประสิทธิภาพคิวรีเป็นนิพจน์ CASE ต่อไปนี้:
กรณีที่ (expression1 ไม่เป็นโมฆะ) จากนั้น expression1 เมื่อ (expression2 ไม่เป็นโมฆะ) จากนั้น expression2 ... อื่น expressionN END
ตัวอย่างเช่น มาดูกันว่าคุณสามารถใช้ส่วนที่เหลือของการหาร (%) ได้อย่างไร โอเปอเรเตอร์นี้มีประโยชน์มากเมื่อคุณต้องการแบ่งบันทึกออกเป็นกลุ่ม ตัวอย่างเช่น ลองเอาพนักงานทุกคนที่มีคู่ออก หมายเลขบุคลากร(ID) เช่น รหัสเหล่านั้นที่หารด้วย 2:
เลือก ID, ชื่อจากพนักงาน โดยที่ ID%2=0 -- เศษที่เหลือเมื่อหารด้วย 2 คือ 0
ORDER BY – การเรียงลำดับผลลัพธ์ของแบบสอบถาม
ส่วนคำสั่ง ORDER BY ใช้เพื่อเรียงลำดับผลลัพธ์ของแบบสอบถามSELECT LastName, FirstName, Salary FROM Employees ORDER BY LastName,FirstName -- เรียงลำดับผลลัพธ์เป็น 2 คอลัมน์ - ตามนามสกุล แล้วตามด้วยชื่อ
สำหรับบันทึกมีคีย์เวิร์ด ASC สำหรับการเรียงลำดับจากน้อยไปหามาก แต่เนื่องจากการเรียงลำดับจากน้อยไปมากเป็นค่าเริ่มต้น คุณจึงลืมตัวเลือกนี้ได้ (ฉันจำไม่ได้ว่าเคยใช้ตัวเลือกนี้เมื่อใด)
เป็นที่น่าสังเกตว่าคำสั่งย่อย ORDER BY ยังสามารถใช้ฟิลด์ที่ไม่อยู่ในรายการในส่วนคำสั่ง SELECT ได้ (ยกเว้นกรณีที่มีการใช้ DISTINCT ซึ่งฉันจะกล่าวถึงด้านล่าง) ตามตัวอย่าง ฉันจะดำเนินการล่วงหน้าเล็กน้อยโดยใช้ตัวเลือก TOP และแสดงให้เห็นว่าคุณสามารถเลือกพนักงาน 3 คนที่มีเงินเดือนสูงสุดได้อย่างไร โดยคำนึงถึงว่าเพื่อวัตถุประสงค์ในการรักษาความลับฉันไม่ควรแสดงเงินเดือน:
SELECT TOP 3 -- ส่งคืนเฉพาะ 3 ระเบียนแรกจาก ID ผลลัพธ์ทั้งหมด, นามสกุล, ชื่อจริงจากพนักงาน ORDER BY Salary DESC -- เรียงลำดับผลลัพธ์จากมากไปหาน้อยของ Salary
บัตรประจำตัวประชาชน | นามสกุล | ชื่อ |
---|---|---|
1000 | อีวานอฟ | อีวาน |
1002 | ซิโดรอฟ | ซีดอร์ |
แน่นอนว่า มีบางกรณีที่พนักงานหลายคนอาจมีเงินเดือนเท่ากัน และเป็นการยากที่จะบอกว่าคำขอนี้จะส่งกลับพนักงานคนใด ซึ่งจะต้องได้รับการแก้ไขร่วมกับผู้อำนวยการงาน สมมติว่าหลังจากปรึกษาปัญหานี้กับนักออกแบบแล้ว คุณตกลงและตัดสินใจใช้งาน ตัวเลือกถัดไป– ทำการเรียงลำดับเพิ่มเติมตามฟิลด์วันเกิด (เช่น เราให้ความสำคัญกับคนหนุ่มสาว) และหากวันเกิดของพนักงานหลายคนอาจตรงกัน (ซึ่งก็เป็นไปได้เช่นกัน) คุณสามารถทำการเรียงลำดับที่สามตามลำดับจากมากไปน้อย ของค่า ID (สุดท้าย ตัวอย่างจะรวมถึงผู้ที่มี ID สูงสุด - เช่นผู้ที่ได้รับการยอมรับครั้งหลังสมมติว่าเราออกหมายเลขบุคลากรตามลำดับ):
เลือก TOP 3 -- ส่งคืนเฉพาะ 3 ระเบียนแรกจาก ID ผลลัพธ์ทั้งหมด นามสกุล ชื่อจากพนักงาน ORDER BY DESC เงินเดือน -- 1. เรียงลำดับผลลัพธ์จากมากไปน้อยตามวันเกิดเงินเดือน -- 2. จากนั้นตามวันเกิด ID DESC -- 3 และเพื่อความชัดเจนของผลลัพธ์ เราจึงเพิ่มการเรียงลำดับตาม ID
เหล่านั้น. คุณควรพยายามทำให้ผลลัพธ์ของคำขอสามารถคาดเดาได้ เพื่อที่ว่าในกรณีของการซักถาม คุณสามารถอธิบายได้ว่าทำไมบุคคลเหล่านี้จึงถูกรวมอยู่ใน "บัญชีดำ" เช่น ทุกอย่างถูกเลือกอย่างซื่อสัตย์ตามกฎที่กำหนดไว้
คุณยังสามารถเรียงลำดับโดยใช้นิพจน์ที่แตกต่างกันในส่วนคำสั่ง ORDER BY ได้:
เลือกนามสกุล, ชื่อจากพนักงาน ORDER BY CONCAT(LastName," ",FirstName) -- ใช้นิพจน์
คุณยังสามารถใช้นามแฝงที่ระบุสำหรับคอลัมน์ใน ORDER BY:
เลือก CONCAT (นามสกุล, " ", ชื่อ) fi จากพนักงาน ORDER BY fi - ใช้นามแฝง
เป็นที่น่าสังเกตว่าเมื่อใช้คำสั่งย่อย DISTINCT เฉพาะคอลัมน์ที่อยู่ในบล็อก SELECT เท่านั้นที่สามารถใช้ในส่วนคำสั่ง ORDER BY เหล่านั้น. หลังจากใช้การดำเนินการ DISTINCT เราก็จะได้ ชุดใหม่ข้อมูลพร้อมคอลัมน์ชุดใหม่ ด้วยเหตุนี้ ตัวอย่างต่อไปนี้จึงไม่ทำงาน:
SELECT DISTINCT LastName,FirstName,Salary FROM Employees ORDER BY ID -- ID ไม่อยู่ในชุดผลลัพธ์ที่เราได้รับด้วย DISTINCT
เหล่านั้น. คำสั่งย่อย ORDER BY ใช้กับชุดผลลัพธ์ก่อนที่ผลลัพธ์จะถูกส่งกลับไปยังผู้ใช้
หมายเหตุ 1.คุณยังสามารถใช้หมายเลขของคอลัมน์ที่แสดงอยู่ใน SELECT ในส่วนคำสั่ง ORDER BY ได้:SELECT LastName,FirstName,Salary FROM Employees ORDER BY -- เรียงลำดับ 3 DESC, -- 1. เงินเดือนจากมากไปน้อย 1, -- 2. ตามนามสกุล 2 -- 3. ตามชื่อ
สำหรับผู้เริ่มต้นจะดูสะดวกและน่าดึงดูด แต่เป็นการดีกว่าที่จะลืมและอย่าใช้ตัวเลือกการเรียงลำดับนี้
หากในกรณีนี้ (เมื่อมีการแสดงรายการช่องต่างๆ ไว้อย่างชัดเจน) ตัวเลือกนี้ยังเป็นที่ยอมรับได้ ในกรณีที่ใช้ "*" จะเป็นการดีกว่าที่จะไม่ใช้ตัวเลือกนี้ เพราะเหตุใด - เนื่องจากหากมีคน เช่น เปลี่ยนลำดับของคอลัมน์ในตาราง หรือลบคอลัมน์ (ซึ่งถือเป็นสถานการณ์ปกติ) การสืบค้นของคุณอาจยังใช้งานได้ แต่ไม่ถูกต้อง เนื่องจาก การเรียงลำดับสามารถทำได้โดยคอลัมน์อื่นแล้วและนี่เป็นเรื่องร้ายกาจเพราะ ข้อผิดพลาดนี้อาจจะยังไม่ถูกเปิดเผยเร็วๆ นี้
หากมีการระบุเสาหลักไว้อย่างชัดเจน ในสถานการณ์ข้างต้น แบบสอบถามจะยังคงทำงานต่อไปแต่ก็ถูกต้องด้วย (เนื่องจากทุกอย่างถูกกำหนดไว้อย่างชัดเจน) หรือเพียงแค่ส่งข้อผิดพลาดที่ ของคอลัมน์นี้ไม่มีอยู่จริง
คุณจึงลืมการเรียงลำดับตามหมายเลขคอลัมน์ไปได้เลย
หมายเหตุ 2
ใน MS SQL เมื่อเรียงลำดับจากน้อยไปมาก ค่าว่างจะแสดงก่อนเลือก BonusPercent จากพนักงานเรียงตาม BonusPercent
ดังนั้นเมื่อใช้ DESC มันจะอยู่ที่จุดสิ้นสุด
เลือก BonusPercent จากพนักงานเรียงลำดับตาม BonusPercent DESC
หากคุณต้องการเปลี่ยนตรรกะในการเรียงลำดับค่า NULL ให้ใช้นิพจน์ เช่น:
เลือก BonusPercent จากพนักงาน ORDER BY ISNULL(BonusPercent,100)
ORACLE มีสองตัวเลือกสำหรับจุดประสงค์นี้: NULLS FIRST และ NULLS LAST (ใช้เป็นค่าเริ่มต้น) ตัวอย่างเช่น:
เลือก BonusPercent จากพนักงาน เรียงตาม BonusPercent DESC NULLS LAST
โปรดใส่ใจกับสิ่งนี้เมื่อเปลี่ยนไปใช้ฐานข้อมูลเฉพาะ
TOP – ส่งคืนจำนวนเรคคอร์ดที่ระบุ
สารสกัดจาก MSDN TOP—จำกัดจำนวนแถวที่ส่งคืนในผลลัพธ์การค้นหาที่ตั้งค่าเป็นตัวเลขหรือเปอร์เซ็นต์ที่ระบุ เมื่อมีการใช้คำสั่งย่อย TOP ร่วมกับคำสั่งย่อย ORDER BY ชุดผลลัพธ์จะถูกจำกัดไว้ที่ N แถวแรกของผลลัพธ์ที่เรียงลำดับ มิฉะนั้น N แถวแรกจะถูกส่งกลับตามลำดับที่ไม่ได้ระบุ
โดยปกติ การแสดงออกนี้ใช้กับคำสั่งย่อย ORDER BY และเราได้ดูตัวอย่างที่จำเป็นต้องส่งคืน N แถวแรกจากชุดผลลัพธ์แล้ว
โดยไม่ต้อง ORDER BY ตามปกติ ข้อเสนอนี้ใช้เมื่อเราต้องการดูตารางที่เราไม่รู้จักซึ่งอาจมีบันทึกจำนวนมาก ในกรณีนี้ เราสามารถขอคืนเฉพาะ 10 แถวแรก แต่เพื่อความชัดเจนเราจะพูดเพียง 2 เท่านั้น:
เลือก TOP 2 * จากพนักงาน
คุณยังสามารถระบุคำว่า PERCENT เพื่อส่งคืนเปอร์เซ็นต์ของแถวที่สอดคล้องกันจากชุดผลลัพธ์:
เลือก 25 เปอร์เซนต์สูงสุด * จากพนักงาน
ในทางปฏิบัติของฉัน มักใช้การสุ่มตัวอย่างตามจำนวนแถว
คุณยังสามารถใช้ตัวเลือก WITH TIES กับ TOP ซึ่งจะช่วยส่งคืนแถวทั้งหมดในกรณีที่มีการเรียงลำดับที่ไม่ชัดเจน เช่น ประโยคนี้จะส่งคืนแถวทั้งหมดที่มีองค์ประกอบเท่ากันไปยังแถวที่อยู่ในการเลือก TOP N ส่งผลให้สามารถเลือกได้มากกว่า N แถว เรามาเพิ่ม "โปรแกรมเมอร์" อีกคนด้วยเงินเดือน 1,500 สำหรับการสาธิต:
INSERT Employees(ID,Name,Email,PositionID,DepartmentID,ManagerID,Salary) ค่า(1004,N"Nikolaev N.N."," [ป้องกันอีเมล]",3,3,1003,1500)
และขอเพิ่มพนักงานอีกคนโดยไม่ระบุตำแหน่งและแผนกด้วยเงินเดือน 2,000:
INSERT พนักงาน (ID, ชื่อ, อีเมล, PositionID, DepartmentID, ManagerID, เงินเดือน) ค่า (1005, N "Alexandrov A.A.", [ป้องกันอีเมล]",โมฆะ,โมฆะ,1,000,2000)
ทีนี้มาเลือกใช้ตัวเลือก WITH TIES พนักงานทุกคนที่มีเงินเดือนตรงกับเงินเดือนของพนักงาน 3 คนโดยมีเงินเดือนน้อยที่สุด (ฉันหวังว่าจะชัดเจนยิ่งขึ้นว่าฉันได้รับอะไร):
เลือก 3 อันดับแรกที่มีรหัส TIES, ชื่อ, เงินเดือนจากพนักงานเรียงตามเงินเดือน
ที่นี่แม้ว่าจะมีการระบุ TOP 3 แต่คำขอก็ส่งคืน 4 บันทึกเพราะ มูลค่าเงินเดือนที่ส่งคืน TOP 3 (1,500 และ 2,000) พบในพนักงาน 4 คน สายตามันใช้งานได้ดังนี้:
เพียงแค่บันทึก
TOP ถูกนำไปใช้ในฐานข้อมูลที่แตกต่างกัน ในรูปแบบที่แตกต่างกันใน MySQL มีข้อ LIMIT สำหรับสิ่งนี้ ซึ่งคุณสามารถตั้งค่าออฟเซ็ตเริ่มต้นเพิ่มเติมได้ใน ORACLE 12c พวกเขายังแนะนำอะนาล็อกของตัวเอง โดยผสมผสานฟังก์ชันของ TOP และ LIMIT - ค้นหาคำว่า "ORACLE OFFSET FETCH" ก่อนเวอร์ชัน 12c โดยทั่วไปจะใช้คอลัมน์หลอก ROWNUM เพื่อจุดประสงค์นี้
จะเกิดอะไรขึ้นถ้าคุณใช้ DISTINCT และ TOP clause พร้อมกัน? คำถามดังกล่าวสามารถตอบได้อย่างง่ายดายโดยทำการทดลอง โดยทั่วไปแล้วอย่ากลัวและอย่าเกียจคร้านที่จะทดลองเพราะ... ส่วนใหญ่จะเรียนรู้ผ่านการฝึกฝน ลำดับคำในคำสั่ง SELECT มีดังนี้ DISTINCT มาก่อน ตามด้วย TOP เช่น หากคุณคิดอย่างมีเหตุผลและอ่านจากซ้ายไปขวา ระบบจะใช้รายการแรกที่ทิ้งรายการที่ซ้ำกัน จากนั้น TOP จะถูกสร้างตามชุดนี้ เรามาตรวจสอบและตรวจสอบให้แน่ใจว่าเป็นกรณีนี้:
เลือกเงินเดือน 2 อันดับแรกที่โดดเด่นจากพนักงาน เรียงตามเงินเดือน
เงินเดือน |
---|
1500 |
2000 |
เหล่านั้น. เป็นผลให้เราได้รับเงินเดือนที่น้อยที่สุด 2 อันดับจากทั้งหมด แน่นอนว่าอาจมีกรณีที่ไม่สามารถระบุเงินเดือนของพนักงานบางคนได้ (NULL) เนื่องจาก โครงการช่วยให้เราทำเช่นนี้ได้ ดังนั้นเราจึงตัดสินใจว่าจะประมวลผลค่า NULL ในส่วนคำสั่ง ORDER BY หรือเพียงแค่ละทิ้งบันทึกทั้งหมดที่เงินเดือนเป็น NULL ขึ้นอยู่กับงานและด้วยเหตุนี้เราจึงดำเนินการศึกษาส่วนคำสั่ง WHERE
WHERE – เงื่อนไขการเลือกแถว
ประโยคนี้ใช้เพื่อกรองบันทึกตามเงื่อนไขที่กำหนด ตัวอย่างเช่น ให้เลือกพนักงานทุกคนที่ทำงานในแผนก "ไอที" (ID=3):เลือก ID,นามสกุล,ชื่อ,เงินเดือนจากพนักงาน WHERE DepartmentID=3 -- IT ORDER BY LastName,FirstName
บัตรประจำตัวประชาชน | นามสกุล | ชื่อ | เงินเดือน |
---|---|---|---|
1004 | โมฆะ | โมฆะ | 1500 |
1003 | อันดรีฟ | อันเดรย์ | 2000 |
1001 | เปตรอฟ | ปีเตอร์ | 1500 |
ส่วนคำสั่ง WHERE ถูกเขียนก่อนคำสั่ง ORDER BY
ลำดับการใช้คำสั่งกับชุดพนักงานเริ่มต้นมีดังนี้:
- โดยที่ – หากระบุไว้ ขั้นตอนแรกจากชุดพนักงานทั้งหมดคือการเลือกเฉพาะเรกคอร์ดที่ตรงตามเงื่อนไข
- DISTINCT – หากระบุไว้ รายการซ้ำทั้งหมดจะถูกละทิ้ง
- ORDER BY – หากระบุ ผลลัพธ์จะถูกจัดเรียง
- TOP – หากระบุไว้ ระบบจะส่งกลับเฉพาะจำนวนเรคคอร์ดที่ระบุจากผลลัพธ์ที่เรียงลำดับ
ลองดูตัวอย่างเพื่อความชัดเจน:
เลือกเงินเดือน 1 อันดับแรกที่โดดเด่นจากพนักงาน โดยที่ DepartmentID=3 เรียงตามเงินเดือน
สายตาจะมีลักษณะเช่นนี้:
เป็นที่น่าสังเกตว่าการตรวจสอบค่า NULL ไม่ได้ทำด้วยเครื่องหมายเท่ากับ แต่ใช้ตัวดำเนินการ IS NULL และ IS NOT NULL เพียงจำไว้ว่าคุณไม่สามารถเปรียบเทียบ NULL โดยใช้ตัวดำเนินการ “=” (เครื่องหมายเท่ากับ) ได้ เนื่องจาก ผลลัพธ์ของนิพจน์จะเท่ากับ NULL ด้วย
ตัวอย่างเช่น ให้เลือกพนักงานทั้งหมดที่ไม่ได้ระบุแผนก (เช่น DepartmentID IS NULL):
เลือก ID, ชื่อจากพนักงานโดยที่ DepartmentID เป็นโมฆะ
ในตอนนี้ เป็นตัวอย่าง มาคำนวณโบนัสสำหรับพนักงานทุกคนที่มีค่า BonusPercent ที่ระบุ (เช่น BonusPercent ไม่ใช่ NULL):
เลือก ID, ชื่อ, เงินเดือน/100*BonusPercent เป็นโบนัสจากพนักงาน โดยที่ BonusPercent ไม่ใช่ NULL
ใช่ ยังไงก็ตาม หากคุณลองคิดดู ค่า BonusPercent สามารถเท่ากับศูนย์ (0) และสามารถป้อนค่าด้วยเครื่องหมายลบได้ เนื่องจากเราไม่ได้กำหนดข้อจำกัดใดๆ ในฟิลด์นี้
หลังจากบอกเกี่ยวกับปัญหาแล้ว เราได้รับแจ้งในตอนนี้ให้พิจารณาว่าถ้า (BonusPercent<=0 или BonusPercent IS NULL), то это означает что у сотрудника так же нет бонуса. Для начала, как нам сказали, так и сделаем, реализуем это при помощи логического оператора OR и NOT:
เลือก ID, ชื่อ, เงินเดือน/100*BonusPercent เป็นโบนัสจากพนักงาน โดยที่ไม่ได้ (BonusPercent<=0 OR BonusPercent IS NULL)
เหล่านั้น. ที่นี่เราเริ่มเรียนรู้เกี่ยวกับตัวดำเนินการบูลีน นิพจน์ในวงเล็บ “(BonusPercent<=0 OR BonusPercent IS NULL)» проверяет на то что у сотрудника нет бонуса, а NOT инвертирует это значение, т.е. говорит «верни всех сотрудников которые не сотрудники у которых нет бонуса».
นิพจน์นี้สามารถเขียนใหม่ได้โดยพูดว่า "คืนพนักงานทั้งหมดที่มีโบนัส" ทันทีโดยแสดงสิ่งนี้ด้วยนิพจน์ (BonusPercent>0 และ BonusPercent IS NOT NULL):
เลือก ID, ชื่อ, เงินเดือน/100*BonusPercent เป็นโบนัสจากพนักงาน โดยที่ BonusPercent>0 และ BonusPercent ไม่ใช่ NULL
นอกจากนี้ ในบล็อก WHERE คุณสามารถตรวจสอบนิพจน์ประเภทต่างๆ ได้โดยใช้ตัวดำเนินการและฟังก์ชันทางคณิตศาสตร์ ตัวอย่างเช่น การตรวจสอบที่คล้ายกันสามารถทำได้โดยใช้นิพจน์ที่มีฟังก์ชัน ISNULL:
เลือก ID, ชื่อ, เงินเดือน/100*BonusPercent เป็นโบนัสจากพนักงาน โดยที่ ISNULL(BonusPercent,0)>0
ตัวดำเนินการบูลีนและตัวดำเนินการเปรียบเทียบอย่างง่าย
ใช่ เราไม่สามารถดำเนินการได้หากไม่มีคณิตศาสตร์ที่นี่ ดังนั้น เรามาดูรายละเอียดสั้นๆ เกี่ยวกับบูลีนและตัวดำเนินการเปรียบเทียบแบบง่ายกันดีกว่ามีตัวดำเนินการบูลีนเพียง 3 ตัวใน SQL - AND, OR และ NOT:
สำหรับตัวดำเนินการบูลีนแต่ละตัว คุณสามารถจัดเตรียมตารางความจริงที่แสดงให้เห็นเพิ่มเติมว่าผลลัพธ์จะเป็นอย่างไรเมื่อเงื่อนไขสามารถเป็น NULL ได้:
มีดังต่อไปนี้ ตัวดำเนินการง่ายๆการเปรียบเทียบที่ใช้เพื่อสร้างเงื่อนไข:
นอกจากนี้ยังมีตัวดำเนินการ 2 ตัวสำหรับตรวจสอบค่า/นิพจน์สำหรับ NULL:
เป็นโมฆะ | การทดสอบความเท่าเทียมกันของ NULL |
---|---|
ไม่เป็นโมฆะ | การทดสอบความไม่เท่าเทียมกันของ NULL |
ลำดับความสำคัญ: 1) ตัวดำเนินการเปรียบเทียบทั้งหมด; 2) ไม่; 3) และ; 4) หรือ.
เมื่อสร้างอาคารที่ซับซ้อน การแสดงออกทางตรรกะใช้วงเล็บ:
((เงื่อนไข1 และเงื่อนไข2) หรือไม่(เงื่อนไข3 และเงื่อนไข4 และเงื่อนไข5)) หรือ (...)
นอกจากนี้ คุณสามารถเปลี่ยนลำดับการคำนวณมาตรฐานได้ด้วยการใช้วงเล็บ
ที่นี่ฉันพยายามให้แนวคิดเกี่ยวกับพีชคณิตแบบบูลในปริมาณที่เพียงพอสำหรับการทำงาน อย่างที่คุณเห็น เพื่อที่จะเขียนเงื่อนไขที่ซับซ้อนมากขึ้น คุณไม่สามารถทำได้หากไม่มีตรรกะ แต่ที่นี่มีไม่มากนัก (และ หรือ และไม่ใช่) และมันถูกประดิษฐ์ขึ้นโดยผู้คน ดังนั้นทุกอย่างจึงค่อนข้างสมเหตุสมผล
มาดูตอนท้ายของส่วนที่สองกันดีกว่า
อย่างที่คุณเห็นแม้เกี่ยวกับไวยากรณ์พื้นฐานของตัวดำเนินการ SELECT เราก็สามารถพูดคุยได้เป็นเวลานาน แต่เพื่อให้อยู่ในขอบเขตของบทความในที่สุดฉันก็จะแสดงตัวดำเนินการเชิงตรรกะเพิ่มเติม - BETWEEN, IN และ LIKEBETWEEN – ตรวจสอบการรวมในช่วง
Test_value ระหว่าง start_value และ end_value
นิพจน์สามารถทำหน้าที่เป็นค่าได้
ลองดูตัวอย่าง:
เลือก ID, ชื่อ, เงินเดือนจากพนักงานที่มีเงินเดือนระหว่าง 2,000 ถึง 3,000 - ซึ่งมีเงินเดือนอยู่ในช่วง 2,000-3,000
จริงๆ แล้ว BETWEEN เป็นสัญกรณ์แบบง่ายของแบบฟอร์ม:
เลือก ID, ชื่อ, เงินเดือนจากพนักงาน WHERE เงินเดือน>=2,000 และเงินเดือน<=3000 -- все у кого ЗП в диапозоне 2000-3000
คำว่า NOT สามารถใช้หน้าคำว่า BETWEEN ได้ ซึ่งจะตรวจสอบว่าค่าไม่อยู่ในช่วงที่ระบุหรือไม่:
เลือก ID, ชื่อ, เงินเดือนจากพนักงานโดยที่เงินเดือนไม่อยู่ระหว่าง 2,000 ถึง 3,000 -- คล้ายกับ NOT(เงินเดือน>=2,000 และเงินเดือน<=3000)
ดังนั้น หากคุณใช้ BETWEEN, IN, LIKE คุณสามารถรวมเข้ากับเงื่อนไขอื่นๆ โดยใช้ AND และ OR:
SELECT ID,Name,Salary FROM Employees WHERE Salary BETWEEN 2000 AND 3000 -- ที่มีเงินเดือนอยู่ในช่วง 2000-3000 AND DepartmentID=3 -- คำนึงถึงพนักงานของแผนก 3 เท่านั้น
IN – ตรวจสอบการรวมไว้ในรายการค่า
โอเปอเรเตอร์นี้มีแบบฟอร์มดังต่อไปนี้:Test_value ใน (value1, value2, ...)
ฉันคิดว่าการแสดงตัวอย่างทำได้ง่ายกว่า:
เลือก ID, ชื่อ, เงินเดือนจากพนักงาน WHERE PositionID IN (3,4) - ซึ่งมีตำแหน่ง 3 หรือ 4
เหล่านั้น. โดยพื้นฐานแล้วจะเหมือนกับนิพจน์ต่อไปนี้:
เลือก ID, ชื่อ, เงินเดือนจากพนักงาน โดยที่ PositionID=3 หรือ PositionID=4 -- ซึ่งมีตำแหน่ง 3 หรือ 4
ในกรณีของ NOT มันจะคล้ายกัน (เราจะได้ทุกคนยกเว้นแผนก 3 และ 4):
เลือก ID, ชื่อ, เงินเดือนจากพนักงานโดยที่ PositionID ไม่อยู่ใน (3,4) -- คล้ายกับ NOT (PositionID=3 หรือ PositionID=4)
แบบสอบถามที่มี NOT IN สามารถแสดงโดยใช้ AND:
เลือก ID, ชื่อ, เงินเดือนจากพนักงาน WHERE PositionID<>3และตำแหน่งID<>4 -- เทียบเท่ากับ PositionID NOT IN(3,4)
โปรดทราบว่าการค้นหาค่า NULL โดยใช้โครงสร้าง IN จะไม่ทำงานเพราะว่า การตรวจสอบ NULL=NULL จะส่งคืนค่า NULL ไม่ใช่ True:
เลือก ID, ชื่อ, DepartmentID จากพนักงาน WHERE DepartmentID IN (1,2, NULL) -- บันทึก NULL จะไม่รวมอยู่ในผลลัพธ์
ในกรณีนี้ ให้แบ่งเช็คออกเป็นหลายเงื่อนไข:
เลือก ID, ชื่อ, DepartmentID จากพนักงานโดยที่ DepartmentID IN (1,2) -- 1 หรือ 2 หรือ DepartmentID เป็น NULL -- หรือ NULL
หรือคุณสามารถเขียนบางอย่างเช่น:
เลือก ID,ชื่อ,DepartmentID จากพนักงาน WHERE ISNULL(DepartmentID,-1) IN(1,2,-1) -- หากคุณแน่ใจว่าไม่มีแผนกที่มี ID=-1
ฉันคิดว่าตัวเลือกแรกในกรณีนี้จะถูกต้องและเชื่อถือได้มากกว่า โอเค นี่เป็นเพียงตัวอย่างเพื่อแสดงให้เห็นว่าโครงสร้างอื่นใดที่สามารถสร้างได้
นอกจากนี้ยังควรกล่าวถึงข้อผิดพลาดที่ร้ายกาจยิ่งกว่าที่เกี่ยวข้องกับ NULL ซึ่งสามารถทำได้เมื่อใช้โครงสร้าง NOT IN ตัวอย่างเช่น ลองเลือกพนักงานทั้งหมด ยกเว้นพนักงานที่มีแผนกเป็น 1 หรือไม่ได้ระบุแผนกเลย เช่น เท่ากับ NULL เพื่อเป็นวิธีแก้ปัญหา ตัวเลือกต่อไปนี้จะแนะนำตัวเอง:
เลือก ID, ชื่อ, DepartmentID จากพนักงานโดยที่ DepartmentID ไม่อยู่ใน (1, NULL)
แต่หลังจากดำเนินการค้นหาแล้ว เราจะไม่ได้รับแถวเดียว แม้ว่าเราคาดว่าจะเห็นสิ่งต่อไปนี้:
อีกครั้ง เรื่องตลกที่นี่เล่นโดย NULL ที่ระบุในรายการค่า
มาดูกันว่าเหตุใดจึงเกิดข้อผิดพลาดเชิงตรรกะในกรณีนี้ มาขยายแบบสอบถามโดยใช้ AND:
เลือก ID, ชื่อ, DepartmentID จากพนักงาน WHERE DepartmentID<>1 และ ID แผนก<>NULL -- ปัญหาเกิดจากการตรวจสอบ NULL นี้ เงื่อนไขนี้จะคืนค่า NULL เสมอ
สภาพถูกต้อง (DepartmentID<>NULL) จะให้ความไม่แน่นอนแก่เราเสมอที่นี่ เช่น โมฆะ. ตอนนี้ จำตารางความจริงสำหรับตัวดำเนินการ AND โดยที่ (TRUE และ NULL) ให้ค่า NULL เหล่านั้น. เมื่อตรงตามเงื่อนไขด้านซ้าย (DepartmentID<>1) เนื่องจากเงื่อนไขสิทธิ์ที่ไม่ได้กำหนดไว้ เราจะได้ค่าที่ไม่ได้กำหนดสำหรับนิพจน์ทั้งหมด (DepartmentID<>1 และ ID แผนก<>NULL) ดังนั้นสตริงจะไม่รวมอยู่ในผลลัพธ์
สามารถเขียนเงื่อนไขใหม่ได้อย่างถูกต้องดังนี้:
เลือก ID, ชื่อ, DepartmentID จากพนักงานโดยที่ DepartmentID ไม่อยู่ใน (1) - หรือในกรณีนี้เพียง DepartmentID<>1 และ DepartmentID ไม่เป็นโมฆะ -- และแยกตรวจสอบว่าไม่เป็นโมฆะ
IN ยังสามารถใช้กับแบบสอบถามย่อยได้ แต่เราจะกลับมาที่แบบฟอร์มนี้ในส่วนต่อๆ ไปของบทช่วยสอนนี้
LIKE – การตรวจสอบสตริงโดยใช้รูปแบบ
ฉันจะพูดถึงโอเปอเรเตอร์นี้เฉพาะในรูปแบบที่ง่ายที่สุดซึ่งเป็นมาตรฐานและได้รับการสนับสนุนโดยภาษา SQL ส่วนใหญ่ แม้จะอยู่ในรูปแบบนี้ ก็สามารถใช้เพื่อแก้ไขปัญหาต่างๆ ที่ต้องตรวจสอบเนื้อหาของสตริงได้โอเปอเรเตอร์นี้มีแบบฟอร์มดังต่อไปนี้:
Test_string เช่น string_pattern
ข้อมูลต่อไปนี้สามารถใช้ได้ใน “template_string”: อักขระพิเศษ:
- ขีดล่าง “_” หมายความว่าสามารถใช้อักขระตัวเดียวแทนได้
- เครื่องหมายเปอร์เซ็นต์ “%” - บอกว่าสามารถแทนที่ด้วยอักขระจำนวนเท่าใดก็ได้ รวมถึงไม่มีด้วย
SELECT ID, ชื่อจากพนักงาน WHERE Name LIKE "Pet%" -- ซึ่งชื่อขึ้นต้นด้วยตัวอักษร "Pet" SELECT ID, LastName FROM Employees WHERE LastName LIKE "%ov" -- ซึ่งนามสกุลลงท้ายด้วย "ov" SELECT ID, นามสกุลจากพนักงาน โดยที่นามสกุลเช่น "%re%" -- ซึ่งนามสกุลประกอบด้วยชุดค่าผสม "re"
ลองดูตัวอย่างที่มีสัญลักษณ์ “_”:
SELECT ID, นามสกุลจากพนักงาน WHERE นามสกุล LIKE "_etrov" -- ซึ่งนามสกุลประกอบด้วยอักขระตัวแรกและตัวอักษรที่ตามมา "etrov" SELECT ID, นามสกุลจากพนักงาน WHERE นามสกุล LIKE "____ov" -- ซึ่งนามสกุลประกอบด้วยอักขระสี่ตัวใดก็ได้ และตัวอักษรต่อมาคือ "ov"
เมื่อใช้ ESCAPE คุณสามารถระบุอักขระ Escape ที่ยกเลิกผลการตรวจสอบของอักขระพิเศษ "_" และ "%" ส่วนคำสั่งนี้ใช้เมื่อคุณต้องการตรวจสอบเครื่องหมายเปอร์เซ็นต์หรือขีดล่างในสตริงโดยตรง
เพื่อสาธิต ESCAPE เรามารวมขยะไว้ในรายการเดียว:
อัปเดตพนักงาน SET FirstName = "นี่คือถังขยะที่มี %" โดยที่ ID = 1005
และมาดูกันว่าแบบสอบถามต่อไปนี้ส่งคืนอะไร:
SELECT * จากพนักงานโดยที่ FirstName เช่น "%!%%" ESCAPE "!" -- บรรทัดมีเครื่องหมาย "%" SELECT * FROM Employees WHERE FirstName LIKE "%!_%" ESCAPE "!" -- บรรทัดมีเครื่องหมาย "_"
หากคุณต้องการตรวจสอบสตริงเพื่อดูการจับคู่ที่สมบูรณ์ แทนที่จะใช้ LIKE ควรใช้เครื่องหมาย “=”:
SELECT * จากพนักงาน WHERE FirstName = "Peter"
เพียงแค่บันทึก
ใน MS SQL ในเทมเพลตตัวดำเนินการ LIKE คุณสามารถระบุการค้นหาโดยใช้นิพจน์ทั่วไปได้ อ่านเกี่ยวกับเรื่องนี้บนอินเทอร์เน็ตหากความสามารถมาตรฐานของตัวดำเนินการนี้ไม่เพียงพอสำหรับคุณORACLE ใช้ฟังก์ชัน REGEXP_LIKE เพื่อค้นหาโดยใช้นิพจน์ทั่วไป
เล็กน้อยเกี่ยวกับสตริง
ในกรณีที่ตรวจสอบสตริงว่ามีอักขระ Unicode หรือไม่ คุณจะต้องวางอักขระ N ก่อนเครื่องหมายคำพูด เช่น น"…". แต่เนื่องจากช่องอักขระทั้งหมดในตารางของเราอยู่ในรูปแบบ Unicode (ประเภท nvarchar) คุณจึงใช้รูปแบบนี้กับช่องเหล่านี้ได้ตลอดเวลา ตัวอย่าง:เลือก ID, ชื่อจากพนักงาน โดยที่ชื่อ LIKE N"Pet%" เลือก ID, นามสกุลจากพนักงาน WHERE LastName=N"Petrov"
เมื่อทำอย่างถูกต้อง เมื่อเปรียบเทียบกับฟิลด์ประเภท varchar (ASCII) คุณควรลองใช้การทดสอบโดยใช้ "..." และเมื่อเปรียบเทียบฟิลด์กับประเภท nvarchar (Unicode) คุณควรลองใช้การทดสอบโดยใช้ N" …”. ซึ่งทำเพื่อหลีกเลี่ยงการแปลงประเภทโดยนัยระหว่างการดำเนินการค้นหา เราใช้กฎเดียวกันเมื่อแทรกค่า (INSERT) ลงในฟิลด์หรืออัปเดต (UPDATE)
เมื่อเปรียบเทียบสตริง ควรพิจารณาจุดที่ขึ้นอยู่กับการตั้งค่าฐานข้อมูล (การจัดเรียง) การเปรียบเทียบสตริงอาจเป็นแบบคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (เมื่อ "Petrov" = "PETROV") หรือคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (เมื่อ "Petrov"<>"เปตรอฟ").
ในกรณีของการตั้งค่าที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ หากคุณต้องการค้นหาโดยไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ คุณสามารถแปลงนิพจน์ด้านขวาและซ้ายไว้ล่วงหน้าเป็นตัวพิมพ์เดียว - บนหรือล่าง:
เลือก ID, ชื่อจากพนักงาน โดยที่ UPPER(ชื่อ) เช่น UPPER(N"Pet%") -- หรือ LOWER(ชื่อ) เช่น LOWER(N"Pet%") เลือก ID,นามสกุลจากพนักงาน โดยที่ UPPER(LastName)=UPPER( N"Petrov") -- หรือ LOWER(LastName)=LOWER(N"Petrov")
เล็กน้อยเกี่ยวกับวันที่
เมื่อตรวจสอบวันที่ คุณสามารถใช้เครื่องหมายคำพูดเดี่ยว "..." ได้เช่นเดียวกับสตริงไม่ว่าการตั้งค่าภูมิภาคใน MS SQL จะเป็นอย่างไร คุณสามารถใช้ไวยากรณ์วันที่ต่อไปนี้ "YYYYMMDD" (ปี เดือน วัน รวมกันโดยไม่ต้องเว้นวรรค) MS SQL จะเข้าใจรูปแบบวันที่นี้เสมอ:
เลือก ID, ชื่อ, วันเกิดจากพนักงานโดยที่วันเกิดระหว่าง "19800101" และ "19891231" - พนักงานในยุค 80 เรียงตามวันเกิด
ในบางกรณี การตั้งวันที่โดยใช้ฟังก์ชัน DATEFROMPARTS จะสะดวกกว่า:
เลือก ID, ชื่อ, วันเกิดจากพนักงานโดยที่วันเกิดระหว่าง DATEFROMPARTS (1980,1,1) และ DATEFROMPARTS (1989,12,31) เรียงตามวันเกิด
นอกจากนี้ยังมีฟังก์ชันที่คล้ายกัน DATETIMEFROMPARTS ซึ่งใช้ในการตั้งค่าวันที่และเวลา (สำหรับประเภทวันที่และเวลา)
คุณยังสามารถใช้ฟังก์ชัน CONVERT ได้หากต้องการแปลงสตริงเป็นค่าวันที่หรือเวลา:
เลือก แปลง(วันที่,"12.03.2015",104), แปลง(วันที่เวลา,"2014-11-30 17:20:15",120)
ค่า 104 และ 120 ระบุรูปแบบวันที่ที่ใช้ในสตริง คุณสามารถค้นหาคำอธิบายของรูปแบบที่ถูกต้องทั้งหมดในไลบรารี MSDN ได้โดยการค้นหา “MS SQL CONVERT”
มีฟังก์ชันมากมายสำหรับการทำงานกับวันที่ใน MS SQL ให้มองหา “ฟังก์ชัน ms sql สำหรับการทำงานกับวันที่”
บันทึก.ภาษา SQL ทุกภาษามีชุดฟังก์ชันของตนเองสำหรับการทำงานกับวันที่และใช้วิธีการของตนเองในการทำงานกับวันที่
เล็กน้อยเกี่ยวกับตัวเลขและการแปลง
ข้อมูลในส่วนนี้อาจเป็นประโยชน์กับผู้เชี่ยวชาญด้านไอทีมากกว่า หากคุณไม่ใช่หนึ่งเดียวและเป้าหมายของคุณคือเพียงเรียนรู้วิธีเขียนแบบสอบถามเพื่อรับข้อมูลที่คุณต้องการจากฐานข้อมูล คุณอาจไม่ต้องการรายละเอียดปลีกย่อยดังกล่าว แต่ในกรณีใด ๆ คุณสามารถอ่านข้อความและจดบันทึกได้อย่างรวดเร็ว , เพราะ . หากคุณได้ศึกษาเกี่ยวกับ SQL แสดงว่าคุณเข้าร่วมงานไอทีแล้วต่างจากฟังก์ชันการแปลง CAST คุณสามารถระบุพารามิเตอร์ที่สามในฟังก์ชัน CONVERT ซึ่งรับผิดชอบรูปแบบการแปลง (รูปแบบ) ประเภทข้อมูลที่แตกต่างกันอาจมีชุดสไตล์ของตัวเอง ซึ่งอาจส่งผลต่อผลลัพธ์ที่ส่งคืน เราได้สัมผัสถึงการใช้สไตล์แล้วเมื่อพิจารณาการแปลงสตริงโดยใช้ฟังก์ชัน CONVERT เป็นประเภทวันที่และเวลา
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับฟังก์ชัน CAST, CONVERT และสไตล์ใน MSDN - “ฟังก์ชัน CAST และ CONVERT (Transact-SQL)”: msdn.microsoft.com/ru-ru/library/ms187928.aspx
เพื่อให้ตัวอย่างง่ายขึ้น จะใช้คำสั่งภาษา Transact-SQL DECLARE และ SET ที่นี่
แน่นอน ในกรณีของการแปลงจำนวนเต็มเป็นจำนวนจริง (ซึ่งฉันได้ให้ไว้ตอนต้นของบทเรียนนี้ เพื่อแสดงให้เห็นความแตกต่างระหว่างจำนวนเต็มและการหารจำนวนจริง) ความรู้เกี่ยวกับความแตกต่างของการแปลงนั้นไม่สำคัญนัก เพราะ ที่นั่นเราได้แปลงจำนวนเต็มเป็นจำนวนจริง (ช่วงซึ่งมากกว่าช่วงของจำนวนเต็มมาก):
ประกาศ @min_int int SET @min_int=-2147483648 ประกาศ @max_int int SET @max_int=2147483647 SELECT -- (-2147483648) @min_int,CAST(@min_int AS float),CONVERT(float,@min_int), -- 2147483647 @max_int ,CAST(@max_int AS float),CONVERT(float,@max_int), -- ตัวเลข(16,6) @min_int/1., -- (-2147483648.000000) @max_int/1. -- 2147483647.000000
บางทีอาจไม่คุ้มค่าที่จะระบุวิธีการแปลงโดยนัยที่ได้จากการหารด้วย (1.) เพราะ ขอแนะนำให้ลองทำการแปลงที่ชัดเจนเพื่อการควบคุมประเภทของผลลัพธ์ที่ได้รับมากขึ้น แม้ว่าเราต้องการได้ผลลัพธ์เป็นประเภทตัวเลข โดยมีจำนวนหลักที่ระบุหลังจุดทศนิยม เราก็สามารถใช้เคล็ดลับใน MS SQL เพื่อคูณค่าจำนวนเต็มด้วย (1., 1.0, 1.00 ฯลฯ) : :
ประกาศ @int int SET @int=123 SELECT @int*1., -- ตัวเลข(12, 0) - ทศนิยม 0 ตำแหน่ง @int*1.0, -- ตัวเลข(13, 1) - ทศนิยม 1 ตำแหน่ง @int*1.00, -- ตัวเลข(14, 2) - 2 ตัวอักษร -- แม้ว่าบางครั้งจะเป็นการดีกว่าหากทำการแปลงอย่างชัดเจน CAST(@int AS numeric(20, 0)) -- 123 CAST(@int AS numeric(20, 1) ), -- 123.0 CAST(@int AS ตัวเลข(20, 2)) -- 123.00
ในบางกรณีรายละเอียดของการแปลงมีความสำคัญมาก เนื่องจาก... ส่งผลต่อความถูกต้องของผลลัพธ์ที่ได้รับ เช่น ในกรณีที่ทำการแปลงจากค่าตัวเลขเป็นสตริง (varchar) ลองดูตัวอย่างการแปลงเงินและค่าลอยตัวเป็น varchar:
พฤติกรรมเมื่อแปลงเงินเป็น varchar DECLARE @money money SET @money = 1025.123456789 -- จะมีการแปลงโดยนัยเป็น 1025.1235 เพราะ ประเภทเงินเก็บเพียง 4 หลักหลังจุดทศนิยม SELECT @money, -- 1025.1235 -- ตามค่าเริ่มต้น CAST และ CONVERT จะทำงานเหมือนกัน (เช่น พูดคร่าวๆ จะใช้สไตล์ 0) CAST(@money as varchar(20)) , -- 1,025.12 CONVERT(varchar(20), @money), -- 1,025.12 CONVERT(varchar(20), @money, 0), -- 1,025.12 (รูปแบบ 0 - ไม่มีตัวคั่นหลักพันและทศนิยม 2 ตำแหน่ง (รูปแบบเริ่มต้น)) CONVERT( varchar(20), @money, 1), -- 1.025.12 (สไตล์ 1 - ใช้ตัวคั่นหนึ่งในพันและทศนิยม 2 ตำแหน่ง) CONVERT(varchar(20), @money, 2) -- 1025.1235 (สไตล์ 2 - ไม่มีตัวคั่นและมีตัวเลข 4 ตัวหลังจุดทศนิยม)
พฤติกรรมเมื่อแปลง float เป็น varchar DECLARE @float1 float SET @float1 = 1025.123456789 DECLARE @float2 float SET @float2 = 1231025.123456789 SELECT @float1, -- 1025.123456789 @float2, -- 1231025 .12345679 -- โดย ค่าเริ่มต้น CAST และ CONVERT จะทำงานเหมือนกัน (กล่าวคือ พูดคร่าวๆ ก็คือใช้สไตล์ 0) -- สไตล์ 0 - ไม่เกิน 6 หลัก สัญลักษณ์เอ็กซ์โพเนนเชียลถูกใช้โดยไม่จำเป็น -- สิ่งที่น่ากลัวจริงๆ เกิดขึ้นที่นี่เมื่อแปลงเป็น varchar CAST(@float1 เป็น varchar(20)), -- 1,025.12 CONVERT(varchar(20), @float1), -- 1,025.12 CONVERT(varchar( 20 ), @float1, 0), -- 1,025.12 CAST(@float2 เป็น varchar(20)), -- 1.23103e+006 CONVERT(varchar(20), @float2), -- 1.23103e+006 CONVERT(varchar( 20 ), @float2, 0), -- 1.23103e+006 -- style 1 - ต้องมี 8 หลักเสมอ มีการใช้สัญลักษณ์ทางวิทยาศาสตร์สำหรับตัวเลขเสมอ
ดังที่เห็นได้จากตัวอย่าง ประเภทลอยตัวแบบลอยจริงในบางกรณีสามารถสร้างข้อผิดพลาดขนาดใหญ่ได้จริง โดยเฉพาะเมื่อแปลงเป็นสตริงและย้อนกลับ (สิ่งนี้สามารถเกิดขึ้นได้กับการรวมประเภทต่างๆ เช่น เมื่อมีการถ่ายโอนข้อมูลเข้า ข้อความจากระบบหนึ่งไปยังอีกระบบหนึ่ง)
หากคุณต้องการควบคุมความแม่นยำอย่างชัดเจนจนถึงเครื่องหมายที่กำหนด ซึ่งมากกว่า 4 บางครั้งการใช้ประเภททศนิยม/ตัวเลขในการจัดเก็บข้อมูลก็ดีกว่า หากเพียงพอแล้ว 4 ตัวอักษรคุณสามารถใช้ประเภทเงินได้ - ซึ่งสอดคล้องกับตัวเลขโดยประมาณ(20,4)
ทศนิยมและตัวเลข DECLARE @money money SET @money = 1025.123456789 -- 1025.1235 DECLARE @float1 float SET @float1 = 1025.123456789 DECLARE @float2 float SET @float2 = 1231025.123456789 DECLARE @numer ic(28,9 ) SET @numeric = 1025.123456789 เลือกนักแสดง ( @numeric as varchar(20)), -- 1025.12345679 CONVERT(varchar(20), @numeric), -- 1025.12345679 CAST(@money as numeric(28,9)), -- 1025.123500000 CAST(@float1 as numeric( 28 ,9)), -- 1025.123456789 CAST(@float2 เป็นตัวเลข(28,9)) -- 1231025.123456789
บันทึก.
ตั้งแต่เวอร์ชัน MS SQL 2008 คุณสามารถใช้โครงสร้างต่อไปนี้แทน:เซิร์ฟเวอร์ ms sql เพิ่มแท็ก
พื้นฐานของภาษา SQL ประกอบด้วยตัวดำเนินการ ซึ่งแบ่งออกเป็นหลายกลุ่มตามเงื่อนไขตามฟังก์ชันที่พวกเขาทำ กลุ่มคำสั่งต่อไปนี้สามารถแยกแยะได้ (ไม่ใช่ทุกคำสั่ง SQL ที่แสดงไว้):
คำสั่ง ddl (ภาษานิยามข้อมูล)
คำสั่ง DDL - คำสั่งนิยามอ็อบเจ็กต์ฐานข้อมูล
สร้าง SCHEMA - สร้างสคีมาฐานข้อมูล
DROP SHEMA - ลบสคีมาฐานข้อมูล
สร้างตาราง - สร้างตาราง
ALTER TABLE - เปลี่ยนตาราง
วางตาราง - ลบตาราง
สร้างโดเมน - สร้างโดเมน
เปลี่ยนโดเมน - เปลี่ยนโดเมน
วางโดเมน - ลบโดเมน
CREATE COLLATION - สร้างลำดับ
DROP COLLATION - ลบลำดับ
สร้างมุมมอง - สร้างมุมมอง
DROP VIEW - ลบมุมมอง
คำสั่ง dml (ภาษาการจัดการข้อมูล)
คำสั่ง DML - คำสั่งการจัดการข้อมูล
SELECT - เลือกแถวจากตาราง
INSERT - เพิ่มแถวลงในตาราง
UPDATE - เปลี่ยนแถวในตาราง
DELETE - ลบแถวในตาราง
COMMIT - ยอมรับการเปลี่ยนแปลงที่ทำ
ROLLBACK - ย้อนกลับการเปลี่ยนแปลงที่ทำ
ผู้ดำเนินการปกป้องและจัดการข้อมูล
สร้างความมั่นใจ - สร้างข้อจำกัด
DROP ASSERION - ลบข้อจำกัด
GRANT - ให้สิทธิ์แก่ผู้ใช้หรือแอปพลิเคชันเพื่อจัดการวัตถุ
REVOKE - เพิกถอนสิทธิ์ผู้ใช้หรือแอปพลิเคชัน
นอกจากนี้ ยังมีกลุ่มตัวดำเนินการสำหรับการตั้งค่าพารามิเตอร์เซสชัน รับข้อมูลเกี่ยวกับฐานข้อมูล ตัวดำเนินการ SQL แบบคงที่ และตัวดำเนินการ SQL แบบไดนามิก สิ่งที่สำคัญที่สุดสำหรับผู้ใช้คือคำสั่งการจัดการข้อมูล (DML)
ตัวอย่างการใช้ตัวดำเนินการจัดการข้อมูล
INSERT - การแทรกแถวลงในตาราง
ตัวอย่างที่ 1 . การแทรกหนึ่งแถวลงในตาราง:
ค่านิยม(4, "อีวานอฟ");
ตัวอย่างที่ 2 - การแทรกหลายแถวลงในตารางที่เลือกจากตารางอื่น (ข้อมูลเกี่ยวกับซัพพลายเออร์จากตาราง P ที่มีตัวเลขมากกว่า 2 จะถูกแทรกลงในตาราง TMP_TABLE):
TMP_TABLE (PNUM, PNAME)
เลือก PNUM, PNAME
โดยที่ P.PNUM>2;
UPDATE - อัปเดตแถวในตาราง
ตัวอย่างที่ 3 - อัปเดตหลายแถวในตาราง:
SET PNAME = "พุชนิคอฟ"
โดยที่ P.PNUM = 1;
DELETE - การลบแถวในตาราง
ตัวอย่างที่ 4 . การลบหลายแถวในตาราง:
โดยที่ P.PNUM = 1;
ตัวอย่างที่ 5 - การลบแถวทั้งหมดในตาราง:
ตัวอย่างการใช้คำสั่ง SELECT
จริงๆ แล้ว คำสั่ง SELECT เป็นคำสั่ง SQL ที่มีความสำคัญต่อผู้ใช้มากที่สุดและซับซ้อนที่สุด มีไว้สำหรับดึงข้อมูลจากตารางเช่น ในความเป็นจริงมันใช้หนึ่งในวัตถุประสงค์หลักของฐานข้อมูล - เพื่อให้ข้อมูลแก่ผู้ใช้
คำสั่ง SELECT จะถูกดำเนินการเสมอกับบางตารางที่เป็นส่วนหนึ่งของฐานข้อมูล
ความคิดเห็น- ในความเป็นจริง ฐานข้อมูลไม่เพียงแต่มีตารางที่เก็บไว้อย่างถาวรเท่านั้น แต่ยังมีตารางชั่วคราวและสิ่งที่เรียกว่ามุมมองอีกด้วย มุมมองเป็นเพียงนิพจน์ SELECT ที่จัดเก็บไว้ในฐานข้อมูล จากมุมมองของผู้ใช้ มุมมองคือตารางที่ไม่ได้จัดเก็บอย่างถาวรในฐานข้อมูล แต่จะ "ปรากฏขึ้น" เมื่อมีการเข้าถึง จากมุมมองของคำสั่ง SELECT ทั้งตารางถาวรและตารางและมุมมองชั่วคราวจะมีลักษณะเหมือนกันทุกประการ แน่นอนว่า เมื่อระบบดำเนินการคำสั่ง SELECT จริงๆ ความแตกต่างระหว่างตารางที่เก็บไว้และมุมมองจะถูกนำมาพิจารณาด้วย แต่ความแตกต่างเหล่านี้ ที่ซ่อนอยู่จากผู้ใช้
ผลลัพธ์ของคำสั่ง SELECT จะเป็นตารางเสมอ ดังนั้นผลลัพธ์ของคำสั่ง SELECT จึงคล้ายคลึงกับตัวดำเนินการของพีชคณิตเชิงสัมพันธ์ ตัวดำเนินการพีชคณิตเชิงสัมพันธ์ใดๆ สามารถแสดงด้วยคำสั่ง SELECT ที่ใช้คำอย่างเหมาะสม ความซับซ้อนของคำสั่ง SELECT ถูกกำหนดโดยข้อเท็จจริงที่ว่ามันมีความสามารถทั้งหมดของพีชคณิตเชิงสัมพันธ์ เช่นเดียวกับความสามารถเพิ่มเติมที่ไม่มีอยู่ในพีชคณิตเชิงสัมพันธ์
คำสั่ง SQL พื้นฐาน ไวยากรณ์และตัวอย่างการใช้คำสั่ง SELECT
พื้นฐานของภาษา SQL ประกอบด้วยตัวดำเนินการ ซึ่งแบ่งออกเป็นหลายกลุ่มตามเงื่อนไขตามฟังก์ชันที่พวกเขาทำ
กลุ่มของตัวดำเนินการต่อไปนี้สามารถแยกแยะได้ (ไม่ใช่ตัวดำเนินการ SQL ทั้งหมดที่อยู่ในรายการ):
คำสั่ง DDL (Data Definition Language) - คำสั่งสำหรับกำหนดวัตถุฐานข้อมูล
· สร้าง SCHEMA - สร้างสคีมาฐานข้อมูล
· DROP SHEMA - ลบสคีมาฐานข้อมูล
· สร้างตาราง - สร้างตาราง
ALTER TABLE - เปลี่ยนตาราง
· DROP TABLE - ลบตาราง
· สร้างโดเมน - สร้างโดเมน
เปลี่ยนโดเมน - เปลี่ยนโดเมน
· DROP DOMAIN - ลบโดเมน
· CREATE COLLATION - สร้างลำดับ
· DROP COLLATION - ลบลำดับ
· สร้างมุมมอง - สร้างมุมมอง
· DROP VIEW - ลบมุมมอง
ตัวดำเนินการ DML (Data Manipulation Language) - ตัวดำเนินการจัดการข้อมูล
· SELECT - เลือกแถวจากตาราง
INSERT - เพิ่มแถวลงในตาราง
· UPDATE - เปลี่ยนแถวในตาราง
· DELETE - ลบแถวในตาราง
· COMMIT - คอมมิตการเปลี่ยนแปลงที่ทำ
· ROLLBACK - ย้อนกลับการเปลี่ยนแปลงที่ทำ
ผู้ดำเนินการปกป้องและจัดการข้อมูล
· สร้างการยืนยัน - สร้างข้อจำกัด
· DROP ASSERION - ลบข้อจำกัด
· GRANT - ให้สิทธิ์แก่ผู้ใช้หรือแอปพลิเคชันเพื่อจัดการอ็อบเจ็กต์
REVOKE - เพิกถอนสิทธิ์ผู้ใช้หรือแอปพลิเคชัน
ในเวลาเดียวกัน มีกลุ่มตัวดำเนินการสำหรับการตั้งค่าพารามิเตอร์เซสชัน รับข้อมูลเกี่ยวกับฐานข้อมูล ตัวดำเนินการ SQL แบบคงที่ และตัวดำเนินการ SQL แบบไดนามิก
สิ่งที่สำคัญที่สุดสำหรับผู้ใช้คือคำสั่งการจัดการข้อมูล (DML)
ตัวอย่างการใช้ตัวดำเนินการจัดการข้อมูล
INSERT - การแทรกแถวลงในตาราง
ตัวอย่างที่ 1- การแทรกหนึ่งแถวลงในตาราง:
ค่านิยม(4, "อีวานอฟ");
UPDATE - อัปเดตแถวในตาราง
ตัวอย่างที่ 3- อัปเดตหลายแถวในตาราง:
SET PNAME = "พุชนิคอฟ"
โดยที่ P.PNUM = 1;
DELETE - การลบแถวในตาราง
ตัวอย่างที่ 4- การลบหลายแถวในตาราง:
โดยที่ P.PNUM = 1;
ตัวอย่างการใช้คำสั่ง SELECT
จริงๆ แล้ว คำสั่ง SELECT เป็นคำสั่ง SQL ที่มีความสำคัญต่อผู้ใช้มากที่สุดและซับซ้อนที่สุด มันถูกออกแบบมาเพื่อดึงข้อมูลจากตาราง แทร.WS ในความเป็นจริงมันใช้หนึ่งในวัตถุประสงค์พื้นฐานของฐานข้อมูล - เพื่อให้ข้อมูลแก่ผู้ใช้
คำสั่ง SELECT จะถูกดำเนินการเสมอกับบางตารางที่เป็นส่วนหนึ่งของฐานข้อมูล
ความคิดเห็น- ในความเป็นจริงในฐานข้อมูลไม่เพียงมีตารางที่เก็บไว้อย่างถาวรเท่านั้น แต่ยังมีตารางชั่วคราวและสิ่งที่เรียกว่ามุมมองอีกด้วย มุมมองเป็นเพียงนิพจน์ SELECT ที่จัดเก็บไว้ในฐานข้อมูล จากมุมมองของผู้ใช้ มุมมองคือตารางที่ไม่ได้จัดเก็บอย่างถาวรในฐานข้อมูล แต่จะ "ปรากฏขึ้น" เมื่อมีการเข้าถึง จากมุมมองของคำสั่ง SELECT ทั้งตารางถาวรและตารางและมุมมองชั่วคราวจะมีลักษณะเหมือนกันทุกประการ แน่นอนว่า เมื่อระบบดำเนินการคำสั่ง SELECT จริงๆ ความแตกต่างระหว่างตารางที่เก็บไว้และมุมมองจะถูกนำมาพิจารณาด้วย แต่ความแตกต่างเหล่านี้ ที่ซ่อนอยู่จากผู้ใช้
ผลลัพธ์ของคำสั่ง SELECT จะเป็นตารางเสมอ อย่างไรก็ตาม ขึ้นอยู่กับผลลัพธ์ของการกระทำ คำสั่ง SELECT จะคล้ายกับตัวดำเนินการของพีชคณิตเชิงสัมพันธ์ ตัวดำเนินการพีชคณิตเชิงสัมพันธ์ใดๆ จะต้องแสดงด้วยคำสั่ง SELECT ที่ใช้คำอย่างเหมาะสม ความซับซ้อนของคำสั่ง SELECT ถูกกำหนดโดยข้อเท็จจริงที่ว่ามันมีความสามารถทั้งหมดของพีชคณิตเชิงสัมพันธ์ เช่นเดียวกับความสามารถเพิ่มเติมที่ไม่มีอยู่ในพีชคณิตเชิงสัมพันธ์
คำสั่งการดำเนินการคำสั่ง SELECT
เพื่อทำความเข้าใจว่าผลลัพธ์ของการดำเนินการคำสั่ง SELECT ได้มาอย่างไร ให้พิจารณาแผนภาพแนวคิดของการดำเนินการ โครงการนี้เป็นแนวคิดล้วนๆ เพราะ รับประกันว่าผลลัพธ์จะเหมือนกับการทำทีละขั้นตอนตามโครงร่างนี้ ในความเป็นจริง ผลลัพธ์ที่แท้จริงจะได้มาจากอัลกอริธึมที่ซับซ้อนมากขึ้นซึ่ง DBMS หนึ่งๆ “เป็นเจ้าของ”
ขั้นตอนที่ 1: การดำเนินการคำสั่ง SELECT เดียว
หากตัวดำเนินการมีคีย์เวิร์ด UNION, EXCEPT และ INTERSECT การสืบค้นจะถูกแบ่งออกเป็นหลาย ๆ การสืบค้นอิสระ ซึ่งแต่ละการสืบค้นจะดำเนินการแยกกัน:
ขั้นตอนที่ 1 (จาก)- ผลคูณคาร์ทีเซียนโดยตรงของตารางทั้งหมดที่ระบุในส่วนบังคับจากได้รับการคำนวณ จากขั้นตอนที่ 1 เราได้รับตาราง A
ขั้นตอนที่ 2 (ที่ไหน)- ถ้าคำสั่ง SELECT มี WHERE clause ตาราง A ที่ได้รับในขั้นตอนที่ 1 จะถูกสแกน ในกรณีนี้ สำหรับแต่ละแถวจากตาราง A นิพจน์เงื่อนไขที่กำหนดใน WHERE clause จะถูกคำนวณ เฉพาะแถวที่นิพจน์เงื่อนไขส่งคืน TRUE เท่านั้นที่จะรวมไว้ในผลลัพธ์ หากละเว้นส่วน WHERE ให้ดำเนินการขั้นตอนที่ 3 ทันที หากแบบสอบถามย่อยที่ซ้อนกันเกี่ยวข้องกับนิพจน์แบบมีเงื่อนไข แบบสอบถามเหล่านั้นจะถูกคำนวณตามโครงร่างแนวคิดนี้ จากขั้นตอนที่ 2 เราได้ตาราง B
ขั้นตอนที่ 3 (จัดกลุ่มตาม)- หากคำสั่ง SELECT มีส่วน GROUP BY แถวของตาราง B ที่ได้รับในขั้นตอนที่สองจะถูกจัดกลุ่มตามรายการการจัดกลุ่มที่ระบุในส่วน GROUP BY หากละเว้นส่วน GROUP BY ให้ดำเนินการขั้นตอนที่ 4 ทันที จากขั้นตอนที่ 3 เราจะได้ตาราง C
ขั้นตอนที่ 4 (มี)- หากคำสั่ง SELECT มีส่วน HAVING กลุ่มที่ไม่เป็นไปตามนิพจน์เงื่อนไขที่กำหนดในส่วน HAVING จะถูกแยกออก หากละเว้นส่วน HAVING ให้ดำเนินการขั้นตอนที่ 5 ทันที จากขั้นตอนที่ 4 เราจะได้ตาราง D
ขั้นตอนที่ 5 (เลือก)- แต่ละกลุ่มที่ได้รับในขั้นตอนที่ 4 จะสร้างแถวผลลัพธ์หนึ่งแถวดังนี้ นิพจน์สเกลาร์ทั้งหมดที่ระบุในส่วน SELECT ได้รับการประเมิน ตามกฎสำหรับการใช้ GROUP BY clause นิพจน์สเกลาร์ดังกล่าวจะต้องเหมือนกันสำหรับทุกแถวภายในแต่ละกลุ่ม สำหรับแต่ละกลุ่ม จะมีการคำนวณค่าของฟังก์ชันรวมที่ระบุในส่วน SELECT หากไม่มีส่วน GROUP BY แต่มีฟังก์ชันรวมในส่วน SELECT ก็ถือว่ามีเพียงกลุ่มเดียว หากไม่มีทั้งส่วน GROUP BY หรือฟังก์ชันรวม จะถือว่ามีกลุ่มมากเท่ากับจำนวนแถวที่เลือกในขณะนี้ จากผลลัพธ์ของขั้นตอนที่ 5 เราได้ตาราง E ซึ่งมีคอลัมน์มากเท่ากับจำนวนองค์ประกอบที่แสดงอยู่ในส่วน SELECT และมีแถวมากตามจำนวนกลุ่มที่เลือก
ขั้นตอนที่ 2 การดำเนินการ UNION, EXCEPT, INTERSECT
หากคำสั่ง SELECT มีคีย์เวิร์ด UNION, EXCEPT และ INTERSECT ตารางที่ได้รับจากขั้นตอนที่ 1 จะถูกรวม ลบ หรือตัดกัน
ขั้นตอนที่ 3 การเรียงลำดับผลลัพธ์
หากคำสั่ง SELECT มีส่วน ORDER BY แถวของตารางที่ได้รับในขั้นตอนก่อนหน้านี้จะถูกเรียงลำดับตามรายการเรียงลำดับที่ระบุในส่วน ORDER BY
คำสั่ง SQL พื้นฐาน ไวยากรณ์และตัวอย่างการใช้คำสั่ง SELECT - แนวคิดและประเภท การจำแนกประเภทและคุณลักษณะของหมวดหมู่ "ตัวดำเนินการ SQL พื้นฐาน ไวยากรณ์และตัวอย่างการใช้ตัวดำเนินการ SELECT" 2017, 2018.
ไวยากรณ์ของคำสั่ง SELECT เป็นดังนี้:เลือก<список атрибутов>/* จาก<список таблиц>
วงเล็บเหลี่ยมระบุองค์ประกอบที่อาจไม่มีอยู่ในคำขอ
รายชื่อนักเรียนทุกคน.
SELECT * จากนักเรียน
SELECT id_st นามสกุลจากนักเรียน
โปรดทราบว่าหากเราเพิ่มเข้าไป คำขอนี้ ORDER BY นามสกุล clause รายการจะเรียงลำดับตามนามสกุล ตามค่าเริ่มต้น การเรียงลำดับจะถือว่าเรียงลำดับจากน้อยไปหามาก หากต้องการเรียงลำดับจากมากไปน้อย คำว่า DESC จะถูกเพิ่มหลังชื่อแอททริบิวต์
แสดงรายการเกรดที่นักเรียนได้รับรหัส "1".
จัดทำรายการรหัสสำหรับนักเรียนที่ได้รับ D หรือ C อย่างน้อยหนึ่งรายการในการสอบ.
ในส่วนคำสั่ง WHERE คุณสามารถเขียนนิพจน์โดยใช้ ตัวดำเนินการทางคณิตศาสตร์การเปรียบเทียบ (<, >ฯลฯ) และตัวดำเนินการเชิงตรรกะ (AND, OR, NOT) เช่นเดียวกับในภาษาการเขียนโปรแกรมทั่วไป
พร้อมด้วยตัวดำเนินการเปรียบเทียบและ ตัวดำเนินการเชิงตรรกะในการสร้างเงื่อนไขในภาษา SQL (เนื่องจากขอบเขตเฉพาะ) มีตัวดำเนินการพิเศษจำนวนหนึ่งซึ่งตามกฎแล้วจะไม่มีอะนาล็อกในภาษาอื่น เหล่านี้คือตัวดำเนินการ:
- IN – การเข้าสู่ชุดค่าที่กำหนด;
- BETWEEN – การเข้าสู่ช่วงค่าที่กำหนด
- LIKE – การทดสอบการจับคู่รูปแบบ
- เป็นโมฆะ - ตรวจสอบค่าที่ไม่ได้กำหนด
ตัวดำเนินการ IN ใช้เพื่อตรวจสอบว่าค่ารวมอยู่ในชุดหรือไม่ ใช่ขอ
ให้ผลลัพธ์เช่นเดียวกับแบบสอบถามข้างต้น (จะแสดงตัวระบุของผู้สมัครทั้งหมดที่ได้รับ D หรือ C อย่างน้อยหนึ่งรายการในการสอบ)
ผลลัพธ์เดียวกันนี้สามารถทำได้โดยใช้ตัวดำเนินการ BETWEEN:
รายชื่อนักเรียนทุกคนที่มีนามสกุลขึ้นต้นด้วยตัวอักษร ก.
ในกรณีนี้ จะสะดวกในการใช้ตัวดำเนินการ LIKE
ตัวดำเนินการ LIKE ใช้กับฟิลด์อักขระโดยเฉพาะ และช่วยให้คุณกำหนดได้ว่าค่าของฟิลด์ตรงกับรูปแบบหรือไม่ รูปแบบอาจมีอักขระพิเศษ:
_ (ขีดล่าง) – แทนที่อักขระเดี่ยวใดๆ
% (เครื่องหมายเปอร์เซ็นต์) – แทนที่ลำดับของอักขระจำนวนเท่าใดก็ได้
บ่อยครั้งที่จำเป็นต้องคำนวณค่าต่ำสุดสูงสุดหรือค่าเฉลี่ยในคอลัมน์ ตัวอย่างเช่น คุณอาจต้องคำนวณเกรดเฉลี่ยของคุณ เพื่อทำการคำนวณดังกล่าว SQL ได้จัดเตรียมสิ่งพิเศษไว้ ฟังก์ชันรวม:
- นาที - ค่าต่ำสุดในคอลัมน์;
- แม็กซ์ – ค่าสูงสุดในคอลัมน์;
- SUM – ผลรวมของค่าในคอลัมน์
- AVG – ค่าเฉลี่ยในคอลัมน์
- COUNT – จำนวนค่าที่ไม่ใช่ NULL ในคอลัมน์
ข้อความค้นหาต่อไปนี้จะคำนวณค่าเฉลี่ยของคะแนนทั้งหมดที่นักเรียนได้รับในการสอบ
เลือก AVG (เครื่องหมาย) จาก mark_st
โดยธรรมชาติแล้วคุณสามารถใช้ ฟังก์ชันรวมร่วมกับส่วนคำสั่ง WHERE:
ข้อความค้นหานี้จะคำนวณคะแนนเฉลี่ยของนักเรียนที่มีรหัส 100 โดยพิจารณาจากผลการสอบทั้งหมดที่เขาทำ
แบบสอบถามนี้จะคำนวณคะแนนเฉลี่ยของนักเรียนโดยพิจารณาจากผลการสอบผ่านรหัส 10 นอกเหนือจากกลไกที่กล่าวถึง