Khái niệm cơ bản về SQL

1. Trước khi bắt đầu

Ở lớp học trước, bạn đã tìm hiểu về cách kết hợp dữ liệu được nối mạng vào ứng dụng của mình và tìm hiểu về cách sử dụng coroutine để xử lý các thao tác đồng thời. Trong lộ trình này, bạn sẽ tìm hiểu một kỹ năng cơ bản khác về phát triển Android nhằm xây dựng ứng dụng có chất lượng: tính bền vững (persistence). Ngay cả khi chưa từng nghe về thuật ngữ này trước đây, nhưng có thể bạn đã gặp các tình huống liên quan đến tính bền vững khi dùng ứng dụng. Từ việc viết danh sách mua sắm cho đến cuộn qua các hình ảnh từ vài năm trước trong ứng dụng ảnh cũng như việc tạm dừng và tiếp tục một trò chơi, các ứng dụng đều sử dụng tính bền vững để mang đến cho người dùng một trải nghiệm liền mạch. Dù người dùng có thể dễ dàng sử dụng những tính năng này, nhưng lưu trữ dữ liệu một cách bền vững là một kỹ năng thiết yếu để nhà phát triển xây dựng ứng dụng chất lượng cao.

Ở phần sau trong bài này, bạn sẽ tìm hiểu thêm về tính bền vững trên Android và về thư viện Room. Thư viện này cho phép ứng dụng đọc và ghi từ cơ sở dữ liệu. Tuy nhiên, trước khi tìm hiểu kỹ hơn về tính bền vững trên Android, bạn phải làm quen với các khái niệm cơ bản của cơ sở dữ liệu quan hệ cũng như cách đọc và thao tác với dữ liệu bằng SQL (gọi đầy đủ là Structured Query Language – Ngôn ngữ truy vấn có cấu trúc). Nếu bạn đã quen thuộc với các khái niệm này, hãy xem đây là một bài ôn tập để đảm bảo bạn nhớ chúng khi tìm hiểu về Room. Nếu không thì hoàn toàn không có vấn đề gì! Chúng tôi cho rằng vào lúc này bạn không biết gì về cơ sở dữ liệu. Khi kết thúc lớp học lập trình này, bạn sẽ có mọi kiến thức cơ bản cần thiết để bắt đầu tìm hiểu cách làm việc với cơ sở dữ liệu trong ứng dụng Android.

Điều kiện tiên quyết

  • Thao tác trên một dự án trong Android Studio.

Kiến thức bạn sẽ học được

  • Cấu trúc của cơ sở dữ liệu quan hệ: bảng, cột và hàng
  • Các câu lệnh SELECT bao gồm mệnh đề WHERE, ORDER BY, GROUP BYLIMIT
  • Cách chèn, cập nhật và xoá hàng bằng SQL

Bạn cần có

  • Máy tính đã cài đặt Android Studio.

2. Tổng quan về cơ sở dữ liệu quan hệ

Cơ sở dữ liệu quan hệ là gì?

Trong ngữ cảnh điện toán, cơ sở dữ liệu chỉ đơn giản là một tập hợp dữ liệu có cấu trúc mà lập trình viên có thể truy cập và ghi vào. Cơ sở dữ liệu lưu trữ mọi thông tin bạn có thể mô tả trong ứng dụng bằng Kotlin. Trên thiết bị di động, cơ sở dữ liệu thường được dùng để lưu dữ liệu từ một ứng dụng đang chạy để bạn có thể truy cập vào khi mở lại ứng dụng mà không cần truy xuất dữ liệu từ một nguồn khác (chẳng hạn như Internet). Đây được gọi là tính bền vững của dữ liệu.

