คำสั่ง dml sql ตัวดำเนินการ SQL พื้นฐาน SQL แบบโต้ตอบ ลบตัวดำเนินการดู

พื้นฐานของภาษา 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:

  • ทั้งหมด / ทั้งหมด = ทั้งหมด (เช่นในกรณีนี้มี การหารจำนวนเต็ม)
  • จริง / จำนวนเต็ม = จริง
  • จำนวนเต็ม / จริง = จริง
เหล่านั้น. ผลลัพธ์จะถูกแปลงเป็น ประเภทที่ใหญ่กว่าดังนั้นใน 2 กรณีสุดท้าย เราจะได้จำนวนจริง (คิดแบบคณิตศาสตร์ - พิสัย ตัวเลขจริงมีค่ามากกว่าช่วงของจำนวนเต็ม ดังนั้นผลลัพธ์จึงถูกแปลงเป็นค่าดังกล่าว):

เลือก 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

ลำดับการใช้คำสั่งกับชุดพนักงานเริ่มต้นมีดังนี้:

  1. โดยที่ – หากระบุไว้ ขั้นตอนแรกจากชุดพนักงานทั้งหมดคือการเลือกเฉพาะเรกคอร์ดที่ตรงตามเงื่อนไข
  2. DISTINCT – หากระบุไว้ รายการซ้ำทั้งหมดจะถูกละทิ้ง
  3. ORDER BY – หากระบุ ผลลัพธ์จะถูกจัดเรียง
  4. 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 และ LIKE

BETWEEN – ตรวจสอบการรวมในช่วง

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”: อักขระพิเศษ:

  1. ขีดล่าง “_” หมายความว่าสามารถใช้อักขระตัวเดียวแทนได้
  2. เครื่องหมายเปอร์เซ็นต์ “%” - บอกว่าสามารถแทนที่ด้วยอักขระจำนวนเท่าใดก็ได้ รวมถึงไม่มีด้วย
ลองดูตัวอย่างที่มีสัญลักษณ์ "%" (ในทางปฏิบัติมักใช้บ่อยกว่า):

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 นอกเหนือจากกลไกที่กล่าวถึง