MySQL – JSON
MySQL provides a native JSON (JavaScript Object Notation) datatype that enables efficient access to the data in JSON documents. This datatype is introduced in MySQL versions 5.7.8 and later.
Before it was introduced, the JSON-format strings were stored in the string columns of a table. However, the JSON datatype proves to be more advantageous than strings due to the following reasons −
- It automatically validates the JSON documents, displaying an error whenever an invalid document is stored.
- It stores the JSON documents in an internal format allowing easy read access to the document elements. Hence, when the MySQL server later reads the stored JSON values in a binary format, it just enables the server to look up subobjects or nested values directly by key or array index without reading all values before or after them in the document.
The storage requirements for JSON documents are similar to those of LONGBLOB or LONGTEXT data types.
MySQL JSON
To define a table column with JSON datatype, we use the keyword JSON in the CREATE TABLE statement.
We can create two types of JSON values in MySQL:
-
JSON array: It is a list of values separated by commas and enclosed within square brackets ([]).
-
JSON object: An object with a set of key-value pairs separated by commas and enclosed within curly brackets ({}).
Syntax
Following is the syntax to define a column whose data type is JSON −
CREATE TABLE table_name ( ... column_name JSON, ... );
Example
Let us see an example demonstrating the usage of JSON datatype in a MySQL table. Here, we are creating a table named MOBILES using the following query −
CREATE TABLE MOBILES( ID INT NOT NULL, NAME VARCHAR(25) NOT NULL, PRICE DECIMAL(18,2), FEATURES JSON, PRIMARY KEY(ID) );
Now, let us insert values into this table using the INSERT statement. In the FEATURES column, we use key-value pairs as a JSON value.
INSERT INTO MOBILES VALUES (121, ''iPhone 15'', 90000.00, ''{"OS": "iOS", "Storage": "128GB", "Display": "15.54cm"}''), (122, ''Samsung S23'', 79000.00, ''{"OS": "Android", "Storage": "128GB", "Display": "15.49cm"}''), (123, ''Google Pixel 7'', 59000.00, ''{"OS": "Android", "Storage": "128GB", "Display": "16cm"}'');
Output
The table will be created as −
ID | NAME | PRICE | FEATURES |
---|---|---|---|
121 | iPhone 15 | 90000.00 | {“OS”: “iOS”, “Storage”: “128GB”, “Display”: “15.54cm”} |
122 | Samsung S23 | 79000.00 | {“OS”: “Android”, “Storage”: “128GB”, “Display”: “15.49cm”} |
123 | Google Pixel 7 | 59000.00 | {“OS”: “Android”, “Storage”: “128GB”, “Display”: “16cm”} |
Retrieving Data From JSON Column
As JSON datatype provides an easier read access to all JSON elements, we can also retrieve each element directly from the JSON column. MySQL provides a JSON_EXTRACT() function to do so.
Syntax
Following is the syntax of the JSON_EXTRACT() function −
JSON_EXTRACT(json_doc, path)
In a JSON array, we can retrieve a particular element by specifying its index (starting from 0). And in a JSON object, we specify the key from key-value pairs.
Example
In this example, from the previously created MOBILES table we are retrieving the OS name of each mobile using the following query −
SELECT NAME, JSON_EXTRACT(FEATURES,''$.OS'') AS OS FROM MOBILES;
Instead of calling the function, we can also use -> as a shortcut for JSON_EXTRACT. Look at the query below −
SELECT NAME, FEATURES->''$.OS'' AS OS FROM MOBILES;
Output
Both queries display the same following output −
NAME | FEATURES |
---|---|
iPhone 15 | “iOS” |
Samsung S23 | “Android” |
Google Pixel 7 | “Android” |
The JSON_UNQUOTE() Function
The JSON_UNQUOTE() function is used to remove the quotes while retrieving the JSON string. Following is the syntax −
JSON_UNQUOTE(JSON_EXTRACT(json_doc, path))
Example
In this example, let us display the OS name of each mobile without the quotes −
SELECT NAME, JSON_UNQUOTE(JSON_EXTRACT(FEATURES,''$.OS'')) AS OS FROM MOBILES;
Or, we can use ->> as a shortcut for JSON_UNQUOTE(JSON_EXTRACT(…)).
SELECT NAME, FEATURES->>''$.OS'' AS OS FROM MOBILES;
Output
Both queries display the same following output −
NAME | FEATURES |
---|---|
iPhone 15 | iOS |
Samsung S23 | Android |
Google Pixel 7 | Android |
We cannot use chained -> or ->> to extract data from nested JSON object or JSON array. These two can only be used for the top level.
The JSON_TYPE() Function
As we know, the JSON field can hold values in the form of arrays and objects. To identify which type of values are stored in the field, we use the JSON_TYPE() function. Following is the syntax −
JSON_TYPE(json_doc)
Example
In this example, let us check the type of the FEATURES column of MOBILES table using JSON_TYPE() function.
SELECT JSON_TYPE(FEATURES) FROM MOBILES;
Output
As we can see in the output, the songs column type is OBJECT.
JSON_TYPE(FEATURES) |
---|
OBJECT |
OBJECT |
OBJECT |
The JSON_ARRAY_APPEND() Function
If we want to add another element to the JSON field in MySQL, we can use the JSON_ARRAY_APPEND() function. However, the new element will only be appended as an array. Following is the syntax −
JSON_ARRAY_APPEND(json_doc, path, new_value);
Example
Let us see an example where we are adding a new element at the end of the JSON object using the JSON_ARRAY_APPEND() function −
UPDATE MOBILES SET FEATURES = JSON_ARRAY_APPEND(FEATURES,''$'',"Resolution:2400x1080 Pixels");
We can verify whether the value is added or not using a SELECT query −
SELECT NAME, FEATURES FROM MOBILES;
Output
The table will be updated as −
NAME | FEATURES |
---|---|
iPhone 15 | {“OS”: “iOS”, “Storage”: “128GB”, “Display”: “15.54cm”, “Resolution: 2400 x 1080 Pixels”} |
Samsung S23 | {“OS”: “Android”, “Storage”: “128GB”, “Display”: “15.49cm”, “Resolution: 2400 x 1080 Pixels”} |
Google Pixel 7 | {“OS”: “Android”, “Storage”: “128GB”, “Display”: “16cm”, “Resolution: 2400 x 1080 Pixels”} |
The JSON_ARRAY_INSERT() Function
We can only insert a JSON value at the end of the array using the JSON_ARRAY_APPEND() function. But, we can also choose a position to insert a new value into the JSON field using the JSON_ARRAY_INSERT() function. Following is the syntax −
JSON_ARRAY_INSERT(json_doc, pos, new_value);
Example
Here, we are adding a new element in the index=1 of the array using the JSON_ARRAY_INSERT() function −
UPDATE MOBILES SET FEATURES = JSON_ARRAY_INSERT( FEATURES, ''$[1]'', "Charging: USB-C" );
To verify whether the value is added or not, display the updated table using the SELECT query −
SELECT NAME, FEATURES FROM MOBILES;
Output
The table will be updated as −
NAME | FEATURES |
---|---|
iPhone 15 | {“OS”: “iOS”, “Storage”: “128GB”, “Display”: “15.54cm”, “Charging: USB-C”, “Resolution: 2400 x 1080 Pixels”} |
Samsung S23 | {“OS”: “Android”, “Storage”: “128GB”, “Display”: “15.49cm”, “Charging: USB-C”, “Resolution: 2400 x 1080 Pixels”} |
Google Pixel 7 | {“OS”: “Android”, “Storage”: “128GB”, “Display”: “16cm”, “Charging: USB-C”, “Resolution: 2400 x 1080 Pixels”} |
JSON Using Client Program
We can also define a MySQL table column with the JSON datatype using Client Program.
Syntax
To create a column of JSON type through a PHP program, we need to execute the CREATE TABLE statement with JSON datatype on a column using the mysqli function query() as follows −
$sql = ''CREATE TABLE Blackpink (ID int AUTO_INCREMENT PRIMARY KEY NOT NULL, SONGS JSON) $mysqli->query($sql);
To create a column of JSON type through a JavaScript program, we need to execute the CREATE TABLE statement with JSON datatype on a column using the query() function of mysql2 library as follows −
sql = "CREATE TABLE Blackpink (ID int AUTO_INCREMENT PRIMARY KEY NOT NULL,SONGS JSON)"; con.query(sql)
To create a column of JSON type through a Java program, we need to execute the CREATE TABLE statement with JSON datatype on a column using the JDBC function execute() as follows −
String sql = "CREATE TABLE Blackpink (ID int AUTO_INCREMENT PRIMARY KEY NOT NULL, SONGS JSON)"; statement.execute(sql);
To create a column of JSON type through a Python program, we need to execute the CREATE TABLE statement with JSON datatype on a column using the execute() function of the MySQL Connector/Python as follows −
create_table_query = ''CREATE TABLE Blackpink (ID int AUTO_INCREMENT PRIMARY KEY NOT NULL, SONGS JSON)'' cursorObj.execute(create_table_query)
Example
Following are the programs −
$dbhost = ''localhost $dbuser = ''root $dbpass = ''password $dbname = ''TUTORIALS $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname); if ($mysqli->connect_errno) { printf("Connect failed: %s
", $mysqli->connect_error); exit(); } // Create table Blackpink $sql = ''CREATE TABLE Blackpink (ID int AUTO_INCREMENT PRIMARY KEY NOT NULL, SONGS JSON) $result = $mysqli->query($sql); if ($result) { echo "Table created successfully...!
"; } // Insert data into the created table $q = "INSERT INTO Blackpink (SONGS) VALUES (JSON_ARRAY(''Pink venom'', ''Shutdown'', ''Kill this love'', ''Stay'', ''BOOMBAYAH'', ''Pretty Savage'', ''PLAYING WITH FIRE''))"; if ($res = $mysqli->query($q)) { echo "Data inserted successfully...!
"; } // Now display the JSON type $s = "SELECT JSON_TYPE(SONGS) FROM Blackpink"; if ($res = $mysqli->query($s)) { while ($row = mysqli_fetch_array($res)) { echo $row[0] . "n"; } } else { echo ''Failed } // JSON_EXTRACT function to fetch the element $sql = "SELECT JSON_EXTRACT(SONGS, ''$[2]'') FROM Blackpink"; if ($r = $mysqli->query($sql)) { while ($row = mysqli_fetch_array($r)) { echo $row[0] . "n"; } } else { echo ''Failed } $mysqli->close();
Output
The output obtained is as shown below −
ARRAY "Kill this love"
var mysql = require(''mysql2''); var con = mysql.createConnection({ host: "localhost", user: "root", password: "Nr5a0204@123" }); // Connecting to MySQL con.connect(function (err) { if (err) throw err; console.log("Connected!"); console.log("--------------------------"); // Create a new database sql = "Create Database TUTORIALS"; con.query(sql); sql = "USE TUTORIALS"; con.query(sql); //Creating Blackpink table sql = "CREATE TABLE Blackpink (ID int AUTO_INCREMENT PRIMARY KEY NOT NULL,SONGS JSON)"; con.query(sql); sql = "INSERT INTO Blackpink (ID, SONGS) VALUES (ID, JSON_ARRAY(''Pink venom'',''Shutdown'', ''Kill this love'', ''Stay'', ''BOOMBAYAH'', ''Pretty Savage'', ''PLAYING WITH FIRE''));" con.query(sql); sql = "select * from blackpink;" con.query(sql, function(err, result){ if (err) throw err console.log("Records in Blackpink Table"); console.log(result); console.log("--------------------------"); }); sql = "SELECT JSON_TYPE(songs) FROM Blackpink;" con.query(sql, function(err, result){ if (err) throw err console.log("Type of the column"); console.log(result); console.log("--------------------------"); }); sql = "SELECT JSON_EXTRACT(songs, ''$[2]'') FROM Blackpink;" con.query(sql, function(err, result){ console.log("fetching the third element in the songs array "); if (err) throw err console.log(result); }); });
Output
The output obtained is as shown below −
Connected! -------------------------- Records in Blackpink Table [ { ID: 1, SONGS: [ ''Pink venom'', ''Shutdown'', ''Kill this love'', ''Stay'', ''BOOMBAYAH'', ''Pretty Savage'', ''PLAYING WITH FIRE'' ] } ] -------------------------- Type of the column [ { ''JSON_TYPE(songs)'': ''ARRAY'' } ] -------------------------- fetching the third element in the songs array [ { "JSON_EXTRACT(songs, ''$[2]'')": ''Kill this love'' } ]
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class Json { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/TUTORIALS"; String username = "root"; String password = "password"; try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection connection = DriverManager.getConnection(url, username, password); Statement statement = connection.createStatement(); System.out.println("Connected successfully...!"); //create a table that takes a column of Json...! String sql = "CREATE TABLE Blackpink (ID int AUTO_INCREMENT PRIMARY KEY NOT NULL, SONGS JSON)"; statement.execute(sql); System.out.println("Table created successfully...!"); String sql1 = "INSERT INTO Blackpink (SONGS) VALUES (JSON_ARRAY(''Pink venom'', ''Shutdown'', ''Kill this love'', ''Stay'', ''BOOMBAYAH'', ''Pretty Savage'', ''PLAYING WITH FIRE''))"; statement.execute(sql1); System.out.println("Json data inserted successfully...!"); // Now display the JSON type String sql2 = "SELECT JSON_TYPE(SONGS) FROM Blackpink"; ResultSet resultSet = statement.executeQuery(sql2); while (resultSet.next()){ System.out.println("Json_type:"+" "+resultSet.getNString(1)); } // JSON_EXTRACT function to fetch the element String sql3 = "SELECT JSON_EXTRACT(SONGS, ''$[2]'') FROM Blackpink"; ResultSet resultSet1 = statement.executeQuery(sql3); while (resultSet1.next()){ System.out.println("Song Name:"+" "+resultSet1.getNString(1)); } connection.close(); } catch (Exception e) { e.printStackTrace(); } } }
Output
The output obtained is as shown below −
Connected successfully...! Table created successfully...! Json data inserted successfully...! Json_type: ARRAY Song Name: "Kill this love"
import mysql.connector # Establishing the connection connection = mysql.connector.connect( host=''localhost'', user=''root'', password=''password'', database=''tut'' ) # Creating a cursor object cursorObj = connection.cursor() # Creating the table ''Blackpink'' with JSON column create_table_query = '''''' CREATE TABLE Blackpink ( ID int AUTO_INCREMENT PRIMARY KEY NOT NULL, SONGS JSON )'''''' cursorObj.execute(create_table_query) print("Table ''Blackpink'' is created successfully!") # Adding values into the above-created table insert = """ INSERT INTO Blackpink (SONGS) VALUES (JSON_ARRAY(''Pink venom'', ''Shutdown'', ''Kill this love'', ''Stay'', ''BOOMBAYAH'', ''Pretty Savage'', ''PLAYING WITH FIRE'')); """ cursorObj.execute(insert) print("Values inserted successfully!") # Display table display_table = "SELECT * FROM Blackpink;" cursorObj.execute(display_table) # Printing the table ''Blackpink'' results = cursorObj.fetchall() print("nBlackpink Table:") for result in results: print(result) # Checking the type of the ''SONGS'' column type_query = "SELECT JSON_TYPE(SONGS) FROM Blackpink;" cursorObj.execute(type_query) song_type = cursorObj.fetchone() print("nType of the ''SONGS'' column:") print(song_type[0]) # Fetching the third element in the ''SONGS'' array fetch_query = "SELECT JSON_EXTRACT(SONGS, ''$[2]'') FROM Blackpink;" cursorObj.execute(fetch_query) third_element = cursorObj.fetchone() print("nThird element in the ''SONGS'' array:") print(third_element[0]) # Closing the cursor and connection cursorObj.close() connection.close()
Output
The output obtained is as shown below −
Table ''Blackpink'' is created successfully! Values inserted successfully! Blackpink Table: (1, ''["Pink venom", "Shutdown", "Kill this love", "Stay", "BOOMBAYAH", "Pretty Savage", "PLAYING WITH FIRE"]'') Type of the ''SONGS'' column: ARRAY Third element in the ''SONGS'' array: "Kill this love"