Khi nói về tính bền vững của dữ liệu, bạn thường nghe thấy thuật ngữ "cơ sở dữ liệu quan hệ". Cơ sở dữ liệu quan hệ là một loại cơ sở dữ liệu phổ biến giúp sắp xếp dữ liệu thành bảng, cột và hàng. Khi viết mã Kotlin, bạn tạo các lớp (class) mô tả đối tượng (object). Bảng trong cơ sở dữ liệu quan hệ hoạt động theo cách tương tự. Ngoài việc mô tả dữ liệu, bảng cũng có thể tham chiếu đến các bảng khác để bạn có thể có mối quan hệ giữa chúng với nhau. Một bảng gồm "student" (học viên), "teacher" (giáo viên) và "course" (khoá học) là một ví dụ điển hình. Một khoá học có một giáo viên, nhưng một học viên có thể có nhiều khoá học. Cơ sở dữ liệu có thể mô tả mối quan hệ giữa các bảng này, do đó bạn thường nghe thấy thuật ngữ cơ sở dữ liệu quan hệ.

ef61dd2663e4da82.png

Mối quan hệ trong thế giới thực có thể được biểu diễn bằng mối quan hệ giữa các bảng.

Bảng, cột và hàng

Việc xác định bảng hoặc dữ liệu bạn đang mô tả chỉ là bước đầu tiên trong quá trình tạo cơ sở dữ liệu quan hệ. Bạn cũng cần suy nghĩ về việc thông tin nào nằm trong bảng nào. Thuộc tính cụ thể được mô tả trong cột. Cột bao gồm tên và kiểu dữ liệu. Bạn đã làm quen với thuộc tính khi làm việc với các lớp (class) trong Kotlin. Bạn có thể nghĩ về bảng SQL theo cùng cách. Bảng giống như một định nghĩa về lớp, mô tả kiểu của "thứ" bạn muốn biểu diễn. Cột là thuộc tính cụ thể của "thứ" được tạo với mỗi mục nhập trong bảng.

Thực vật

id

INTEGER

loài

TEXT (chuỗi)

tên

TEXT (chuỗi)

màu

TEXT (chuỗi)

Vườn

id

INTEGER

tên

TEXT (chuỗi)

chiều dài

INTEGER

chiều rộng

INTEGER

Các mục nhập riêng lẻ trong bảng được gọi là hàng. Đây chỉ là một thực thể của lớp trong Kotlin. Mỗi hàng có dữ liệu tương ứng với mỗi cột. Bảng cung cấp mẫu, nhưng hàng xác định dữ liệu thực tế được lưu trữ trong bảng.

id

loài

tên

màu

1

Camellia Sinensis

Cây chè

xanh lục

2

Echinacea Purpurea

Hoa cúc tím

tím

3

Ferula Foetida

A nguỳ

xanh lục

Khoá chính

Trong ví dụ trên, lưu ý rằng có một cột cho thuộc tính id. Do các loài thực vật trong thiên nhiên (hoặc bất kỳ thứ gì mà bạn mô tả trong cơ sở dữ liệu của mình) thường không có mã nhận dạng (id) được đánh số thuận tiện, nên điều quan trọng là các hàng trong bảng dữ liệu phải có một kiểu mã nhận dạng độc nhất. Mã này thường được gọi là khoá chính và là giá trị độc nhất của mỗi hàng trong bảng. Điều này rất hữu ích nếu bạn cần tham chiếu hàng trong một bảng dữ liệu từ một bảng khác. Ví dụ: một bảng khác có tên là "vườn" và bạn muốn liên kết khu vườn với tất cả các loài thực vật trong vườn. Bạn có thể sử dụng khoá chính trong bảng thực vật để tham chiếu đến một loài thực vật từ mục nhập trong bảng vườn hoặc bất kỳ bảng nào khác trong cơ sở dữ liệu.

Khoá chính giúp bạn có thể có các mối quan hệ trong cơ sở dữ liệu quan hệ. Dù bạn không sử dụng cơ sở dữ liệu có nhiều bảng trong khoá học này, nhưng việc có một mã nhận dạng duy nhất sẽ giúp truy vấn, cập nhật và xoá các mục hiện có trong bảng.

Kiểu dữ liệu

