การ จำกัด และการจัดเรียงข้อมูล
ความสามารถที่สำคัญของคำสั่ง SELECT ได้แก่ Selection, Projection และ Joining การแสดงคอลัมน์เฉพาะจากตารางเรียกว่าการดำเนินการโครงการ ตอนนี้เราจะเน้นไปที่การแสดงแถวเฉพาะของเอาต์พุต สิ่งนี้เรียกว่าการดำเนินการเลือก คุณสามารถเลือกแถวเฉพาะได้โดยการเพิ่ม WHERE clause ในแบบสอบถาม SELECT ตามความเป็นจริงแล้วส่วนคำสั่ง WHERE จะปรากฏหลังส่วนคำสั่ง FROM ในลำดับชั้นของแบบสอบถามที่เลือก ลำดับจะต้องได้รับการดูแลในทุกสถานการณ์ หากละเมิด Oracle จะยกข้อยกเว้น
ไวยากรณ์:
SELECT *|{[DISTINCT] column| expression [alias],..}
FROM table
[WHERE condition(s)]
ในไวยากรณ์
WHERE clause คือคีย์เวิร์ด
[เงื่อนไข] ประกอบด้วยชื่อคอลัมน์นิพจน์ค่าคงที่ตัวอักษรและตัวดำเนินการเปรียบเทียบ
สมมติว่าผู้จัดการของคุณกำลังทำงานโดยใช้งบประมาณรายไตรมาสสำหรับองค์กรของคุณ ในส่วนหนึ่งของกิจกรรมนี้จำเป็นต้องจัดทำรายการรายละเอียดที่สำคัญของพนักงานแต่ละคน แต่สำหรับพนักงานที่ได้รับค่าจ้างอย่างน้อย 25,000 เหรียญต่อปี แบบสอบถาม SQL ด้านล่างช่วยให้งานนี้สำเร็จ สังเกตการใช้คำสั่ง WHERE ที่แสดงเป็นตัวหนา
SELECT Employee_ID, Last_Name, First_Name, Salary
FROM employees
WHERE Salary >= 25000;
EMPLOYEE_ID LAST_NAME FIRST_NAME SALARY
---------- --------------- --------------- -----------
88303 Jones Quincey $30,550.00
88404 Barlow William $27,500.00
88505 Smith Susan $32,500.00
3 rows selected
ประเด็นที่ควรสังเกต -
คำสั่ง SELECT สามารถมี WHERE ได้เพียงคำสั่งเดียว อย่างไรก็ตามเงื่อนไขการกรองหลายเงื่อนไขสามารถต่อท้าย WHERE clause โดยใช้ AND หรือ OR operator
คอลัมน์ตัวอักษรหรือนิพจน์ในส่วนคำสั่งเพรดิเคตต้องเป็นชนิดข้อมูลที่คล้ายกันหรือสลับกันได้
ไม่สามารถใช้นามแฝงคอลัมน์ในส่วนคำสั่ง WHERE
ตัวอักษรต้องอยู่ภายในเครื่องหมายอัญประกาศเดี่ยวและคำนึงถึงขนาดตัวพิมพ์
ตัวอักษรวันที่ต้องอยู่ภายในเครื่องหมายคำพูดเดียวและมีความสำคัญกับรูปแบบ รูปแบบเริ่มต้นคือDD-MON-RR.
ตัวดำเนินการเปรียบเทียบ
ตัวดำเนินการเปรียบเทียบใช้ในเพรดิเคตเพื่อเปรียบเทียบคำหนึ่งหรือตัวถูกดำเนินการกับคำอื่น SQL มีชุดตัวดำเนินการความเท่าเทียมความไม่เท่าเทียมและเบ็ดเตล็ดที่ครอบคลุม สามารถใช้ได้โดยขึ้นอยู่กับข้อมูลและตรรกะเงื่อนไขตัวกรองในแบบสอบถาม SELECT เมื่อคุณใช้ตัวดำเนินการเปรียบเทียบในส่วนคำสั่ง WHERE อาร์กิวเมนต์ (วัตถุหรือค่าที่คุณกำลังเปรียบเทียบ) ทั้งสองด้านของตัวดำเนินการต้องเป็นชื่อคอลัมน์หรือค่าเฉพาะ หากใช้ค่าเฉพาะค่านั้นจะต้องเป็นค่าตัวเลขหรือสตริงตามตัวอักษร หากค่าเป็นสตริงอักขระหรือวันที่คุณต้องป้อนค่าภายในเครื่องหมายคำพูดเดี่ยว ('')
Oracle มีตัวดำเนินการเปรียบเทียบเก้าตัวที่จะใช้ในสภาวะความเท่าเทียมหรืออสมการ
Operator Meaning
= equal to
< less than
> greater than
>= greater than or equal to
<= less than or equal to
!= not equal to
<> not equal to
ตัวดำเนินการ Oracle อื่น ๆ ได้แก่ ระหว่าง .. และในชอบและเป็นโมฆะ
ระหว่างตัวดำเนินการ
สามารถใช้ตัวดำเนินการ BETWEEN เพื่อเปรียบเทียบค่าคอลัมน์ภายในช่วงที่กำหนด ช่วงที่ระบุต้องมีขีด จำกัด ล่างและบนซึ่งรวมทั้งสองอย่างระหว่างการเปรียบเทียบ การใช้งานคล้ายกับตัวดำเนินการอสมการแบบผสม (<= and> =) สามารถใช้ได้กับค่าตัวเลขอักขระและประเภทวันที่
ตัวอย่างเช่นเงื่อนไข WHERE SALARY BETWEEN 1500 AND 2500 ในแบบสอบถาม SELECT จะแสดงรายชื่อพนักงานที่มีเงินเดือนอยู่ระหว่าง 1,500 ถึง 2500
ตัวดำเนินการใน
ตัวดำเนินการ IN ใช้เพื่อทดสอบค่าคอลัมน์ในชุดค่าที่กำหนด ถ้าคอลัมน์สามารถเทียบเคียงกับค่าใด ๆ จากชุดที่กำหนดเงื่อนไขจะถูกตรวจสอบ เงื่อนไขที่กำหนดโดยใช้ตัวดำเนินการ IN เรียกอีกอย่างว่าเงื่อนไขการเป็นสมาชิก
ตัวอย่างเช่นเงื่อนไข WHERE SALARY IN (1500, 3000, 2500) ในแบบสอบถาม SELECT จะ จำกัด แถวที่เงินเดือนอยู่ที่ 1,500, 3000 หรือ 2500
ตัวดำเนินการ LIKE
ตัวดำเนินการ LIKE ใช้สำหรับการจับคู่รูปแบบและการค้นหาสัญลักษณ์แทนในแบบสอบถามแบบเลือก หากไม่ทราบค่าส่วนหนึ่งของคอลัมน์สามารถใช้สัญลักษณ์แทนเพื่อแทนที่ส่วนที่ไม่รู้จักได้ ใช้ตัวดำเนินการตัวแทนเพื่อสร้างสตริงการค้นหาดังนั้นการค้นหาจึงเรียกว่าการค้นหาโดยใช้สัญลักษณ์แทน ตัวดำเนินการทั้งสองนี้คือ Percentile ('%') และ Underscore ('_') ขีดล่าง ('_') ใช้แทนอักขระเดี่ยวในขณะที่เปอร์เซ็นไทล์ ('%') แทนที่มากกว่าหนึ่งอักขระ สามารถใช้ร่วมกันได้เช่นกัน
ตัวอย่างเช่นคำค้นหา SELECT ด้านล่างแสดงชื่อของพนักงานที่นามสกุลขึ้นต้นด้วย 'SA'
SELECT first_name
FROM employees
WHERE last_name LIKE 'SA%';
เป็น (ไม่) เงื่อนไขเป็นโมฆะ
ที่ต้องสังเกตไม่สามารถทดสอบค่า NULL โดยใช้ตัวดำเนินการความเท่าเทียมกันได้ เป็นเพราะไม่ทราบค่า NULL และไม่ได้กำหนดในขณะที่ตัวดำเนินการความเท่าเทียมกันจะทดสอบค่าที่แน่นอน ตัวดำเนินการ IS NULL ทำหน้าที่เป็นตัวดำเนินการความเท่าเทียมกันเพื่อตรวจสอบค่า NULL ของคอลัมน์
ตัวอย่างเช่นเงื่อนไข WHERE COMMISSION_PCT IS NULL ในแบบสอบถาม SELECT จะแสดงรายการพนักงานที่ไม่มีเปอร์เซ็นต์ค่าคอมมิชชั่น
ตัวดำเนินการทางตรรกะ
สามารถเพิ่มเงื่อนไขตัวกรองหลายเงื่อนไขลงในเพรดิเคต WHERE clause สามารถรวมเงื่อนไขได้มากกว่าหนึ่งเงื่อนไขเข้าด้วยกันโดยใช้ตัวดำเนินการเชิงตรรกะ AND, OR และ NOT
และ: รวมเงื่อนไขสองเงื่อนไขขึ้นไปและส่งกลับผลลัพธ์ก็ต่อเมื่อเงื่อนไขทั้งหมดเป็นจริง
หรือ: รวมเงื่อนไขสองเงื่อนไขขึ้นไปและจะส่งกลับผลลัพธ์เมื่อเงื่อนไขใด ๆ เป็นจริง
NOT: ลบล้างนิพจน์ที่ตามหลังมัน
ตัวดำเนินการ AND เชื่อมโยงสองเงื่อนไขขึ้นไปในส่วนคำสั่ง WHERE และส่งกลับค่า TRUE ก็ต่อเมื่อเงื่อนไขทั้งหมดเป็นจริง สมมติว่าผู้จัดการต้องการรายชื่อพนักงานหญิง นอกจากนี้รายชื่อควรรวมเฉพาะพนักงานที่มีนามสกุลที่ขึ้นต้นด้วยตัวอักษร "E" หรือตามตัวอักษรในภายหลัง นอกจากนี้ตารางผลลัพธ์ควรเรียงตามนามสกุลของพนักงาน มีสองเงื่อนไขง่ายๆที่จะต้องปฏิบัติตาม คำสั่ง WHERE อาจเขียนเป็น: WHERE Gender = 'F' AND last_name> 'E'
SELECT last_name "Last Name", first_name "First Name", Gender "Gender"
FROM employees
WHERE Gender = 'F' AND last_name > 'E'
ORDER BY last_name;
ตัวดำเนินการ OR เชื่อมโยงเงื่อนไขมากกว่าหนึ่งเงื่อนไขในส่วนคำสั่ง WHERE และส่งกลับค่า TRUE หากเงื่อนไขใดเงื่อนไขหนึ่งคืนค่าเป็นจริง สมมติว่าข้อกำหนดของผู้จัดการองค์กรของคุณเปลี่ยนไปเล็กน้อย จำเป็นต้องมีรายชื่อพนักงานอื่น แต่ในรายชื่อนี้พนักงานควร: (1) เป็นหญิงหรือ (2) มีนามสกุลที่ขึ้นต้นด้วยตัวอักษร "T" หรือตัวอักษรที่มาทีหลังในตัวอักษร ตารางผลลัพธ์ควรเรียงตามนามสกุลของพนักงาน ในสถานการณ์นี้สามารถพบเงื่อนไขอย่างใดอย่างหนึ่งจากสองเงื่อนไขเพื่อตอบสนองการสืบค้น พนักงานหญิงควรมีรายชื่อพร้อมกับพนักงานที่มีชื่อตรงตามเงื่อนไขที่สอง
ตัวดำเนินการ NOT ใช้เพื่อลบล้างนิพจน์หรือโครงสร้าง
คำสั่งซื้อตามข้อ
เมื่อคุณแสดงข้อมูลเพียงไม่กี่แถวอาจไม่จำเป็นต้องเรียงลำดับผลลัพธ์ อย่างไรก็ตามเมื่อคุณแสดงแถวจำนวนมากผู้จัดการอาจได้รับความช่วยเหลือในการตัดสินใจโดยจัดเรียงข้อมูล เอาต์พุตจากคำสั่ง SELECT สามารถเรียงลำดับได้โดยใช้คำสั่ง ORDER BY เมื่อคุณใช้คำสั่ง ORDER BY ชื่อคอลัมน์ที่คุณกำลังสั่งซื้อจะต้องเป็นชื่อคอลัมน์ที่ระบุไว้ในส่วนคำสั่ง SELECT
แบบสอบถาม SQL ด้านล่างใช้คำสั่ง ORDER BY เพื่อจัดเรียงตารางผลลัพธ์ตามคอลัมน์ last_name จากน้อยไปหามาก ลำดับจากน้อยไปมากคือลำดับการจัดเรียงเริ่มต้น
SELECT last_name, first_name
FROM employees
WHERE last_name >= 'J'
ORDER BY last_name;
last_name first_name
--------------- ---------------
Jones Quincey
Klepper Robert
Quattromani Toni
Schultheis Robert
การเรียงลำดับสามารถขึ้นอยู่กับค่าตัวเลขและวันที่ด้วย นอกจากนี้ยังสามารถจัดเรียงตามคอลัมน์หลายคอลัมน์
โดยค่าเริ่มต้นคำสั่ง ORDER BY จะเรียงแถวเอาต์พุตในตารางผลลัพธ์จากน้อยไปมาก เราสามารถใช้คีย์เวิร์ด DESC (ย่อมาจากมากไปหาน้อย) เพื่อเปิดใช้งานการเรียงลำดับจากมากไปหาน้อย ค่าดีฟอลต์ทางเลือกคือ ASC ซึ่งเรียงลำดับจากน้อยไปหามาก แต่คีย์เวิร์ด ASC มักไม่ค่อยใช้เนื่องจากเป็นค่าเริ่มต้น เมื่อใช้คีย์เวิร์ดทางเลือก ASC หรือ DESC คีย์เวิร์ดนั้นจะต้องเป็นไปตามชื่อคอลัมน์ที่คุณกำลังเรียงลำดับในส่วนคำสั่ง WHERE
Positional Sorting - ตำแหน่งตัวเลขของคอลัมน์ในรายการคอลัมน์ที่เลือกสามารถกำหนดได้ใน ORDER BY clause แทนชื่อคอลัมน์ ส่วนใหญ่จะใช้ในการสืบค้น UNION (จะกล่าวถึงในภายหลัง) แบบสอบถามจะเรียงลำดับผลลัพธ์ที่กำหนดโดยเงินเดือนเนื่องจากปรากฏเป็นอันดับ 2 ในรายการคอลัมน์
SELECT first_name, salary
FROM employees
ORDER BY 2;
ตัวแปรทดแทน
เมื่อต้องดำเนินการเคียวรี SQL มากกว่าหนึ่งครั้งสำหรับชุดอินพุตที่แตกต่างกันสามารถใช้ตัวแปรทดแทนได้ สามารถใช้ตัวแปรการแทนที่เพื่อแจ้งให้ผู้ใช้ป้อนข้อมูลก่อนการดำเนินการสืบค้น มีการใช้กันอย่างแพร่หลายในการสร้างรายงานตามแบบสอบถามซึ่งใช้ช่วงข้อมูลจากผู้ใช้เป็นอินพุตสำหรับการกรองตามเงื่อนไขและการแสดงข้อมูล ตัวแปรการแทนที่ถูกนำหน้าด้วยสัญลักษณ์เครื่องหมายเดียวและ (&) เพื่อเก็บค่าไว้ชั่วคราว ตัวอย่างเช่น,
SELECT EMPLOYEE_ID, LAST_NAME, SALARY
FROM employees
WHERE LAST_NAME = &last_name
OR EMPLOYEE_ID = &EMPNO;
เมื่อดำเนินการค้นหา SELECT ด้านบน oracle จะระบุตัวแปร '&' เป็นตัวแปรทดแทน จะแจ้งให้ผู้ใช้ป้อนค่าสำหรับ 'last_name' และ 'EMPNO' ดังต่อไปนี้
Enter value for last_name:
Enter value for empno:
เมื่อผู้ใช้ป้อนข้อมูลให้กับตัวแปรทั้งสองค่าจะถูกแทนที่การสืบค้นจะได้รับการตรวจสอบและดำเนินการ
ประเด็นที่ควรสังเกต -
หากตัวแปรมีไว้เพื่อแทนค่าอักขระหรือวันที่จำเป็นต้องใส่ลิเทอรัลไว้ในเครื่องหมายคำพูดเดี่ยว เทคนิคที่มีประโยชน์คือการใส่ตัวแปรการแทนที่เครื่องหมายและในเครื่องหมายคำพูดเดี่ยวเมื่อจัดการกับค่าอักขระและวันที่
ทั้ง SQL Developer และ SQL * Plus สนับสนุนตัวแปรการทดแทนและคำสั่ง DEFINE / UNDEFINE แม้ว่า SQL Developer หรือ SQL * Plus จะไม่รองรับการตรวจสอบความถูกต้อง (ยกเว้นประเภทข้อมูล) บนอินพุตของผู้ใช้
คุณสามารถใช้ตัวแปรทดแทนไม่เพียง แต่ในส่วนคำสั่ง WHERE ของคำสั่ง SQL เท่านั้น แต่ยังใช้แทนชื่อคอลัมน์นิพจน์หรือข้อความได้อีกด้วย
การใช้ตัวแปรสองแอมเพอร์แซนด์และการแทนที่
เมื่อมีการใช้ตัวแปรการแทนที่เดียวกันมากกว่าหนึ่งตำแหน่งดังนั้นเพื่อหลีกเลี่ยงการป้อนข้อมูลเดิมซ้ำอีกเราใช้เครื่องหมายแอมเพอร์แซนด์คู่และการแทนที่ ในกรณีเช่นนี้ค่าของตัวแปรการแทนที่เมื่อป้อนแล้วจะถูกแทนที่ในทุกกรณีของการใช้งาน
SELECT first_name, HIRE_DATE, SEPARATION_DATE
FROM employees
WHERE HIRE_DATE LIKE '%&DT%' AND SEPARATION_DATE '%&&DT%'
โปรดทราบว่าค่าเดียวกันของ & DT จะถูกแทนที่สองครั้งในแบบสอบถามด้านบน ดังนั้นค่าที่ผู้ใช้กำหนดจะถูกแทนที่ด้วยสองตำแหน่ง
คำสั่ง DEFINE และ VERIFY
การตั้งค่านิยามของตัวแปรในเซสชันถูกกำหนดโดยคุณสมบัติ DEFINE ของ SQL * Plus ตัวแปรสามารถกำหนดได้ในเซสชันเพื่อหลีกเลี่ยงการหยุดระหว่างการดำเนินการสืบค้น Oracle อ่านตัวแปรเดียวกันทุกครั้งที่พบในแบบสอบถาม SQL อยู่ในสถานะเปิดตามค่าเริ่มต้น ด้วยความช่วยเหลือของ DEFINE clause คุณสามารถประกาศตัวแปรในบรรทัดคำสั่งก่อนที่จะดำเนินการสืบค้นเป็นDEFINE variable=value;.
คำสั่ง Verify ตรวจสอบการแทนที่ด้านบนที่แสดงเป็นคำสั่ง OLD และ NEW ปิดโดยค่าเริ่มต้นและสามารถตั้งค่าเป็นเปิดโดยใช้คำสั่ง SET
SQL> SET DEFINE ON
SQL> SET VERIFY ON
SQL> DEFINE NAME = MARTIN'
SQL> SELECT first_name, SALARY
FROM employees
WHERE first_name = '&NAME';
OLD 1: select first_name, sal from employee where first_name = '&first_name'
new 1: select first_name, sal from employee where first_name = 'MARTIN'
first_name SALARY
------- -------
MARTIN 5000