– Kiểu dữ liệu data type– Hàm functions – Mệnh đề Group by group By clause – Truy vấn con sub-queries... Hàm Ngày tháng tt• CURRENT_DATE trả về ngày tháng hiện tại nơi mà người dùng đang
Trang 1Data type – Function – Subquery
Trang 2– Kiểu dữ liệu (data type)
– Hàm (functions)
– Mệnh đề Group by (group By clause)
– Truy vấn con (sub-queries)
Trang 3Kiểu dữ liệu (data type)
VARCHAR2(n) Dữ liệu kiểu ký tự, n<=4000
CHAR(n) Dữ liệu kiểu ký tự, kích thước cố đinh, n<=2000
NUMBER Kiểu số nguyên, số ký số tối đa là 38 ký số
NUMBER(p) Kiểu số nguyên, với số ký số tối đa là p
NUMBER(p,s) Kiểu số thực, tối đa p ký số, s số thập phân p≤38, -84 ≤ s ≤ 127.Ví dụ: số 7456123, khai báo kiểu number (7, -2)
= 7456100 DATE Kiểu ngày, lưu ngày từ 1/1/4712 BC -> 31/12/9999
LONG Kiểu ký tự (Do not create tables with LONG columns Use LOB columns (CLOB, NCLOB) instead LONG
columns are supported only for backward compatibility.) RAW Chuỗi nhị phân dài tối đa 2000 bytes
LONG RAW Chuỗi nhị phân dài tối đa 2GB
BLOB (Bynary Large Object) có độ dài ≤ 4GB
CLOB (Character Large Object) có độ dài ≤ 4GB
BFILE Chứa con trỏ chỉ đến một tập tin nhị phân ở ngoài DB
Trang 4Hàm
Trang 5Hàm chuyển đổi chữ hoa, chữ thường
Trang 6Ví dụ: Hàm chuyển đổi chữ hoa, thường
SELECT last_name, job_id, salary
Trang 8Chỉ lấy đến vị trí thứ 2 sau dấu chấm
Trang 9Ví dụ: TRUNC
• Kết quả: 45 (zero decimal places)
• Ghi chú: DUAL là một table giả, được dùng để xem kết quả từ một hàm hoặc từ
một tính toán nào đó
SELECT TRUNC(45.923)
Trang 10Hàm Ngày tháng
• ADD_MONTHS (date, integer)
– trả về ngày tháng đã cộng với một số nguyên (integer) vào tháng.
– Ví dụ
• add_months('01-Aug-03', 3) = 01-Nov-03
• add_months('01-Aug-03', -3) = 01-MAY-03
• add_months('31-Jan-03', 1) = 28-FEB-03
• MONTHS_BETWEEN (date1, date2)
– Trả về số tháng giữa date1 và date2
– Ví dụ: months_between('02-Feb-1995', '01-Jan-1995’) = 1.03225806
Trang 11Hàm Ngày tháng (tt)
• ROUND(date [, fmt ]): trả về ngày tháng đã được làm tròn đến hàng đơn vị được xác định bởi định dạng ngày tháng (fmt)
– Ví dụ
• ROUND (TO_DATE ('27-OCT-00'),'YEAR') = 01-JAN-01
• ROUND(TO_DATE('13-OCT-06'), 'MONTH') = 01-OCT-06.
Trang 12Hàm Ngày tháng (tt)
• CURRENT_DATE trả về ngày tháng hiện tại nơi mà người dùng đang truy vấn
• NEXT_DAY (date, char)
– Trả về ngày của tuần đầu tiên được xác định bởi char, và phải sau date.
– Ví dụ:
• NEXT_DAY('02-FEB-2001','TUESDAY') = 06-FEB-2001
Trang 14Hàm Ngày tháng (tt)
• EXTRACT( {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND } FROM datetime_value_expression)
• Ví dụ:
– EXTRACT(YEAR FROM DATE '1998-03-07') = 1998
• TO_CHAR (date, fmt): chuyển đổi ngày tháng thành chuỗi có kiểu dữ liệu varchar2 theo định dạng fmt
Trang 15Hàm Ngày tháng (tt)
• TO_DATE (char, fmt): chuyển đổi một chuỗi sang kiểu ngày tháng theo định dạng fmt
• Ví dụ:
– TO_DATE('2003/07/09', 'yyyy/dd/mm') = 09-JUL-03
– TO_DATE('070903', 'MMDDYY') = 09-JUL-03
– TO_DATE('20020315', 'yyyymmdd') = 15-MAR-02
Trang 16Hàm NVL
• Hàm NVL dùng để chuyển đổi giá trị null thành một giá trị cụ thể nào đó
• Kiểu dữ liệu được chuyển đổi phải phù hợp với kiểu dữ liệu ban đầu
– NVL(commision_pct, 0)
– NVL(hire_date, ’01-Jan-09’)
– NVL(job_title, ‘No Job Yet’)
Trang 18Hàm gom nhóm với giá trị null
• Hàm gom nhóm bỏ qua giá trị null trong cột
• Hàm NVL giúp hàm gom nhóm tính toán cả những giá trị null
employees
Trang 21Truy vấn không hợp lệ với hàm GROUP
SELECT department_id, job_id, COUNT(name)
Trang 22Truy vấn không hợp lệ với hàm GROUP (tt)
• Không được sử dụng mệnh đề WHERE để lọc dữ liệu trong nhóm
• Dùng mệnh đề HAVING để lọc dữ liệu trong nhóm
SELECT department_id, AVG(salary) FROM employees
WHERE AVG(salary) > 8000 GROUP BY department_id;
SELECT department_id, AVG(salary) FROM employees
GROUP BY department_id HAVING AVG(salary) > 8000
Trang 23Hàm gom nhóm lồng nhau
• Hiển thị lương trung bình cao nhất:
• Ghi chú: mệnh đề GROUP BY là bắt buộc khi dùng hàm gom nhóm lồng nhau
SELECT MAX(AVG(salary))
FROM employees
GROUP BY department_id
Trang 24Truy vấn con
Trang 25Truy vấn con (Nested SELECT)
• Truy vấn con (subquery) thực thi trước truy vấn chính (main query)
• Kết quả của truy vấn con được dùng bởi main query
SELECT select_list FROM table
WHERE expr operator
Trang 27Sư dụng hàm gom nhóm trong một truy vấn con
• Truy vấn con trả về một giá trị, và được truy vấn ngoài (main query) sử dụng
SELECT last_name, job_id, salary FROM employees
WHERE salary =
(SELECT MIN(salary) FROM employees);
Trang 28Truy vấn sau sai ở đâu?
• Truy vấn co trả về nhiều giá trị, mỗi giá trị cho một nhóm Toán tử bằng (=) là toán tử so sánh một dòng (single-row), nó chỉ chấp nhận một giá trị
SELECT last_name, salary FROM employees
WHERE salary =
(SELECT MIN(salary) FROM employees GROUP BY department_id);
Trang 29Truy vấn con trả về nhiều dòng
Trang 30Toán tử BETWEEN
• Sử dụng toán tử BETWEEN để hiển thị dữ liệu dựa trên phạm vi các giá trị
SELECT last_name, salary
FROM employees
WHERE salary BETWEEN 2500 AND 3500;
Trang 31Toán tử IN
• Dùng toán tử IN để kiểm tra giá trị trong một danh sách
SELECT last_name, salary, manager_id FROM employees
WHERE manager_id IN (100, 101, 201);
Trang 32Sử dụng điều kiện NULL
• Kiểm tra null với toán tử IS NULL
• Note: không được sử dụng =
– null không dùng để so sánh bằng (=) hoặc không bằng (<>) với bất kỳ giá trị nào (A null is not equal, or unequal to any value)
SELECT last_name, manager_id FROM employees
WHERE manager_id IS NULL;
Trang 33Mệnh đề ORDER BY
• Sắp xếp những dòng dữ liệu được lấy ra sử dụng mệnh đề ORDER BY
– ASC: sắp xếp theo thứ tự tăng dần (mặc định)
– DESC: sắp xếp theo thứ tự giảm dần
• Mệnh đề ORDER BY được thực hiện cuối cùng trong câu lệnh SELECT
SELECT last_name, department_id, hire_date FROM employees
ORDER BY hire_date;
Trang 34Sắp xếp
• Sắp xếp theo thứ tự giảm dần
• Sắp xếp theo bí danh của cột (column alias)
SELECT last_name, department_id, hire_date FROM employees
ORDER BY hire_date DESC;
SELECT last_name, salary*12 annsal FROM employees
ORDER BY annsal;
Trang 36Sử dụng lệnh DEFINE
• Sử dụng lệnh DEFINE để tạo và gán giá trị cho một biến (variable).
• Sử dụng lệnh UNDEFINE để loại bỏ một biến