Cũng giống như việc xác định thuộc tính của các lớp Kotlin, cột trong cơ sở dữ liệu có thể thuộc một kiểu dữ liệu. Một cột có thể biểu diễn một ký tự, chuỗi, số (có hoặc không có số thập phân) hoặc dữ liệu nhị phân. Các dữ liệu khác như ngày và giờ có thể được biểu diễn bằng số hoặc chuỗi tuỳ thuộc vào trường hợp sử dụng. Khi sử dụng Room, chủ yếu bạn sẽ làm việc với các kiểu trong Kotlin, nhưng thực ra các kiểu dữ liệu này sẽ ánh xạ đến các kiểu SQL trong nền.

SQL

Khi truy cập vào cơ sở dữ liệu quan hệ, dù trực tiếp trên chính cơ sở dữ liệu đó hay qua thư viện như Room, bạn đều cần một thứ gọi là SQL.

SQL là gì? SQL là viết tắt của Structured Query Language (Ngôn ngữ truy vấn có cấu trúc), cho phép bạn đọc và thao tác dữ liệu trong cơ sở dữ liệu quan hệ. Đừng lo, bạn sẽ không phải học một ngôn ngữ lập trình hoàn toàn mới chỉ để triển khai tính bền vững trong ứng dụng của mình. Không giống một ngôn ngữ lập trình như Kotlin, SQL chỉ bao gồm một vài loại câu lệnh để đọc và viết từ cơ sở dữ liệu. Khi đã hiểu được định dạng cơ bản của các câu lệnh, nếu muốn đọc hoặc viết lên cơ sở dữ liệu, điều duy nhất bạn cần làm là điền các thông tin cần thiết trong câu lệnh.

Dưới đây là những câu lệnh SQL phổ biến nhất và những câu lệnh bạn sẽ dùng.

SELECT

Lấy thông tin cụ thể từ bảng dữ liệu và kết quả có thể được lọc và sắp xếp theo nhiều cách.

INSERT

Thêm một hàng mới vào bảng.

UPDATE

Cập nhật một hàng (hoặc nhiều hàng) hiện có trong bảng.

DELETE

Xoá một hàng (hoặc nhiều hàng) hiện có khỏi bảng.

Trước khi thao tác trong SQL, đầu tiên bạn cần một cơ sở dữ liệu. Trên màn hình tiếp theo, bạn sẽ thiết lập một dự án mẫu bao gồm cơ sở dữ liệu để thực hành truy vấn SQL.

3. Mã khởi đầu – Cơ sở dữ liệu về công viên

Mã khởi đầu mà bạn tải xuống hơi khác so với các lớp học lập trình trước đây. Thay vì xây dựng dựa trên một dự án hiện có, chúng tôi sẽ cung cấp một dự án Android Studio đơn giản giúp tạo cơ sở dữ liệu mà bạn có thể sử dụng để thực hành truy vấn SQL. Sau khi chạy ứng dụng một lần, bạn sẽ có thể truy cập cơ sở dữ liệu bằng cách sử dụng công cụ Android Studio được gọi là Trình kiểm tra cơ sở dữ liệu.

Để lấy mã cho lớp học lập trình này và mở mã đó trong Android Studio, hãy làm như sau.

Lấy mã

  1. Nhấp vào URL được cung cấp. Thao tác này sẽ mở trang GitHub của dự án trong một trình duyệt.
  2. Trên trang GitHub của dự án, hãy nhấp vào nút Code (Mã), một hộp thoại sẽ xuất hiện.

5b0a76c50478a73f.png

  1. Trong hộp thoại này, hãy nhấp vào nút Download ZIP (Tải tệp ZIP xuống) để lưu dự án vào máy tính. Chờ quá trình tải xuống hoàn tất.
  2. Xác định vị trí của tệp trên máy tính (thường nằm trong thư mục Downloads (Tệp đã tải xuống)).
  3. Nhấp đúp vào tệp ZIP để giải nén. Thao tác này sẽ tạo một thư mục mới chứa các tệp dự án.

