MySQL - SET: Hiểu và Sử dụng Kiểu Dữ liệu SET

Giới thiệu về MySQL SET

Xin chào các bạn đam mê cơ sở dữ liệu! Hôm nay, chúng ta sẽ cùng nhau lặn vào thế giới kỳ diệu của kiểu dữ liệu SET trong MySQL. Là người giáo viên máy tính gần gũi của bạn, tôi ở đây để hướng dẫn bạn qua chủ đề này với cùng niềm vui mà tôi cảm thấy khi khám phá một sự kết hợp mới của topping trên pizza. tin tôi đi, đến cuối bài học này, bạn sẽ thoải mái với SET như tôi với đôi dép mã hóa yêu thích của mình!

MySQL - SET

Kiểu Dữ liệu SET trong MySQL

SET là gì?

Kiểu dữ liệu SET trong MySQL giống như một chiếc pizza với nhiều topping - nó cho phép bạn lưu trữ nhiều giá trị từ một danh sách các tùy chọn đã xác định trong một cột duy nhất. Hãy tưởng tượng bạn đang tạo một cơ sở dữ liệu cho một hiệu sách, và bạn muốn theo dõi thể loại của mỗi cuốn sách. Một cuốn sách có thể thuộc nhiều thể loại, phải không? Đây là lúc SET đến để cứu nguy!

Cú pháp và Sử dụng

Hãy cùng xem cách chúng ta định nghĩa một cột SET:

CREATE TABLE books (
id INT PRIMARY KEY,
title VARCHAR(100),
genres SET('Fiction', 'Non-Fiction', 'Mystery', 'Romance', 'Sci-Fi')
);

Trong ví dụ này, chúng ta đã tạo một cột 'genres' có thể chứa bất kỳ sự kết hợp nào của các giá trị đã xác định. Đó như việc tặng mỗi cuốn sách một chiếc pizza thể loại tùy chỉnh!

Chèn Dữ liệu

Bây giờ, hãy thêm một số cuốn sách vào bảng của chúng ta:

INSERT INTO books (id, title, genres) VALUES
(1, 'The Mysterious Universe', 'Non-Fiction,Sci-Fi'),
(2, 'Love in the Time of Algorithms', 'Fiction,Romance,Sci-Fi'),
(3, 'The Art of Debugging', 'Non-Fiction');

Ở đây, chúng ta đang gán nhiều thể loại cho mỗi cuốn sách. Nó đơn giản như việc tách các giá trị bằng dấu phẩy.

Lưu trữ Kiểu Dữ liệu SET

Cách SET giá trị được lưu trữ

Behind the scenes, MySQL stores SET values as bit-vectors. Each option in the SET is assigned a bit position. For example:

Value Bit Position Numeric Value
Fiction 0 1
Non-Fiction 1 2
Mystery 2 4
Romance 3 8
Sci-Fi 4 16

When you insert a SET value, MySQL calculates the sum of the numeric values for each selected option. For instance, 'Fiction,Sci-Fi' would be stored as 17 (1 + 16).

Hiệu quả về bộ nhớ

Phương pháp lưu trữ này rất hiệu quả. MySQL có thể lưu trữ lên đến 64 giá trịDistinct trong một SET chỉ với 8 byte bộ nhớ. Nó như việc đặt một thư viện đầy thể loại vào một kệ sách nhỏ!

Cập nhật Giá trị SET

Thêm và Bỏ Giá trị

Cập nhật giá trị SET dễ dàng như việc cập nhật đơn đặt hàng pizza. Bạn có thể thêm hoặc bỏ giá trị bằng cách sử dụng các hàm khác nhau của MySQL:

-- Thêm một thể loại
UPDATE books SET genres = CONCAT(genres, ',Mystery') WHERE id = 1;

-- Bỏ một thể loại
UPDATE books SET genres = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', genres, ','), ',Sci-Fi,', ',')) WHERE id = 1;

Trong truy vấn đầu tiên, chúng ta đang thêm 'Mystery' vào các thể loại. Trong truy vấn thứ hai, chúng ta đang bỏ 'Sci-Fi'. Nó như việc tùy chỉnh pizza sau khi đã đặt hàng!

Sử dụng các Оператор SET

MySQL cung cấp một số оператор tiện ích để làm việc với các giá trị SET:

-- Tìm các cuốn sách thuộc cả Fiction và Sci-Fi
SELECT * FROM books WHERE FIND_IN_SET('Fiction', genres) > 0 AND FIND_IN_SET('Sci-Fi', genres) > 0;

-- Tìm các cuốn sách thuộc Romance hoặc Mystery
SELECT * FROM books WHERE genres & (1 << 2 | 1 << 3);

Truy vấn thứ hai sử dụng các hoạt động bit để kiểm tra Romance (bit position 3) hoặc Mystery (bit position 2). Nó như việc sử dụng một mật mã để tìm thể loại sách yêu thích của bạn!

Sử dụng Kiểu Dữ liệu SET trong Chương trình Khách

Khi làm việc với SET qua một chương trình khách, bạn có một số tùy chọn để xử lý dữ liệu:

Như một chuỗi

Most client programs will present SET values as comma-separated strings:

import mysql.connector

db = mysql.connector.connect(host="localhost", user="yourusername", password="yourpassword", database="bookstore")
cursor = db.cursor()

cursor.execute("SELECT * FROM books WHERE id = 2")
result = cursor.fetchone()
print(f"Genres for '{result[1]}': {result[2]}")
# Output: Genres for 'Love in the Time of Algorithms': Fiction,Romance,Sci-Fi

Như một tập hợp các số nguyên

Some advanced applications might work with the underlying integer representation:

cursor.execute("SELECT genres+0 FROM books WHERE id = 2")
result = cursor.fetchone()
print(f"Integer representation of genres: {result[0]}")
# Output: Integer representation of genres: 25

Ở đây, genres+0 ép MySQL trả về đại diện số nguyên.

Kết luận

Và thế là bạn đã có, các phù thủy cơ sở dữ liệu tương lai! Chúng ta đã cùng nhau hành trình qua vùng đất của kiểu dữ liệu SET trong MySQL, từ sự linh hoạt như pizza đến các mã số bí mật. Nhớ rằng, giống như việc chọn topping cho chiếc pizza hoàn hảo của bạn, việc chọn đúng kiểu dữ liệu cho cơ sở dữ liệu của bạn là rất quan trọng. SET cho bạn quyền lực để xử lý nhiều lựa chọn một cách hiệu quả và thanh lịch.

Khi chúng ta kết thúc, tôi nhớ lại một học sinh từng nói rằng SET nhắc họ về việc 收集 trading cards - bạn có thể có bất kỳ sự kết hợp nào, nhưng chỉ từ một bộ đã xác định. Dấu phẩy này lưu lại với tôi, giống như phô mai dính trên nóc miệng của bạn!

Tiếp tục thực hành, 保持 sự tò mò, và trước khi bạn biết điều đó, bạn sẽ dễ dàng như tôi phục vụ các giải pháp cơ sở dữ liệu, dễ dàng như tôi phục vụ những câu đùapizza tệ hại. Hẹn gặp lại, chúc các bạn có các truy vấn nhanh chóng và tính toàn vẹn dữ liệu mạnh mẽ!

Credits: Image by storyset