Cách viết truy vấn SQL Microsoft Access từ Scratch

Cách viết truy vấn SQL Microsoft Access từ Scratch

Microsoft Access được cho là công cụ mạnh mẽ nhất trong toàn bộ bộ Microsoft Office, nhưng nó lại gây bí ẩn (và đôi khi gây sợ hãi) cho những người dùng thành thạo Office. Với đường cong học tập dốc hơn Word hoặc Excel, làm thế nào mà mọi người lại phải hứng thú với việc sử dụng công cụ này? Tuần này, Bruce Epper sẽ xem xét một số vấn đề được thúc đẩy bởi câu hỏi này từ một trong những độc giả của chúng tôi.





Một độc giả hỏi:

Tôi đang gặp sự cố khi viết truy vấn trong Microsoft Access. Tôi có một cơ sở dữ liệu với hai bảng sản phẩm chứa một cột chung với mã sản phẩm dạng số và tên sản phẩm được liên kết. Tôi muốn tìm hiểu những sản phẩm nào từ Bảng A có thể được tìm thấy trong Bảng B. Tôi muốn thêm một cột có tên Kết quả chứa tên sản phẩm từ Bảng A nếu nó tồn tại và tên sản phẩm từ Bảng B khi nó không tồn tại trong Bảng A. Bạn có lời khuyên nào không?





Câu trả lời của Bruce:

Microsoft Access là Hệ thống quản lý cơ sở dữ liệu (DBMS) được thiết kế để sử dụng trên cả máy Windows và Mac. Nó sử dụng công cụ cơ sở dữ liệu Jet của Microsoft để xử lý và lưu trữ dữ liệu. Nó cũng cung cấp giao diện đồ họa cho người dùng gần như loại bỏ nhu cầu hiểu Ngôn ngữ truy vấn có cấu trúc (SQL).





SQL là ngôn ngữ lệnh được sử dụng để thêm, xóa, cập nhật và trả về thông tin được lưu trữ trong cơ sở dữ liệu cũng như sửa đổi các thành phần cơ sở dữ liệu cốt lõi như thêm, xóa hoặc sửa đổi bảng hoặc chỉ số.

Điểm khởi đầu

Nếu bạn chưa quen với Access hoặc một RDBMS khác, tôi khuyên bạn nên bắt đầu với các tài nguyên này trước khi tiếp tục:



  • Vậy Cơ sở dữ liệu là gì? trong đó Ryan Dube sử dụng Excel để hiển thị những điều cơ bản về cơ sở dữ liệu quan hệ.
  • Hướng dẫn nhanh để bắt đầu với Microsoft Access 2007 là tổng quan cấp cao về Access và các thành phần cấu thành cơ sở dữ liệu Access.
  • Hướng dẫn Nhanh về Bảng trong Microsoft Access 2007 xem xét cách tạo cơ sở dữ liệu và bảng đầu tiên của bạn để lưu trữ dữ liệu có cấu trúc của bạn.
  • Hướng dẫn nhanh về các truy vấn trong Microsoft Access 2007 xem xét các phương tiện để trả về các phần cụ thể của dữ liệu được lưu trữ trong các bảng cơ sở dữ liệu.

Có hiểu biết cơ bản về các khái niệm được cung cấp trong các bài viết này sẽ làm cho phần sau dễ hiểu hơn một chút.

Quan hệ cơ sở dữ liệu và chuẩn hóa

Hãy tưởng tượng bạn đang điều hành một công ty bán 50 loại vật dụng khác nhau trên khắp thế giới. Bạn có cơ sở khách hàng là 1.250 và trong một tháng trung bình bán được 10.000 vật dụng cho những khách hàng này. Bạn hiện đang sử dụng một bảng tính duy nhất để theo dõi tất cả các lần bán hàng này - hiệu quả là một bảng cơ sở dữ liệu duy nhất. Và mỗi năm thêm hàng nghìn hàng vào bảng tính của bạn.





Những hình ảnh trên là một phần của bảng tính theo dõi đơn hàng mà bạn đang sử dụng. Bây giờ, giả sử cả hai khách hàng này mua vật dụng từ bạn vài lần trong năm để bạn có nhiều hàng hơn cho cả hai.





Nếu Joan Smith kết hôn với Ted Baines và lấy họ của anh ta, mọi hàng có chứa tên của cô ấy bây giờ cần được thay đổi. Vấn đề sẽ phức tạp hơn nếu bạn tình cờ có hai khách hàng khác nhau với tên 'Joan Smith'. Việc giữ cho dữ liệu bán hàng của bạn nhất quán trở nên khó khăn hơn nhiều do một sự kiện khá phổ biến.

Bằng cách sử dụng cơ sở dữ liệu và chuẩn hóa dữ liệu, chúng tôi có thể tách các mục thành nhiều bảng như khoảng không quảng cáo, khách hàng và đơn đặt hàng.