Mở dự án trong Android Studio

  1. Khởi động Android Studio.
  2. Trong cửa sổ Welcome to Android Studio (Chào mừng bạn đến với Android Studio), hãy nhấp vào Open an existing Android Studio project (Mở một dự án hiện có trong Android Studio).

36cc44fcf0f89a1d.png

Lưu ý: Nếu Android Studio đã mở sẵn thì thay vào đó, hãy chọn tuỳ chọn sau đây trong trình đơn File > New > Import Project (Tệp > Mới > Nhập dự án).

21f3eec988dcfbe9.png

  1. Trong hộp thoại Import Project (Nhập dự án), hãy chuyển đến nơi chứa thư mục dự án đã giải nén (thường nằm trong thư mục Downloads (Tệp đã tải xuống)).
  2. Nhấp đúp vào thư mục dự án đó.
  3. Chờ Android Studio mở dự án.
  4. Nhấp vào nút Run (Chạy) 11c34fc5e516fb1c.png để xây dựng và chạy ứng dụng. Hãy đảm bảo ứng dụng được dựng như mong đợi.
  5. Duyệt qua các tệp dự án trong cửa sổ công cụ Project (Dự án) để xem cách ứng dụng được thiết lập.

Trước khi chuyển sang phần tiếp theo, hoàn tất các bước sau để đảm bảo bạn đã sẵn sàng với dự án khởi động.

  1. Chạy ứng dụng. Ứng dụng phải hiển thị một màn hình giống như màn hình này.

3c62c10fad7c0136.png

  1. Trong Android Studio, mở Trình kiểm tra cơ sở dữ liệu với View (Xem) > Tool Windows (Công cụ Windows) > Database Inspector (Trình kiểm tra cơ sở dữ liệu).
  2. Bạn sẽ thấy một thẻ mới ở dưới cùng có nhãn "Trình kiểm tra cơ sở dữ liệu". Có thể mất vài giây để tải, nhưng bạn sẽ thấy một danh sách ở bên trái với các bảng dữ liệu mà có thể được chọn để chạy truy vấn.

8c2b12249b4f652a.png

4. Câu lệnh SELECT (CHỌN) cơ bản

Trong các bài tập sau, bạn sẽ chạy truy vấn trong Trình kiểm tra cơ sở dữ liệu. Đảm bảo bạn chọn đúng bảng trong ngăn bên trái (công viên), nhấp vào nút Open New Query Tab (Mở thẻ Truy vấn mới) và bạn sẽ thấy một hộp văn bản để nhập lệnh SQL.

bb06b5ce9ac4ba72.png

Câu lệnh SQL là một lệnh, giống như một dòng mã, để truy cập (đọc hoặc ghi) cơ sở dữ liệu. Điều cơ bản nhất bạn có thể làm trong SQL chỉ là nhận tất cả dữ liệu trong bảng. Để làm điều này, bạn bắt đầu với từ SELECT, có nghĩa là bạn muốn đọc dữ liệu. Sau đó, bạn thêm dấu sao (*). Đây là nơi bạn chỉ định các cột muốn chọn và dấu sao là cú pháp viết tắt để chọn tất cả các cột. Rồi sử dụng từ khoá FROM, theo sau là tên của bảng dữ liệu, park. Chạy lệnh sau trong Trình kiểm tra cơ sở dữ liệu và quan sát toàn bộ bảng với tất cả các hàng và cột.

SELECT * FROM park

Nếu chỉ muốn chọn một cột cụ thể thay vì tất cả các cột trong bảng dữ liệu, bạn có thể chỉ định tên cột.

SELECT city FROM park

Bạn cũng có thể chọn nhiều cột cụ thể, mỗi cột cách nhau bằng dấu phẩy.

SELECT name, established, city FROM park

Đôi khi, không cần chọn tất cả các hàng trong cơ sở dữ liệu. Bạn có thể thêm phần mệnh đề của câu lệnh SQL để thu hẹp kết quả của mình.

