1. Trang chủ
  2. » Công Nghệ Thông Tin

Lập trình SQL nâng cao pdf

31 978 9

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 31
Dung lượng 633 KB

Nội dung

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 1

Lậ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 2

SQL 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 3

Cú 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 4

MIN(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 5

UCASE(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 6

Số 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 7

SELECT Company,SUM(Amount) FROM Sales

HAVING SUM(column) condition value

Ta thực hiện lệnh như sau :

Trang 8

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 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 10

SQL 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 11

WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)

Query view trên :

Mã:

SELECT * FROM [Products Above Average Price]

Trang 12

Ví 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 13

Số 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 14

values (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 15

Như đã 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 16

Mà 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 17

WHERE 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 18

Toá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 19

Kế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 20

SELECT 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 21

SELECT 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 22

UNION 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 23

Còn đây là các thuộc tính cơ bản của nó :

Dữ liệu kiểu số nguyên :

Trang 24

Kiể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 25

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]

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 26

Khi 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 27

DROP 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

Ngày đăng: 07/07/2014, 07:20

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w