Data Types (kiểu dữ liệu) trong MySQL
- 25-03-2023
- Toanngo92
- 0 Comments
Trong MySQL, kiểu dữ liệu đề cập đến loại dữ liệu có thể được lưu trữ trong một cột cụ thể của bảng. Nó ẹxác định phạm vi giá trị có thể được lưu trữ trong một cột và các thao tác có thể được thực hiện trên các giá trị đó. MySQL hỗ trợ nhiều kiểu dữ liệu khác nhau như kiểu dữ liệu số, chuỗi, ngày/giờ và không gian. Việc lựa chọn kiểu dữ liệu phụ thuộc vào bản chất của dữ liệu được lưu trữ và các thao tác cần được thực hiện trên đó. Chọn kiểu dữ liệu thích hợp có thể cải thiện hiệu suất và hiệu quả của cơ sở dữ liệu.
Danh sách các kiểu dữ liệu hệ thống MySQL
Mục lục
Kiểu dữ liệu số (Numeric Data Types)
Đây là kiểu dữ liệu tính toán được trong MySQL, có các kiểu dữ liệu như sau:
| Kiểu dữ liệu | Mô tả |
| BIT(size) | Một kiểu giá trị bit. Số lượng bit trên mỗi giá trị được chỉ định trong kích thước. elà 1. |
| TINYINT(size) | Một số nguyên rất nhỏ. Phạm vi có dấu là từ -128 đến 127. Phạm vi unsiged (không dấu) là từ 0 đến 255. Tham số kích thước chỉ định chiều rộng hiển thị tối đa (là 255) |
| BOOL | Giá trị 0 được coi là sai, giá trị khác 0 được coi là đúng. |
| BOOLEAN | Tương tự bool |
| SMALLINT(size) | Một số nguyên nhỏ. Phạm vi có dấu là từ -32768 đến 32767. Phạm vi không dấu là từ 0 đến 65535. Tham số kích thước chỉ định chiều rộng hiển thị tối đa (là 255) |
| MEDIUMINT(size) | Một số nguyên trung bình. Phạm vi có dấu là từ -8388608 đến 8388607. Phạm vi không dấu là từ 0 đến 16777215. Tham số kích thước chỉ định chiều rộng hiển thị tối đa (là 255) |
| INT(size) | Một số nguyên trung bình. Phạm vi có dấu là từ -2147483648 đến 2147483647. Phạm vi có dấu là từ 0 đến 4294967295. Tham số kích thước chỉ định chiều rộng hiển thị tối đa (là 255) |
| INTEGER(size) | Tương tự INT(size) |
| BIGINT(size) | Một số nguyên lớn. Phạm vi có dấu là từ -9223372036854775808 đến 9223372036854775807. Phạm vi không dấu là từ 0 đến 18446744073709551615. Tham số kích thước chỉ định chiều rộng hiển thị tối đa (là 255) |
| FLOAT(size, d) | Một số thực. Tổng số chữ số được chỉ định trong kích thước. Số chữ số sau dấu thập phân được chỉ định trong tham số d. Cú pháp này không được dùng trong MySQL 8.0.17 và nó sẽ bị xóa trong các phiên bản MySQL trong tương lai |
| FLOAT(p) | Một số thực. MySQL sử dụng giá trị p để xác định nên sử dụng FLOAT hay DOUBLE cho kiểu dữ liệu kết quả. Nếu p từ 0 đến 24, kiểu dữ liệu sẽ trở thành FLOAT(). Nếu p từ 25 đến 53, kiểu dữ liệu trở thành DOUBLE() |
| DOUBLE(size, d) | Một số thực kích thước bình thường. Tổng số chữ số được chỉ định trong kích thước. Số chữ số sau dấu thập phân được chỉ định trong tham số d |
| DECIMAL(size, d) | Một số điểm cố định (số đằng sau dâu phẩy động) chính xác. Tổng số chữ số được chỉ định trong kích thước. Số chữ số sau dấu thập phân được chỉ định trong tham số d. Số lượng tối đa cho kích thước là 65. Số lượng tối đa cho d là 30. Giá trị mặc định cho kích thước là 10. Giá trị mặc định cho d là 0. |
| DEC(size, d) | Tương tự DECIMAL(size, d) |
Kiểu dữ liệu chuỗi (String Data Types)
| Kiểu dữ liệu | Mô tả |
| CHAR(size) | Một chuỗi độ dài CỐ ĐỊNH (có thể chứa các chữ cái, số và ký tự đặc biệt). Tham số kích thước chỉ định độ dài cột theo ký tự – có thể từ 0 đến 255. Mặc định là 1 |
| VARCHAR(size) | Một chuỗi có độ dài BIẾN THIÊN (có thể chứa các chữ cái, số và ký tự đặc biệt). Tham số kích thước chỉ định độ dài chuỗi tối đa tính bằng ký tự – có thể từ 0 đến 65535 |
| BINARY(size) | Bằng với CHAR(), nhưng lưu trữ các chuỗi byte nhị phân. Tham số kích thước chỉ định độ dài cột theo byte. Mặc định là 1 |
| VARBINARY(size) | Bằng với VARCHAR(), nhưng lưu trữ các chuỗi byte nhị phân. Tham số kích thước chỉ định độ dài cột tối đa tính bằng byte. |
| TINYBLOB | Dùng cho BLOB (Binary Large Objects). Độ dài tối đa: 255 byte |
| TINYTEXT | Lưu trữ một chuỗi có độ dài tối đa 255 ký tự |
| TEXT(size) | Lưu trữ một chuỗi có độ dài tối đa là 65.535 byte |
| BLOB(size) | Dùng cho BLOB (Binary Large Objects). Độ dài tối đa 65.535 byte dữ liệu |
| MEDIUMTEXT | Lưu trữ một chuỗi có độ dài tối đa 16.777.215 ký tự |
| MEDIUMBLOB | Dùng cho BLOB (Binary Large Objects). Độ dài tối đa 16.777.215 byte dữ liệu |
| LONGTEXT | Lưu trữ một chuỗi có độ dài tối đa 4.294.967.295 ký tự |
| LONGBLOB | Dùng cho BLOB (Đối tượng lớn nhị phân). Độ dài tối đa 4.294.967.295 byte dữ liệu |
| ENUM(val1, val2, val3, …) | Một đối tượng chuỗi chỉ có thể có một giá trị, được chọn từ danh sách các giá trị có thể. Bạn có thể liệt kê tối đa 65535 giá trị trong danh sách ENUM. Nếu một giá trị được chèn không có trong danh sách, một giá trị trống sẽ được chèn vào. Các giá trị được sắp xếp theo thứ tự bạn nhập chúng |
| SET(val1, val2, val3, …) | Một đối tượng chuỗi có thể có 0 hoặc nhiều giá trị, được chọn từ danh sách các giá trị có thể. Bạn có thể liệt kê tối đa 64 giá trị trong danh sách SET |
Kiểu dữ liệu ngày tháng (Date and Date time Data Types)
MySQL cũng cung cấp các kiểu dữ liệu liên quan đến thời gian giúp lưu trữ và làm việc với ngày tháng và thời gian dễ dàng hơn. Khi lưu dữ liệu ở dạng này, chúng ta có thể truy vấn dữ liệu theo từng phần riêng lẻ như theo ngày, theo tháng và theo năm, hay thậm chi là truy vấn kết hơp cả ngày tháng năm.
Nếu muốn lưu trữ ngày, tháng và năm thì chọn kiểu Date, lưu trữ đầy đủ bao gồm giờ phút giây thì có thể sử dụng Datetime và chỉ lưu trữ chỉ giờ phút giây thì chọn time. Ngoài ra có thêm kiểu timestamp dùng lưu trữ thời gian theo dạng số tính từ năm 1970.
| Kiểu dữ liệu | Mô tả |
| DATE | Lưu trữ dữ liệu ngày. Định dạng: YYYY-MM-DD. Phạm vi được hỗ trợ là từ ‘1000-01-01’ đến ‘9999-12-31’ |
| DATETIME | Lưu trữ kết hợp ngày và thời gian. Định dạng: YYYY-MM-DD hh:mm:ss. Phạm vi được hỗ trợ là từ ‘1000-01-01 00:00:00’ đến ‘9999-12-31 23:59:59’. Thêm DEFAULT và ON UPDATE trong định nghĩa cột để tự động khởi tạo và cập nhật ngày giờ hiện tại |
| TIMESTAMP | Lưu trữ dấu thời gian (timestamp). Các giá trị timestamp được lưu trữ dưới dạng số giây kể từ Kỷ nguyên Unix (‘1970-01-01 00:00:00’ UTC). Định dạng: YYYY-MM-DD hh:mm:ss. Phạm vi được hỗ trợ là từ ‘1970-01-01 00:00:01’ UTC đến ‘2038-01-09 03:14:07’ UTC. Có thể chỉ định tự động khởi tạo và cập nhật ngày giờ hiện tại bằng cách sử dụng DEFAULT CURRENT_TIMESTAMP và ON UPDATE CURRENT_TIMESTAMP trong định nghĩa cột |
| TIME | Lưu trữ giờ phút giây. Định dạng: hh:mm:ss. Phạm vi được hỗ trợ là từ ‘-838:59:59’ đến ‘838:59:59’ |
| YEAR | Một năm ở định dạng bốn chữ số. Các giá trị được phép ở định dạng bốn chữ số: 1901 đến 2155 và 0000. MySQL 8.0 không hỗ trợ năm ở định dạng hai chữ số. |
Kiểu dữ liệu không gian (Spatial Data Types)
MySQL có hỗ trợ nhiều loại kiểu dữ liệu không gian liên quan đến đối tượng điểm, tọa độ và địa lý sau:
| Kiểu dữ liệu | Mô tả |
| GEOMETRY | Giá trị không gian của bất kì loại nào |
| POINT | Một cặp điểm tọa độ X:Y |
| LINESTRING | Một đường cong |
| POLYGON | Một đa giác |
| GEOMETRYCOLLECTION | Một danh sách các GEOMETRY |
| MULTILINESTRING | Một danh sách các đường cong |
| MULTIPOINT | Một danh sách các điểm tọa độ X:Y |
| MULTIPOLYGON | Một danh sách các đa giác |
Bài tập
Bài tập ôn luyện 3:
1. Tạo một file SQL có tên Lab4.sql.
2. Tạo một Cơ sở dữ liệu (CSDL) có tên DBLab4.
3. Tạo 03 bảng như sau:
- Bảng Customers lưu trữ thông tin về khách hàng gồm các cột MaKhach (PK), Ten, SoDienThoai.
- Bảng Items lưu trữ thông tin về hàng hóa gồm các cột MaHang (PK), Ten, SoLuong, DonGia.
- Bảng CustomerItem lưu trữ thông tin về những sản phẩm đã được bán mua gồm các cột MaKhach, MaHang, SoLuongMua, trong đó PK nằm trên 2 cột MaKhach và MaHang, FK1 nằm trên cột MaKhach, FK2 nằm trên cột MaHang.
4. Nhập các thông tin sau vào bảng Items:
|
Tên sản phẩm |
Số lượng |
Đơn giá (nghìn đồng) |
|---|---|---|
|
Tu lanh |
5 |
3500 |
|
Ti vi |
2 |
3000 |
|
Dieu hoa |
1 |
8000 |
|
Quat da |
5 |
1700 |
|
May giat |
3 |
5000 |
5. Tách lọc và nhập thông tin sau vào hai bảng Customers và CustomerItem:
|
Tên khách hàng |
Số điện thoại |
Hàng đã mua |
Số lượng mua |
|---|---|---|---|
|
Dinh Truong Son |
1234567 |
Tu lanh |
4 |
|
Dinh Truong Son |
1234567 |
May giat |
1 |
|
Mai Thanh Minh |
1357999 |
Ti vi |
1 |
|
Nguyen Hong Ha |
2468888 |
Dieu hoa |
1 |
|
Nguyen Hong Ha |
2468888 |
Tu lanh |
1 |
6. Hiển thị tổng số tiền mà cửa hàng đã thu được từ các khách hàng trên.
7. Hiển thị tên, số tiền đã mua của người khách hàng đã trả tiền cho cửa hàng nhiều nhất.
8. Kiểm tra xem người khách có số điên thoại 2468888 có mua mặt hàng Tủ lạnh không, nếu có mua thì hiện ra dòng chữ 'Có mua', ngược lại hiện ra dòng chữ 'Không mua'.
9. Tính tổng số hàng hóa và tổng tiền còn lại trong kho (số còn lại bằng tổng số trừ đi số đã bán).
10. Hiển thị danh sách 3 mặt hàng bán chạy nhất(số lượng bán nhiều nhất).
11. Hiển thị tất cả các mặt hàng mà chưa bán được một sản phẩm nào.
12. Hiển thị danh sách những người mua nhiều hơn một mặt hàng.
13. Hiển thị danh sách những người mua hàng có số lượng nhiều hơn một cái.
14. Hiển thị tên khách hàng, tổng số tiền mua hàng của từng khách và hiển thị cột Level với giá trị điền vào cột này theo tiêu chí sau: Nếu tổng số tiền mua hàng của từng khách < 5000 thì điền giá trị là 'Level1', từ 5000 đến < 10000 thì điền giá trị là 'Level2', >=10000 thì điền giá trị là 'V.I.P'.
Bài tập View:
Dựa vào bài tập https://hocvietcode.com/truy-van-du-lieu-voi-select-trong-mysql/
Tiếp tục tạo view cho CSDL này nhưu sau:
Dựa vào database studentManagement và tạo view có tên vwStudentSubjectMark hiển thị kết quả mỗi sinh viên theo môn, với các thông tin StudentId,StudentName,SubjectName
Bài tập store procedure:
Dựa vào database studentManagement và tạo stored procedure sp_IncreaseMark với tham số đầu vào như sau:
| Parameter | Data Type |
| @SubjectId | INT |
Stored procedure nà tăng 1 điểm cho mỗi trường cột Mark cho mỗi student dựa theo môn học truyền vào.
Chạy câu lệnh thực thi stored procedure trên.
Bài tập trigger
Dựa vào database studentManagement thực hiện các yêu cầu sau:
Tạo trigger tên TG_Result_Insert sẽ thực thi khi người dùng thêm bản ghi mới vào bảng Result. Trigger kiểm tra nếu Mark < 0 sẽ hiển thị lỗi 'Cannot insert mark <0', nếu không thì cho phép thực thi.
| Trigger Name | Event | Table | Data Anomalies | Error Message |
| TG_Result_Insert | INSERT | Result | Mark < 0 | Can not insert mark less than 0 |
Test trigger với dữ liệu (StudentId,SubjectId,Mark) = (1,3,-2)
Tạo trigger cho sự kiện UPDATE với tên TG_Subject_Update, khi xảy ra sự kiện update trong cột SubjectName của bảng Subject, không cho update cột vàn ra thôg báo "Can not update SubjectName"
| Trigger_Name | Event | Table | Data Anomalies | Error Message |
| TG_Subject_Update | UPDATE | Subject | column SubjectName update | Can not update SubjectName |

