Thứ Tư, 5 tháng 8, 2020

SQL Tutorial - Bài 3: Mệnh đề WHERE

Nội dung

  • Thiết lập môi trường
  • Giới thiệu
  • Điều kiện đẳng thức và bất đẳng thức
  • Điều kiện IN và NOT IN trong 
  • Điều kiện EXISTS và NOT EXISTS 
  • Điều kiện BETWEEN và NOT BETWEEN 
  • Điều kiện LIKE và NOT LIKE 
  • Điều kiện OR
  • Phần kết luận

Thiết lập môi trường

Bạn có thể thực hiện tất cả các truy vấn trực tuyến miễn phí bằng SQL Fiddle .
Các ví dụ trong bài viết này yêu cầu phải có các bảng sau đây.
--DROP TABLE employees PURGE;
--DROP TABLE departments PURGE;

CREATE TABLE departments (
  department_id   NUMBER(2) CONSTRAINT departments_pk PRIMARY KEY,
  department_name VARCHAR2(14),
  location        VARCHAR2(13)
);

INSERT INTO departments VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO departments VALUES (20,'RESEARCH','DALLAS');
INSERT INTO departments VALUES (30,'SALES','CHICAGO');
INSERT INTO departments VALUES (40,'OPERATIONS','BOSTON');
COMMIT;


CREATE TABLE employees (
  employee_id   NUMBER(4) CONSTRAINT employees_pk PRIMARY KEY,
  employee_name VARCHAR2(10),
  job           VARCHAR2(9),
  manager_id    NUMBER(4),
  hiredate      DATE,
  salary        NUMBER(7,2),
  commission    NUMBER(7,2),
  department_id NUMBER(2) CONSTRAINT emp_department_id_fk REFERENCES departments(department_id)
);

