|
|
|
|
|
|
Bạn hãy click vào tên Diễn đàn con (phía trên) nếu muốn gửi Chủ đề mới
hoặc cuộn xuống cuối trang để trả lời cho Chủ đề này.
|
|
| Tác
giả |
Nội dung |
dem_arap Normal_Member  Ngày gia nhập: 19/02/2005 - 09:45:43 Số bài gửi: 81
Offline |
Tìm hiểu về các truy vấn SQL với Ms Access Ngày gửi : 01/10/2005 lúc 09:02:04 - Lượt xem: 1302
|
| Quay về đầu |
|
|
 |
huudung Normal Member  Ngày gia nhập: 06/06/2004 - 02:24:02 Số bài gửi: 1936
Offline |
truy vấn SELECT Ngày gửi : 01/10/2005 lúc 10:36:29 cú pháp
SELECT [predicate] <*|danh sách trường>
FROM tableexpression [, ...] [IN externaldatabase]
[WHERE <điều kiện lọc bản ghi>]
[GROUP BY ]
[HAVING <điều kiện lọc nhóm> ]
[ORDER BY [ASC | DESC ]]
trong đó
Predicate: có thể nhận 1 trong số các giá trị sau
ALL:
giá trị này là mặc định, tất cả các bản ghi (thỏa mãn câu lệnh SQL) sẽ được lấy
vd: SELECT ALL * FROM tblTacgia
DISTINCT:
trong kết quả trả ra sẽ không có các bản ghi trùng lặp trên các trường được lấy ra (chỉ có bản ghi đầu tiên có giá trị được lấy )
vd: lấy ra các bản ghi trừ các bản ghi trùng nhau trên trường sHoten, tNgaysinh
SELECT Distinct sHoten, tNgaysinh
FROM tblTacgia
DISTINCTROW:
trong kết quả trả ra sẽ không có các bản ghi trùng lặp cả bản ghi (toàn bộ các trường trong bảng) và chỉ có bản ghi đầu tiên có giá trị được lấy
TOP N [Percent]
chỉ lấy ra N (hoặc N %) bản ghi đầu tiên thoả mãn câu lệnh SQL
<*|danh sách trường>
Phần dùng để chỉ định những trường sẽ được lấy ra,
vd:
select sHoten
From tblTacgia
truy vấn này sẽ lấy ra tất cả các bản ghi từ tblTacgia với 1 trường sHoten trong kết quả.
Những trường được chỉ định này có thể là các trường đã có sẵn trong các bảng dữ liệu hoặc là biểu thức tính toán để trả ra dữ liệu (gọi là các trường tính toán).
vd:
Select sHoten, Year(date())-year([tNgaysinh])
From tblTacgia
Truy vấn này sẽ trả ra các bản ghi với 2 trường dữ liệu trong đó trường sHoten là trường của bảng tblTacgia còn trường thứ 2 được tính toán theo biểu thức Year(date())-year([tNgaysinh]). Lưu ý rằng Microsoft Jet (Engine - bộ máy dữ liệu của Ms Access) qui định phải đặt các tên trường (nếu có chứa dấu cách, kí tự đặc biệt hoặc sử dụng trường làm đối số cho các hàm) trong dấu ngoặc vuông [] để phân biệt với xâu dữ liệu.
Trong trường hợp ta lấy dữ liệu từ nhiều bảng khác nhau (chỉ định bởi mệnh đề FROM), nếu các bảng đó có chứa các trường trùng tên thì trong truy vấn ta phải chỉ định rõ ta lấy trường đó từ bảng nào bằng cú pháp ..
Các trường trong ds trường được phân cách nhau bởi dấu phẩy (,) - thứ tự của các trường trong mệnh đề Select sẽ qui định thứ tự các cột trong kết quả trả về
Ta có thể chỉ định việc lấy tất cả các trường bằng cách chỉ định dấu *
vd: Select * From tblTacgia
Jet sẽ hiểu rằng "truy vấn này muốn lấy ra tất cả các trường của bảng tblTacgia".
Tuy nhiên, việc lấy ra tất cả các trường của bảng là một việc làm giảmg hiệu suất của truy vấn. Nhất là khi ta chỉ cần đến một số hữu hạn cụ thể các trường - tốt nhất ta nên chỉ định tường minh tên trường và thứ tự của các trường cần lấy ra.
FROM tableexpression [, ...]
Còn nữa ... |
| Quay về đầu |
|
|
 |
