PostgreSQL JSON/JSONB
-- Create table with JSONB
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
data JSONB
);
-- Insert JSON data
INSERT INTO products (name, data) VALUES
('Widget', '{"price": 19.99, "tags": ["electronics", "gadget"], "stock": 100}'),
('Gadget', '{"price": 29.99, "tags": ["electronics"], "stock": 50}');
-- Query JSON fields
SELECT * FROM products WHERE data->>'price' = '19.99';
SELECT * FROM products WHERE (data->>'stock')::int > 50;
-- JSON operators
-- -> : Get JSON object field (returns JSON)
-- ->> : Get JSON object field as text
-- #> : Get JSON object at path (returns JSON)
-- #>> : Get JSON object at path as text
-- @> : Contains (left JSON contains right)
-- ? : Key exists
SELECT name, data->'price' FROM products; -- Returns JSON
SELECT name, data->>'price' FROM products; -- Returns text
SELECT name, data#>'{tags,0}' FROM products; -- First tag
-- Check if key exists
SELECT * FROM products WHERE data ? 'price';
SELECT * FROM products WHERE data ?& ARRAY['price', 'stock'];
-- Contains queries
SELECT * FROM products WHERE data @> '{"tags": ["electronics"]}';
SELECT * FROM products WHERE data->'tags' @> '["gadget"]';
-- Update JSON
UPDATE products
SET data = data || '{"featured": true}'
WHERE name = 'Widget';
UPDATE products
SET data = jsonb_set(data, '{price}', '24.99')
WHERE name = 'Widget';
-- Delete JSON key
UPDATE products SET data = data - 'featured';
-- Create index for JSON queries
CREATE INDEX idx_products_data ON products USING GIN(data);
CREATE INDEX idx_products_price ON products ((data->>'price'));
PostgreSQL Full-Text Search
-- Create table with text search
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
title TEXT,
content TEXT,
search_vector TSVECTOR
);
-- Basic full-text search
SELECT * FROM documents
WHERE to_tsvector('english', content) @@ to_tsquery('english', 'postgresql & database');
-- Create tsvector column and index
UPDATE documents
SET search_vector = to_tsvector('english', title || ' ' || content);
CREATE INDEX idx_documents_search ON documents USING GIN(search_vector);
-- Query with tsvector column
SELECT * FROM documents
WHERE search_vector @@ to_tsquery('english', 'postgresql & database');
-- Ranking results
SELECT
title,
ts_rank(search_vector, query) as rank
FROM documents,
to_tsquery('english', 'postgresql & database') query
WHERE search_vector @@ query
ORDER BY rank DESC;
-- Prefix search
SELECT * FROM documents
WHERE search_vector @@ to_tsquery('english', 'postgre:*');
-- Auto-update search_vector with trigger
CREATE FUNCTION documents_search_trigger() RETURNS trigger AS $$
BEGIN
NEW.search_vector := to_tsvector('english', NEW.title || ' ' || NEW.content);
RETURN NEW;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER tsvector_update BEFORE INSERT OR UPDATE
ON documents FOR EACH ROW EXECUTE FUNCTION documents_search_trigger();
MySQL JSON
-- Create table with JSON
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
data JSON
);
-- Insert JSON data
INSERT INTO products (name, data) VALUES
('Widget', '{"price": 19.99, "tags": ["electronics", "gadget"], "stock": 100}'),
('Gadget', '{"price": 29.99, "tags": ["electronics"], "stock": 50}');
-- Query JSON fields
SELECT * FROM products WHERE JSON_EXTRACT(data, '$.price') = 19.99;
SELECT * FROM products WHERE data->>'$.price' = '19.99'; -- MySQL 5.7+
SELECT * FROM products WHERE JSON_UNQUOTE(data->'$.stock') > 50;
-- JSON operators (MySQL 5.7+)
-- -> : Get JSON value (returns JSON with quotes)
-- ->> : Get JSON value and unquote
SELECT name, data->'$.price' FROM products;
SELECT name, data->>'$.price' FROM products;
-- JSON functions
SELECT JSON_KEYS(data) FROM products;
SELECT JSON_LENGTH(data->'$.tags') FROM products;
SELECT JSON_TYPE(data->'$.price') FROM products;
-- JSON array operations
SELECT * FROM products WHERE JSON_CONTAINS(data->'$.tags', '"electronics"');
-- Update JSON
UPDATE products
SET data = JSON_SET(data, '$.featured', TRUE)
WHERE name = 'Widget';
UPDATE products
SET data = JSON_INSERT(data, '$.discount', 10)
WHERE name = 'Widget';
UPDATE products
SET data = JSON_REPLACE(data, '$.price', 24.99)
WHERE name = 'Widget';
-- Remove JSON key
UPDATE products
SET data = JSON_REMOVE(data, '$.featured')
WHERE name = 'Widget';
-- Create index (functional index on JSON path, MySQL 8.0.13+)
CREATE INDEX idx_products_price ON products ((CAST(data->>'$.price' AS DECIMAL(10,2))));
-- Virtual generated column (alternative for indexing)
ALTER TABLE products ADD COLUMN price DECIMAL(10,2) AS (data->>'$.price');
CREATE INDEX idx_products_price ON products(price);
MySQL Full-Text Search
-- Create FULLTEXT index
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT KEY idx_fulltext (title, content)
) ENGINE=InnoDB;
-- Natural language search
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('MySQL database');
-- Boolean search
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE);
-- Boolean operators:
-- + : Must be present
-- - : Must not be present
-- * : Wildcard
-- " " : Phrase
-- Wildcard search
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('data*' IN BOOLEAN MODE);
-- Phrase search
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('"MySQL database"' IN BOOLEAN MODE);
-- Ranking results
SELECT
title,
MATCH(title, content) AGAINST('MySQL database') as relevance
FROM articles
WHERE MATCH(title, content) AGAINST('MySQL database')
ORDER BY relevance DESC;