INSERT INTO employees VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO employees VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO employees VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO employees VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO employees VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO employees VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO employees VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO employees VALUES (7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87','dd-mm-rr')-85,3000,NULL,20);
INSERT INTO employees VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO employees VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO employees VALUES (7876,'ADAMS','CLERK',7788,to_date('13-JUL-87', 'dd-mm-rr')-51,1100,NULL,20);
INSERT INTO employees VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO employees VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO employees VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
COMMIT;
Các bảng này là một biến thể của các bảng EMP và DEPT từ lược đồ SCOTT. Bạn sẽ thấy rất nhiều ví dụ của Oracle trên internet bằng cách sử dụng các bảng từ lược đồ SCOTT. Bạn có thể tìm thấy các định nghĩa bảng gốc trong tập lệnh "$ORACLE_HOME/rdbms/admin/utlsampl.sql".

Giới thiệu

Mệnh đề WHERE được sử dụng để lọc các tập kết quả. Nếu các điều kiện lọc trong mệnh đề WHERE ước tính thành FALSE cho một hàng cụ thể, hàng đó sẽ không được trả về trong tập kết quả cuối cùng. Nhiều điều kiện lọc có thể được nhóm lại với nhau bằng cách sử dụng ANDvà ORđiều kiện.
Khi sử dụng cú pháp nối không ANSI, mệnh đề WHERE chứa cả điều kiện nối và điều kiện lọc.
SELECT e.employee_name, e.salary, d.department_id, d.department_name
FROM   employees e, departments d
WHERE  e.department_id = d.department_id  -- Điều kiện join
AND    d.department_id = 20               -- Lọc
AND    e.salary >= 2000                   -- Lọc
ORDER BY e.employee_name;

EMPLOYEE_N     SALARY DEPARTMENT_ID DEPARTMENT_NAM
---------- ---------- ------------- --------------
FORD             3000            20 RESEARCH
JONES            2975            20 RESEARCH
SCOTT            3000            20 RESEARCH

3 rows selected.

SQL>
Khi sử dụng cú pháp nối ANSI, mệnh đề WHERE chỉ chứa các điều kiện lọc.
SELECT e.employee_name, e.salary, d.department_id, d.department_name
FROM   employees e
       JOIN departments d ON e.department_id = d.department_id
WHERE  d.department_id = 20               -- Lọc
AND    e.salary >= 2000                   -- Lọc
ORDER BY e.employee_name;

EMPLOYEE_N     SALARY DEPARTMENT_ID DEPARTMENT_NAM
---------- ---------- ------------- --------------
FORD             3000            20 RESEARCH
JONES            2975            20 RESEARCH
SCOTT            3000            20 RESEARCH

3 rows selected.

SQL>
Trong phần còn lại của bài viết này, chúng tôi sẽ xem xét các loại điều kiện bạn có thể thấy trong mệnh đề WHEREHãy nhớ rằng, đây không phải là một danh sách đầy đủ, chỉ là một số trong những điều phổ biến nhất. Để giữ cho mọi thứ đơn giản, các ví dụ sau sẽ sử dụng cú pháp nối ANSI, vì vậy mệnh đề WHERE chỉ chứa các điều kiện lọc.

Điều kiện bình đẳng và bất bình đẳng

Điều kiện lọc có thể sử dụng các bài kiểm tra đẳng thức và bất đẳng thức cơ bản.
  • =: Bằng nhau.
  • <> hoặc! =: Không bằng nhau.
  • >: Lớn hơn.
  • <: Ít hơn.
  • > =: Tuyệt vời hơn hoặc bằng.
  • <=: Nhỏ hơn hoặc bằng.
SELECT e.employee_name, e.department_id, e.salary
FROM   employees e
WHERE  e.department_id = 20
AND    e.salary >= 2000
ORDER BY e.employee_name;

EMPLOYEE_N DEPARTMENT_ID     SALARY
---------- ------------- ----------
FORD                  20       3000
JONES                 20       2975
SCOTT                 20       3000

3 rows selected.

SQL>

Điều kiện IN và NOT IN

Điều kiện IN ước tính thành TRUE cho các giá trị cột trong danh sách đã chỉ định.
SELECT e.department_id, e.employee_id, e.employee_name
FROM   employees e
WHERE  e.department_id IN (10, 20)
ORDER BY e.department_id, e.employee_id;

DEPARTMENT_ID EMPLOYEE_ID EMPLOYEE_N
------------- ----------- ----------
           10        7782 CLARK
           10        7839 KING
           10        7934 MILLER
           20        7369 SMITH
           20        7566 JONES
           20        7788 SCOTT
           20        7876 ADAMS
           20        7902 FORD

8 rows selected.

SQL>
Điều kiện NOT IN ước tính thành TRUE cho các giá trị cột không có trong danh sách đã chỉ định.
SELECT e.department_id, e.employee_id, e.employee_name
FROM   employees e
WHERE  e.department_id NOT IN (10, 20)
ORDER BY e.department_id, e.employee_id;

DEPARTMENT_ID EMPLOYEE_ID EMPLOYEE_N
------------- ----------- ----------
           30        7499 ALLEN
           30        7521 WARD
           30        7654 MARTIN
           30        7698 BLAKE
           30        7844 TURNER
           30        7900 JAMES

6 rows selected.

SQL>
Các điều kiện IN và NOT IN có thể được đánh giá theo các giá trị được trả về bởi một truy vấn con.
SELECT e.department_id, e.employee_id, e.employee_name
FROM   employees e
WHERE  e.department_id IN (SELECT d.department_id
                           FROM   departments d
                           WHERE  d.department_id < 30)
ORDER BY e.department_id, e.employee_id;

DEPARTMENT_ID EMPLOYEE_ID EMPLOYEE_N
------------- ----------- ----------
           10        7782 CLARK
           10        7839 KING
           10        7934 MILLER
           20        7369 SMITH
           20        7566 JONES
           20        7788 SCOTT
           20        7876 ADAMS
           20        7902 FORD

8 rows selected.

SQL>

Điều kiện EXISTS và NOT EXISTS 

Điều kiện EXISTS ước tính thành TRUE nếu truy vấn con trả về một hoặc nhiều hàng.
SELECT d.department_id, d.department_name
FROM   departments d
WHERE  EXISTS (SELECT 1
               FROM   employees e
               WHERE  d.department_id = e.department_id)
ORDER BY d.department_id;

DEPARTMENT_ID DEPARTMENT_NAM
------------- --------------
           10 ACCOUNTING
           20 RESEARCH
           30 SALES

3 rows selected.

SQL>
Điều kiện NOT EXISTS ước tính thành TRUE nếu truy vấn con trả về 0 hàng.
SELECT d.department_id, d.department_name
FROM   departments d
WHERE  NOT EXISTS (SELECT 1
                   FROM   employees e
                   WHERE  d.department_id = e.department_id)
ORDER BY d.department_id;

DEPARTMENT_ID DEPARTMENT_NAM
------------- --------------
           40 OPERATIONS

1 row selected.

SQL>

Điều kiện BETWEEN và NOT BETWEEN

Điều kiện BETWEEN ước tính thành TRUE cho các giá trị cột trong phạm vi được chỉ định, bao gồm các ranh giới.
SELECT d.department_id, d.department_name
FROM   departments d
WHERE  department_id BETWEEN 20 AND 40
ORDER BY d.department_id;

DEPARTMENT_ID DEPARTMENT_NAM
------------- --------------
           20 RESEARCH
           30 SALES
           40 OPERATIONS

3 rows selected.
Điều kiện NOT BETWEEN ước tính thành TRUE cho các giá trị cột không nằm trong phạm vi được chỉ định, bao gồm các ranh giới.
SELECT d.department_id, d.department_name
FROM   departments d
WHERE  department_id NOT BETWEEN 20 AND 40
ORDER BY d.department_id;

DEPARTMENT_ID DEPARTMENT_NAM
------------- --------------
           10 ACCOUNTING

1 row selected.

SQL>

Điều kiện LIKE và NOT LIKE

Điều kiện LIKE ước tính thành TRUE nếu có mẫu khớp. '%' Là ký tự đại diện có chiều dài thay đổi. '_' Là ký tự đại diện một ký tự.
SELECT d.department_id, d.department_name
FROM   departments d
WHERE  department_name LIKE '%O%'
ORDER BY d.department_id;

DEPARTMENT_ID DEPARTMENT_NAM
------------- --------------
           10 ACCOUNTING
           40 OPERATIONS

2 rows selected.

SQL>
Điều kiện NOT LIKE ước tính thành TRUE nếu không có mẫu khớp.
SELECT d.department_id, d.department_name
FROM   departments d
WHERE  department_name NOT LIKE '%O%'
ORDER BY d.department_id;

DEPARTMENT_ID DEPARTMENT_NAM
------------- --------------
           20 RESEARCH
           30 SALES

2 rows selected.

SQL>

Điều kiện OR

Hãy cẩn thận khi liên kết các điều kiện với nhau trong mệnh đề WHERE bằng cách sử dụng điều kiện ORThật dễ dàng để làm rối logic của bạn. Trong ví dụ sau tôi nghĩ rằng tôi đã yêu cầu các nhà quản lý và thư ký ở department_id=20.
SELECT e.employee_id, e.employee_name, e.department_id, e.salary, e.job
FROM   employees e
WHERE  e.department_id = 20
AND    e.job = 'MANAGER'
OR     e.job = 'CLERK'
ORDER BY e.employee_id;

EMPLOYEE_ID EMPLOYEE_N DEPARTMENT_ID     SALARY JOB
----------- ---------- ------------- ---------- ---------
       7369 SMITH                 20        800 CLERK
       7566 JONES                 20       2975 MANAGER
       7876 ADAMS                 20       1100 CLERK
       7900 JAMES                 30        950 CLERK
       7934 MILLER                10       1300 CLERK

5 rows selected.

SQL>
Chúng ta có thể thấy từ đầu ra, chúng tôi đã trả lại nhân viên từ bộ phận 30 và 10. Điều này là do điều kiện OR đã hủy bỏ điều kiện bộ phận nếu nhân viên là nhân viên bán hàng.
Chúng ta nên sử dụng dấu ngoặc đơn để đảm bảo rằng chúng ta đã hỏi đúng câu hỏi.
SELECT e.employee_id, e.employee_name, e.department_id, e.salary, e.job
FROM   employees e
WHERE  e.department_id = 20
AND    (e.job = 'MANAGER' OR e.job = 'CLERK')
ORDER BY e.employee_id;

EMPLOYEE_ID EMPLOYEE_N DEPARTMENT_ID     SALARY JOB
----------- ---------- ------------- ---------- ---------
       7369 SMITH                 20        800 CLERK
       7566 JONES                 20       2975 MANAGER
       7876 ADAMS                 20       1100 CLERK

3 rows selected.

SQL>

Phần kết luận

Có nhiều chức năng, điều kiện và toán tử mà bạn sẽ tiếp xúc trong suốt quá trình làm việc với SQL, nhưng tất cả chúng đều là những bổ sung trên nền tảng này. Hiểu những điều cơ bản và những thứ khác sẽ rơi vào vị trí theo thời gian.
Người mới bắt đầu thường thấy các phép nối (join) khá khó hiểu và có xu hướng hấp dẫn các điều kiện IN và EXISTS để lọc dữ liệu, ngay cả trong trường hợp sẽ hiệu quả hơn khi tham gia vào bảng cụ thể và sử dụng bộ lọc đơn giản để chống lại dùng join. Trong những ngày đầu, bạn có thể sẽ tập trung vào việc chỉ cố gắng để có được kết quả chính xác, nhưng để phát triển lâu dài, bạn nên thử càng nhiều phương pháp khác nhau để có kết quả giống nhau nhất có thể và so sánh hiệu suất. 

Bạn cũng cần lưu ý rằng những gì bạn viết không phải lúc nào cũng là những gì Oracle chạy. Trong một số trường hợp, trình tối ưu hóa (optimizer) sẽ chuyển đổi (viết lại) câu lệnh của bạn. Ví dụ, một điều kiện IN sử dụng danh sách có thể được mở rộng thành một nhóm các điều kiện bình đẳng được liên kết với các điều kiện ORLúc đầu có thể gây bỡ ngỡ cho bạn, nhưng khi bạn làm lâu về sau, bạn sẽ cần bắt đầu xem xét điều này khi chọn điều kiện lọc để sử dụng.
=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
SQL Tutorial  - Bài 3: Mệnh đề WHERE, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master