Một mệnh đề là LIMIT, cho phép bạn đặt giới hạn về số lượng hàng được trả về. Vì vậy, thay vì trả lại tất cả 23 kết quả, truy vấn sau chỉ trả về năm kết quả đầu tiên.

SELECT name FROM park
LIMIT 5

Một trong những mệnh đề phổ biến và hữu ích nhất là mệnh đề WHERE. Mệnh đề WHERE cho phép bạn lọc kết quả dựa trên một hoặc nhiều cột.

SELECT name FROM park
WHERE type = "national_park"

Ngoài ra còn có một toán tử "không bằng" (!=). Truy vấn sau đây liệt kê tất cả các công viên rộng trên 100.000 mẫu mà không phải là recreation_area. Với mệnh đề WHERE, bạn cũng có thể sử dụng các toán tử Boolean như AND hoặc OR để thêm nhiều điều kiện.

SELECT name FROM park
WHERE type != "recreation_area"
AND area_acres > 100000

Thực hành

Truy vấn SQL có thể hữu ích để trả lời nhiều câu hỏi về dữ liệu của bạn và cách tốt nhất để thực hành là viết truy vấn của riêng bạn. Trong vài bước tiếp theo, bạn sẽ có cơ hội viết một truy vấn để trả lời một câu hỏi cụ thể. Hãy nhớ kiểm thử mã đó trong Trình kiểm tra cơ sở dữ liệu trước khi tiếp tục.

Tất cả các bài tập đều dựa trên kiến thức tích lũy từ toàn bộ các phần trước và sẽ có hướng dẫn đáp án ở cuối lớp học lập trình để kiểm tra câu trả lời của bạn.

5. Hàm SQL phổ biến

Truy vấn đầu tiên bạn đã viết chỉ trả về từng hàng trong cơ sở dữ liệu.

SELECT * FROM park

Tuy nhiên, có lẽ bạn không muốn trả về một danh sách dài các kết quả. SQL cũng cung cấp các hàm tổng hợp có thể giúp bạn giảm dữ liệu về một giá trị có ý nghĩa duy nhất. Ví dụ: giả sử bạn muốn biết số lượng hàng trong bảng park. Thay vì SELECT * ..., sử dụng hàm COUNT() và chuyển vào * (cho tất cả các hàng) hoặc tên cột. Khi đó, truy vấn sẽ trả về số lượng của tất cả các hàng.

SELECT COUNT(*) FROM park

Một hàm tổng hợp hữu ích khác là hàm SUM() dùng để cộng các giá trị trong một cột. Truy vấn này chỉ lọc các công viên quốc gia (vì đây là các mục duy nhất có cột park_visitors không rỗng) và thêm tổng số khách ghé thăm cho từng công viên.

SELECT SUM(park_visitors) FROM park
WHERE type = "national_park"

Lưu ý rằng bạn vẫn có thể sử dụng SUM() trên giá trị rỗng, nhưng giá trị đó sẽ chỉ được xử lý là số không. Truy vấn sau đây sẽ trả về cùng kết quả như truy vấn ở trên. Tuy nhiên, bạn vẫn nên càng cụ thể càng tốt để tránh lỗi khi bắt đầu sử dụng SQL trong ứng dụng.

SELECT SUM(park_visitors) FROM park

Ngoài việc tổng hợp các giá trị, còn có các hàm hữu ích khác, như MAX()MIN() để nhận được giá trị lớn nhất hoặc nhỏ nhất tương ứng.

SELECT MAX(area_acres) FROM park
WHERE type = 'national_park'

Lấy giá trị DISTINCT

Bạn có thể để ý rằng với một số hàng, cột cũng có cùng giá trị với các hàng khác. Ví dụ: cột loại chỉ có một số lượng giá trị hữu hạn. Bạn có thể loại bỏ giá trị trùng lặp khỏi kết quả truy vấn bằng từ khoá DISTINCT. Ví dụ: để nhận tất cả các giá trị duy nhất cho cột loại, bạn có thể sử dụng truy vấn sau.

