Data type – Function – Subquery
– Kiểu dữ liệu (data type)
– Hàm (functions)
– Mệnh đề Group by (group By clause)
– Truy vấn con (sub-queries)
Kiểu dữ liệu (data type)
Loại dữ liệu
Mô tả
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
Hàm
Hàm chuyển đổi chữ hoa, chữ thường
Hàm
Kết quả
LOWER(‘SQL Course’)
sql course
UPPER(‘SQL Course’)
SQL COURSE
INITCAP(‘SQL Course’)
Sql Course
Ví dụ: Hàm chuyển đổi chữ hoa, thường
SELECT last_name, job_id, salary
FROM employees
WHERE last_name = ‘peng’;
0 rows returned.
SELECT last_name, job_id, salary
FROM employees
WHERE LOWER(last_name) = ‘peng’;
1 rows returned.
last_name
job_id
salary
Peng
IT
3.000
Jane
IT
2.500
Hàm xử lý ký tự
Hàm
Kết quả
SUBSTR(‘HelloWorld’, 1,5)
Hello
LENGTH(‘HelloWorld’)
10
INSTR(‘HelloWorld’, ‘W’)
6
LPAD(salary, 10, ‘*’)
*****24000
RPAD(salary, 10, ‘*’)
24000*****
Hàm xử lý số (number Function)
Hàm
ROUND(45.926, 2)
Kết quả
Làm tròn đến vị trí thứ 2
45.93
sau dấu chấm
TRUNC(45.926, 2)
Chỉ lấy đến vị trí thứ 2 sau
45.92
dấu chấm
MOD(1600, 300)
100
Ví dụ: TRUNC
SELECT TRUNC(45.923)
•
•
FROM DUAL;
Nếu không xác định vị trí thì mặc định là 0
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 đó
Hà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
Hà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.
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 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
Hàm Ngày tháng (tt)
•
•
LAST_DAY (date) trả về ngày cuối cùng của tháng.
Ví dụ
– LAST_DAY('08-JAN-01') = 31-JAN-01
•
SYSDATE trả về ngày giờ hiện tại của hệ điều hành nơi cài đặt database
Hà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
Ví dụ:
–
–
–
–
–
TO_CHAR(SYSDATE, 'YYYY') = ‘2017’
TO_CHAR(SYSDATE, 'DD-MM-YYYY') = '14-02-2017'
TO_CHAR(SYSDATE, 'DD-MON-YYYY') = '14-FEB-2017'
TO_CHAR(SYSDATE, 'fmDDTH') = '14TH'
TO_CHAR(SYSDATE, 'FMMonth DD, YYYY') = 'February 14, 2017'
Hà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
Hà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’)
Hàm gom nhóm
Hàm
Mô tả
AVG
Giá trị trung bình
COUNT
Đếm số dòng (row)
SUM
Tổng giá trị
MAX/MIN
Giá trị cao nhất/thấp nhất
Hàm gom nhóm với giá trị null
•
Hàm gom nhóm bỏ qua giá trị null trong cột
employees
SELECT AVG(commision_pct)
FROM employees;
Kết quả: 2.500
•
last_name
job_id
commision_pct
Peng
IT
3.000
Jane
IT
2.500
Anna
HR
2.000
Hàm NVL giúp hàm gom nhóm tính toán cả những
giá trị null
John
HR
Thomas
SELECT AVG(NVL(commision_pct, 0))
FROM employees;
Kết quả: 1.500
HR
null
null
Tạo nhóm dữ liệu
•
Ta có thể phân chia những dòng dữ liệu trong table thành những nhóm nhỏ hơn
sử dụng mệnh đề GROUP BY
SELECT column, group_function(column)
FROM table
[WHREE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
VÍ DỤ: GROUP BY
•
Tất cả các cột trong SELECT (ngoại trừ các hàm tính toán) phải xuất hiện trong
mệnh đề GROUP BY
SELECT department_id, AVG(salary)
FROM
employees
GROUP BY department_id;
Truy vấn không hợp lệ với hàm GROUP
SELECT department_id, job_id, COUNT(name)
FROM employees
GROUP BY department_id;
Either remove job_id, or
Add job_id in the GROUP_BY
SELECT department_id, COUNT(name)
FROM employees;
A GROUP_BY clause must be added to count
the name for each dept
Truy 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
SELECT department_id, AVG(salary)
FROM employees
•
WHERE AVG(salary) > 8000
Dùng mệnhGROUP
đề HAVING
để lọc dữ liệu trong nhóm
BY department_id;
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 8000
Hàm gom nhóm lồng nhau
•
Hiển thị lương trung bình cao nhất:
SELECT MAX(AVG(salary))
FROM
employees
GROUP BY department_id
•
Ghi chú: mệnh đề GROUP BY là bắt buộc khi dùng hàm gom nhóm lồng nhau.
Truy vấn con
Truy vấn con (Nested SELECT)
SELECT select_list
FROM table
WHERE expr operator
•
•
select_list
FROM
table)
Truy vấn con (subquery) thực(SELECT
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