Cú pháp
SELECT [DISTINCT]|Columns_list|Expression_list|*
FROM <Tables_list>
WHERE <Conditions>
GROUP BY <Columns>
HAVING <Conditions_for_group>
ORDER BY [ACS| DESC]
Trong đó:
- Sau
SELECT: Các thông tin cần đưa ra, đó chính là danh sách các thuộc tính - Sau
FROM: Danh sách các tên bảng, từ đó thông tin được lấy ra. - Sau
WHERE: Các biểu thức logic, chỉ ra thông tin được lấy ra từ hàm nào hoặc điều kiện nối giữa các bảng. - Sau
GROUP BY: Các cột mà trong đó được tính theo từng nhóm. - Sau
HAVING: Biểu thức logic chỉ ra thông tin được lấy ra từ nhóm nào. - Sau
ORDER BY: Chỉ ra các cột mà trong đó thông tin được sắp xếp theo thứ tự.ASC: thông tin được sắp xếp theo chiều tăng dần (ASCendent)DESC: thông tin được sắp xếp theo chiều giảm dần(DESCendent)
Xét bảng: NHANVIEN
| NHANVIEN | ||||
| MaNV | HoTen | CongViec | Luong | MaDV |
| NV001 | Phạm Thị Nhàn | Thư ký | 500 | 0001 |
| NV002 | Hoàng Thanh Vân | Giáo viên | 600 | 0001 |
| NV003 | Hoàng Thị Lan | Giáo viên | 200 | 0002 |
| NV004 | Đỗ Trung Dũng | Thư ký | 700 | 0003 |
| ... | ... | .... | ... | ... |
Đưa ra các cột
Đưa tất cả các cột
SELECT *
FROM NHANVIEN
Kết quả: Toàn bộ bảng trên.
Đưa một số các cột
SELECT Hoten, Luong
FROM NHANVIEN
Kết quả
| sl_NV_some_col | |
| Hoten | Luong |
| Phạm Thị Nhàn | 500 |
| Hoàng Thanh Vân | 600 |
| Hoàng Thị Lan | 200 |
| Đỗ Trung Dũng | 700 |
Tránh các giá trị trùng lặp (DISTINCT)
SELECT DISTINCT Congviec
FROM NHANVIEN
Kết quả: - Nếu không có lệnh DISTINCT :
| Congviec |
| Thư ký |
| Giáo viên |
| Giáo viên |
| Thư ký |
và có DISTINCT
| Congviec |
| Giáo viên |
| Thư ký |
Đưa ra các giá trị của các biểu thức
SELECT Hoten, Luong*12
FROM NHANVIEN
Kết quả
| sl_bieuthuc | |
| Hoten | Expr1001 |
| Phạm Thị Nhàn | 6000 |
| Hoàng Thanh Vân | 7200 |
| Hoàng Thị Lan | 2400 |
| Đỗ Trung Dũng | 8400 |
Sử dụng bí danh cột
SELECT Hoten, Luong*12 AS Luongnam
FROM NHANVIEN
Kết quả
| Hoten | LuongNam |
| Phạm Thị Nhàn | 6000 |
| Hoàng Thanh Vân | 7200 |
| Hoàng Thị Lan | 2400 |
| Đỗ Trung Dũng | 8400 |
Sắp xếp thứ tự (ORDER BY)
SELECT Hoten, Luong
FROM NHANVIEN
ORDER BY Luong [ASC/ DESC]
Kết quả
| Hoten | Luong |
| Hoàng Thị Lan | 200 |
| Phạm Thị Nhàn | 500 |
| Hoàng Thanh Vân | 600 |
| Đỗ Trung Dũng | 700 |
- Trong đó
ASC(ascendent) là tăng dần,DESC(descendent) là giảm dần. - Nếu để giá trị mặc định thì sẽ sắp xếp theo chiều tăng dần.
Đưa ra các hàng
Lệnh có dạng
SELECT [DISTINCT]|Columns_list|Expression_list|*
FROM <Tables_list>
WHERE <Conditions>
Điều kiện sau mệnh để Where là một biểu thức lôgic, sử dụng các phép toán sau:
Sử dụng các phép so sánh
| = | Toán tử bằng hay tương đương |
| != | Toán tử khác hay không tương đương |
| > | Toán tử lớn hơn |
| < | Toán tử nhỏ hơn |
| >= | Toán tử lớn hơn hoặc bằng |
| <= | Toán tử nhỏ hơn hoặc bằng |
| Hoten | Luong |
| Phạm Thị Nhàn | 500 |
| Hoàng Thanh Vân | 600 |
| Đỗ Trung Dũng | 700 |
Sử dụng các phép logic: AND, OR, NOT
SELECT HoTen, Luong
FROM NHANVIEN
WHERE (Luong>300) AND (Congviec='Giáo viên')
Kết quả:
| HoTen | Luong |
| Hoàng Thanh Vân | 600 |
Phân tích ví dụ sau
SESELECT HoTen, Luong
FROM NHANVIEN
WHERE (((Luong)>400) AND (Not(CongViec)=('Thư ký') )
OR (Congviec=('Thư ký' ) ))
Kết quả
| HoTen | Luong |
| Phạm Thị Nhàn | 500 |
| Hoàng Thanh Vân | 600 |
| Đỗ Trung Dũng | 700 |
Các toán tử của SQL
- [NOT] BETWEEN x AND y: [Không] nằm giữa giá trị X và Y
- IN (danh sách): thuộc bất kỳ giá trị nào trong danh sách
- x [NOT] LIKE y: Đúng nếu x [không] giống khung mẫu y. Các ký tự dùng trong khuôn mẫu: Dấu gạch dưới ( _ ) : Chỉ một ký tự bất kỳ Dấu phần trăm ( % ) : Chỉ một nhóm ký tự bất kỳ
- IS [NOT] NULL: kiểm tra giá trị rỗng
- EXISTS: Trả về TRUE nếu có tồn tại.
- Phép BETWEEN … AND …
SELECT HoTen, Luong
FROM NHANVIEN
WHERE Luong BETWEEN 300 AND 600
Kết quả
| HoTen | Luong |
| Phạm Thị Nhàn | 500 |
| Hoàng Thanh Vân | 600 |
- Phép IN ( Một tập hợp)
SELECT HoTen, Luong
FROM NHANVIEN
WHERE Luong IN (200,500,600)
Kết quả
| HoTen | Luong |
| Phạm Thị Nhàn | 500 |
| Hoàng Thanh Vân | 600 |
| Hoàng Thị Lan | 200 |
- Phép LIKE
- Ký tự thay thế ‘%’ đại diện cho một nhóm các ký tự chưa biết (trong Access là: *).
- Ký tự thay thế ‘_’ đại diện cho một ký tự chưa biết (trong Access là:?).
SELECT HoTen, Congviec
FROM NHANVIEN
WHERE Hoten LIKE 'Hoàng*'
Kết quả
| HoTen | Congviec |
| Hoàng Thanh Vân | Giáo viên |
| Hoàng Thị Lan | Giáo viên |
SELECT HoTen, Congviec
FROM NHANVIEN
WHERE Hoten LIKE 'Hoàng Thanh Vân'- Phép IS [NOT] NULL
SELECT * FROM NHANVIEN WHERE Diachi IS NULL
Sử dụng các hàm
Các HQTCSDL đưa ra các hàm khác nhau, vì thế khi làm việc với HQTCSDL nào chúng ta nên tìm hiểu các hàm và cách sử dụng chúng đối với HQTCSDL đó. Sau đây là một số các loại hàm thường dùng.
Hàm số học
Đầu vào và đầu ra là các giá trị kiểu số.
ROUND(n[,m]): Cho giá trị làm tròn của n (đến cấp m, mặc nhiên m=0)
TRUNC(n[,m]): Cho giá trị n lấy m chữ số tính từ chấm thập phân.
CEIL(n): Cho số nguyên nhỏ nhất lớn hơn hoặc bằng n.
FLOOR(n): Cho số nguyên lớn nhất bằng hoặc nhỏ hơn n.
POWER(m,n): Cho lũy thừa bậc n của m.
EXP(n): Cho giá trị của en
SQRT(n): Cho căn bậc 2 của n, n>=0
SIGN(n): Cho dấu của n.
n<0 có SIGN(n)= -1
n=0 có SIGN(n)= 0
n>0 có SIGN(n)= 1
ABS(n): Cho giá trị tuyệt đối
MOD(m,n): Cho phần dư của phép chia m cho n
Một số hàm kiểu số tham khảo khác:
LOG(m,n) cho logarit cơ số m của n
SIN(n) cosin của n (n tính bằng radian)
COS(n) cho cosin của n (n tính bằng radian)
TAN(n) cotang của n (n tính bằng radian)
SELECT ROUND(4.923,1),
ROUND(4.923),
ROUND(4.923,-1),
ROUND(4.923,2)
FROM DUMMY;
| ROUND(4.923,1) | ROUND(4.923) | ROUND(4.923,-1) | ROUND(4.923,2) |
| 4.9 | 5 | 0 | 4.92 |
SELECT TRUNC (4.923,1),
TRUNC (4.923),
TRUNC (4.923,-1),
TRUNC (4.923,2)
FROM DUMMY;
| TRUNC(4.923,1) | TRUNC(4.923) | TRUNC(4.923,-1) | TRUNC(4.923,2) |
| 4.9 | 4 | 0 | 4.92 |
SELECT CEIL (SAL), CEIL(99.9),CEIL(101.76), CEIL(-11.1)
FROM EMP
WHERE SAL BETWEEN 3000 AND 5000;
| CEIL(SAL) | CEIL(99.9) | CEIL(101.76) | CEIL(-11.1) |
| 5000 | 100 | 102 | -11 |
SELECT FLOOR (SAL), FLOOR (99.9), FLOOR (101.76), FLOOR (-11.1)
FROM EMP
WHERE SAL BETWEEN 3000 AND 5000;
| FLOOR(SAL) | FLOOR(99.9) | FLOOR(101.76) | FLOOR(-11.1) |
| 5000 | 99 | 101 | -12 |
| 3000 | 99 | 101 | -12 |
| 3000 | 99 | 101 | -12 |
SELECT SAL, POWER(SAL,2), POWER(SAL,3), POWER(50,5)
FROM EMP
WHERE DEPTNO =10;
| SAL | POWER(SAL,2) | POWER(SAL,3) | POWER(50,5) |
| 5000 | 25000000 | 1.2500E+11 | 312500000 |
| 2450 | 6002500 | 1.4706E+10 | 312500000 |
| 1300 | 1690000 | 2197000000 | 312500000 |
SELECT EXP(4) FROM DUMMY;
| EXP(4) |
| 54.59815 |
SELECT SAL, SQRT(SAL), SQRT(40), SQRT (COMM)
FROM EMP
WHERE DEPTNO =10;
| SAL | SQRT(SAL) | SQRT(40) | SQRT(COMM) |
| 5000 | 70.7106781 | 6.32455532 | |
| 2450 | 49.4974747 | 6.32455532 | |
| 1300 | 36.0555128 | 6.32455532 |
SELECT SAL-NVL(COMM,0), SIGN(SAL-NVL(COMM,0)),
NVL(COMM,0)-SAL, SIGN(NVL(COMM,0)-SAL)
FROM EMP
WHERE DEPTNO =30
| SAL-NVL(COMM,0) | SIGN(SAL-NVL(COMM,0)) | NVL(COMM,0)-SAL | SIGN(NVL(COMM,0)-SAL) |
| 2850 | 1 | -2850 | -1 |
| -150 | -1 | 150 | 1 |
| 1300 | 1 | -1300 | -1 |
| 1500 | 1 | -1500 | -1 |
| 950 | 1 | -950 | -1 |
| 750 | 1 | -750 | -1 |
Các hàm ký tự
- CONCAT(char1, char2): Cho kết hợp của 2 chuỗi ký tự, tương tự như sử dụng toán tử.
- INITCAP(char): Cho chuỗi với ký tự đầu các từ là ký tự hoa
- LOWER(char): Cho chuỗi ký tự viết thường (không viết hoa)
- LPAD(char1, n [,char2]): Chochuỗi ký tự có chiều dài bằng n. Nếu chuỗi char1 ngắn hơn n thì thêm vào bên trái chuỗi char2 cho đủ n ký tự. Nếu chuỗi char1 dài hơn n thì giữ lại n ký từ tính từ trái sang
- LTRIM(char1, n [,char2]): Bỏ các ký tự trống bên trái
- NLS_INITCAP(char): Cho chuỗi với ký tự đầu các từ là chữ hoa, các chữ còn lại là chữ thường
- REPLACE(char,search_string[,replacement_string]): Thay tất cả các chuỗi search_string có trong chuỗi char bằng chuỗi replacement_string.
- RPAD(char1, n [,char2]): Giống LPAD(char1, n [,char2]) nhưng căn phải.
- RTRIM(char1, n [,char2]): Bỏ các ký tự trống bên phải
- SOUNDEX(char): Cho chuỗi đồng âm của char.
- SUBSTR(char, m [,n]): Cho chuỗi con của chuỗi char lấy từ vị trí m vế phải n ký tự, nếu không chỉ n thì lấy cho đến cuối chuỗi
- TRANSLATE(char, from, to): Cho chuỗi trong đó mỗi ký tự trong chuỗi from thay bằng ký tự tương ứng trong chuỗi to, những ký tự trong chuỗi from không có tương ứng trong chuỗi to sẽ bị loại bỏ.
- UPPER(char): Cho chuỗi chữ hoa của chuỗi char
- ASCII(char): Cho ký tự ASCII của byte đầu tiên của chuỗi char
- INSTR(char1, char2 [,n[,m]]): Tìm vị trí chuỗi char2 trong chuỗi char1 bắt đầu từ vị trí n, lần xuất hiện thứ m.
- LENGTH(char): Cho chiều dài của chuỗi char
SELECT LOWER(DNAME), LOWER(‘SQL COURSE’) FROM DEPT;
| LOWER(DNAME) | LOWER(' SQL COURSE’) | LOWER(DNAME) | LOWER(' SQL COURSE’) |
| Accounting | sql course | Accounting | sql course |
| Research | sql course | Research | sql course |
| Sales | sql course | Sales | sql course |
SELECT ENAME FROM EMP WHERE ENAME = UPPER(‘Smith’);
| ENAME |
| SMITH |
SELECT INITCAP(DNAME), INITCAP(LOC) FROM DEPT;
| INITCAP(DNAME) | INITCAP(LOC) |
| Accounting | New York |
| Research | Dallas |
| Sales | Chicago |
| Operations | Boston |
SELECT CONCAT(ENAME, JOB) JOB FROM EMP WHERE EMPNO = 7900;
| JOB |
| JAMES CLERK |
SELECT LPAD(DNAME,20,’*’), LPAD(DNAME,20), LPAD(DEptno,20,’ ’)
FROM DEPT;
| LPAD(DNAME,20,'*') | LPAD(DNAME,20) | LPAD(DEPTNO,20,'') |
| ******ACCOUNTING | ACCOUNTING | 10 |
| ******RESEARCH | RESEARCH | 20 |
| ******SALES | SALES | 30 |
| ******OPERATIONS | OPERATIONS | 40 |
SELECT RPAD(DNAME,20,’*’), RPAD(DNAME,20), RPAD(DEptno,20,’ ’)
FROM DEPT;
| RPAD(DNAME,20,'*') | RPAD(DNAME,20) | RPAD(DEPTNO,20,'') |
| ACCOUNTING | ****** ACCOUNTING | 10 |
| RESEARCH | ****** RESEARCH | 20 |
| SALES | ****** SALES | 30 |
| OPERATIONS | ****** OPERATIONS | 40 |
SELECT SUBSTR(‘ORACLE’,2,4), SUBSTR(DNAME,2), SUBSTR(DNAME,3,5)
FROM DEPT;
| SUBS | SUBSTR(DNAME,2) | SUBSTR(DNAME,3,5) |
| RACL | CCOUNTING | COUNT |
| RACL | ESEARCH | SEARC |
| RACL | ALES | LES |
| RACL | PERATIONS | ERATI |
SELECT DNAME, INSTR(DNAME, ‘A’), INSTR(DNAME,’ES’),
INSTR(DNAME,’C’,1,2)
FROM DEPT;
| DNAME | INSTR(DNAME,'A') | INSTR(DNAME,'ES') |
| ACCOUNTING | 1 | 0 |
| RESEARCH | 5 | 2 |
| SALES | 2 | 4 |
| OPERATIONS | 5 | 0 |
SELECT DNAME, LTRIM(DNAME,’A’), LTRIM(DNAME,’AS’),
LTRIM(DNAME,’ASOP’)
FROM DEPT;
| DNAME | LTRIM(DNAME,'A’) | LTRIM(DNAME,'AS’) | LTRIM(DNAME,’ASOP’) |
| ACCOUNTING | CCOUNTING | CCOUNTING | CCOUNTING |
| RESEARCH | RESEARCH | RESEARCH | RESEARCH |
| SALES | SALES | LES | LES |
SELECT DNAME, RTRIM(DNAME,’A’), RTRIM(DNAME,’AS’),
RTRIM(DNAME,’ASOP’)
FROM DEPT;
| DNAME | RTRIM(DNAME,’A’) | RTRIM(DNAME,’AS’) | RTRIM(DNAME,’ASOP’) |
| ACCOUNTING | ACCOUNTING | ACCOUNTING | ACCOUNTING |
| RESEARCH | RESEARCH | RESEARCH | RESEARCH |
| SALES | SALES | SALES | SALES |
| OPERATIONS | OPERATIONS | OPERATIONS | OPERATIONS |
SELECT ENAME, SOUNDEX(ENAME)
FROM EMP
WHERE SOUNDEX(ENAME)= SOUNDEX(‘FRED’);
| ENAME | SOUN |
| FORD | F630 |
SELECT LENGTH(‘SQL COURSE’), LENGTH(DEPTNO), LENGTH(DNAME) FROM DEPT;
| LENGTH('SQLCOURSE') | LENGTH(DEPTNO) | LENGTH(DNAME) |
| 10 | 2 | 14 |
| 10 | 2 | 14 |
| 10 | 2 | 14 |
| 10 | 2 | 14 |
SELECT ENAME, TRANSLATE(ENAME,'C','F'), JOB,
TRANSLATE(JOB,'AR','IT')
FROM EMP
WHERE DEPTNO = 10;
| ENAME | TRANSLATE(ENAME,'C','F') | JOB | TRANSLATE(JOB,'AR','IT') |
| KING | KING | PRESIDENT | PTESIDENT |
| CLARK | FLARK | MANAGER | MINIGET |
| MILLER | MILLER | CLERK | CLETK |
SELECT JOB, REPLACE(JOB, ‘SALESMAN’, ‘SALESPERSON’), ENAME, REPLACE(ENAME, ‘CO’,’PR’)
FROM EMP
WHERE DEPTNO =30 OR DEPTNO =20;
| JOB | REPLACE(JOB, ‘SALESMAN’, ‘SALESPERSON’) | ENAME | REPLACE(ENAME, ‘CO’,’PR’) |
| MANAGER | MANAGER | BLAKE | BLAKE |
| MANAGER | MANAGER | JONES | JONES |
| SALESMAN | SALESPERSON | MARTIN | MARTIN |
| SALESMAN | SALESPERSON | ALLEN | ALLEN |
| SALESMAN | SALESPERSON | TURNER | TURNER |
| CLERK | CLERK | JAMES | JAMES |
| SALESMAN | SALESPERSON | WARD | WARD |
| ANALYST | ANALYST | FORD | FORD |
| CLERK | CLERK | SMITH | SMITH |
| ANALYST | ANALYST | SCOTT | SPRTT |
| CLERK | CLERK | ADAMS | ADAMS |
SELECT DNAME, LENGHT(DNAME), LENGHT(TRANSLATE,DNAME, ‘AS’,’A’))
FROM DEPT;
| DNAME | LENGTH(DNAME) | LENGTH(TRANSLATE(DNAME,'AS','A')) |
| ACCOUNTING | 14 | 14 |
| RESEARCH | 14 | 13 |
| SALES | 14 | 12 |
| OPERATIONS | 14 | 13 |
Các hàm ngày
MONTH_BETWEEN(d1, d2): Cho biết só tháng giữa ngày d1 và d2.
ADD_MONTHS(d,n): Cho ngày d thêm n tháng.
NEXT_DAY(d, char ): Cho ngày tiếp theo ngày d có thứ chỉ bởi char.
LAST_DAY(d): Cho ngày cuối cùng trong tháng chỉ bởi d.
SELECT MONTHS_BETWEEN( SYSDATE, HIREDATE),
MONTHS_BETWEEN('01-01-2000','05-10-2000')
FROM EMP
WHERE MONTHS_BETWEEN( SYSDATE,HIREDATE)>240;
| MONTHS_BETWEEN(SYSDATE,HIREDATE) | TWEEN('01-01-2000','05-10-2000') |
| 241.271055 | -9.1290323 |
| 241.206539 | -9.1290323 |
| 243.367829 | -9.1290323 |
SELECT HIREDATE, ADD_MONTHS(HIRE,3), ADD_MONTHS(HIREDATE,-3)
FROM EMP
WHERE DEPTNO=20;
| HIREDATE | ADD_MONTHS | ADD_MONTHS |
| 02-04-1981 | 02-07-1981 | 02-01-1981 |
| 03-12-1981 | 03-03-1982 | 03-09-1981 |
| 17-12-1980 | 17-03-1981 | 17-09-1980 |
| 09-12-1982 | 09-03-1983 | 09-09-1982 |
| 12-01-1983 | 12-04-1983 | 12-10-1982 |
SELECT HIREDATE, NEXT_DAY(HIREDATE,’FRIDAY’), NEXT_DAY(HIREDATE,6)
FROM EMP
WHERE DEPTNO = 10;
| HIREDATE | NEXT_DAY(HIREDATE,’FRIDAY’) | NEXT_DAY(HIREDATE,6) |
| 17-11-1981 | 20-11-1981 | 20-11-1981 |
| 09-06-1981 | 12-06-1981 | 12-06-1981 |
| 23-01-1982 | 29-01-1982 | 29-01-1982 |
SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE, LAST_DAY(HIREDATE),
LAST_DAY(’15-01-2001’)
FROM EMP
WHERE DEPTNO =20;
| SYSDATE | LAST_DAY(SYSDATE) | HIREDATE | LAST_DAY(HIREDATE) | LAST_DAY(’15-01-2001’) |
| 28-03-2001 | 31-03-2001 | 02-04-1981 | 30-04-1981 | 31-01-2001 |
| 28-03-2001 | 31-03-2001 | 03-12-1981 | 31-12-1981 | 31-01-2001 |
| 28-03-2001 | 31-03-2001 | 17-12-1980 | 31-12-1980 | 31-01-2001 |
| 28-03-2001 | 31-03-2001 | 09-12-1982 | 31-12-1982 | 31-01-2001 |
| 28-03-2001 | 31-03-2001 | 12-01-1983 | 31-01-1983 | 31-01-2001 |
Một số hàm khác có thể áp dụng cho kiểu ngày:
- ROUND(date1): Trả về ngày date 1 tại thời điểm giữa trưa 12:00 AM
- ROUND(date1,’MONTH’:Nếu date 1 nằm trong nửa tháng đầu trả về ngày đầu tiên của thàng, ngược lại sẽ trả về ngày đầu tiên của tháng sau.
- ROUND(date1,’YEAR’): Nếu date 1 nằm trong nửa năm đầu trả về ngày đầu tiên của thàng, ngược lại sẽ trả về ngày đầu tiên của năm sau.
- TRUNC(date1, ’MONTH’): Trả về ngày đầu tiên của tháng chứa date1.
- TRUNC(date1, ’YEAR’): Trả về ngày đầu tiên của năm chứa date1
Các hàm chuyển đổi kiểu
- TO_CHAR(number|date, ‘fmt’): Chuyển kiểu số và ngày về kiểu ký tự.
- TO_NUMBER(char): Chuyển ký tự có nội dung số sang số
- TO_DATE(‘chsr’,’fmt’): Chuyển ký tự sang kiểu ngày với định dạng đặt trong fmt.
- DECODE(EXPR, SEARCH1, RESULT1, SEARCH2, RESULT2, DEFAULT): So sánh biểu thức expr với giá trị search nếu đúng trả về giá trị result nếu không trả về giá trị default.
- NVL(COL|VALUE, VAL): Chuyển giá trị COL|VALUE thành val nếu null.
- Greatest(col|value1, col|value2): Trả giá trị lớn nhất trong dãy giá trị.
SELECT To_char (sysdate, ‘day, ddth month yyyy’) from dummy;
SELECT EMPNO, ENAME, HIREDATE
FROM EMP
WHERE HIREDATE = TO_DATE (‘June 4, 1984’, ‘month dd, yyyy’);
INSERT INTO EMP (EMPNO, DEPTNO, HIREDATE
VALUES (777, 20, TO_DATE(’19-08-2000’, ‘DD-MM-YYYY’);
SELECT ENAME, JOB,
DECODE (JOB, ‘CLERK’,’WWORKER’,’MANAGER’,’BOSS’,’UNDEFINED’) DECODẹD_JOB
FROM EMP;
SELECT GREATEST(1000,2000), GREATEST(SAL,COMM) FROM EMP
WHERE DEPTNO = 10;
Một số khuôn dạng ngày
| SCC hoặc CC | thế kỷ; S chỉ ngày BC |
| YYYY hoặc SYYYY | năm; S chỉ ngày BC |
| YYY, YY, Y | Chỉ năm với 3,2,1 ký tự số |
| IYYY, IYY, IY, I | Chỉ năm theo chuẩn ISO |
| SYEAR, YEAR | Chỉ năm theo cách phát âm của người anh; |
| Q | Quý trong năm |
| MM | Giá trị tháng với 2 số (01-12) |
| MONTH | Tên đầy đủ của tháng theo tiếng anh, đọ dài 9 |
| MON | Tháng với 3 ký tự viến tắt (JAN, FEB...) |
| WW, W | Tuần trong năm hoặc trong tháng |
| DDD, DD, D | Ngày trong năm, tháng hoặc tuần |
| DAY | Chỉ thứ trong tuần |
| DY | Chỉ thứ trong tuần với 3 ký tự viết tắt |
| J | Ngày Julian; bắt đầu từ ngày 31/12/4713 trước công nguyên |
| AM, PM | Chỉ định sáng, chiều |
| HH, HH12 HH24 | Chỉ giờ trong ngày (1-12) hoặc (0-23) |
| MI | Phút (0-59) |
| SS | Giây (0-59) |
| SSSSS | Số giây đến nửa đêm (0-86399) |
| / . , - | được tự động thêm khi đặt trong khuôn dạng |
| “char” | Đoạn ký tự đặt trong nháy đúp được tự động thêm khi đặt trong khuôn dạng |
| TH | Thêm phần thứ tự (1st, 2nd, 4th ) |
| SP | Phát âm số ( FOUR với DDSP) |
| SPTH, THSP | Phát âm và chuyển sang dạng thứ tự ( First, second, ...) |
| RR | Ngày chuyển giao thiên niên kỷ với các năm <1999. |
Một số khuôn dạng số
| Ký tự | Mô tả | Ví dụ | Kết quả |
| 9 | Xác định hiển thị 1 số | 999999 | 1234 |
| 0 | Hiển thị cả số 0 ở đầu nếu độ dài khuôn dạng lớn hơn số hiện có | 099999 | 001234 |
| $ | Thêm ký tự tiền tệ | $999999 | $1234 |
| L | Thêm ký tự tiền tệ bản địa | L999999 | FF1234 |
| . | Dấu thập phân | 999999.99 | 1234.00 |
| , | Dấu phân cách phần nghìn | 999,999 | 1,234 |
| MI | Dấu âm ở bên phải ( với các giá trị âm) | 999999MI | 1234- |
| PR | Thêm ngoặc nhọn vào các giá trị âm | 999999PR | <1234> |
| EEE | Chuyển sang hiển thị số E | 99.9999RRRR | 1.234E+03 |
| V | Nhân với 10 n, n là số các số 9 đặt sau V | 9999V99 | 123400 |
| B | Hiển thị cả giá trị 0 nếu = 0. | B9999.99 | 1234.00 |
Hàm nhóm
COUNT(): Đếm số lần xuất hiện của thuộc tính.SUM(colume): Tính tổng các giá trị của thuộc tính (thuộc loại số học)AVG(colume): Tính giá trị trung bình các giá trị của thuộc tính (thuộc loại số học)MAX(colume): Tìm giá trị cực đại của thuộc tínhMIN(colume): Tìm giá trị cực tiểu của thuộc tính.
Sử dụng hàm nhóm
Đối số của các hàm nhóm là tên của thuộc tính mà hàm phải tính toán.
SELECT Avg(Luong)AS LuongTB,
Max(Luong) AS LuongCN,
Min(Luong) AS LuongTN,
COUNT(MaNV) AS TongNV
FROM NHANVIEN
Kết quả:
| LuongTB | LuongCN | LuongTN | TongNV |
| 500 | 700 | 200 | 4 |
Mệnh đề GROUP BY
Mệnh đề GROUP BY <các cột> cho phép đưa ra thông tin theo từng nhóm.
SELECT CongViec, AVG(Luong) AS LuongTB
FROM NHANVIEN
GROUP BY CongViec
Kết quả:
| CongViec | LuongTB |
| Giáo viên | 400 |
| Thư ký | 600 |
Có thể thêm vào một mệnh đề WHERE để đưa vào một tiêu chuẩn chọn lựa các dòng. SQL thực hiện cùng một cách xử lý, đầu tiên là loại bỏ các dòng không đáp ứng tiêu chuẩn đã được xác định trong mệnh đề WHERE.
SELECT CongViec, AVG(Luong) AS LuongTB
FROM NHANVIEN
WHERE Luong>200
GROUP BY CongViec
Kết quả:
| CongViec | LuongTB |
| Giáo viên | 600 |
| Thư ký | 600 |
- Sử dụng mệnh đề GROUP BY để đưa ra các thông tin về các nhóm con trong các nhóm lớn.
SELECT MaDV, CongViec, SUM(Luong) AS TongLuong
FROM NHANVIEN
GROUP BY MaDV, CongViec
Kết quả:
| MaDV | CongViec | TongLuong |
| 0001 | Giáo viên | 600 |
| 0001 | Thư ký | 500 |
| 0002 | Giáo viên | 200 |
| 0003 | Thư ký | 700 |
| TongLuong |
| 1100 |
| 200 |
| 700 |
Mệnh đề HAVING
Muốn đưa ra các nhóm trên cơ sở thông tin nhóm thì điều kiện phải được viết trong mệnh đề HAVING (Không viết trong mệnh đề WHERE).
SELECT CongViec, Avg(Luong) AS TBLuong
FROM NHANVIEN
GROUP BY CongViec
HAVING (Avg(Luong)>300)
Kết quả:
| CongViec | TBLuong |
| Giáo viên | 400 |
| Thư ký | 600 |
SELECT MaDV, Max(Luong) AS MaxLuong
FROM NHANVIEN
GROUP BY MaDV
HAVING Max(Luong)>300
Kết quả:
| MaDV | MaxLuong |
| 0001 | 600 |
| 0003 | 700 |
Lấy thông tin từ nhiều bảng
Muốn lấy thông tin từ nhiều bảng ta cần phải thực hiện nối các bảng, điều kiện nối phải được thiết đặt đầu tiên trong mệnh đề Where.
Nối bằng (Equi-Join)
Điều kiện nối là một đẳng thức.
SELECT HoTen, CongViec, TenDV
FROM NHANVIEN, DONVI
WHERE NHANVIEN.MaDV= DONVI.MaDV
Kết quả:
| HoTen | CongViec | TenDV |
| Phạm Thị Nhàn | Thư ký | KHTN |
| Hoàng Thanh Vân | Giáo viên | KHTN |
| Hoàng Thị Lan | Giáo viên | DHTL |
| Đỗ Trung Dũng | Thư ký | DHQG |
Bí danh bảng
Được viết ngay bên phải tên bảng trong mệnh đề FROM.
SELECT HoTen, CongViec, TenDV
FROM NHANVIEN NV, DONVI DV
WHERE NV.MaDV= DV.MaDVNối không bằng (Non Equi-Join)
SELECT HoTen, CongViec, MaBac
FROM NHANVIEN NV, BACLUONG BL
WHERE NV.Luong BETWEEN BL.BacThap AND BL.BacCao
Kết quả:
| sl_non_equi | ||
| HoTen | CongViec | MaBac |
| Phạm Thị Nhàn | Thư ký | 1 |
| Hoàng Thanh Vân | Giáo viên | 2 |
| Đỗ Trung Dũng | Thư ký | 3 |
SELECT HoTen, CongViec, TenDV, Luong
FROM NHANVIEN AS NV, DONVI AS DV
WHERE (NV.MaDV=DV.MaDV) AND (Luong>=500);
Kết quả:
| HoTen | CongViec | TenDV | Luong |
| Phạm Thị Nhàn | Thư ký | KHTN | 500 |
| Hoàng Thanh Vân | Giáo viên | KHTN | 600 |
| Đỗ Trung Dũng | Thư ký | DHQG | 700 |
Nối bảng với chính nó
Giả sử trong bảng NHANVIEN ta thêm 1 thuộc tính (cột) là MaPT (Mã phụ trách) để lưu mã của nhân viên phụ trách trực tiếp 1 nhân viên khác. Cụ thể như sau:
SELECT NV.MaNV, NV.Hoten, PT.MaNV, PT.Hoten
FROM NHANVIEN NV, NHANVIEN PT
WHERE (NV.MaNV=PT.MaPT) AND (NV.Luong>PT.Luong)
Kết quả:
| NV.MaNV | NV.Hoten | PT.MaNV | PT.Hoten |
| NV002 | Hoàng Thanh Vân | NV001 | Phạm Thị Nhàn |
| NV002 | Hoàng Thanh Vân | NV003 | Hoàng Thị Lan |
Thực hiện kết nối thông qua từ khóa Join
Ta có thể thực hiện lấy dữ liệu từ hai bảng thông qua từ khóa JOIN.
INNER JOIN (nối trong)
Cú pháp:
SELECT field1, field2, field3
FROM table1
INNER JOIN table2
ON table1.keyfield=table2.foreign_keyfield;
KHACHHANG:
| MaKH | TenKH |
| 01 | Hoàng Thanh Vân |
| 02 | Lê Thị Nhàn |
| 03 | Phan Thanh Hòa |
| 04 | Phạm Hồng Thanh |
DONHANG:
| MaSP | TenSP | MaKH |
| H102 | Máy in | 01 |
| H106 | Bàn | 03 |
| H301 | Ghế | 03 |
Yêu cầu: Đưa ra tên khách hàng và tên sản phẩm khách hàng đó mua.
SELECT KHACHHANG.TenKH, DONHANG.TenSP
FROM KHACHHANG
INNER JOIN DONHANG
ON KHACHHANG.MaKH=DONHANG.MaKH
Kết quả:
| TenKH | TenSP |
| Hoàng Thanh Vân | Máy in |
| Phan Thanh Hòa | Bàn |
| Phan Thanh Hòa | Ghế |
INNER JOIN trả về tất cả các dòng từ hai bảng thỏa mãn điều kiện. Nếu những dòng dữ liệu có bên table1 mà không có trong table2 thì sẽ không được hiển thị (khác với …)
LEFT JOIN
Cú pháp:
SELECT field1, field2, field3
FROM table1
LEFT JOIN table2
ON table1.keyfield = table2.foreign_keyfield
SELECT KHACHHANG.TenKH, DONHANG.TenSP
FROM KHACHHANG
LEFT JOIN DONHANG
ON KHACHHANG.MaKH=DONHANG.MaKH
Kết quả:
| TenKH | TenSP |
| Hoàng Thanh Vân | Máy in |
| Lê Thị Nhàn | |
| Phan Thanh Hòa | Bàn |
| Phan Thanh Hòa | Ghế |
| Phạm Hồng Thanh |
LEFT JOIN trả về tất cả các dòng có ở bảng thứ nhất, mặc dù ở bảng thứ hai không thỏa mãn phép toán. Nếu dữ liệu có ở bảng thứ nhất mà không có ở bảng thứ hai thì dữ liệu vẫn hiển thị.
RIGHT JOIN
Cú pháp
SELECT field1, field2, field3
FROM table1
RIGHT JOIN table2
ON table1.keyfield = table2.foreign_keyfield
SELECT KHACHHANG.TenKH, DONHANG.TenSP
FROM KHACHHANG
RIGHT JOIN DONHANG
ON KHACHHANG.MaKH=DONHANG.MaKH
Kết quả:
| TenKH | TenSP |
| Hoàng Thanh Vân | Máy in |
| Phan Thanh Hòa | Bàn |
| Phan Thanh Hòa | Ghế |
RIGHT JOIN trả về tất cả các dòng có ở bảng 2, mặc dù bảng 1 không thỏa mãn phép toán. Nếu dữ liệu có ở bảng 2 mà không có ở bảng 1 thì vẫn được hiển thị.
Thực hiện các phép toán trên tập hợp
Các phép toán trên tập hợp gồm: Hợp (UNION) hoặc UNION ALL, Giao (INTERSECT), Trừ (MINUS)
Điều kiện thực hiện các phép toán trên tập hợp: Các bảng tham gia vào phép toán phải có cùng số cột như nhau.
- Phép
UNION
| NHANVIEN | |||||
| MaNV | HoTen | CongViec | Luong | MaDV | MaPT |
| NV001 | Phạm Thị Nhàn | Thư ký | 500 | 0001 | NV002 |
| NV002 | Hoàng Thanh Vân | Giáo viên | 600 | 0001 | NV003 |
| NV003 | Hoàng Thị Lan | Giáo viên | 200 | 0002 | NV002 |
| NV004 | Đỗ Trung Dũng | Thư ký | 700 | 0003 | NV002 |
| NV005 | Đỗ Văn Hải | Bảo vệ | 100 | 0001 | NV002 |
| NV006 | Nguyễn Nam Hải | Giám đốc | 1000 | 0001 |
SELECT CongViec
FROM NHANVIEN
WHERE MaDV='0001'
UNION
SELECT CongViec
FROM NHANVIEN
WHERE MaDV='0002'
Kết quả:
| CongViec |
| Bảo vệ |
| Giám đốc |
| Giáo viên |
| Thư ký |
- Phép
INTERSECT: Nếu thayUNIONbằngINTERSECTthì kết quả sẽ đưa ra những công việc vừa có trong đơn vị 1, vừa có trong đơn vị 2. - Phép
MINUS: Nếu thayUNIONbằngMINUSthì kết quả sẽ đưa ra những công việc chỉ có trong đơn vị 1, mà không có trong đơn vị 2.
Các câu hỏi lồng nhau
- Là các lệnh
SELECTtrong đó có chứa các lệnhSELECTkhác. - Các câu lệnh
SELECTbên trong nằm sau mệnh đềWHEREhoặcHAVINGcủaSELECTbên ngoài. - Cách thực hiện của câu lệnh SELECT lồng nhau:
- Thực hiện lệnh
SELECTbên trong. - Sử dụng kết quả của lệnh
SELECTbên trong để thực hiện lệnhSELECTbên ngoài. - Số các lệnh
SELECTlồng nhau được phép là 255.
Lệnh SELECT bên trong cho kết quả là 1 hàng
Xét bảng NHANVIEN trên.
Đối với yêu cầu này ta cần làm những việc sau:
- Đưa ra trung bình lương của tất cả các nhân viên.
- Đưa ra những nhân viên thỏa mãn yêu cầu.
SELECT Hoten, TenDV, Congviec, Luong
FROM NHANVIEN AS NV, DONVI AS DV
WHERE (NV.MaDV= DV.MaDV)
AND (Luong> ( SELECT AVG(Luong)
FROM NHANVIEN ))
Kết quả:
| Hoten | TenDV | Congviec | Luong |
| Nguyễn Nam Hải | KHTN | Giám đốc | 1000 |
| Hoàng Thanh Vân | KHTN | Giáo viên | 600 |
| Đỗ Trung Dũng | DHQG | Thư ký | 700 |
Công việc:
- Tìm MaDV có tên đơn vị là DHTL.
- Tìm mức lương lớn nhất trong đơn vị này.
- Tìm những nhân viên có lương thỏa mãn yêu cầu.
SELECT Hoten, TenDV, Congviec, Luong
FROM NHANVIEN AS NV, DONVI AS DV
WHERE (NV.MaDV= DV.MaDV)
AND (Luong> ( SELECT MAX(Luong)
FROM NHANVIEN
WHERE MaDV =
SELECT MaDV
FROM DONVI
WHERE TenDV='DHTL'))
Kết quả:
| Hoten | TenDV | Congviec | Luong |
| Nguyễn Nam Hải | KHTN | Giám đốc | 1000 |
| Phạm Thị Nhàn | KHTN | Thư ký | 500 |
| Hoàng Thanh Vân | KHTN | Giáo viên | 600 |
| Đỗ Trung Dũng | DHQG | Thư ký | 700 |
Lệnh SELECT bên trong cho kết quả là nhiều hàng
Giả sử lệnh SELECT bên trong có dạng:
SELECT MaDV,MAX(Luong) AS LuongLN,MIN(Luong) AS LuongNN
FROM NHANVIEN
GROUP BY MaDV
Kết quả:
| MaDV | LuongLN | LuongNN |
| 0001 | 1000 | 100 |
| 0002 | 200 | 200 |
| 0003 | 700 | 700 |
Như vậy, kết quả của câu lệnh SELECT bên trong cho kết quả là một tập giá trị, thì ta phải sử dụng các phép toán so sánh với tập hợp, không sử dụng được các phép toán so sánh như (>, <, =, …. ).
Toán tử SOME/ANY/ALL/NOT IN/EXITS
[NOT] IN : Không thuộc
ANY và SOME : So sánh một giá trị với mỗi giá trị trong một danh sách hay trong kết quả trả về của câu hỏi con, phải sau toán tử =
ALL : So sánh một giá trị với mọi giá trị trong danh sách hay trong kết quả trả về của câu hỏi con.
EXISTS : Trả về TRUE nếu có tồn tại.
- Phép toán IN
Ta có biểu thức: <Giá trị> IN {Tập hợp} trả lại kết quả = TRUE nếu tập hợp các giá trị nằm trong tập hợp đứng sau IN.
Bảng NHANVIEN:
| NHANVIEN | |||||
| MaNV | HoTen | CongViec | Luong | MaDV | MaPT |
| NV001 | Phạm Thị Nhàn | Thư ký | 500 | 0001 | NV002 |
| NV002 | Hoàng Thanh Vân | Giáo viên | 600 | 0001 | NV003 |
| NV003 | Hoàng Thị Lan | Giáo viên | 200 | 0002 | NV002 |
| NV004 | Đỗ Trung Dũng | Thư ký | 700 | 0003 | NV002 |
| NV005 | Đỗ Văn Hải | Bảo vệ | 100 | 0001 | NV002 |
| NV006 | Nguyễn Nam Hải | Giám đốc | 1000 | 0001 | |
| NV007 | Nguyễn Hoàng Lan | Giáo viên | 500 | 0001 | NV006 |
| NV008 | Nguyễn Thanh Ngọc | Giáo viên | 700 | 0002 |
Công việc:
- Tính lương thấp nhất cho từng đơn vị
- So sánh (MaDV, Luong) của tất cả nhân viên với tập hợp đó.
SELECT Hoten, MaDV, Luong
FROM NHANVIEN
WHERE (MaDV, Luong) IN (Select MaDV, Min(Luong)
From NHANVIEN
Group by MaDV)
Đối với một vài HQTCSDL, tập hợp trong phép toán IN chỉ bao gồm 1 giá trị. Ví dụ không thể so sánh (MaDV, Luong), chỉ được phép so sánh MaDV hoặc Luong.
SELECT NHANVIEN.MaNV, NHANVIEN.Hoten, NHANVIEN.Luong
FROM NHANVIEN
WHERE NHANVIEN.Luong IN (
SELECT Min(NHANVIEN.Luong) AS MinOfLuong
FROM NHANVIEN
GROUP BY NHANVIEN.MaDV)
Kết quả:
| MaNV | Hoten | Luong |
| NV003 | Hoàng Thị Lan | 200 |
| NV004 | Đỗ Trung Dũng | 700 |
| NV005 | Đỗ Văn Hải | 100 |
| NV008 | Nguyễn Thanh Ngọc | 700 |
Phép toán ALL
Kết hợp với các phép so sánh thông thường để so sánh một giá trị với 1 tập hợp.
Giá_trị > ALL{Tập hợp}: Biểu thức TRUE nếu giá trị so sánh > tất cả các giá trị trong tập hợp.
5> ALL(2,3,4): TRUE
5> ALL(2,4,6): FALSE
Phép toán ANY
Giá_trị> ANY{Tập hợp}:Biểu thức TRUE nếu giá trị so sánh > một giá trị nào đó trong tập hợp.
5> ANY(2,4,6): TRUE
SELECT Hoten, Luong
FROM NHANVIEN
WHERE Luong> ALL(
Select Luong
From NHANVIEN
Where MaDV ='0002')
Kết quả select trong là:
| Luong |
| 200 |
| 700 |
Kết quả của cả câu lệnh:
| Hoten | Luong |
| Nguyễn Nam Hải | 1000 |
Nếu thay ALL = ANY thì kết quả:
| Hoten | Luong |
| Phạm Thị Nhàn | 500 |
| Hoàng Thanh Vân | 600 |
| Đỗ Trung Dũng | 700 |
| Nguyễn Nam Hải | 1000 |
| Nguyễn Hoàng Lan | 500 |
| Nguyễn Thanh Ngọc | 700 |
Mệnh đề HAVING trong SELECT lồng nhau.
Mệnh đề HAVING được sử dụng khi có điều kiện nhóm
- Tính lương lớn nhất của đơn vị có mã đơn vị là 0003
- Đưa ra những đơn vị có TBLương > Lương nhỏ nhất vừa tính được
SELECT MaDV, Avg(Luong) AS AvgOfLuong
FROM NHANVIEN
GROUP BY NHANVIEN.MaDV
HAVING AVG(Luong)>
Select Min(Luong)
From NHANVIEN
Where MaDV='0002')Mệnh đề ORDER BY trong SELECT lồng nhau
Mỗi lệnh SELECT chỉ có 1 mệnh đề ORDER By duy nhất.
Một lệnh SELECT lồng nhau được coi là một lệnh SELECT. Vì vậy, nếu muốn sắp xếp dữ liệu thì mệnh để ORDER BY phải là mệnh đề cuối cùng của lệnh SELECT ngoài cùng, các lệnh SELECT bên trong không có ORDER BY.
Các lệnh lồng nhau liên kết
Các lệnh liên kết cũng là các lệnh SELECT lồng nhau nhưng nó có cách thực hiện khác các lệnh lồng nhau thông thường.
Các bước thực hiện:
- Xét 1 hàng của bảng
- Sử dụng dữ liệu của hàng đó để thực hiện lệnh
SELECTbên trong. - Sử dụng kết quả của SELECT bên trong để thực hiện
SELECTbên ngoài - Lặp lại các bước trên cho đến khi hết các hàng được xét.
| NHANVIEN | |||||
| MaNV | HoTen | CongViec | Luong | MaDV | MaPT |
| NV001 | Phạm Thị Nhàn | Thư ký | 500 | 0001 | NV002 |
| NV002 | Hoàng Thanh Vân | Giáo viên | 600 | 0001 | NV003 |
| NV003 | Hoàng Thị Lan | Giáo viên | 200 | 0002 | NV002 |
| NV004 | Đỗ Trung Dũng | Thư ký | 700 | 0003 | NV002 |
| NV005 | Đỗ Văn Hải | Bảo vệ | 100 | 0001 | NV002 |
| NV006 | Nguyễn Nam Hải | Giám đốc | 1000 | 0001 | |
| NV007 | Nguyễn Hoàng Lan | Giáo viên | 500 | 0001 | NV006 |
| NV008 | Nguyễn Thanh Ngọc | Giáo viên | 700 | 0002 |
Đưa ra Hoten, MaDV, Luong của những nhân viên có Luong> LuongTB của đơn vị của họ.
SELECT NHANVIEN.HoTen, NHANVIEN.MaDV, NHANVIEN.Luong
FROM NHANVIEN
WHERE ((NHANVIEN.Luong)> (Select AVG(Luong)
From NHANVIEN NV1
Where NV1.MaDV= NHANVIEN.MaDV))