SELECT DISTINCT type FROM park

Bạn cũng có thể sử dụng DISTINCT trong hàm tổng hợp, do đó, thay vì liệt kê type duy nhất và tự đếm các loại, bạn chỉ cần trả về số đếm.

SELECT COUNT(DISTINCT type) FROM park

Thực hành

Dành thời gian để áp dụng những điều đã học và xem liệu bạn có thể viết các truy vấn sau đây hay không. Nhớ sử dụng Trình kiểm tra cơ sở dữ liệu để xác minh rằng mã của bạn chạy tốt.

6. Kết quả truy vấn theo thứ tự và nhóm

Trong các ví dụ trước, có lẽ bạn khó tìm được một mục cụ thể. Rất may, bạn cũng có thể sắp xếp kết quả của câu lệnh SELECT bằng mệnh đề ORDER BY. Bạn thêm mệnh đề ORDER BY vào cuối truy vấn sau mệnh đề WHERE (nếu có) và chỉ định tên cột mà bạn muốn sắp xếp. Ví dụ sau đây lấy tên của từng công viên trong cơ sở dữ liệu, nhưng sắp xếp kết quả theo thứ tự bảng chữ cái.

SELECT name FROM park
ORDER BY name

Theo mặc định, kết quả được sắp xếp theo thứ tự tăng dần, nhưng bạn có thể thêm từ khoá ASC hoặc DESC vào thứ tự theo mệnh đề để sắp xếp theo thứ tự tăng dần hoặc giảm dần. Để bắt đầu, bạn không cần chỉ định ASC khi truy vấn đầu tiên liệt kê kết quả theo thứ tự tăng dần, nhưng nếu bạn muốn nhận kết quả theo thứ tự giảm dần, hãy thêm từ khoá DESC vào cuối mệnh đề ORDER BY.

SELECT name FROM park
ORDER BY name DESC

Để đọc kết quả dễ hơn, bạn cũng có tuỳ chọn để nhóm kết quả theo cột. Trước mệnh đề ORDER BY (nếu có), bạn có thể tuỳ ý chỉ định mệnh đề GROUP BY và một cột. Tác vụ này sẽ tách riêng các kết quả thành một tập hợp con cụ thể cho cột trong GROUP BY và đối với mỗi cột, kết quả sẽ được lọc và sắp xếp theo phần còn lại của truy vấn.

SELECT type, name FROM park
GROUP BY type
ORDER BY name

Dùng ví dụ để hiểu rõ hơn các lệnh này. Thay vì đếm tất cả công viên trong cơ sở dữ liệu, bạn có thể thấy số lượng công viên cho mỗi loại và nhận số lượng riêng cho từng loại công viên.

SELECT type, COUNT(*) FROM park
GROUP BY type
ORDER BY type

Thực hành

Dành thời gian để áp dụng những điều đã tìm hiểu và xem liệu bạn có thể viết truy vấn dưới đây hay không. Nhớ sử dụng Trình kiểm tra cơ sở dữ liệu để xác minh rằng mã của bạn chạy tốt.

Bài tập 4: Viết một truy vấn SQL cho tên của 5 công viên hàng đầu, cùng số khách ghé thăm, có nhiều khách ghé thăm nhất theo thứ tự giảm dần.

7. Chèn và xoá hàng

Bạn cần phải ghi dữ liệu để tận dụng tối đa dữ liệu bền vững trên Android với Room. Ngoài việc truy vấn cơ sở dữ liệu, bạn cũng có thể dùng các câu lệnh SQL để chèn, cập nhật và xoá hàng. Bạn cần phải có kiến thức cơ bản về các câu lệnh này khi tìm hiểu cách viết dữ liệu bằng Room trong Lộ trình 2 sau này.

CHÈN câu lệnh