Chỉ cần xem xét phần khách hàng trong ví dụ của chúng tôi, chúng tôi sẽ loại bỏ các cột cho Tên khách hàng và Địa chỉ khách hàng và đặt chúng vào một bảng mới. Trong hình trên, tôi cũng đã chia ra những thứ tốt hơn để truy cập chi tiết hơn vào dữ liệu. Bảng mới cũng chứa một cột cho Khóa chính (ClientID) - một số sẽ được sử dụng để truy cập mỗi hàng trong bảng này.

Trong bảng ban đầu, nơi chúng tôi đã xóa dữ liệu này, chúng tôi sẽ thêm một cột cho Khoá ngoại (ClientID), đây là cột liên kết đến hàng thích hợp chứa thông tin cho ứng dụng khách cụ thể này.

Giờ đây, khi Joan Smith đổi tên thành Joan Baines, việc thay đổi chỉ cần thực hiện một lần trong bảng Khách hàng. Mọi tham chiếu khác từ các bảng được kết hợp sẽ lấy tên khách hàng thích hợp và báo cáo xem xét những gì Joan đã mua trong 5 năm qua sẽ nhận được tất cả các đơn đặt hàng dưới tên thời con gái và tên đã kết hôn của cô ấy mà không cần phải thay đổi cách tạo báo cáo .

Như một lợi ích bổ sung, điều này cũng làm giảm tổng lượng dung lượng lưu trữ được tiêu thụ.

Tham gia các loại

SQL định nghĩa năm kiểu nối khác nhau: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER và CROSS. Từ khóa OUTER là tùy chọn trong câu lệnh SQL.

Microsoft Access cho phép sử dụng INNER (mặc định), LEFT OUTER, RIGHT OUTER và CROSS. FULL OUTER không được hỗ trợ như vậy, nhưng bằng cách sử dụng LEFT OUTER, UNION ALL và RIGHT OUTER, nó có thể bị làm giả với chi phí nhiều chu kỳ CPU và hoạt động I / O hơn.

Đầu ra của một phép nối CROSS chứa mọi hàng của bảng bên trái được ghép nối với mọi hàng của bảng bên phải. Lần duy nhất tôi từng thấy một tham gia CROSS được sử dụng là trong quá trình thử nghiệm tải các máy chủ cơ sở dữ liệu.

Chúng ta hãy xem cách hoạt động của các phép nối cơ bản, sau đó chúng tôi sẽ sửa đổi chúng cho phù hợp với nhu cầu của mình.

Hãy bắt đầu bằng cách tạo hai bảng, ProdA và ProdB, với các thuộc tính thiết kế sau.

Số tự động là một số nguyên dài tăng dần tự động được gán cho các mục nhập khi chúng được thêm vào bảng. Tùy chọn Văn bản không được sửa đổi, vì vậy nó sẽ chấp nhận một chuỗi văn bản dài tối đa 255 ký tự.

Bây giờ, điền chúng với một số dữ liệu.

Để cho thấy sự khác biệt về cách hoạt động của 3 loại kết hợp, tôi đã xóa các mục 1, 5 và 8 khỏi ProdA.

Kế tiếp, tạo một truy vấn mới bằng cách đi đến Tạo> Thiết kế truy vấn . Chọn cả hai bảng từ hộp thoại Hiển thị Bảng và bấm Thêm , sau đó Gần .

Nhấp vào ProductID trong bảng ProdA, kéo nó đến ProductID trong bảng ProdB và thả nút chuột để tạo mối quan hệ giữa các bảng.

Nhấp chuột phải vào dòng giữa các bảng biểu thị mối quan hệ giữa các mục và chọn Tham gia Thuộc tính .

Theo mặc định, loại tham gia 1 (INNER) được chọn. Tùy chọn 2 là tham gia LEFT OUTER và 3 là tham gia RIGHT OUTER.

Trước tiên, chúng tôi sẽ xem xét tham gia INNER, vì vậy hãy nhấp vào OK để loại bỏ hộp thoại.

Trong trình thiết kế truy vấn, hãy chọn các trường chúng tôi muốn xem từ danh sách thả xuống.

Khi chúng tôi chạy truy vấn (dấu chấm than màu đỏ trong ruy-băng), nó sẽ hiển thị trường ProductName từ cả hai bảng với giá trị từ bảng ProdA trong cột đầu tiên và ProdB trong cột thứ hai.

Lưu ý rằng kết quả chỉ hiển thị các giá trị mà ProductID bằng nhau trong cả hai bảng. Mặc dù có một mục nhập cho ProductID = 1 trong bảng ProdB, nó không hiển thị trong kết quả vì ProductID = 1 không tồn tại trong bảng ProdA. Điều tương tự cũng áp dụng cho ProductID = 11. Nó tồn tại trong bảng ProdA nhưng không tồn tại trong bảng ProdB.

Bằng cách sử dụng nút Chế độ xem trên ruy-băng và chuyển sang Chế độ xem SQL, bạn có thể thấy truy vấn SQL do trình thiết kế tạo ra được sử dụng để lấy các kết quả này.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA INNER JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Quay lại Chế độ xem thiết kế, thay đổi kiểu tham gia thành 2 (ĐẦU RA TRÁI). Chạy truy vấn để xem kết quả.

