Truy vấn thông tin
Một câu lệnh SQL thường gọi là một Query. Như trên đã nêu, Query không chỉ đơn giản là hỏi - truy vấn thông tin từ CSDL để phục vụ NSD. Một SQL query có thể - tạo lập hay huỷ một bảng - thêm, xoá, cập nhật một dòng, ...
Một câu lệnh SQL thường gọi là một Query. Như trên đã nêu, Query không chỉ đơn giản là hỏi - truy vấn thông tin từ CSDL để phục vụ NSD.
Một SQL query có thể
- tạo lập hay huỷ một bảng
- thêm, xoá, cập nhật một dòng, một trường
- tiùm kiếm trong nhiều bảng có liên quan
- thay đổi chế độ an toàn.
Trong chương này ta chỉ tập chung vào chức năng hay sử dụng nhất của một SQL Query là truy vấn thông tin.
Cú pháp chung - câu lệnh SELECT.
- câu lệnh SQL không phân biệt chứ in hoa, viết thường. (Nhưng kiểu dữ liệu Char = xâu kí tự thì có phân biệt).
- dấu cách có thể là : các khoảng trắng, dấu table, dấu xuống dòng.
- kết thúc câu lệnh có thể là : dấu chấm phẩy hoặc không có gì tuỳ theo từng hệ thống.
Ví dụ
SELECT NAME, STARTTERM, ENDTERM
FROM PRESIDENTS
WHERE NAME = 'LINCOLN'
Select name, startterm, endterm
From presidents
Where name = 'LINCOLN'
Select name, startterm, endterm From presidents Where name = 'LINCOLN'
Các thành phần cơ bản.
Các từ khoá + các biểu thức -> các điều khoản
Các điều khoản -> câu lệnh SQL
select <danh sách tên cột>from <tên bảng> where <điều kiện tìm kiếm> | điều khoản Selectđiều khoản Fromđiều khoản Where |
Danh sách tên cột :
các tên cột cách nhau dấu phẩy
thứ tự giống như đã liệt kê, có thể khác với thứ tự vốn có trong bảng.
* = tất cả các cột theo thứ tự vốn có
Vi dụ :
Giả sử có bảng tên là Employee với các trường (các cột) tên là Badge, Name, Departement, BirthYear, Salary. Sau này ta sẽ viết ngắn gọn như sau : Employee ( Badge, Name, Departement, BirthYear, Salary ).
Câu lệnh sau đây sẽ hiện toàn thể nội dung của bảng.
SELECT * FROM EMPLOYEE
Badge | Name | Department | Birth year | Salary |
1834 | Bob Smith | Sales | 1970 | 24000.00 |
1051 | Fred Sanders | Sales | 1965 | 36000.00 |
3211 | Stan Humphries | Field Service | 1974 | 22000.00 |
6732 | Fred Stanhope | Field Service | 1958 | 56000.00 |
4411 | Sue Sommers | Logistics | 1965 | 40000.00 |
5522 | Lance Finepoint | Library | 1970 | 24000.00 |
1997 | Mark McGuire | Field Service | 1966 | 36000.00 |
9998 | Sally Springer | Sales | 1973 | 22000.00 |
7773 | Ludmilla Valencia | Software | 1969 | 36000.00 |
8883 | Barbara Lint | Field Service | 1966 | 40000.00 |
8005 | Jeffrey Vickers | Mailroom | 1965 | 42000.00 |
7779 | Jim Walker | Unit Manager | 1971 | 24000.00 |
Từ khoá DISTINCT / ALL
DISTINCT = chỉ lấy những dòng khác nhau
Nghĩa là nếu có nhiều dòng giống nhau chỉ lấy một đại diện.
ALL = tất cả các dòng, kể cả trùng nhau
đây là mặc định , không cần gõ ALL.
Cú pháp
Select DISTINCT <danh sách tên cột> ...
Select ALL <danh sách tên cột> ...
Ví dụ
SELECT DISTINCT Departement
FROM EMPLOYEE
Department |
Sales |
Field Service |
Logistics |
Library |
Software |
Mailroom |
Unit Manager |
Biểu thức :
Là một tập hợp các toán hạng và toán tử, trả lại một giá trị : số, lôgic, xâu
Ví dụ
Biểu thức số : (Salary * 1.05)
Biểu thức lôgic : Name = ' Barbara Lint' , Salary <= 50,000.00
Biểu thức xâu : Name + Phone.
Các biểu thức được sử dụng trong câu lệnh QSL :
- Trong điều khoản SELECT để kết xuất thông tin trực tiếp
- Làm điều kiện tìm kiếm trong điều khoản WHERE, HAVING ...
Biểu thức điều kiện & Điều khoản Where.
Điều kiện là một biểu thức lôgic.
Một biểu thức điều kiện được dùng kèm với từ khoá Where để tạo thành điều khoản Where, ấn định tiêu chuẩn tìm kiếm thông tin xuất ra. Chỉ những dữ liệu thảo điều kiện đã nêu mới được đưa vào kết quả truy vấn.
Ví dụ. Câu lệnh sau đây chỉ tìm và xuất ra các thông tin về cán bộ thuộc phòng bán hàng - Sales.
SELECT Name, Departement, Salary
FROM EMPLOYEE
WHERE Departement = 'Sales'
Name | Department | Salary |
Bob Smith | Sales | 24000.00 |
Fred Sanders | Sales | 36000.00 |
Sally Springer | Sales | 22000.00 |
Toán tử số học.
Là các thành phần để xây dựng biểu thức.
Các phép toán số học, phép so sánh, phép toán xâu kí tự.
Toán tử số học : cộng, trừ , nhân, chia, modulo ( a % b hoặc Mod (a,b) )
Các biểu thức số học, biểu thức xâu có thể sử dụng trong điều khoản SELECT để kết xuất thông tin trực tiếp.
Ví dụ 1: giả sử mọi người đều được phụ cấp thêm 5 phần trăm lương. Có thể hiển thị mức thực lĩnh như sau.
SELECT Name, Salary * 1.05
FROM EMPLOYEE
Ví dụ 2 : Giả sử có tệp csdl PRICE về giá hàng hoá gồm các trường Item - tên hàng, Wholesale - giá bán buôn. Nếu quy định giá bán lẻ là cộng thêm 0.15 thì có thể hiển thị bằng câu lênh sau
SELECT Item, Wholesale, Wholesale + 0.15
FROM PRICE
ALIAS - Tên hiệu.
Trong các ví dụ trên tên cột sẽ được hiển thị là Salary * 1.05 hoặc Wholesale + 0.15 không được đẹp mắt và gợi tả nội dung cho lắm.
Có thể đặt lại tên cột cho sát nội dung, gợi tả hơn : thay Salary *1.05 bằng Newamount - số thực lĩnh, thay wholesale + 0.15 bằng retail - giá bán lẻ.
SELECT Name, Salary * 1.05 Newamount
FROM EMPLOYEE
SELECT Item, Wholesale, Wholesale + 0.15 Retail
FROM PRICE
Các tên cột mới Newamount, Retail gọi là Alias -Tên hiệu, tên thay thế.
Lưu ý : cú pháp sử dụng Alias là
<biểu thức tên cột> <Alias> cách nhau khoảng trắng
Một số hệ thống có thể quy định khác, ví dụ dùng cú pháp với dấu bằng
<biểu thức tên cột> = <Alias>
Toán tử so sánh
Để xây dựng biểu thức lôgic.
kí hiệu | í nghĩa |
= | Bằng |
!= | Khác |
<> | Khác |
< | Nhỏ hơn |
> | Lớn hơn |
<= | Nhỏ hơn hay bằng |
>= | Lớn hơn hay bằng |
Các ví dụ & điều khoản where.
Điều kiện tìm kiếm được thể hiện trong diều khoản Where. Không chỉ có so sánh bằng nhau mà có thể dùng các phép so sánh bất kì hoặc biểu thức lôgic phức tạp.
Ví dụ : - tìm những người lương lớn hơn 30000.00
SELECT Name, Salary
FROM EMPLOYEE
WHERE Salary > 30000.00
- tìm những người lương lớn hơn 30000.00 mà không ở phòng bán hàng
SELECT Name, Salary , Departement
FROM EMPLOYEE
WHERE (Salary > 30000.00) AND (Departement <> 'Sales' )
Toán tử xâu -
LIKE : khi không biét thật chính xác một phần của xâu hoặc chỉ quan tâm đến một phần noà đó của xâu, có thể dùng Like với các kí tự đại diện %, _
Kí tự đại diện % thay cho một xâu con bất kì
Kí tự dại diện _ thay cho một kí tự bất kì.
Ví dụ : bảng mã vùng điện thoại AREACODE gồm có các trường : TênTỉnh, MãVùng,
MãVùng | TênTỉnh |
034 | HaTay |
036 | HaiDuong |
04 | HaNoi |
08 | TPHCM |
Có thể hiển thị tất cả các tỉnh bắt đầu bằng Ha
SELECT *
PROM AREACODE
WHERE TenTinh LIKE 'Ha%'
Phép nối | |
Dùng để nối các xâu lại tạo thành biểu thức xâu lớn hơn.
Ví dụ có bảng FRIENDS gồm các trường FirstName, LastName, TelNum ...
Có thể hiên thị tên đầy đủ bằng câu lệnh
SELECT FirstName || LastName FullName
FROM FRIENDS
Toán tử lôgic
AND, OR, NOT,
Các phép toán lôgic có thể dùng để xây dựng các biểu thức điều kiện phức tạp hơn trong điều khoản Where.
Ví dụ
select *
from employee
where department = "field service"
or department = "logistics"
or department = "software"
Các phép toán tập hợp.
Hai bảng phải có cấu trúc giống nhau
UNION : hợp hai kết quả select, có loại bỏ trùng nhau.
UNION ALL : hợp hai kết quả select, không loại bỏ trùng nhau.
INTERSECT : giao hai kết quả select
MINUS : hiệu hai kết quả.
các phép toán khác
BETWEEN để xác định một đoạn con trong vùng giá trị có thể của một cột
IN để xác định một danh sách các giá trị có thể
SELECT column_name_1,...column_name_n
FROM table_name_1,...table_name_n
WHERE column_name IN (value_1, ...value_n)
Ví dụ
select *
from employee
where badge between 2000 and 7000
Các hàm xử lí tập thể - Aggregate functions.
Các câu lệnh SQL thông thường két xuất dữ liệu lần lượt theo từng dòng của bảng.
Các hàm tập đoàn - Aggegate function - Xử lí dữ liệu thuộc mọi dòng trong toàn bộ một cột ( hoặc một nhóm dòng thoả điều kiện nào đó) và cho ra chỉ một kết quả. Chúng dôi khi cũng đợc gọi là hàm nhóm - Group function.
Count : đếm số dòng thoả mãn điều khoản Where.
Ví dụ: đếm số nhân viên của phòng bán hàng
select count (*)
from employee
where Department = 'Sales'
Nếu không có điều khoản Where thì là đếm toàn bộ nhân viên.
SUM : tính tổng một cột
Cột phải là kiểu số
Bị lỗi Nếu không phải kiểu số .
Ví dụ
select SUM (Salary)
from employee.
AVG : Tính trung bình cộng của cột
Cột phải là kiểu số
Bị lỗi Nếu không phải kiểu số .
Select AVG (Salary)
from employee.
MAX : cho giá trị cực đại trong cột.
Có thể áp dụng cho cột kỉểu số và cả cột kiểu Char
Select MAX(Salary)
from employee.
MIN : cho giá trị cực tiểu trong cột
Có thể áp dụng cho cột kiểu số và cả cột kiểu Char.
Select MIN(Name)
from employee.
VARIANCE :
Cho bình phương của độ lêch tiêu chuẩn
Chỉ áp dụng được cho cột kiểu số.
Select VARIANCE(Salary)
from employee.
STDDEV : độ lệch tiêu chuẩn - Standard Deviation
Chỉ áp dụng cho cột kiểu số.
Ngày tháng và Thời gian.
SYSDATE : Thời gian hệ thống.
Dùng để so sánh : tìm các công việc chưa bắt đầu, đã kết thúc ...
ADD_MONTHS :
Dịch lùi lại, cộng thêm một số tháng từ một ngày cho trước
Ví dụ : Giả sử có CSDL về quản lí dự án gồm các trường Công việc, Ngày bắt đầu, ngày kết thúc ...
PROJECT ( Task, StartDate, EndDate, ...). Giả sử có sự cố làm dự án chậm mất hai tháng. Để hiển thị các công việc còn chưa két thúc được cần dùng hàm Add_month ( Enddate, 2) .
Select Task, StartDate, EnDDate Original_End, ADD_MONTHS (EndDate, 2)
From PROJECT
MONTH_BETWEEN :
Đếm số tháng giữa hai mốc ngày.
Ví dụ.
Select Task, StartDate, EndDate ,
MONTHS_BETWEEN( StartDate, EndDate) Duration
From PROJECT
Các hàm số học.
ABS : giá trị tuyệt đối
CEIL : số trần - số nguyên nhỏ nhất lớn hơn hay bằng đối số
FLOOR : số sàn - số nguyên lớn nhất bé hơn hay bằng đối số
Cac hàm lượng giác
COS , COSH, SIN, SINH, TAN, TANH
đối số là Radian
EXP
LN
LOG (x, b) : log b x.
POWER ( a, b) : a b
MOD ( a,b) : a mod b
SIGN : cho dấu = -1 nếu đối số là âm
= 0 nếu đối số = 0
= 1 nếu đối số là dương.
SQRT : căn bậc hai
các hàm xử lí kí tự và xâu kí tự.
CHR : chuyển đối số là một số nguyên thành kí tự có mã tương ứng
Bảng mã có thể là ASCII
CONCAT : nối hai xâu
INITCAP : chuẩn hoá xâu, kí tự đầu là in hoa, các kí tự sau là chữ thường.
LOWER, UPPER : chuyển đổi cả xâu (mọi kí tự) thành chữ in thường, in hoa
LPAD, RPAD : độn thêm kí tự vào bên trái, bên phải của xâu cho đủ độ rộng.
Lpad ( xâu, độ rộng, kí tự mẫu để điền thêm)
Ví dụ
Néu chỉ có hai đối là xâu và độ rộng, không cho kí tự mẫu thì mặc định là khoảng trống.
LTRIM, RTRIM :
Ltrim ( xâu, kí tự cần xoá bỏ) .
Nếu chỉ có một đối xâu, không cho kí tự mẫu thì mặc định là khoảng trống.
REPLACE : thay thế một (các) xâu con bằng một xâu khác
Replay (xâu, xâu con cần tìm, xâu thay thế)
Tìm xâu con và thay thế mỗi khi gặp bằng xâu thay thế.
Nếu không có đối thứ 3 - không cho xâu thay thế, thì mặc định là rỗng.
SUBSTR : Trích ra xâu con
SubStr ( xâu, pos , num)
Pos = vị trí bắt đầu
Num = số kí tự trích ra = độ dài xâu con.
Nếu pos là số âm thì tính từ cuối xâu mẹ. Lưu ý rằng độ rộng trường ấn định trước nên có thể tính lùi.
TRANSLATE. Dịch từng kí tự thành kí tự mã hoá tương ứng
Translate (xâu đích, xâu kí tự nguồn, xâu kí tự mã hoá)
Ví dụ : để mã hoá chuyển mọi kí số thành N, kí tự chữ cái thành C
Translate (Firstname, 0123456789ABCDE...
NNNNNNNNCCCC....
INSTR : tìm kiếm một kí tự mẫu, cho biết vị trí trong xâu
Instr( xâu, mẫu tìm kiếm, vị trí bắt đầu, mẫu thứ mấy)
Ví dụ instr (LastName, 'O', 2, 1)
Bắt dầu từ vị trí thứ 2 trong LastName, tìm vị trí đầu tiên xuất hiện của kí tự O,
LENGTH : cho độ dài xâu
Các hàm chuyển đổi.
TO_CHAR : chuyển thành xâu kí tự
Chuyển một số nguyên thành xâu kí số biểu diễn số đó
TO_NUMBER
Chuyển xâu kí số thành giá trị số.
Các hàm khác
GREATEST : cho hạng tử lớn nhất trong dãy các đối
LEAST cho hạng tử nhỏ nhất trong dãy các đối
USER : cho biết tên của người đang sử dụng DB.
Where
Starting with
Order by
Group by
Having.
Điều khoản WHERE.
Một biểu thức điều kiện được dùng kèm với từ khoá Where để tạo thành điều khoản Where, ấn định tiêu chuẩn tìm kiếm thông tin xuất ra. Chỉ những dữ liệu thoả điều kiện đã nêu mới được đưa vào kết quả truy vấn.
Biểu thưc diều kiện trong điều khoản Where có thể dùng bất kì các phép so sánh số học, các phép toán lôgic nào.
Điều khoản STARTING WITH.
Giống như LIKE ( <biểu thức> %)
Điều khoản ORDER BY
Dùng để két xuất thông tin ra theo thứ tự của một cột được chọn làm khoá sắp xếp.
Có thể sắp theo nhiều, trước hết sắp theo cột thứ nhất trong danh sách khoá, sau đó trong từng nhóm cùng cột thứ nhất lai sắp theo cột thứ 2...
select *
from employee
order by department, badge desc
ASC : tăng dần, là lựa chon mặc định
DESC : giảm dần
Có thể thay tên cột bằng số thứ tự cột trong bảng.
Điều khoản GROUP BY
Khác với ORDER BY in ra mọi dòng theo nhóm không loại bỏ các giá trị trùng lặp, xử lí cả nhóm dòng cùng giá trị như một đơn vị.
select department, count(*) headcount
from employee
group by department
GROUP BY thường dùng với các hàm xử lí nhóm dữ liệu.
Ví dụ
select department, AVG(Salary)
from employee
group by department
Điều khoản HAVING
Where không làm việc với các hàm xử lí (tập đoàn) nhóm như AVG, SUM...
Phaỉ dùng Having
select department, SUM(Salary)
from employee
group by department
having SUM (Salary) > ...
Kết hợp các điều khoản.
Có thẻ phối hợp nhiều điều khoản để thực hiện các truy vấn tin tuỳ ý thoả mãn yêu cầu của NSD.
Ví dụ. Có bảng CHECKS ( Payee, Amount). Câu lệnh sau sẽ xuất ra từng người nhận séc với tổng số tiền và số lần nhận nhưng loại bỏ những người mà có tổng số tiền quá nhỏ (<= 50).
Select Payee,
SUM(Amount) Total,
COUNT (Payee) Checks_written
From checks
Group by Payee
Having SUM (Amount) > 50
Join : nối tự nhiên hai bảng
select *
from table_1, table_2
đây là phép nối tự nhiên, không có điều kiện gì (thiếu điều khoản Where).
kết quả của nối tự nhiên là tích Đề các.
Nếu bảng 1 có m dòng, bảng 2 có n dòng thì kết quả sẽ gồm m*n dòng
Nối có điều kiện
Việc chuẩn hoá loại bỏ dư thừa dữ liệu làm cho bảng nhỏ hơn và cơ sở dữ liệu gồm nhiều bảng hơn. Rất thông thường, các truy vấn SQL lien quan đến nhiều bảng. Điều khoản Where thể hiện mối liên hệ này.
Ví dụ : Có CSDL gồm ba bảng
CUSTOMER (Name, Address, Phone)
ODERS ( OrderOn, Name, PartNum,Quantity)
PART (PartNum, Description, Price)
select o.orderon, o.name, o.partnum,
p.description, o.quantity * p.price total
from order o, part p
where o.partnum = p.partnum
Có thể bổ xung thêm điều kiện vào điều khoản Where để thực hiện các truy vấn chi tiết hơn ví dụ
where o.partnum = p.partnum
and p.price > ...
Câu lệnh con. SubQueries
Là một truy vấn khác, đóng vai trò là một phần của điều khoản Where.
Ví dụ.
select *
from employee
where department = (
select department
from employee
where name = "bob smith")
Điều kiện lôgic = ở trên đòi hỏi kết quả của câu lệnh con phải đơn trị, nghĩa là chỉ trả về một dòng. Nếu thay câu lệnh con như sau
(
select department
from employee
where name like "% smith")
Thì có thể mắc lỗi khi có nhiều người tên là smith và ở các phòng chức năng khác nhau.
Ví dụ2 :
select o.orderon, o.name, o.partnum,
p.description, o.quantity * p.price total
from order o, part p
where o.partnum = p.partnum
and o.quantity * p.price >
(select AVG(o.quantity * p.price)
from order o, part p
where o.partnum = p.partnum )
Các câu lệnh con lồng nhau.
Các Subqueries có thể lồng nhau nhiều mức, tuỳ theo khả năng cụ thể của từng hệ thống SQL.
Ví dụ 3
Select c.name, c.address, c.phone
From customer c
Where c.name IN
(select o.name
from order o, part p
where o.partnum = p.partnum
and o.quantity * p.price >
(select AVG(o.quantity * p.price)
from order o, part p
where o.partnum = p.partnum ))
Lưu ý rằng ở đây điều kiện lôgic là IN nên câu lệnh con có thể trả về nhiều dòng.
Sử dụng EXits, ANY, ALL
EXIST : kiểm tra kết quả của câu lệnh con như là một tham đối. Nếu câu lệnh con có trả về một kết quả gì đó thì điều kiện được coi là TRUE, trái lại thì điều kiện là FALSE.
Ví dụ.
Select name, orderon
From orders
Where EXITS
(select *
from orders
where name = 'xxxxx' )
Lưu ý EXIST không quan tâm đến số cột trả về trong câu lệnh con.
ANY hoặc SOME : kiểm tra lần luợt từng dòng. Nếu giá trị cột có mặt trong kết quả trả về của câu lệnh con thì điều kiện được coi là TRUE.
Như vậy câu lệnh con có thể trả về nhiều giá trị dù rằng điều kiện ở đây là =.
Có thể thấy nó có tác dụng giống như IN
Ví dụ.
Select name, orderon
From orders
Where name = ANY
(select name
from orders
where name = 'xxxxx')
Tuy nhiên, có trrường hợp không thể dùng IN,
Trong ví dụ sau ANY được dùng với phép so sánh <, > trong khi IN có thể hiểu như nhiều dấu bằng.
Select name, orderon
From orders
Where name > ANY
(select name
from orders
where name = 'xxxxx')
ALL : điều kiện chỉ được coi là đúng nếu mọi kết quả trả về của câu lệnh con đều thoả mãn.
Select name, orderon
From orders
Where name <> ALL
(select name
from orders
where name = 'xxxxx')
Câu lệnh trên có kết quả là mọi người, trừ ông 'xxxxx'.