Để thêm hàng mới, bạn sử dụng câu lệnh INSERT. Câu lệnh INSERT đứng trước từ khoá INTO và tên của bảng mà bạn muốn thêm hàng. Sau từ khoá GIÁ TRỊ, bạn cung cấp giá trị cho mỗi cột (theo thứ tự) trong ngoặc đơn và mỗi cột được phân cách bằng dấu phẩy. Định dạng của câu lệnh INSERT như sau.

INSERT INTO table_name
VALUES (column1, column2, ...)

Để thêm một hàng vào bảng park, câu lệnh INSERT sẽ có dạng như sau. Giá trị khớp với thứ tự mà các cột được xác định cho bảng park. Lưu ý rằng một số dữ liệu chưa được chỉ định. Mọi việc đến giờ vẫn ổn do bạn có thể luôn cập nhật một hàng sau khi chèn hàng đó.

INSERT INTO park
VALUES (null, 'Googleplex', 'Mountain View', 12, null, 0, '')

Ngoài ra, lưu ý rằng bạn chuyển vào null cho mã nhận dạng ID. Dù bạn có thể cung cấp một con số cụ thể, nhưng điều này không thực sự thuận tiện vì ứng dụng của bạn phải theo dõi mã nhận dạng mới nhất để đảm bảo không có mã nào bị trùng. Tuy nhiên, bạn có thể định cấu hình cơ sở dữ liệu để khoá chính được tự động tăng lên. Việc này được thực hiện ở đây. Bằng cách đó, bạn có thể chuyển vào null và mã nhận dạng ID tiếp theo sẽ tự động được chọn.

Xác minh rằng mục nhập đã được tạo bằng mệnh đề WHERE để chỉ định công viên có tên là "Googleplex".

SELECT * FROM park
WHERE name = 'Googleplex'

CẬP NHẬT câu lệnh

Sau khi tạo một hàng, bạn có thể thay đổi nội dung của hàng đó bất cứ lúc nào. Bạn có thể thực hiện việc này với câu lệnh UPDATE. Giống như tất cả câu lệnh SQL khác bạn đã thấy, trước tiên bạn cần chỉ định tên bảng. Trong mệnh đề SET, bạn chỉ cần đặt từng cột mà bạn muốn đổi sang giá trị mới.

UPDATE table_name
SET column1 = ...,
column2 = ...,
...
WHERE column_name = ...
...

Đối với mục nhập Googleplex, một thuộc tính hiện có sẽ được cập nhật và một số trường khác sẽ được điền (các trường này trước đây đã có một giá trị nhưng đó chỉ là một chuỗi trống, ""). Bạn có thể cập nhật nhiều (hoặc tất cả) các trường cùng một lúc bằng câu lệnh UPDATE.

UPDATE park
SET area_acres = 46,
established = 1088640000,
type = 'office'
WHERE name = 'Googleplex'

Xem nội dung cập nhật được phản ánh trong kết quả truy vấn

SELECT * FROM park
WHERE name = 'Googleplex'

XOÁ câu lệnh

Cuối cùng, bạn cũng có thể sử dụng lệnh SQL để xoá hàng khỏi cơ sở dữ liệu. Một lần nữa, chỉ định tên bảng và giống như đã thực hiện với câu lệnh SELECT, bạn sử dụng mệnh đề WHERE để cung cấp tiêu chí cho các hàng bạn muốn xoá. Do mệnh đề WHERE có thể khớp với nhiều hàng, bạn có thể xoá nhiều hàng bằng một lệnh duy nhất.

DELETE FROM table_name
WHERE <column_name> = ...

Vì Googleplex không phải là vườn quốc gia, nên hãy thử sử dụng câu lệnh DELETE để xoá mục nhập này khỏi cơ sở dữ liệu.

DELETE FROM park
WHERE name = 'Googleplex'

Xác minh để đảm bảo hàng đã được xoá bằng câu lệnh SELECT. Truy vấn không trả về kết quả nào, nghĩa là tất cả các hàng có tên "Googleplex" đã thực sự bị xoá.