Như bạn có thể thấy, mọi mục nhập trong bảng ProdA được thể hiện trong kết quả trong khi chỉ những mục nhập trong ProdB có mục nhập ProductID phù hợp trong bảng ProdB mới hiển thị trong kết quả.

Khoảng trống trong cột ProdB.ProductName là một giá trị đặc biệt (NULL) vì không có giá trị phù hợp trong bảng ProdB. Điều này sẽ chứng minh quan trọng sau này.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA LEFT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Hãy thử điều tương tự với kiểu tham gia thứ ba (RIGHT OUTER).

Kết quả hiển thị mọi thứ từ bảng ProdB trong khi nó đang hiển thị các giá trị trống (được gọi là NULL) trong đó bảng ProdA không có giá trị phù hợp. Cho đến nay, điều này mang lại cho chúng tôi gần nhất với kết quả mong muốn trong câu hỏi của độc giả của chúng tôi.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Sử dụng các hàm trong một truy vấn

Kết quả của một hàm cũng có thể được trả về như một phần của truy vấn. Chúng tôi muốn một cột mới có tên là 'Kết quả' xuất hiện trong tập kết quả của chúng tôi. Giá trị của nó sẽ là nội dung của cột ProductName của bảng ProdA nếu ProdA có giá trị (nó không phải là NULL), nếu không thì nó phải được lấy từ bảng ProdB.

Hàm IF (IIF) ngay lập tức có thể được sử dụng để tạo ra kết quả này. Hàm nhận ba tham số. Đầu tiên là điều kiện phải đánh giá thành giá trị Đúng hoặc Sai. Tham số thứ hai là giá trị được trả về nếu điều kiện là Đúng và tham số thứ ba là giá trị được trả về nếu điều kiện là Sai.

Cấu trúc hàm đầy đủ cho tình huống của chúng ta trông như thế này:

IIF(ProdA.ProductID Is Null, ProdB.ProductName,ProdA.ProductName)

Lưu ý rằng tham số điều kiện không kiểm tra sự bình đẳng. Giá trị Null trong cơ sở dữ liệu không có giá trị nào có thể được so sánh với bất kỳ giá trị nào khác, kể cả giá trị Null khác. Nói cách khác, Null không bằng Null. Bao giờ. Để vượt qua điều này, thay vào đó chúng tôi kiểm tra giá trị bằng cách sử dụng từ khóa 'Là'.

Chúng tôi cũng có thể sử dụng 'Is Not Null' và thay đổi thứ tự của các tham số True và False để có được kết quả tương tự.

Khi đặt điều này vào Trình thiết kế truy vấn, bạn phải nhập toàn bộ hàm vào mục nhập Field:. Để có được nó để tạo cột 'Kết quả', bạn cần sử dụng bí danh. Để thực hiện việc này, hãy mở đầu hàm bằng 'Kết quả:' như trong ảnh chụp màn hình sau.

Mã SQL tương đương để thực hiện việc này sẽ là:

SELECT ProdA.ProductName, ProdB.ProductName, IIF(ProdA.ProductID Is Null,ProdB.ProductName,ProdA.ProductName) AS Results FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Bây giờ, khi chúng ta chạy truy vấn này, nó sẽ tạo ra những kết quả này.

tên tệp quá dài để xóa

Ở đây chúng ta thấy đối với mỗi mục nhập trong đó bảng ProdA có một giá trị, giá trị đó được phản ánh trong cột Kết quả. Nếu không có mục nhập trong bảng ProdA, mục nhập từ ProdB sẽ xuất hiện trong Kết quả, đây chính xác là những gì độc giả của chúng tôi yêu cầu.

Để có thêm tài nguyên để học Microsoft Access, hãy xem Cách học Microsoft Access: 5 Tài nguyên Trực tuyến Miễn phí của Joel Lee.

Đăng lại Đăng lại tiếng riu ríu E-mail Nâng cấp lên Windows 11 có đáng không?

Windows đã được thiết kế lại. Nhưng điều đó có đủ thuyết phục bạn chuyển từ Windows 10 sang Windows 11?

Đọc tiếp
Chủ đề liên quan
  • Năng suất
  • Hỏi các chuyên gia
Giới thiệu về tác giả Bruce Epper(13 bài báo đã xuất bản)

Bruce đã chơi điện tử từ những năm 70, máy tính từ đầu những năm 80 và trả lời chính xác các câu hỏi về công nghệ mà anh đã không sử dụng cũng như không nhìn thấy trong suốt thời gian qua. Anh ấy cũng tự làm phiền bản thân khi cố gắng chơi guitar.

Xem thêm từ Bruce Epper

Theo dõi bản tin của chúng tôi

Tham gia bản tin của chúng tôi để biết các mẹo công nghệ, đánh giá, sách điện tử miễn phí và các ưu đãi độc quyền!

Bấm vào đây để đăng ký