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 from where điều khoản Selectđiều khoảnFromđiều khoản WhereDanh sách tên cột : các tên cột cách nhau
Trang 1Bài giảng Sql
Biên tập bởi:
Vien CNTT – DHQG Hanoi
Trang 4Sql server
Giới thiệu chung về SQL
Vài nét khái quát
Lịch sử
SQL ra đời vào năm 1970 - tại Phòng thí nghiệm của IBM, San Jose, California
Là một ngôn ngữ mô tả, phi thủ tục - Non procedural language
Các câu lệnh mô tả yêu cầu cần phải Làm gì - What, chứ không cần nêu từng bước tiến hành Làm như thế nào - How
Tên gọi sql = Structured Query Language, nghĩa là ngôn ngữ truy vấn (thông tin) có cấutrúc
Thực chất không chỉ có Query mà SQL còn thực hiện nhiều chức năng khác như bổxung thêm dữ liệu, sửa đổi cập nhật thông tin, huỷ thông tin, liên kết lưu trữ thông tin.Vậy phải gọi là
Structured Add, Modify, Delete, Join, Store, Trigger & Query Language
Ngày nay SQL thực tế đa trở thành chuẩn - De facto Standard - để truy vấn và xử lí dữliệu trong hầu hết các hệ quản trị CSDL
Ngôn ngữ SQL được dùng trong các ứng dụng CSDL theo mô hình Client-Server Cácchương trình khách gửi yêu cầu truy vấn thông tin dưới dạng các câu lệnh SQL Chươngtrình chủ dịch vụ - Server CSDL - sẽ thực hiện yêu cầu và gửi lại kết quả cho chươngtrình khách
Có hai họ sản phẩm, để cài đặt cho PC và để cìa đạt trong các hệ thống lớn VLDB very large DB
-Ví dụ một số hệ quản trị CSDL điển hình
MicroSoft Access
Personal oracle - SQL* Plus
Trang 5MicroSoft Query.
OBBC - Open Database Connectivity.
Là thư viện các hàm (chức năng) cung cấp một giao diện trình ứng dụng - API -chungtới hệ thống DB
Không phụ thuộc vào nhà cung cấp hệ quản trị DBMS, ( non vendor- specific)
Các nhà cung cấp thường thêm các tính năng ngoài chuẩn, ví dụ : Transact-SQL củaMicroSoft & Sybase, PL/SQL của Oracle
ODBC đã thành chuẩn, nhiều sản phẩm chấp nhận và phát triển các công cụ dùng chuẩnnày : Visual Basic, Visual C++, Foxpro, Borland Delphi, Power Builder
Cần cân nhắc
ODBC : portability, nhưng chậm hơn
Vendor specific : nhanh hơn, tối ưu hơn
Trang 6SQL trong chương trình ứng dụng.
Ba kiểu tương tác với ứng dụng
- Mođun : các thủ tục làm sẵn thông qua các tham số, gọi và trả kết quả về
- Nhúng trực tiếp : các câu lệnh SQL trong chương trình
- Gọi trực tiếp : tương tác
Nhúng là hình thức làm việc tĩnh - static : câu lệnh được biên dịch ra, không thay đổiđược khi chạy
Hiện nay Dynamic SQL : cho phép chuẩn bị câu lệnh SQL trong khi chạy Các thànhphần của câu lệnh SQL được ghép nối lại trong thời gian chạy, cho phép mức linh hoạtrất cao trong khai thác CSDL
Giống như chuyển từ compiler sang interpreter
Trang 7Odbc có tính năng Dynamic.
Chuẩn ANSI 1992 : SQL-92
định nghĩa 3 mức tương thích của một hệ quản trị CSDL với SQL - SQL compliance :entry, intermediate, full
Trang 8Truy vấn thông tin
SQL Query
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
Trang 9Select 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ảnFromđiều khoản WhereDanh 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
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
Trang 107773 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>
Trang 11Biểu thức, điều kiện & toán tử.
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ảnWhere, ấ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
Trang 12Toá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ếtxuấ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
Trang 13Lư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>
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ằngnhau 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
Trang 14WHERE (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ầnnoà đó 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
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
Trang 15Toá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
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ả
Trang 16Cá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ộtcộ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ôikhi 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
Trang 17Bị 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 :
Trang 18Dị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àykết thúc
PROJECT ( Task, StartDate, EndDate, ) Giả sử có sự cố làm dự án chậm mất haithá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
Trang 19POWER ( a, b) : a b
MOD ( a,b) : a mod b
SIGN : cho dấu = -1 nếu đối số là âm
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ế
Trang 20Nế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ố
Trang 21Cá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
Đ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ảnWhere, ấ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 đó trongtừng nhóm cùng cột thứ nhất lai sắp theo cột thứ 2
select *
from employee
Trang 22order 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
Đ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
Trang 23from 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ồmnhiề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ềukhoả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)
Trang 24ODERS ( 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ếthơn ví dụ
where o.partnum = p.partnum
and p.price >
Câu lệnh lồng nhau
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
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
(
Trang 25select 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ốngSQL
from order o, part p
where o.partnum = p.partnum