SELECT * FROM park
WHERE name = 'Googleplex'

Đó là tất cả những gì cần làm để chèn, cập nhật và xoá dữ liệu. Tất cả những gì cần biết là định dạng cho lệnh SQL bạn muốn thực hiện và chỉ định giá trị mà khớp với cột trong cơ sở dữ liệu. Khi chúng tôi giới thiệu Room trong lớp học lập trình tiếp theo, bạn sẽ chủ yếu tập trung vào việc đọc từ một cơ sở dữ liệu. Việc chèn, cập nhật và xoá dữ liệu sẽ được giảng chi tiết trong Lộ trình 2.

8. Đáp án bài tập

Hy vọng rằng các bài tập thực hành đã giúp củng cố kiến thức của bạn về khái niệm SQL. Nếu bạn gặp khó khăn với khái niệm nào hoặc muốn kiểm tra câu trả lời của mình, hãy tham khảo đáp án của chúng tôi ở bên dưới

Bài tập 1: Viết một truy vấn SQL để lấy tên của tất cả các công viên có dưới 1.000.000 khách ghé thăm.

Bài tập này hỏi tên công viên (một cột duy nhất) với yêu cầu có ít hơn 1.000.000 khách ghé thăm được chỉ định trong mệnh đề WHERE.

SELECT name FROM park
WHERE park_visitors < 1000000

Bài tập 2: Viết truy vấn SQL để biết số lượng thành phố chỉ có một công viên trong bảng park

Tổng số đếm của một cột có thể được tính bằng cách sử dụng hàm COUNT(), nhưng vì bạn chỉ muốn các thành phố có một công viên (do một số thành phố có nhiều công viên), bạn có thể sử dụng từ khoá DISTINCT trước tên cột trong hàm COUNT().

SELECT COUNT(DISTINCT city) FROM park

Bài tập 3: Viết một truy vấn SQL để nhận được tổng số lượng khách đến thăm các công viên ở San Francisco.

Tổng số khách ghé thăm có thể tính được bằng cách sử dụng hàm SUM(). Ngoài ra, bạn cũng cần có một mệnh đề WHERE để chỉ xác định các công viên ở San Francisco.

SELECT SUM(park_visitors) FROM park
WHERE city = "San Francisco"

Bài tập 4: Viết một truy vấn SQL cho tên 5 công viên hàng đầu (chỉ tên) cùng với số lượng khách truy cập có nhiều khách truy cập nhất, theo thứ tự giảm dần.

Truy vấn cần lấy cả cột tên và cột khách ghé thăm công viên. Kết quả được sắp xếp trên cột park_visitors theo thứ tự giảm dần bằng mệnh đề ORDER BY. Do bạn không muốn nhóm kết quả trên cột khác và sắp xếp bên trong các nhóm đó, nên không cần mệnh đề GROUP BY.

SELECT name, park_visitors FROM park
ORDER BY park_visitors DESC
LIMIT 5

9. Xin chúc mừng

Tóm tắt:

  • Cơ sở dữ liệu quan hệ cho phép bạn lưu trữ dữ liệu, được sắp xếp thành bảng, cột và hàng.
  • Bạn có thể truy xuất dữ liệu từ cơ sở dữ liệu bằng cách sử dụng câu lệnh SELECT SQL.
  • Bạn có thể sử dụng nhiều mệnh đề trong câu lệnh SELECT bao gồm WHERE, GROUP BY, ORDER BYLIMIT để khiến truy vấn của bạn cụ thể hơn.
  • Bạn có thể sử dụng hàm tổng hợp để kết hợp dữ liệu từ nhiều hàng vào một cột duy nhất.
  • Bạn có thể thêm, cập nhật và xoá hàng trong cơ sở dữ liệu bằng câu lệnh SQL INSERT, UPDATEDELETE tương ứng.

Tìm hiểu thêm