การ จำกัด และการจัดเรียงข้อมูล

ความสามารถที่สำคัญของคำสั่ง 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