Lưu ý : Nếu sử dụng nhiều biểu thức trong một câu lệnh select thì câu lệnh SELECT đấy cần phải có mệnh đề GROUP BY Tập hợp Function trong MS Accesss : Function Description Mã: AVGcolumn
Trang 1Lập trình SQL [Nâng cao]
SQL ORDER BY
Từ khóa ORDER BY dùng để sắp xếp lại những kết quả trả về theo kiểu alphabetical hay một giá trị nào đó
Bây giờ ta sẽ hiển thị ra 2 cột Company và OrderNumber được sắp xếp theo vần alphabetical :
SELECT Company, OrderNumber FROM Orders
ORDER BY Company, OrderNumber
Bạn muốn sắp xếp đảo ngược lại alphabetical thì ta sẽ thêm từ khóa DESC sau giá trị của ORDER BY :
Mã:
SELECT Company, OrderNumber FROM Orders
ORDER BY Company DESC
Và tương tự như vậy khi ta thêm sự sắp xếp kiểu numerical order , thêm từ khóa ASC :
Mã:
SELECT Company, OrderNumber FROM Orders
ORDER BY Company DESC, OrderNumber ASC
Trang 2SQL ALTER TABLE
Biểu thức ALTER TABLE dùng để thay đổi các giá trị trong tables
Mã:
ALTER TABLE table_name
ADD column_name datatype
ALTER TABLE table_name
DROP COLUMN column_name
Lưu ý : Một vài hệ thống database ko cho phép drop trực tiếp các cột trong table (DROP COLUMN column_name)
Thêm vào 1 cột trong table Persons :
Trang 3Cú pháp của Function :
Mã:
SELECT function(column) FROM table
Ở đây chúng ta chỉ vài kiểu cơ bản trong các loại hàm của SQL Đây là 2 dạng cơ bản :
* (Aggregate functions) Tập hợp Functions
* (Scalar functions) Định hướng functions
Aggregate functions :
Aggregate functions có tác dụng với nhiều giá trị nhưng chỉ trả về 1 giá trị
Lưu ý : Nếu sử dụng nhiều biểu thức trong một câu lệnh select thì câu lệnh SELECT đấy cần phải có mệnh đề GROUP BY
Tập hợp Function trong MS Accesss :
Function Description
Mã:
AVG(column) Trả về giá trị trung bình trong một cột
COUNT(column) Trả về số lượng hàng (không có giá trị NULL) của một cột
COUNT(*) Trả về số lượng các hàng được lựa chọn
FIRST(column) Trả về giá trị của bản ghi đầu tiên trong một trường
LAST(column) Trả về giá trị của bản ghi cuối trong một trường được chỉ định
MAX(column) Trả về giá trị lớn nhất của một cột
Trang 4MIN(column) Trả về giá trị nhỏ nhất của một cột
COUNT(column) Trả về số lượng hàng (không có giá trị NULL) của một cột
COUNT(*) Trả về số lượng hàng được chọn
COUNT(DISTINCT column) Trả về số lượng các kết quả riêng biệt
FIRST(column) Trả về giá trị của bản ghi đầu tiên trong một trường được chỉ định (không hỗ trợ trong SQL Server 2000)
LAST(column) Trả về giá trị của bản ghi cuối trong một trường được chỉ định (không hỗ trợ trong SQL Server 2000)
MAX(column) Trả về giá trị lớn nhất của một cột
MIN(column) Trả về giá trị nhỏ nhất của một cột
Trang 5UCASE(c) Chuyển một trường sang chữ HOA
LCASE(c) Chuyển một trường sang chữ thường
MID(c,start[,end]) Lấy ra những kí tự trong trường text
LEN(c) Trả về độ dài của một trường text
INSTR(c,char) Trả về số vị trí của tên kí tự trong một trường text
LEFT(c,number_of_char) Trả về phần bên trái của một trường text được yêu cầu
RIGHT(c,number_of_char) Trả về phần bên phải của một trường text được yêu cầu
ROUND(c,decimals) Làm tròn số trường thập phân
MOD(x,y) Trả về phần còn lại của phép chia
NOW() Trả về ngày tháng của hệ thống hiện thời
FORMAT(c,format) Thay đổi hướng của trường hiển thị
DATEDIFF(d,date1,date2) Sử dụng để thực thi việc tính toán ngày tháng
Thất bại thì Làm lại
Bộ sưu tập E-books tiếng Anh và tiếng Việt cho ITer (119 cuốn):
http://www.mediafire.com/?zao9royjp2pc7
08-12-2008, 09:21 PM
Trang 6Số bài viết: #2
Shin
Ultimate Weapon
Bài viết: 2,590Gia nhập: Dec 2007 Điểm tín nhiệm: 0
Số lần cám ơn: 20Được cám ơn 84 lần/51 bài viết
Lập trình SQL [Nâng cao]
SQL GROUP BY and HAVING
Tập hợp functions (giống như lệnh SUM) thường cần thiết thêm vào hàm GROUP BY
GROUP BY được xem thêm vào SQL bởi vì tập hợp các hàm trả về tập hợp của tất cả giá trị của cột theo mọi thời điểm mà họ gọi ra , và ko dùng hàm GROUP BY thì xem như ko thể tìm được số tổng số của những giá trị nhóm cột riêng lẻ
SELECT Company, SUM(Amount) FROM Sales
Đoạn code trên sẽ ko có hiệu lực bởi vị cột SUM(Amount) sẽ trả về tổng của tất cả các giá trị trong đó nên hiển thị sai Mệnh đề GROUP BY sẽ giải quyết được vấn đề này :
Mã:
Trang 7SELECT Company,SUM(Amount) FROM Sales
HAVING SUM(column) condition value
Ta thực hiện lệnh như sau :
Trang 8Số lần cám ơn: 20Được cám ơn 84 lần/51 bài viết
Lập trình SQL [Nâng cao]
SQL SELECT INTO Statement :
Câu lệnh SELECT INTO thường được dùng để tạo những back up hoặc của tables hoặc những bản ghi
Trang 10SQL CREATE VIEW Statement
Một view có thể coi như là một "bảng ảo" có nội dụng được xác định từ một truy vẫn Một truy vấn (query) chỉ là một tập hợp các chỉ dẫn (intruction) nhằm truy vẫn và hiển thị dữ liệu từ các bảng CSDL Các truy vấn được thực hiện bằng các sử dụng câu lệnh SELECT
Using VIEW :
Một VIEW (khung nhìn) trông giống như một bảng với một tập hợp các tên cột và các dòng dữ liệu.Tuy nhiên ,khung nhìn ko tồn tại như là một cấu trúc lưu trữ dữ liệu trong CSDL Dữ liệu bên trong khung nhìn thực chất là dữ liệu được xác định từ một hay nhiều bảng cơ sở và do đó phụ thuộc vào các bảng cơ sở
Các VIEW được sử dụng trong CSDL nhằm các mục đích sau :
- Sử dụng khung nhìn để tập trung trên dữ liệu xác định
- Sử dụng khung nhìn để đơn giản hoá thao tác dữ liệu
- Sử dụng khung nhìn để tuỳ biến dữ liệu
- Sử dụng khung nhìn để xuất dữ liệu
- Sử dụng khung nhìn để bảo mật dữ liệu
Trang 11WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)
Query view trên :
Mã:
SELECT * FROM [Products Above Average Price]
Trang 12Ví dụ sau view trong database tên Northwind và tính tổng số sản phẩm được bán năm 1997 :
Mã:
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName
Query VIEW :
Mã:
SELECT * FROM [Category Sales For 1997]
Bạn cũng có thể thêm điều kiện và câu truy vấn Ví dụ như ở đây là view trong CategoryName='Beverages' :
Trang 13Số bài viết: #4
Shin
Ultimate Weapon
Bài viết: 2,590Gia nhập: Dec 2007 Điểm tín nhiệm: 0
Số lần cám ơn: 20Được cám ơn 84 lần/51 bài viết
Lập trình SQL [Nâng cao]
Với một số kiến thức cơ bản về SQL ở trên bạn có thể làm gì nào ?
Bây giờ ta sẽ thử xét với phương diện của người lập trình web :
Tạo 1 database tên hacker với các trường như sau :
Mã:
create database hacker
use hacker
Create table admin(
[id] numeric not null,
username nvarchar(10) not null,
[password] nvarchar(10) not null,
address nvarchar(30),
phone numeric(10)
)
select * from admin
Insert vào một số data :
Mã:
insert into admin ([id],username,[password],address,phone)
Trang 14values (1,'admin',12345,'Ha Noi',048324245)
go
insert into admin ([id],username,[password],address,phone)
values (2,'Neo',12345,'Ha Noi',048324245)
Rồi okie
Giờ muốn select những username trong table admin mà có address tại Hà Nội thì câu query sẽ như sau : (tất cả những giá trị là character thì phải được bao trong dấu quote '
Mã:
select username from admin where address='Ha Noi'
Vậy nếu ta viết thế này thì sẽ có chuyện gì xảy ra nhỉ
Mã:
select username from admin where address=''or 1=1 '
Kết quả cũng show ra như trên
Như trên ta thấy đáng lẽ ra address mang giá trị là Ha Noi nhưng nếu ta thay giá trị đó bằng 'or 1=1 thì dấu quote đằng trước sẽ là 2 dấu '' có nghĩa giá trị trong đó rỗng Và sau nó là or 1=1 , như ta đã biết or là câu lệnh điều kiện
và ở đây có nghĩa là hoặc
Mà giá trị đằng trước là rỗng nên SQL sẽ chạy tiếp theo gặp điều kiện or thì tất nhiên sẽ thực thi lệnh này mà or 1=1 , 1=1 thì luôn đúng , còn dấu sẽ biến tất cả những thứ đằng sau thành chú thích (trong SQL quy định sau dấu là câu chú thích) Như vậy câu truy vấn hoàn toàn hợp lệ và ko có lỗi gì cả và nó sẽ show cho ta toàn bộ username của admin , đến đây chắc bạn đã hiểu rồi chứ
Còn về câu lệnh UNION :
Trang 15Như đã biết câu lệnh UNION dùng để gộp chuỗi lại với nhau và các giá trị trong 2 chuỗi đó phải là tương ứng
Ví dụ :
Mã:
select username from admin
UNION
select [password] from admin
Câu lệnh trên sẽ show cho ta thấy các username và password trong table admin
Khi tạo table bạn để ý thấy username ta gán thuộc tính là nvarchar , vậy nếu khi truy vấn bằng UNION , dòng thứ 2 bạn thay [password] thành số bất kì (ví dụ 1) thì sẽ báo lỗi sau :
Ghi chú:Syntax error converting the nvarchar value 'admin' to a column of data type int.
Hô hô error báo sai cú pháp ,ko thể chuyển từ kiểu dữ liệu nvarchar (chuỗi) sang int (số) được vì dòng thứ 2 ta thay thế giá trị là kiểu int > ko cùng loại dữ liệu ->error và show ra cái table admin Còn khi áp dụng trên web thì đây
là dấu hiệu cho thấy table admin là có tồn tại
Đây chỉ là một số ví dụ để các bạn có thể hiểu về SQL injection ,mong giúp được gì đó cho các bạn !
Trang 16Mà còn cách fix thì sao nhỉ , trong SQL có một thứ gọi là trigger
Hàm này có tính năng tương tự như hàm bắt sự kiện trong JavaScript , ta sẽ viết 1 hàm để bắt những lỗi trên hoặc có thể viết = chính ngôn ngữ lập trình web
Số lần cám ơn: 20Được cám ơn 84 lần/51 bài viết
Lập trình SQL [Nâng cao]
Câu lệnh điều kiện AND & OR
AND và OR dùng nối 2 hoặc nhiều điều kiện trong một mệnh đề WHERE
Toán tử AND hiển thị số hàng nếu tất cả điều kiện trong danh sách đều đúng (true)
Toán tử OR hiển thị số hàng nếu một vài điều kiện trong danh sách đúng (true)
Sử dụng AND để hiển thị những giá trị trong table person với FirstName ="Tove" ,và LastName ="Svendson"
Mã:
SELECT * FROM Persons
Trang 17WHERE FirstName='Tove'
AND LastName='Svendson'
Tương tự với toán tử OR ta sẽ dùng hiển thị FirstName và LastName như trên, nhưng đây là câu điều kiện hoặc lên
sẽ show ra FirstName="Tove" hoặc LastName ="Svendson" mà trong table Persons có 2 người FirstName là 'Svendson' nên ta sẽ nhận được 2 kết quả
Hoặc ta có thể kết hợp cả 2 toán tử AND và OR để ra được kết quả trên (sử dụng biểu thức sẽ phức tạp hơn)
Toán tử IN có thể được sử dụng nếu bạn biết chính xác giá trị mà bạn muốn trả về trong ít nhất một cột
Soạn Persons table (hoặc cái gì đó tương tự) như sau :
Ví dụ:
Câu lệnh sau Select và hiển thị table Persons với LastName = "Hansen" hoặc "Pettersen" :
Mã:
SELECT * FROM Persons
WHERE LastName IN ('Hansen','Pettersen')
Trang 18Toán tử BETWEEN :
Toán tử BETWEEN AND dùng để lọc ra một khoảng trong dữ liệu giữa 2 giá trị Giá trị đó có thể là số
(numbers), chữ (text) hoặc ngày tháng (dates)
SELECT * FROM Persons WHERE LastName
BETWEEN 'Hansen' AND 'Pettersen'
Ví dụ 2 :
Trong ví dụ này ta sẽ hiện thị ra kết quả không phải trong khoảng 'Hansen' và 'Pettersen'
Chỉ cần thêm NOT vào trước BETWEEN :
Mã:
SELECT * FROM Persons WHERE LastName
NOT BETWEEN 'Hansen' AND 'Pettersen'
Trang 19Kết quả sẽ hiển thị những giá trị từ Pettersen trở xuống
Số lần cám ơn: 20Được cám ơn 84 lần/51 bài viết
Lập trình SQL [Nâng cao]
SQL Alias :
Với SQL , Aliases có thể sử dụng để gán cho một biệt hiệu cho tên cột và tên table
Column Name Alias :
Mã:
SELECT column AS column_alias FROM table
Table Name Alias :
Mã:
Trang 20SELECT column FROM table AS table_alias
SELECT LastName, FirstName
FROM Persons AS Employees
SQL UNION and UNION ALL
Câu lệnh UNION được sử dụng để select (lựa chọn) những thông tin liên quan đến nhau của hai tables, số lượng những câu lệnh JOIN Tuy nhiên nếu sử dụng câu lện UNION thì tất cả những sự lựa chọn tại các cột cần phải giống nhau về mặt dữ liệu
Chú ý : Trong UNION những giá trị giống nhau sẽ là duy nhất (Coi như có câu lệnh DISTINCT )
Mã:
SQL Statement 1
UNION
Trang 21SELECT E_Name FROM Employees_USA
Bạn chú ý nhé , 2 câu select thì dữ liệu phải tương ứng nhau !
Câu lệnh UNION ALL :
UNION ALL cú pháp tương tự UNION nhưng có điều nó sẽ list ra toàn bộ giá trị của cả 2 bảng
Trang 22UNION ALL
SELECT E_Name FROM Employees_USA
SQL Create Database, Table, and Index
Để giải thích cho ví dụ , bạn cần tạo 1 tables có tên "Person" ,với 4 cột Các cột có tên lần lượt là : "LastName",
"FirstName", "Address", and "Age" và với kiểu dữ liệu nvarchar
Mã:
CREATE TABLE Person
Trang 23Còn đây là các thuộc tính cơ bản của nó :
Dữ liệu kiểu số nguyên :
Trang 24Kiểu dữ liệu toán học :
: Cho phép độ dài nhiều hơn kiểu char
Kiểu dữ liệu ngày tháng :
Trang 25Ultimate Weapon
Bài viết: 2,590Gia nhập: Dec 2007 Điểm tín nhiệm: 0
Số lần cám ơn: 20Được cám ơn 84 lần/51 bài viết
Lập trình SQL [Nâng cao]
Create Index :
Việc tạo index để chỉ mục đến table với mục đích xác định các field một cách nhanh chóng và hiệu quả
Ta có thể thực hiện điều đó = việc tạo index trên những cột trong table , và tất cả index được định sẵn bằng tên Người sử dụng ko thể nhìn được những indexes đó , họ chỉ có thể sử dụng những câu truy vấn một cách chính xác
và nhanh chóng như Google vậy
Lưu ý : Update table có chứa indexes cần rất nhiều thời gian nhưng bởi vì index cần update liên tục Vậy cách tốt nhất là ta chỉ nên lập index tại đến những cột dữ liệu nào mà người dùng hay tìm kiếm nhất
Trường "column_name" chỉ rõ cột mà bạn muốn lập chỉ mục
Tạo 1 Index đơn giản :
Trang 26Khi tạo 1 index đơn giản trên 1 table , ko có ràng buộc UNIQUE thì sẽ tồn tại những giá trị giống nhau.
CREATE INDEX PersonIndex
ON Person (LastName DESC)
Còn bạn muốn lập index cho nhiều hơn 1 cột thì chỉ việc thêm cột vào :
Mã:
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
SQL Drop Index, Table and Database
Bạn có thể xóa những index trong table với biểu thức DROP
Trang 27DROP INDEX table_name.index_name
Delete tables (khi đócấu trúc ,thuộc tính ,và chỉ mục (indexes) cũng bị xóa bỏ)
Mã:
DROP TABLE table_name
Xóa database : (khi hack được hạn chế xài cái này nhé )
Mã:
DROP DATABASE database_name
Còn khi bạn chỉ muốn xóa dữ liệu trong table và giữ nguyên table thì có câu lệnh TRUNCATE TABLE để thực thi điều này :
Data Integrity and Advanced Query Technique
Nói đến Data Integrity là ta nói đến tính toàn vẹn của một database hay nói một cách khác là data chứa trong
database phải chính xác và đáng tin cậy Nếu data chứa trong database không chính xác ta nói database mất tính toàn vẹn (lost data integrity) Trong bài này chúng ta sẽ bàn qua các phương pháp để giữ cho database được toàn vẹn
Các Phương Pháp Ðảm Bảo Data Integrity
SQL Server dùng một số cách để đảm bảo Data Integrity Một số cách như Triggers hay Index sẽ được bàn đến trong các bài sau tuy nhiên trong phạm vi bài này chúng ta cũng nói sơ qua các cách trên
• Data Type : Data type cũng có thể đảm bảo tính toàn vẹn của data ví dụ bạn khai báo data type của một cột
là Integer thì bạn không thể đưa giá trị thuộc dạng String vào được
• Not Null Definitions : Null là một loại giá trị đặc biệt, nó không tương đương với zero, blank hay empty
string " " mà có nghĩa là không biết (unknown) hay chưa được định nghĩa (undefined) Khi thiết kế database
ta nên luôn cẩn thận trong việc cho phép một cột được Null hay Not Null vì việc chứa Null data có thể làm cho một số ứng dụng vốn không xửa lý null data kỹ lưỡng bị "té"
• Default Definitions : Nếu một cột được cho một giá trị default thì khi bạn không đưa vào một giá trị cụ thể
nào thì SQL Server sẽ dùng giá trị mặc định này Bạn phải dùng Default đối với Not Null definition
• Identity Properties : Data thuộc dạng ID sẽ đảm bảo tính duy nhất của data trong table.
• Constraints : Ðây sẽ là phần mà ta đào sâu trong bài này Constraint tạm dịch là những ràng buộc mà ta
dùng để đảm bảo tính toàn vẹn của data Constraints là những quy luật mà ta áp đặt lên một cột để đảm bảo tính chính xác của dữ liệu được nhập vào