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
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 AND
và 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 đề
WHERE
. Hã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 OR
. Thậ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 OR
. Lú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