huudung Normal Member  Ngày gia nhập: 06/06/2004 - 02:24:02 Số bài gửi: 1936
Offline |
FROM tableexpression [, ...] Ngày gửi : 03/10/2005 lúc 08:50:49 FROM tableexpression [, ...]
Ta sử dụng mệnh đề From để chỉ ra cho Jet biết truy vấn sẽ lấy bản ghi từ đâu.
TableExpression có thể là danh sách các bảng dữ liệu, các truy vấn chứa sẵn(Access:Query / SQL Server: Storeprocedure/ View).
Thông thường ta lấy các bản ghi từ 1 bảng/query
Select tblSach.sTieude
From tblSach
xong ta có thể lấy dữ liệu từ nhiều bảng/query bằng cách chỉ định tên các table/query đó sau mệnh đề From
Select tblSach.sTieude, tblTacgia.sHoten
From tblTacgia, tblSach ...... (truy vấn này chưa hoàn thiện)
Cần lưu ý là khi ta lấy dữ liệu từ nhiều bảng/query, ta phải chỉ định biểu thức để liên kết (so khớp) các bản ghi ở các bảng/query đó với nhau bằng cách sử dụng mệnh đề JOIN hoặc điều kiện WHERE.
Trong truy vấn (không có biểu thức liên kết dữ liệu) trên, nếu bảng tblTacgia có 2 bản ghi còn bảng tblSach có 9 bản ghi --> kết quả ta sẽ lấy ra 9*2=18 bản ghi --> đây là điều không mong muốn. (hãy sửa lại truy vấn trên thành
Select tblSach.sTieude, tblTacgia.sHoten
From tblTacgia INNER JOIN tblSach
ON tblTacgia.iTacgiaID=tblSach.iTacgiaID
Hoặc
Select tblSach.sTieude, tblTacgia.sHoten
From tblTacgia , tblSach
WHERE tblTacgia.iTacgiaID=tblSach.iTacgiaID
và theo dõi các bài viết sau để tìm hiểu về JOIN và Where) |
| Quay về đầu |
|
|
 |
huudung Normal Member  Ngày gia nhập: 06/06/2004 - 02:24:02 Số bài gửi: 1936
Offline |
[IN externaldatabase] Ngày gửi : 03/10/2005 lúc 08:55:17 [IN externaldatabase]
Mệnh đề IN trong Ms Access Jet chỉ ra cho Jet Engine biết rằng phải lấy dữ liệu từ 1 Database bên ngoài chứ không phải từ database này.
vd:
Mở csdl Thuvien.mdb và thực hiện truy vấn
Select mathietbi, tenthietbi
From THIETBI
IN 'c:\data\qlThietbi.mdb'
kết quả sẽ cho ta xem các bản ghi từ bảng THIETBI trong csdl qlThietbi.mdb |
| Quay về đầu |
|
|
 |
huudung Normal Member  Ngày gia nhập: 06/06/2004 - 02:24:02 Số bài gửi: 1936
Offline |
[WHERE <điều kiện lọc bản ghi>] Ngày gửi : 03/10/2005 lúc 09:31:48 [WHERE <điều kiện lọc bản ghi>]
Ta sử dụng mệnh đề này để giới hạn bản ghi được trả về theo một hay nhiều tiêu chí lọc mà ta cung cấp. Mỗi tiêu chí lọc (điều kiện) là một biểu thức điều kiện (có giá trị True/False) như A>0 hay T='Hà Nội'.
ví dụ: Lấy ra các nam tác giả
Select sHoten, tNgaysinh
From tblTacgia
Where bGioitinh=Yes
Ta có thể kết hợp nhiều tiêu chí lọc bằng AND hay OR
ví dụ: lấy ra các nữ tác giả sinh năm 1978
Select sHoten, tNgaysinh
From tblTacgia
Where bGioitinh=No And Year(tNgaysinh)=1978
Các toán tử có thể sử dụng trong tiêu chí lọc của mệnh đề Where có thể là >, >=, <, <=, =, <>, BETWEEN, LIKE, IN |
| Quay về đầu |
|
|
 |
huudung Normal Member  Ngày gia nhập: 06/06/2004 - 02:24:02 Số bài gửi: 1936
Offline |
chú ý với tên trường trong truy vấn với Access Ngày gửi : 04/10/2005 lúc 12:33:00 Vì Access cho phép ta đặt tên trường với dấu cách (space) nên với Query, Access yêu cầu ta sử dụng dấu ngoặc vuông [] đối với tên trường dữ liệu. Điều này cũng tương tự như khi bạn viết biểu thức ở thuộc tính Default Value, Validation Rules
vd: year(Date()) - Year([tNgaysinh])>=15
Một điểm đáng chú ý ở đây là:
Với những gì được đặt trong dấu [], Access sẽ mặc định hiểu đó là 1 trường (field) và đi tìm trường đó trong nguồn dữ liệu được chỉ định bới mệnh đề From.
Nếu bạn đưa vào trong [] một giá trị không phải là tên 1 trường nào trong các nguồn dữ liệu
ví dụ: select [sHoten], [abc] From tblTacgia
Access sẽ hiểu đó là 1 tham số, khi thực hiện truy vấn, Access sẽ hiển thị thông báo yêu cầu bạn nhập dữ liệu cho [abc] vì [abc] không phải là 1 trường của tblTacgia.
Ta còn có thể áp dụng điều này cho các Query để có thể thực hiện theo các giá trị so sánh không biết trước
vd:
Select sHoten, tNgaysinh
From tblTacgia
Where tblTacgia.iNgaysinh Between [từ ngày] And [đến ngày] |
| Quay về đầu |
|
|
 |
anonymous Normal_Member  Ngày gia nhập: 01/11/2004 - 01:20:49 Số bài gửi: 108
Offline |
thầy:...và theo dõi các bài viết sau để tìm hiểu về JOIN và Where) Ngày gửi : 01/01/2006 lúc 10:10:27 :D.Thầy post lên đi chứ ạ.Em đang muốn coi lém :D |
| Quay về đầu |
|
|
 |
|
|
|
|
|
|