Truy vấn dữ liệu (Select)

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

Đưa tất cả các thông tin về nhân viên
SELECT * FROM NHANVIEN

Kết quả: Toàn bộ bảng trên.

Đưa một số các cột

Đưa ra Hoten, Luong của các nhân viên
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)

Đưa ra các công việc khác nhau trong bảng NHANVIEN
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

Đưa ra Hoten, Luongnam (Lương *12) của tất cả các nhân viên
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)

Đưa ra Hoten, Luong sắp xếp theo thứ tự tăng dần/ giảm dần của Luong.
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
Đưa ra Hoten, Luong của các nhân viên có Luong>300
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

Đưa ra Hoten, Luong của những nhân viên có công việc là Giáo viên và mức lương >300.
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 …

Đưa ra những nhân viên có Lương trong khoảng 300 đến 600.
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)

Đưa ra những nhân viên có lương hoặc 200, 300, 600.
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à:?).
Đưa ra Hoten, Congviec của các nhân viên có Họ tên bắt đầu bằng chữ ‘Hoàng’.
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)

Hàm ROUND(n[,m]):
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
Hàm TRUNC(n[,m]):
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
Hàm CEIL(n)
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
Hàm FLOOR(n)
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
Hàm POWER(m,n)
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
Hàm EXP(n)
SELECT EXP(4) FROM DUMMY;
EXP(4)
54.59815
Hàm SQRT(n)
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
Hàm SIGN(n)
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
Hàm LOWER(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
Hàm UPPER(char)
SELECT ENAME FROM EMP WHERE ENAME = UPPER(‘Smith’);
ENAME
SMITH
Hàm INITCAP(char)
SELECT INITCAP(DNAME), INITCAP(LOC) FROM DEPT;
INITCAP(DNAME) INITCAP(LOC)
Accounting New York
Research Dallas
Sales Chicago
Operations Boston
Hàm CONCAT(char1, char2)
SELECT CONCAT(ENAME, JOB) JOB FROM EMP WHERE EMPNO = 7900;
JOB
JAMES CLERK
Hàm LPAD(char1, n [,char2])
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
Hàm RPAD(char1, n [,char2])
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
Hàm SUBSTR(char, m [,n])
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
Hàm INSTR(char1, char2 [,n[,m]])
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
Hàm LTRIM(char1, n [,char2])
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
Hàm RTRIM(char1, n [,char2])
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
Hàm SOUNDEX(char)
SELECT ENAME, SOUNDEX(ENAME) FROM EMP WHERE SOUNDEX(ENAME)= SOUNDEX(‘FRED’);
ENAME SOUN
FORD F630
Hàm LENGTH(char)
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
Hàm TRANSLATE(char, from, to)
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
Hàm REPLACE(char,search_string[,replacement_string])
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
Các hàm lồng nhau:
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.

Hàm MONTH_BETWEEN(d1, d2)
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
Hàm ADD_MONTHS(d,n)
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
Hàm NEXT_DAY(d, char )
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
Hàm LAST_DAY(d)
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ính
  • MIN(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.

Đưa ra lương trung bình, lương lớn nhất, nhỏ nhất của tất cả các nhân viên trong bảng NHANVIEN.
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.

Đưa ra Côngviệc, Lương trung bình của từng loại công việc.
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.

Đưa ra tổng lương của từng nhóm công việc trong từng đơn vị.
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
Nếu tên các cột ghi sau SELECT không phải là đối số của các hàm nhóm thì phải đưa vào mệnh đề GROUP BY.
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).

Đưa ra những Congviec và trung bình lương của các công việc có trung bình lương >=300.
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
Đưa ra những đơn vị và lương lớn nhất của các đơn vị có lương lớn nhất >=300.
SELECT MaDV, Max(Luong) AS MaxLuong FROM NHANVIEN GROUP BY MaDV HAVING Max(Luong)>300

Kết quả:

MaDV MaxLuong
0001 600
0003 700
Mệnh để HAVING là mệnh đề tương đương với WHERE áp dụng cho các nhóm. Nói chung, mệnh đề này chỉ sử dụng nếu đã có chỉ thị một mệnh đề GROUP BY

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.

Đưa ra Hoten, Congviec, TenDV của tất cả nhân viên.
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.MaDV

Nối không bằng (Non Equi-Join)

Đưa ra Hoten, Congviec, MaBac của tất cả nhân viên
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
Nếu ngoài các điều kiện nối còn có thêm các điều kiện khác thì điều kiện nối phải được viết trước.
Đưa ra HoTen, Congviec, TenDV, Luong của những nhân viên có Luong>=500.
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;
Giả sử có hai bảng:

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
Đưa ra những công việc trong đơn vị 1 có MaDV là 0001 và đơn vị 2 có MaDV là 0002.
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 thay UNION bằng INTERSECT thì 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 thay UNION bằng MINUS thì 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 SELECT trong đó có chứa các lệnh SELECT khác.
  • Các câu lệnh SELECT bên trong nằm sau mệnh đề WHERE hoặc HAVING của SELECT bê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 SELECT bên trong.
  • Sử dụng kết quả của lệnh SELECT bên trong để thực hiện lệnh SELECT bên ngoài.
  • Số các lệnh SELECT lồ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.

Đưa ra Hoten, TenDV, Congviec, Luong của những người có lương lớn hơn lương trung bình của toàn bộ nhân viê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
Đưa ra những nhân viên có lương lớn hơn người có lương lớn nhất trong đơn vị có tên là DHTL.

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
Đưa ra Hoten, MaDV, Luong của các nhân viên có Luong=Luong thấp nhất trong đơn vị của họ.

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.

Đưa ra Hoten, MaDV, Luong của các nhân viên có Luong=Luong thấp nhất trong một đơn vị nào đó.
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

Đưa ra Hoten, Luong của các nhân viên có Luong lớn nhất của đơn vị có mã đơn vị là 0002.
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

Đưa ra MaDV, AVG(Luong) của đơn vị có trung bình lương lớn hơn lương nhỏ nhất của đơn vị có mã đơn vị là 0003.
  • 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 SELECT bên trong.
  • Sử dụng kết quả của SELECT bên trong để thực hiện SELECT bê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.
Có 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

Đư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))