SQL Server 2016 đi kèm với nhiều tùy chọn JSON. Chúng tôi có một yêu cầu như chọn dữ liệu bảng thành định dạng JSON và cũng kết hợp kết quả này với JSON của bảng khác
Khi bạn đang cố lấy dữ liệu có định dạng JSON bằng FOR JSON PATH, nó sẽ thêm [dấu ngoặc vuông] vào chuỗi JSON, điều này có thể gây ra sự cố khi bạn đang kết hợp nhiều JSON
Bạn có thể sử dụng tùy chọn KHÔNG_ARRAY_WRAPPER để xóa [dấu ngoặc vuông] bổ sung này
Dưới đây là một minh chứng đầy đủ về điều này
Tạo một bảng với các bản ghi mẫu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TẠO BẢNG tbl_Students
[
KHÓA CHÍNH Rno INT
,STudName VARCHAR[20]
, Tên lớp CHAR[1]
]
ĐI
CHÈN VÀO tbl_Students
GIÁ TRỊ
[1,'Anvesh','A'],[2,'Neevan','B'],[3,'Toby','C']
,[5,'Roy','A'],[4,'Jenny','B'],[6,'Kaviy','C']
,[7,'Martin','A'],[8,'Laxmi','B'],[9,'Nion','C']
ĐI
Chuẩn bị JSON bằng FOR JSON PATH.
Bạn có thể thấy thêm [ ] trong chuỗi kết quả.
1
2
3
4
5
6
7
8
CHỌN HÀNG ĐẦU 2 *
TỪ tbl_Students
ĐẶT HÀNG BỞI Rno
ĐỐI VỚI CON ĐƯỜNG JSON
ĐI
--Kết quả
--[{"Không". 1,"STudName". "Anvesh","Tên Lớp". "A"},{"Rno". 2,"STudName". "Neevan","Tên Lớp". "B"}]
Chuẩn bị JSON bằng cách sử dụng FOR JSON PATH, WITHOUT_ARRAY_WRAPPER.Bây giờ, bạn có thể tìm chuỗi kết quả mà không cần [ ].
1
2
3
4
5
6
7
8
CHỌN HÀNG ĐẦU 2 *
TỪ tbl_Students
ĐẶT HÀNG BỞI Rno
ĐỐI VỚI CON ĐƯỜNG JSON, KHÔNG CÓ_ARRAY_WRAPPER
ĐI
--Kết quả
--{"Không". 1,"STudName". "Anvesh","Tên Lớp". "A"},{"Rno". 2,"STudName". "Neevan","Tên Lớp". "B"}
20 tháng 4 năm 2017 Anvesh Patel
Mời bạn tham khảo các bài viết liên quan khác
- Máy chủ SQL 2016. Sử dụng STRING_ESCAPE để thoát khỏi dấu ngoặc đơn, dấu ngoặc kép, dấu gạch chéo về phía trước
- Máy chủ SQL 2016. Tạo dữ liệu được định dạng JSON từ Dữ liệu bảng
- Máy chủ SQL 2016. Sử dụng OPENJSON[] để trích xuất dữ liệu JSON từ Tham số đầu vào
- Máy chủ SQL 2016. Định cấu hình TempDB cho tệp Tự động phát triển và Nhiều tệp dữ liệu
- Máy chủ SQL 2016. STRING_SPLIT để tách một chuỗi theo các dấu phân cách khác nhau
- Máy chủ SQL 2016. Hỗ trợ SSMS Chỉnh sửa 200 hàng TOP để xem
- Máy chủ SQL 2016. Đã giới thiệu biểu thức AT TIME ZONE để chọn các Múi giờ khác SQL Server 2016. Wide World Importers [WWI] - Cơ sở dữ liệu mẫu mới
Nếu bạn muốn tải xuống phiên bản PDF của hướng dẫn này, hãy nhập email của bạn vào bên dưới và bạn sẽ nhận được nó ngay
Mục lục
- JSON là gì và tại sao tôi nên sử dụng nó?
- Cách tạo và điền trường JSON trong MySQL
- Cách đọc và lọc dữ liệu JSON trong MySQL
- Cách cập nhật dữ liệu JSON trong MySQL
- Cách xóa khỏi trường JSON trong MySQL
- Xác thực dữ liệu JSON
- Cải thiện hiệu suất của các truy vấn JSON
- Mẹo để làm việc với JSON trong MySQL
- Sự kết luận
JSON là gì và tại sao tôi nên sử dụng nó?
JSON là viết tắt của JavaScript Object Notation, và đó là một cách để định dạng và lưu trữ dữ liệu
Dữ liệu có thể được biểu diễn ở định dạng JSON để các ứng dụng khác hoặc các phần của ứng dụng có thể đọc và hiểu dữ liệu đó
Nó tương tự như HTML hoặc XML – nó thể hiện dữ liệu của bạn ở một định dạng nhất định mà mọi người có thể đọc được nhưng được thiết kế để các ứng dụng có thể đọc được
Tại sao nên sử dụng JSON trong cơ sở dữ liệu của bạn?
Vậy tại sao bạn lại sử dụng dữ liệu JSON trong cơ sở dữ liệu của mình?
Nếu bạn cần một cấu trúc linh hoạt
Cấu trúc cơ sở dữ liệu được chuẩn hóa, một cấu trúc có bảng, cột và mối quan hệ, hoạt động tốt trong hầu hết các trường hợp. Những cải tiến gần đây trong thực tiễn phát triển cũng có nghĩa là việc thay đổi bảng không còn quan trọng như trước đây, do đó, có thể điều chỉnh cơ sở dữ liệu của bạn sau khi nó được đưa vào sản xuất
Tuy nhiên, nếu yêu cầu của bạn có nghĩa là cấu trúc dữ liệu của bạn cần linh hoạt, thì trường JSON có thể phù hợp với cơ sở dữ liệu của bạn
Một ví dụ có thể là nơi người dùng có thể thêm các thuộc tính tùy chỉnh. Nếu nó được thực hiện bằng cách sử dụng cơ sở dữ liệu chuẩn hóa, điều này có thể liên quan đến việc thay đổi bảng hoặc tạo thiết kế Giá trị thuộc tính thực thể hoặc một số phương pháp khác
Nếu một trường JSON được sử dụng cho việc này, thì việc thêm và duy trì các thuộc tính tùy chỉnh này sẽ dễ dàng hơn nhiều
Dữ liệu JSON cũng có thể được lưu trữ trong cơ sở dữ liệu của bạn và được xử lý bởi ORM [Trình ánh xạ quan hệ đối tượng] hoặc mã ứng dụng của bạn, vì vậy cơ sở dữ liệu của bạn có thể không cần thực hiện thêm bất kỳ công việc nào
Dữ liệu JSON trông như thế nào?
Đây là một ví dụ đơn giản về dữ liệu JSON
{ "id": "1", "username": "jsmith", "location": "United States" }
Nó sử dụng kết hợp các dấu ngoặc, dấu hai chấm và dấu ngoặc kép khác nhau để thể hiện dữ liệu của bạn
Hãy cùng xem thêm một số ví dụ
Tên/Cặp giá trị
Dữ liệu JSON được viết dưới dạng cặp tên/giá trị. Một cặp tên/giá trị là hai giá trị được đặt trong dấu ngoặc kép
Đây là một ví dụ về cặp tên/giá trị
"username": "jsmith"
Tên là “tên người dùng” và giá trị là “jsmith”. Chúng được ngăn cách bởi dấu hai chấm “. ”
Điều này có nghĩa là đối với thuộc tính của tên người dùng, giá trị là jsmith. Tên trong JSON cần được đặt trong dấu ngoặc kép
Các đối tượng
Dữ liệu JSON có thể được đặt trong dấu ngoặc nhọn cho biết đó là một đối tượng
{"username": "jsmith"}
Đây là dữ liệu giống như ví dụ trước, nhưng bây giờ nó là một đối tượng. Điều này có nghĩa là nó có thể được coi là một đơn vị bởi các khu vực khác của ứng dụng
Điều này giúp ích như thế nào?
{ "username": "jsmith", "location": "United States" }
Có thể thêm các thuộc tính bổ sung hoặc cặp tên/giá trị bằng cách sử dụng dấu phẩy để phân tách chúng
Bạn cũng sẽ nhận thấy trong ví dụ này, các dấu ngoặc nhọn nằm trên các dòng riêng của chúng và dữ liệu được thụt vào. Đây là tùy chọn. nó chỉ được thực hiện để làm cho nó dễ đọc hơn
Mảng
JSON cũng hỗ trợ mảng, là tập hợp các bản ghi trong một đối tượng. Mảng trong JSON được đặt trong dấu ngoặc vuông và có tên
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }
Trong ví dụ này, đối tượng này có một thuộc tính gọi là “posts”. Giá trị của các bài đăng là một mảng mà chúng ta có thể thấy bằng dấu ngoặc vuông mở “[“
Bên trong dấu ngoặc vuông, chúng tôi có một tập hợp các dấu ngoặc nhọn, biểu thị một đối tượng và bên trong chúng tôi có id là 1 và tiêu đề Chào mừng. Chúng tôi có một bộ dấu ngoặc nhọn khác cho biết một đối tượng khác
Hai đối tượng này là bài viết và chúng được chứa trong một mảng
Và điều đó bao gồm những điều cơ bản về JSON là gì
Nếu JSON là mới đối với bạn, đừng lo lắng, nó sẽ dễ dàng hơn khi bạn làm việc với nó nhiều hơn
Nếu bạn đã có kinh nghiệm với JSON, bạn sẽ thấy phần còn lại của hướng dẫn hữu ích hơn khi chúng tôi đi vào chi tiết cách làm việc với JSON trong MySQL
Cách tạo và điền trường JSON trong MySQL
Vậy là bạn đã tìm hiểu một chút về dữ liệu JSON và lý do bạn có thể muốn sử dụng nó
Làm cách nào để chúng tôi tạo một trường trong MySQL?
Tạo trường JSON
Chúng tôi tạo một trường mới với kiểu dữ liệu là JSON
Đây là một ví dụ
CREATE TABLE product [
id INT,
product_name VARCHAR[200],
attributes JSON
];
Chúng tôi đã tạo một bảng được gọi là sản phẩm. Nó có một id và một tên sản phẩm. Ngoài ra còn có một cột thuộc tính, có kiểu dữ liệu là JSON
Thêm một cột JSON dễ dàng như vậy
Bạn có thể nghĩ, nếu dữ liệu JSON chỉ là dữ liệu văn bản, tại sao chúng ta cần phải làm gì đặc biệt?
Chúng tôi có thể, nhưng lợi ích chính của kiểu dữ liệu JSON là xác thực định dạng. Với một trường CLOB đơn giản, chúng ta có thể lưu trữ một giá trị văn bản. Tuy nhiên, điều đó có nghĩa là chúng ta có thể lưu trữ JSON không hợp lệ. thiếu tên thuộc tính hoặc dấu ngoặc nhọn
Với trường JSON, dữ liệu được xác thực tự động cho chúng tôi. Chúng tôi sẽ không thể lưu trữ dữ liệu không hợp lệ trong bảng
Ngoài ra, chúng tôi có thể sử dụng các hàm MySQL JSON khác nhau trên dữ liệu JSON để làm việc với nó dễ dàng hơn
Thêm dữ liệu vào trường JSON
Bây giờ chúng tôi đã có trường JSON của mình, làm cách nào để thêm dữ liệu vào đó?
Có một số cách. We can enter the data into a JSON-formatted string, or use a built-in MySQL function. Let’s see both of them
We can add our first product like this
INSERT INTO product [id, product_name, attributes]
VALUES [1, 'Chair', '{"color":"brown", "material":"wood", "height":"60cm"}'];
We can run this statement and the record is inserted. If we select the data from the table, this is what we see
SELECT
id,
product_name,
attributes
FROM product;
idproduct_nameattributes1Chair{“color”. “brown”, “height”. “60cm”, “material”. “wood”}The JSON data is shown exactly as we entered it
Using the method above, we needed to enter the data in exactly the right format
However, we can use the JSON_OBJECT function to make this easier. The JSON_OBJECT function accepts a list of name/value pairs which are converted to a JSON object
We can insert a record into the table using this function [which has been formatted to make it easier to read]
INSERT INTO product [id, product_name, attributes]
VALUES [2, 'Table', JSON_OBJECT[
"color", "brown",
"material", "wood",
"height", "110cm"
]];
This makes it easier to specify attributes as you don’t need to remember the curly brackets or the colons
We can select from the table to see the results
SELECT
id,
product_name,
attributes
FROM product;
idproduct_nameattributes1Chair{“color”. “brown”, “height”. “60cm”, “material”. “wood”}2Table{“color”. “brown”, “height”. “110cm”, “material”. “wood”}The JSON data is shown with the data we entered
Inserting Arrays
If you want to insert JSON data that contains arrays, you can either enter it using text in a JSON format, or use a function called JSON_ARRAY
Here’s how to insert an array by just specifying it in a JSON format
"username": "jsmith"0
This will insert a new product that has an array of drawers. As you can probably see by this statement, reading it [and writing it] is a bit tricky
You can insert simpler arrays using this method too
"username": "jsmith"1
The INSERT statements will work, and the data will look like this
SELECT
id,
product_name,
attributes
FROM product;
idproduct_nameattributes1Chair{“color”. “brown”, “height”. “60cm”, “chất liệu”. “wood”}2Table{“color”. “brown”, “height”. “110cm”, “material”. “wood”}3Desk{“color”. “black”, “drawers”. [{“side”. “left”, “height”. “30cm”}, {“side”. “left”, “height”. “40cm”}], “material”. “metal”}4Side Table{“color”. “brown”, “material”. [“metal”, “wood”]}There is an easier way to insert array data in JSON in MySQL
Inserting Arrays with JSON_ARRAY
Hàm JSON_ARRAY trong MySQL cho phép bạn dễ dàng chỉ định dữ liệu mảng khi chèn dữ liệu JSON vào MySQL
Let’s insert another record into our table. We can use the JSON_ARRAY function along with the JSON_OBJECT function
We’ll insert a simple array, and one with objects
Here’s a simple array
"username": "jsmith"3
We specify the JSON_ARRAY function, and inside the function, we specify the different attributes to be added to the array
Here’s an insert statement with objects in the array
"username": "jsmith"4
Using the JSON_ARRAY function helps us to validate the data we’re inserting, and reduces the chances of getting an error due to a misplaced comma, quote, or bracket
Here’s what our table looks like now
SELECT
id,
product_name,
attributes
FROM product;
idproduct_nameattributes1Chair{“color”. “brown”, “height”. “60cm”, “material”. “wood”}2Table{“color”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. “gỗ”}3Desk{“màu”. “đen”, “ngăn kéo”. [{"cạnh". “left”, “height”. “30cm”}, {“bên”. “trái”, “chiều cao”. “40cm”}], “chất liệu”. “kim loại”}Bàn phụ 4{“màu”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Bàn ăn{“màu sắc”. “nâu”, “chất liệu”. [“wood”, “metal”]}6Bàn lớn{“color”. “trắng”, “ngăn kéo”. ["{\"cạnh\". \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”bên\”. \”phải\”, \”chiều cao\”. \”50cm\”}”], “chất liệu”. "kim loại"}Các bản ghi mới với dữ liệu mảng được hiển thị và các mảng được đặt trong dấu ngoặc vuông
Chúng ta có thể thấy hàng cuối cùng, với id là 6, có dấu gạch chéo ngược trong giá trị của nó. Điều này là do thực tế là một đối tượng mảng được sử dụng cho một thuộc tính. Chúng ta sẽ xem cách hiển thị điều này tốt hơn sau
Cách đọc và lọc dữ liệu JSON trong MySQL
Khi bạn đã có một số dữ liệu JSON trong bảng, bước tiếp theo là đọc nó
làm sao chúng ta làm việc đó bây giờ?
Chúng ta có thể chạy một câu lệnh SELECT đơn giản để xem dữ liệu trong bảng
SELECT
id,
product_name,
attributes
FROM product;
idproduct_nameattributes1Chair{“color”. “brown”, “height”. “60cm”, “material”. “wood”}2Table{“color”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. “gỗ”}3Desk{“màu”. “đen”, “ngăn kéo”. [{"cạnh". “left”, “height”. “30cm”}, {“bên”. “trái”, “chiều cao”. “40cm”}], “chất liệu”. “kim loại”}Bàn phụ 4{“màu”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Bàn ăn{“màu sắc”. “nâu”, “chất liệu”. [“wood”, “metal”]}6Bàn lớn{“color”. “trắng”, “ngăn kéo”. ["{\"cạnh\". \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”bên\”. \”phải\”, \”chiều cao\”. \”50cm\”}”], “chất liệu”. "kim loại"}Điều này cho chúng ta thấy dữ liệu trong cột JSON và nó trông giống như một giá trị văn bản
Điều tốt với điều này là bất kỳ ứng dụng nào cũng có thể dễ dàng đọc trường này và làm việc với nó theo cách họ muốn [hiển thị, lọc nó, v.v.]
Điều gì sẽ xảy ra nếu chúng tôi muốn làm nhiều hơn trong cơ sở dữ liệu của mình?
Chọn các thuộc tính riêng lẻ
Dữ liệu JSON được lưu trữ trong một thứ trông giống như trường văn bản. Tuy nhiên, khá dễ dàng để lấy các thuộc tính và giá trị ra khỏi trường văn bản này và hiển thị chúng
Chúng tôi có thể trích xuất một giá trị từ trường JSON và hiển thị nó trong một cột riêng biệt. Chúng tôi thực hiện việc này bằng cách sử dụng kết hợp "biểu thức đường dẫn" và hàm JSON_EXTRACT
Chúng ta cần sử dụng hàm JSON_EXTRACT để tìm kiếm một thuộc tính cụ thể trong giá trị JSON. Và chúng ta cần sử dụng một “biểu thức đường dẫn” để chỉ định thuộc tính
Chung ta se lam như thê nao?
Trước tiên, hãy viết biểu thức đường dẫn, sau đó đặt biểu thức đó vào hàm JSON_EXTRACT của chúng ta
Biểu thức đường dẫn cho phép chúng tôi chỉ định thuộc tính mà chúng tôi muốn tìm kiếm. Nó bắt đầu bằng ký hiệu $ và chúng tôi chỉ định một dấu chấm, sau đó là tên của thuộc tính mà chúng tôi đang tìm kiếm
Ví dụ: để chỉ định thuộc tính “màu”, biểu thức đường dẫn ra sẽ như thế này
"username": "jsmith"7
Để chỉ định thuộc tính “vật liệu”, chúng ta có thể sử dụng biểu thức đường dẫn này
"username": "jsmith"8
Nếu chúng ta có thuộc tính chiều cao nằm trong thuộc tính kích thước, thì biểu thức đường dẫn của chúng ta sẽ trông như thế này
"username": "jsmith"9
Chúng tôi sử dụng dấu chấm để chỉ định cấp tiếp theo trong hệ thống phân cấp thuộc tính
Làm thế nào để chúng tôi sử dụng điều này để lọc dữ liệu của chúng tôi?
Hàm JSON_EXTRACT nhận hai tham số
{"username": "jsmith"}0
Chúng ta có thể sử dụng điều này trong một ví dụ
Hiển thị Trường bằng JSON_EXTRACT
Giả sử chúng tôi muốn hiển thị thuộc tính màu trong một cột riêng trong kết quả của mình
Đầu tiên, chúng ta viết biểu thức đường dẫn cho thuộc tính màu
"username": "jsmith"7
Sau đó, chúng tôi thêm phần này vào hàm JSON_EXTRACT của chúng tôi
{"username": "jsmith"}2
Cuối cùng, chúng tôi thêm phần này vào mệnh đề SELECT để hiển thị nó dưới dạng một cột riêng biệt
{"username": "jsmith"}3
Truy vấn này sẽ hiển thị tất cả các bản ghi và hiển thị thuộc tính màu dưới dạng một cột riêng biệt
idproduct_namecolorattributes1Ghế“nâu”{“màu”. “nâu”, “chiều cao”. “60cm”, “chất liệu”. “gỗ”}2Bảng “nâu”{“màu”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. “gỗ”}3Desk“đen”{“màu”. “đen”, “ngăn kéo”. [{"cạnh". “trái”, “chiều cao”. “30cm”}, {“bên”. “trái”, “chiều cao”. “40cm”}], “chất liệu”. “kim loại”}4Bảng phụ“nâu”{“màu”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Bàn ăn “nâu”{“màu sắc”. “nâu”, “chất liệu”. [“gỗ”, “kim loại”]}6Bàn lớn“trắng”{“màu”. “trắng”, “ngăn kéo”. ["{\"cạnh\". \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”bên\”. \”phải\”, \”chiều cao\”. \”50cm\”}”], “chất liệu”. "kim loại"}Chúng ta có thể thấy cột riêng biệt ở đây
Ví dụ về biểu thức đường dẫn
Chúng ta có thể thấy một trường khác sử dụng JSON_EXTRACT bằng cách chỉ định tên thuộc tính
{"username": "jsmith"}4
Ở đây chúng tôi đang trích xuất thuộc tính có tên là chiều cao. Điều này có sẵn trong một số bản ghi nhưng không có sẵn trong các bản ghi khác
idproduct_nameheightattributes1Ghế“60cm”{“màu sắc”. “brown”, “height”. “60cm”, “material”. “wood”}2Table“110cm”{“color”. “brown”, “height”. “110cm”, “material”. “wood”}3Desknull{“color”. “black”, “drawers”. [{“side”. “left”, “height”. “30cm”}, {“side”. “left”, “height”. “40cm”}], “material”. “metal”}4Side Tablenull{“color”. “brown”, “material”. [“metal”, “wood”]}5Dining Tablenull{“color”. “brown”, “material”. [“wood”, “metal”]}6Large Desknull{“color”. “white”, “drawers”. [“{\”side\”. \”left\”, \”height\”. \”50cm\”}”, “{\”side\”. \”right\”, \”height\”. \”50cm\”}”], “material”. “metal”}A null value is shown for records that don’t have this attribute
What about attributes that are arrays, such as “material” in this example?
{"username": "jsmith"}5idproduct_namematerialattributes1Chair“wood”{“color”. “nâu”, “chiều cao”. “60cm”, “material”. “wood”}2Table“wood”{“color”. “brown”, “height”. “110cm”, “material”. “wood”}3Desk“metal”{“color”. “black”, “drawers”. [{“side”. “left”, “height”. “30cm”}, {“side”. “left”, “height”. “40cm”}], “material”. “metal”}4Side Table[“metal”, “wood”]{“color”. “brown”, “material”. [“metal”, “wood”]}5Dining Table[“wood”, “metal”]{“color”. “brown”, “material”. [“wood”, “metal”]}6Large Desk“metal”{“color”. “white”, “drawers”. [“{\”side\”. \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”side\”. \”right\”, \”height\”. \”50cm\”}”], “material”. “metal”}
What if we want to see an attribute that’s inside another attribute? For example, the first of the “drawer” attributes?
Because “drawer” is an array, we can’t use the dot notation to get the attribute like this
{"username": "jsmith"}6
This will return a null value as there is no attribute called side. it’s part of an array
However, we can use a number to reference the position in the array
Bạn có thể trả lại đối tượng đầu tiên bằng cách sử dụng [0]
{"username": "jsmith"}7
Có thể tìm thấy đối tượng thứ hai bằng cách sử dụng [1], đối tượng thứ ba bằng cách sử dụng [2], v.v.
So, our query to extract the first item in the array is
{"username": "jsmith"}8
The results are
idproduct_namedrawerattributes1Chairnull{“color”. “brown”, “height”. “60cm”, “material”. “wood”}2Tablenull{“color”. “brown”, “height”. “110cm”, “chất liệu”. “wood”}3Desk{“side”. “trái”, “chiều cao”. “30cm”}{“màu”. “đen”, “ngăn kéo”. [{"cạnh". “trái”, “chiều cao”. “30cm”}, {“bên”. “trái”, “chiều cao”. “40cm”}], “chất liệu”. “kim loại”}4Side Tablenull]{“màu”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Bàn ănnull{“màu”. “nâu”, “chất liệu”. [“gỗ”, “kim loại”]}6Bàn lớn“{\side\”. \”trái\”, \”chiều cao\”. \”50cm\”}”{“màu sắc”. “trắng”, “ngăn kéo”. ["{\"cạnh\". \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”bên\”. \”phải\”, \”chiều cao\”. \”50cm\”}”], “chất liệu”. "kim loại"}Vì vậy, như bạn có thể thấy, có nhiều cách để bạn có thể sử dụng hàm JSON_EXTRACT với biểu thức đường dẫn để lấy thuộc tính mà bạn muốn
Lọc dữ liệu JSON trong MySQL
Giả sử chúng tôi muốn xem sản phẩm Ghế có màu nâu, chất liệu gỗ và chiều cao 60cm. Nhưng chúng tôi muốn lọc các thuộc tính JSON cho ví dụ này
Hãy thử truy vấn này
{"username": "jsmith"}9
Chúng ta có thể chạy truy vấn này. Tuy nhiên, chúng tôi không nhận được bất kỳ kết quả
Thật không may, chúng tôi không thể chỉ lọc trên một cột JSON như vậy
Điều gì sẽ xảy ra nếu chúng tôi thử sử dụng từ khóa THÍCH với đối sánh một phần?
{ "username": "jsmith", "location": "United States" }0
không có kết quả nào được tìm thấy
Điều đó cũng không mang lại cho chúng tôi kết quả mà chúng tôi muốn. Ngoài ra, sử dụng tìm kiếm ký tự đại diện có thể khá chậm nếu có nhiều dữ liệu trong bảng
Tuy nhiên, có một số tính năng trong MySQL cho phép lọc dữ liệu JSON
Sử dụng JSON_EXTRACT để lọc dữ liệu
Giả sử chúng ta muốn tìm tất cả các sản phẩm có màu nâu. Màu sắc là một phần của cột JSON thuộc tính trong bảng của chúng tôi
Biểu thức đường dẫn của chúng ta sẽ trông như thế này
"username": "jsmith"7
Chúng ta có thể viết hàm JSON_EXTRACT như thế này
{"username": "jsmith"}2
Sau đó, chúng tôi thêm phần này vào câu lệnh CHỌN của mình
{ "username": "jsmith", "location": "United States" }3
Chúng tôi đã thêm hàm JSON_EXTRACT này vào mệnh đề WHERE của chúng tôi và thêm một điều kiện trong đó màu bằng “nâu”
Kết quả của truy vấn này được hiển thị bên dưới
idproduct_nameattributes1Chair{“color”. “nâu”, “chiều cao”. “60cm”, “chất liệu”. “gỗ”}2Bảng{“màu”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. “gỗ”}Bàn 4 cạnh{“màu”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Bàn ăn{“màu sắc”. “nâu”, “chất liệu”. [“gỗ”, “kim loại”]}Chúng ta có thể thấy rằng kết quả chỉ hiển thị các bản ghi có thuộc tính màu là màu nâu
Lối tắt cho JSON_EXTRACT
Ví dụ trước của chúng tôi đã sử dụng hàm JSON_EXTRACT để lọc các bản ghi dựa trên các thuộc tính JSON
{ "username": "jsmith", "location": "United States" }3
Có một lối tắt trong MySQL cho hàm JSON_EXTRACT. các -> biểu tượng
Điều này có nghĩa là bạn có thể sử dụng -> để viết hàm JSON_EXTRACT. Sử dụng biểu tượng này, cùng một truy vấn có thể được biểu diễn như thế này
{ "username": "jsmith", "location": "United States" }5
The results are
idproduct_nameattributes1Chair{“color”. “nâu”, “chiều cao”. “60cm”, “chất liệu”. “gỗ”}2Bảng{“màu”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. “gỗ”}Bàn 4 cạnh{“màu”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Bàn ăn{“màu sắc”. “nâu”, “chất liệu”. [“gỗ”, “kim loại”]}Điều này cho thấy kết quả tương tự như sử dụng tên chức năng thực tế
Điều này cũng có thể được sử dụng ở bất kỳ nơi nào có thể sử dụng hàm JSON_EXTRACT, chẳng hạn như trong mệnh đề SELECT
{ "username": "jsmith", "location": "United States" }6idproduct_namecolorattributes1Ghế màu nâu{“màu sắc”. “nâu”, “chiều cao”. “60cm”, “chất liệu”. “gỗ”}2Nâu bàn{“màu”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. “gỗ”}3Deskblack{“màu”. “đen”, “ngăn kéo”. [{"cạnh". “trái”, “chiều cao”. “30cm”}, {“bên”. “trái”, “chiều cao”. “40cm”}], “chất liệu”. “kim loại”}Bàn 4 cạnh Màu nâu{“màu”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Nâu bàn ăn{“màu”. “nâu”, “chất liệu”. [“wood”, “metal”]}6Deskwhite lớn{“color”. “trắng”, “ngăn kéo”. ["{\"cạnh\". \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”bên\”. \”phải\”, \”chiều cao\”. \”50cm\”}”], “chất liệu”. "kim loại"}
Đây là cách bạn có thể thấy một thuộc tính riêng lẻ bằng phím tắt cho JSON_EXTRACT
Tìm kiếm dữ liệu bằng JSON_CONTAINS
Hàm JSON_CONTAINS sẽ tìm kiếm kết quả khớp và trả về 1 nếu tìm thấy hoặc 0 nếu không tìm thấy
Cú pháp là
{ "username": "jsmith", "location": "United States" }7
Phải mất ba tham số
- Mục tiêu. tài liệu JSON để tìm kiếm bên trong
- ứng viên. tài liệu JSON để tìm kiếm
- đường dẫn. một giá trị đường dẫn tùy chọn để tìm kiếm trong mục tiêu
Hãy xem một số ví dụ
Ví dụ này xác định xem trường thuộc tính có chứa màu. cặp tên và giá trị màu nâu
{ "username": "jsmith", "location": "United States" }8
idproduct_namecontain_jsonattributes1Chair1{“color”. “nâu”, “chiều cao”. “60cm”, “chất liệu”. “gỗ”}2Bảng1{“màu”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. “gỗ”}3Desk0{“màu”. “đen”, “ngăn kéo”. [{"cạnh". “trái”, “chiều cao”. “30cm”}, {“bên”. “trái”, “chiều cao”. “40cm”}], “chất liệu”. “kim loại”}Bảng phụ 1{“màu sắc”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}Bàn ăn 1{“màu sắc”. “nâu”, “chất liệu”. [“gỗ”, “kim loại”]}6Bàn lớn0{“màu”. “trắng”, “ngăn kéo”. ["{\"cạnh\". \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”bên\”. \”phải\”, \”chiều cao\”. \”50cm\”}”], “chất liệu”. "kim loại"}
Chúng ta cũng có thể sử dụng JSON_OBJECT để tạo một trong hai tham số, vì JSON_OBJECT trả về kiểu dữ liệu JSON
{ "username": "jsmith", "location": "United States" }9idproduct_namecontain_jsonattributes1Chair1{“color”. “nâu”, “chiều cao”. “60cm”, “chất liệu”. “gỗ”}2Bảng1{“màu”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. “gỗ”}3Desk0{“màu”. “đen”, “ngăn kéo”. [{"cạnh". “trái”, “chiều cao”. “30cm”}, {“bên”. “trái”, “chiều cao”. “40cm”}], “chất liệu”. “kim loại”}Bảng phụ 1{“màu sắc”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}Bàn ăn 1{“màu sắc”. “nâu”, “chất liệu”. [“gỗ”, “kim loại”]}6Bàn lớn0{“màu”. “trắng”, “ngăn kéo”. ["{\"cạnh\". \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”bên\”. \”phải\”, \”chiều cao\”. \”50cm\”}”], “chất liệu”. "kim loại"}
Bạn có thể tìm kiếm trong một đường dẫn cụ thể bằng cách sử dụng tham số đường dẫn
Đây là truy vấn để tìm xem các thuộc tính có chứa cặp giá trị tên chiều cao và 40cm trong thuộc tính ngăn kéo hay không
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }0idproduct_namecontain_jsonattributes1Chairnull{“color”. “nâu”, “chiều cao”. “60cm”, “chất liệu”. “gỗ”}2Tablenull{“màu”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. “gỗ”}3Desk1{“màu”. “đen”, “ngăn kéo”. [{"cạnh". “trái”, “chiều cao”. “30cm”}, {“bên”. “trái”, “chiều cao”. “40cm”}], “chất liệu”. “kim loại”}4Side Tablenull{“màu”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Bàn ănnull{“màu”. “nâu”, “chất liệu”. [“gỗ”, “kim loại”]}6Bàn lớn0{“màu”. “trắng”, “ngăn kéo”. ["{\"cạnh\". \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”bên\”. \”phải\”, \”chiều cao\”. \”50cm\”}”], “chất liệu”. "kim loại"}
Nó hiển thị 1 cho tìm thấy, 0 cho không tìm thấy và null khi thuộc tính ngăn kéo không tồn tại
Có liên quan. Cách tách một chuỗi trong SQL [một phương pháp để thực hiện việc này là sử dụng các hàm JSON]
Tìm đường dẫn bằng JSON_SEARCH
Hàm JSON_SEARCH cho phép bạn tìm đường dẫn đến một chuỗi đã chỉ định
Cú pháp là
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }1
Các tham số là
- json_doc. đây là trường hoặc tài liệu JSON để tìm kiếm trong
- một_or_all. chỉ định “một” để kết thúc tìm kiếm sau lần khớp đầu tiên hoặc “tất cả” để trả về tất cả các kết quả khớp
- search_str. chuỗi để tìm kiếm trong json_doc
- thoát_char. được sử dụng nếu bạn muốn chỉ định % hoặc _ bằng chữ trong chuỗi tìm kiếm của mình [vì đó là các ký tự đại diện]
- đường dẫn. tìm kiếm chuỗi trong đường dẫn đã chỉ định
Hãy xem một số ví dụ
Dưới đây là một ví dụ về tìm kiếm chuỗi “nâu”
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }2
The results are
idproduct_namesearch_resultattributes1Chair“$. màu”{“màu”. “nâu”, “chiều cao”. “60cm”, “chất liệu”. “gỗ”}2Bàn“$. màu”{“màu”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. “gỗ”}3Desknull{“màu”. “đen”, “ngăn kéo”. [{"cạnh". “trái”, “chiều cao”. “30cm”}, {“bên”. “trái”, “chiều cao”. “40cm”}], “chất liệu”. “kim loại”}4Bàn phụ“$. màu”{“màu”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Bàn ăn“$. màu”{“màu”. “nâu”, “chất liệu”. [“wood”, “metal”]}6Desknull lớn{“color”. “trắng”, “ngăn kéo”. ["{\"cạnh\". \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”bên\”. \”phải\”, \”chiều cao\”. \”50cm\”}”], “chất liệu”. "kim loại"}Chúng ta có thể thấy rằng một số hàng đã trả về giá trị “$. màu sắc". Đây là đường dẫn chứa từ “nâu”
Điều gì sẽ xảy ra nếu chúng ta tìm kiếm tất cả các đường dẫn có chứa chữ cái “o”
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }3
The results are
idproduct_namesearch_resultattributes1Chair[“$. màu”, “$. chất liệu”]{“màu sắc”. “nâu”, “chiều cao”. “60cm”, “chất liệu”. “gỗ”}2Bàn[“$. màu”, “$. chất liệu”]{“màu sắc”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. “gỗ”}3Desknull{“màu”. “đen”, “ngăn kéo”. [{"cạnh". “trái”, “chiều cao”. “30cm”}, {“bên”. “trái”, “chiều cao”. “40cm”}], “chất liệu”. “kim loại”}4Bàn phụ[“$. màu”, “$. chất liệu[1]”]{“màu sắc”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Bàn ăn[“$. màu”, “$. chất liệu[0]”]{“màu sắc”. “nâu”, “chất liệu”. [“wood”, “metal”]}6Desknull lớn{“color”. “trắng”, “ngăn kéo”. ["{\"cạnh\". \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”bên\”. \”phải\”, \”chiều cao\”. \”50cm\”}”], “chất liệu”. "kim loại"}Chúng ta có thể thấy rằng một số hàng có nhiều kết quả, được chứa trong một mảng [dấu ngoặc vuông]
Hàm JSON_SEARCH khá mạnh nếu bạn cần tìm đường dẫn dựa trên chuỗi
Tìm loại giá trị bằng JSON_TYPE
Có một hàm gọi là JSON_TYPE cho phép bạn tìm loại giá trị JSON được cung cấp. Một số ví dụ về các loại là
- Sự vật
- Mảng
- số nguyên
Điều này có thể hữu ích nếu bạn cần thực hiện logic hoặc xử lý nhiều hơn trên một giá trị JSON
Hãy xem một số ví dụ
Đây là một ví dụ về việc sử dụng JSON_TYPE trên một giá trị JSON đầy đủ mà chúng ta đã thấy trong bảng của mình
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }4
The results are
idproduct_namejtypeattributes1ChairOBJECT{“màu sắc”. “đen”, “sâu”. “60cm”, “chiều rộng”. “100cm”, “chiều cao”. “60cm”, “chất liệu”. "gỗ"}Kết quả của hàm JSON_TYPE cho dữ liệu này là ĐỐI TƯỢNG, cho biết rằng chuỗi JSON là một đối tượng JSON
Chúng ta cũng có thể sử dụng điều này trên các mảng
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }5
Đây là kết quả
json_datajtype[“a”, “b”, “c”]ARRAYChúng ta có thể thấy rằng JSON_TYPE đã chỉ ra nó là một mảng
Hàm JSON_TYPE này có thể được sử dụng trên các giá trị khác nhau để xác định loại của nó
Cách cập nhật dữ liệu JSON trong MySQL
Đọc JSON là một chuyện. Nếu bạn cần cập nhật dữ liệu JSON thì sao?
Bạn có thể trích xuất chuỗi, thực hiện một số chuỗi con và công việc thay thế trên chuỗi, đồng thời thêm chuỗi đó vào trường, nhưng điều đó dễ xảy ra lỗi và tốn nhiều công sức
Có một vài chức năng trong MySQL cho phép bạn cập nhật một trường khá dễ dàng
Dưới đây là tóm tắt các phương pháp
Yêu cầuChức năngThêm khóa và giá trị mớiJSON_INSERTCập nhật giá trị cho khóa hiện cóJSON_REPLACEThêm khóa và giá trị mới hoặc cập nhật giá trị của khóa hiện tạiJSON_SETHãy xem một số ví dụ về chúng
Chèn một mục mới
Một cách để cập nhật dữ liệu JSON là thêm một mục mới vào giá trị JSON hiện có. Điều này có thể được thực hiện với hàm JSON_INSERT
Cú pháp hàm JSON_INSERT trông như thế này
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }6
Các tham số là
- json_doc. trường JSON sẽ được cập nhật
- đường dẫn. đường dẫn để thêm một giá trị mới cho
- val. giá trị cần thêm cho đường dẫn
Hàm này sẽ trả về giá trị JSON được cập nhật. Vì vậy, bởi vì chúng tôi đang cập nhật một hàng hiện có trong bảng, chúng tôi sử dụng câu lệnh CẬP NHẬT và chức năng này
Đây là mục đầu tiên trong bảng của chúng tôi
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }7idproduct_nameattributes1Chair{“color”. “nâu”, “chiều cao”. “60cm”, “chất liệu”. "gỗ"}
Giả sử chúng ta muốn thêm tên và giá trị thuộc tính mới, ngoài màu sắc, chiều cao và chất liệu đã tồn tại. Thuộc tính mới này sẽ là "chiều rộng" và giá trị là 100cm
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }8
Đường dẫn là “$. width” vì đây là thuộc tính chiều rộng ở cấp cao nhất [không nằm trong thuộc tính khác]
Chúng ta có thể chạy câu lệnh SELECT tương tự như trên để xem giá trị được cập nhật
idproduct_nameattributes1Chair‘{“color”. “nâu”, “chiều rộng”. “100cm”, “chiều cao”. “60cm”, “chất liệu”. "gỗ"}'Chúng ta có thể thấy rằng "chiều rộng" đã được thêm vào danh sách các thuộc tính
Chèn nơi khóa đã tồn tại
Điều gì xảy ra nếu chúng ta sử dụng hàm JSON_INSERT nhưng khóa đã tồn tại?
- thêm giá trị thứ hai, biến giá trị thuộc tính thành một mảng?
- ghi đè giá trị hiện tại bằng giá trị mới
- thêm tên thuộc tính thứ hai và cặp giá trị
- bị phớt lờ?
Hãy xem nào
Truy vấn này sẽ cập nhật cùng một sản phẩm bằng cách sử dụng khóa thuộc tính đã tồn tại [màu]. Chúng tôi cũng đang thêm một thuộc tính mới gọi là "độ sâu", vì vậy chúng tôi có thể thấy rằng câu lệnh đã chạy thành công [bằng cách xem độ sâu đó đã được thêm vào]
Đây là tuyên bố
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }9
Tuyên bố này chạy thành công
Đây là câu lệnh SELECT và đầu ra
{ "username": "jsmith", "location": "United States", "posts": [ { "id":"1", "title":"Welcome" }, { "id":"4", "title":"What started it all" } ] }7idproduct_nameattributes1Chair{“color”. “nâu”, “sâu”. “60cm”, “chiều rộng”. “100cm”, “chiều cao”. “60cm”, “chất liệu”. "gỗ"}
Thuộc tính độ sâu được thêm vào. Tuy nhiên, thuộc tính màu không thay đổi. Điều này là do hàm JSON_INSERT bỏ qua bất kỳ đường dẫn nào trong hàm mà đường dẫn đã tồn tại. Vì vậy, giá trị màu vẫn là màu nâu và không cập nhật thành màu trắng
Cập nhật giá trị hiện có với JSON_REPLACE
Nếu bạn muốn thay thế giá trị của một thuộc tính bên trong trường JSON bằng một giá trị khác, bạn có thể sử dụng hàm JSON_REPLACE
Cú pháp của MySQL JSON_REPLACE trông như thế này
CREATE TABLE product [
id INT,
product_name VARCHAR[200],
attributes JSON
];
1Các tham số là
- json_doc. trường JSON sẽ được cập nhật
- đường dẫn. đường dẫn để cập nhật giá trị cho
- val. giá trị để cập nhật
Đường dẫn phải tham chiếu đến khóa thuộc tính hiện có. Nếu nó không tồn tại thì sẽ không có gì được thực hiện [thuộc tính sẽ không được thêm vào]
Hãy xem một số ví dụ
Đây là ID sản phẩm đầu tiên của chúng tôi
idproduct_nameattributes1Chair{“color”. “nâu”, “sâu”. “60cm”, “chiều rộng”. “100cm”, “chiều cao”. “60cm”, “chất liệu”. "gỗ"}Chúng ta có thể cập nhật giá trị của màu thành màu đen bằng cách sử dụng hàm JSON_REPLACE này. Bởi vì chúng tôi đang cập nhật một giá trị hiện có, chúng tôi sử dụng câu lệnh CẬP NHẬT
CREATE TABLE product [
id INT,
product_name VARCHAR[200],
attributes JSON
];
2Chúng tôi có thể chọn từ bảng này và xem bản ghi được cập nhật
idproduct_nameattributes1Chair{“color”. “đen”, “sâu”. “60cm”, “chiều rộng”. “100cm”, “chiều cao”. “60cm”, “chất liệu”. "gỗ"}
Chèn và cập nhật với JSON_SET
Hàm JSON_INSERT chèn một thuộc tính mới và JSON_REPLACE cập nhật một thuộc tính hiện có
Hàm JSON_SET kết hợp cả hai. cập nhật giá trị nếu nó tồn tại hoặc chèn nó nếu nó không tồn tại
Cú pháp là
CREATE TABLE product [
id INT,
product_name VARCHAR[200],
attributes JSON
];
3Các tham số là
- json_doc. trường JSON sẽ được cập nhật
- đường dẫn. đường dẫn để cập nhật giá trị cho hoặc chèn một thuộc tính mới cho
- val. giá trị để cập nhật hoặc chèn cho thuộc tính
Lưu ý rằng có dấu ngoặc vuông trong cú pháp, biểu thị các giá trị tùy chọn. Bạn có thể thêm nhiều tham số đường dẫn và giá trị bổ sung để thêm hoặc cập nhật nhiều giá trị
Hãy xem một ví dụ sử dụng ID sản phẩm 2
CREATE TABLE product [
id INT,
product_name VARCHAR[200],
attributes JSON
];
4idproduct_nameattributes2Bảng{“màu sắc”. “nâu”, “chiều cao”. “110cm”, “chất liệu”. "gỗ"}Hãy thay đổi giá trị màu thành màu đen và độ sâu thành 100cm. Chúng ta có thể sử dụng hàm JSON_SET để làm điều này
CREATE TABLE product [
id INT,
product_name VARCHAR[200],
attributes JSON
];
5Đây là dữ liệu cập nhật
idproduct_nameattributes2Table{“màu sắc”. “đen”, “sâu”. “100cm”, “chiều cao”. “110cm”, “chất liệu”. "gỗ"}Chúng ta có thể thấy rằng giá trị màu hiện tại đã được thay đổi thành màu đen và thuộc tính độ sâu mới đã được thêm vào
Bạn cũng có thể xem thêm các ví dụ trong hướng dẫn này tại đây
Cách xóa khỏi trường JSON trong MySQL
Có hai thao tác XÓA mà bạn có thể thực hiện khi làm việc với các trường JSON
- xóa một thuộc tính khỏi trường JSON
- xóa một hàng khỏi bảng của bạn
Xóa một hàng bằng JSON_EXTRACT
Việc xóa một hàng khỏi bảng của bạn được thực hiện giống như SQL thông thường. Bạn có thể viết câu lệnh SQL để xóa hàng khớp với ID của mình hoặc sử dụng JSON_EXTRACT
Ví dụ: để xóa tất cả các hàng có thuộc tính màu là màu nâu
CREATE TABLE product [
id INT,
product_name VARCHAR[200],
attributes JSON
];
6Thao tác này sẽ xóa các bản ghi phù hợp khỏi bảng
Xóa thuộc tính khỏi trường JSON
Một cách khác để xóa dữ liệu JSON là xóa thuộc tính khỏi trường JSON
Điều này khác với việc cập nhật, vì bạn đang loại bỏ hoàn toàn thuộc tính thay vì chỉ cập nhật giá trị của nó sang một thứ khác
Chúng ta có thể làm điều này với câu lệnh UPDATE và hàm JSON_REMOVE
Hàm JSON_REMOVE sẽ xóa dữ liệu khỏi trường JSON. Cú pháp là
CREATE TABLE product [
id INT,
product_name VARCHAR[200],
attributes JSON
];
7Các tham số là
- json_doc. trường JSON để xóa dữ liệu khỏi
- đường dẫn. đường dẫn đến thuộc tính để loại bỏ
Không cần chỉ định giá trị như các hàm JSON khác
Hãy xem một ví dụ bằng cách xóa một thuộc tính khỏi ID sản phẩm 2
CREATE TABLE product [
id INT,
product_name VARCHAR[200],
attributes JSON
];
4idproduct_nameattributes2Bảng{“màu sắc”. “đen”, “sâu”. “100cm”, “chiều cao”. “110cm”, “chất liệu”. "gỗ"}Chúng ta có thể chạy câu lệnh CẬP NHẬT với JSON_REMOVE để xóa thuộc tính “chiều cao”
CREATE TABLE product [
id INT,
product_name VARCHAR[200],
attributes JSON
];
9Sau đó, chúng tôi có thể chọn lại dữ liệu từ bảng để thấy rằng nó đã bị xóa
idproduct_nameattributes2Table{“màu sắc”. “đen”, “sâu”. “100cm”, “chất liệu”. "gỗ"}Thuộc tính chiều cao không còn trong trường JSON
Xác thực dữ liệu JSON
Chúng ta đã thấy trong các ví dụ cho đến nay trong hướng dẫn này rằng kiểu dữ liệu JSON trong MySQL sẽ tự động xác thực dữ liệu cho bạn. Nó đảm bảo bạn chỉ có thể chèn dữ liệu JSON hợp lệ vào trường
MySQL cũng bao gồm một chức năng cho phép bạn kiểm tra xem một chuỗi có phải là trường JSON hợp lệ hay không. Điều này có thể hữu ích nếu bạn đang chấp nhận một chuỗi JSON từ một hệ thống khác
Hàm này là JSON_VALID. Bạn cung cấp cho nó một giá trị và nó trả về 1 nếu đó là chuỗi JSON hợp lệ và 0 nếu không phải
Cú pháp là
INSERT INTO product [id, product_name, attributes]
VALUES [1, 'Chair', '{"color":"brown", "material":"wood", "height":"60cm"}'];
0Dưới đây là một số ví dụ
Ví dụ về Chuỗi JSON hợp lệ
Giả sử chúng ta có chuỗi JSON này
INSERT INTO product [id, product_name, attributes]
VALUES [1, 'Chair', '{"color":"brown", "material":"wood", "height":"60cm"}'];
1Chúng tôi có thể kiểm tra xem điều này có hợp lệ hay không bằng cách xem nó để biết dấu ngoặc kép và các ký hiệu khác ở đúng vị trí. Hoặc chúng ta có thể chuyển nó vào hàm JSON_VALID
INSERT INTO product [id, product_name, attributes]
VALUES [1, 'Chair', '{"color":"brown", "material":"wood", "height":"60cm"}'];
2valid_test1Kết quả là 1 nên đó là một giá trị JSON hợp lệ
Ví dụ về chuỗi JSON không hợp lệ
Nếu giá trị không hợp lệ thì sao?
Chúng ta có thể thấy chuỗi JSON mẫu này
INSERT INTO product [id, product_name, attributes]
VALUES [1, 'Chair', '{"color":"brown", "material":"wood", "height":"60cm"}'];
3Thoạt nhìn, nó có vẻ hợp lệ. Hãy sử dụng hàm JSON_VALID để kiểm tra
INSERT INTO product [id, product_name, attributes]
VALUES [1, 'Chair', '{"color":"brown", "material":"wood", "height":"60cm"}'];
4valid_test0Kết quả là 0 nên đây không phải là giá trị JSON hợp lệ. Kết quả không cho biết vấn đề nằm ở đâu trong chuỗi được cung cấp, nhưng nó cho bạn biết chuỗi đó không hợp lệ để bạn có thể xem xét kỹ hơn
Cải thiện hiệu suất của các truy vấn JSON
Các tính năng và hỗ trợ JSON trong MySQL khá tốt và mỗi phiên bản bao gồm nhiều tính năng hơn
Vì vậy, với điều kiện là bạn có thể thêm các cột JSON vào bảng, trích xuất các trường và nhận được tất cả tính linh hoạt của các trường JSON khi xác thực, sẽ không tốt hơn nếu chỉ lưu trữ tất cả dữ liệu của bạn trong các trường JSON thay vì các bảng được chuẩn hóa?
Vâng, đôi khi đó có thể là một ý tưởng tốt. Nhưng sau đó, bạn có thể sử dụng cơ sở dữ liệu NoQuery tốt hơn thay vì MySQL
Một lý do khác khiến việc sử dụng các trường JSON chủ yếu để lưu trữ dữ liệu của bạn không phải là một ý tưởng hay là nó có thể gặp khó khăn về hiệu suất
Chọn hiệu suất
Ví dụ: giả sử chúng tôi muốn chọn tất cả các sản phẩm có màu nâu. Chúng ta có thể sử dụng hàm JSON_EXTRACT trong mệnh đề WHERE mà chúng ta đã thấy trước đó trong hướng dẫn này
{ "username": "jsmith", "location": "United States" }3
Hãy xem kế hoạch thực hiện cho điều này
Kế hoạch thực hiện hiển thị bước Quét toàn bộ bảng, đây là loại truy cập chậm. Điều này có thể ổn đối với bảng của chúng tôi, chỉ có một vài bản ghi, nhưng một khi bạn bắt đầu làm việc với các bảng lớn hơn, nó có thể khá chậm
Vì vậy, sử dụng hàm JSON_EXTRACT trong mệnh đề WHERE có nghĩa là quét toàn bộ bảng được sử dụng
Chúng ta có thể làm gì?
Một giải pháp để chọn dữ liệu
May mắn thay, MySQL cho phép bạn xác định một cột ảo trên bảng và tạo một chỉ mục trên cột ảo đó. Điều này sẽ làm cho truy vấn của chúng tôi nhanh hơn
Cột ảo là cột tính toán dựa trên một cột khác trong bảng
Hãy xem làm thế nào chúng ta có thể làm điều đó
Đầu tiên, chúng ta tạo một cột mới chứa thuộc tính color
INSERT INTO product [id, product_name, attributes]
VALUES [1, 'Chair', '{"color":"brown", "material":"wood", "height":"60cm"}'];
6Chúng ta có thể chọn từ bảng sản phẩm để xem
INSERT INTO product [id, product_name, attributes]
VALUES [1, 'Chair', '{"color":"brown", "material":"wood", "height":"60cm"}'];
7idproduct_namecolorattributes1Ghế“đen”{“màu”. “đen”, “sâu”. “60cm”, “chiều rộng”. “100cm”, “chiều cao”. “60cm”, “chất liệu”. “gỗ”}2Bảng“đen”{“màu”. “đen”, “sâu”. “100cm”, “chất liệu”. “gỗ”}3Desk“đen”{“màu”. “đen”, “ngăn kéo”. [{"cạnh". “trái”, “chiều cao”. “30cm”}, {“bên”. “trái”, “chiều cao”. “40cm”}], “chất liệu”. “kim loại”}4Bảng phụ“nâu”{“màu”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Bàn ăn “nâu”{“màu sắc”. “nâu”, “chất liệu”. [“gỗ”, “kim loại”]}6Bàn lớn“trắng”{“màu”. “trắng”, “ngăn kéo”. ["{\"cạnh\". \”trái\”, \”chiều cao\”. \”50cm\”}”, “{\”bên\”. \”phải\”, \”chiều cao\”. \”50cm\”}”], “chất liệu”. "kim loại"}Bây giờ, chúng ta có thể tạo một chỉ mục trên cột mới này
INSERT INTO product [id, product_name, attributes]
VALUES [1, 'Chair', '{"color":"brown", "material":"wood", "height":"60cm"}'];
8Bây giờ, hãy chọn lại từ bảng, lọc trên cột ảo thay vì trường JSON
INSERT INTO product [id, product_name, attributes]
VALUES [1, 'Chair', '{"color":"brown", "material":"wood", "height":"60cm"}'];
9Lưu ý rằng bộ lọc trong mệnh đề WHERE bao gồm dấu ngoặc kép, vì đây là giá trị được trích xuất từ trường JSON
The results are
idproduct_namecolorattributes4Side Tablebrown{“color”. “nâu”, “chất liệu”. [“kim loại”, “gỗ”]}5Nâu bàn ăn{“màu”. “nâu”, “chất liệu”. [“gỗ”, “kim loại”]}Chúng ta có thể kiểm tra kế hoạch thực hiện để xem nó đã được chạy như thế nào
Chúng ta có thể thấy rằng bước này hiện được gọi là “Tra cứu khóa không phải duy nhất” và chỉ mục đã được sử dụng. Điều này hiệu quả hơn Quét toàn bộ bảng
Đã nói tất cả những điều đó, nếu bạn đang tạo các cột ảo để có thể truy cập dữ liệu trong các trường JSON của MySQL hiệu quả hơn chỉ để làm cho ứng dụng và cơ sở dữ liệu của bạn hoạt động, thì có lẽ trường JSON không phù hợp với cơ sở dữ liệu của bạn. Nhưng chỉ có bạn mới biết điều đó – mỗi trường hợp là khác nhau
Mẹo để làm việc với JSON trong MySQL
Trong hướng dẫn này, chúng ta đã xem JSON là gì, cách tạo các trường JSON trong MySQL và biết nhiều cách chúng ta có thể làm việc với chúng
Vì vậy, cách tốt nhất để làm việc với các trường JSON trong MySQL là gì?
Dưới đây là một số mẹo tôi có thể cung cấp để sử dụng JSON trong MySQL. Chúng có thể không áp dụng cho ứng dụng hoặc cơ sở dữ liệu của bạn nhưng chúng là những thứ cần xem xét
Chỉ vì bạn có thể, không có nghĩa là bạn nên
JSON linh hoạt và khá mạnh mẽ, nhưng chỉ vì bạn có thể lưu trữ dữ liệu trong trường JSON, không có nghĩa là bạn nên. Cân nhắc sử dụng các lợi thế của cơ sở dữ liệu quan hệ MySQL và sử dụng JSON khi thích hợp
Đối xử với trường JSON như một hộp đen
Trường JSON có thể được sử dụng để lưu trữ dữ liệu JSON hợp lệ do ứng dụng của bạn gửi hoặc nhận. Mặc dù có các chức năng để đọc và làm việc với trường JSON, tốt hơn hết là chỉ lưu trữ dữ liệu JSON trong trường, truy xuất dữ liệu đó từ ứng dụng của bạn và xử lý dữ liệu đó ở đó
Đây là khái niệm về hộp đen. Ứng dụng đưa dữ liệu vào và đọc dữ liệu từ nó và cơ sở dữ liệu không quan tâm đến những gì bên trong trường
Nó có thể hiệu quả hoặc không phù hợp với trường hợp của bạn, nhưng hãy cân nhắc áp dụng phương pháp này
Tìm kiếm theo Khóa chính và các trường khác
Chúng tôi đã thấy rằng việc tìm kiếm theo các thuộc tính bên trong trường JSON có thể chậm. Xem xét lọc theo khóa chính và các trường khác trong bảng, thay vì các thuộc tính bên trong trường JSON. Điều này sẽ giúp với hiệu suất
Sự kết luận
Tôi hy vọng bạn tìm thấy hướng dẫn này hữu ích. Bạn đã sử dụng các trường JSON trong MySQL chưa?