举个栗子
产品表中的 attributes 字段是 json格式的数据,我们查询手机的颜色属性来进行一步一步探索。
完整的sql 是这样
-- 22. 查询手机的颜色属性
SELECT name, attributes->>'$.color' AS color FROM products
WHERE category_id IN (SELECT id FROM categories WHERE name LIKE '%手机%');
1. 核心:从 products 表取数据
SELECT name, attributes->>'$.color' AS color
FROM products
-
name:商品名称(如 "iPhone 15 Pro") -
attributes:是一个 JSON 类型的列,里面存储了商品的扩展属性,例如:{"ram": 8, "color": "黑色", "storage": "256GB"} -
attributes->>'$.color':是 MySQL 的 JSON 路径操作符:-
->>表示 提取 JSON 中某个路径的值,并返回字符串(去掉了 JSON 的引号)。 -
'$.color'表示 JSON 路径,取顶层color键对应的值。 -
最终结果列别名为
color。
-
例如上面那个 JSON,attributes->>'$.color' 的结果就是字符串 '黑色'。
2. 条件:只筛选"手机"类别的商品
WHERE category_id IN (
SELECT id FROM categories WHERE name LIKE '%手机%'
)
-
子查询
SELECT id FROM categories WHERE name LIKE '%手机%': 从分类表categories中找出所有 名字里包含"手机" 的分类的id。LIKE '%手机%'会匹配 "智能手机"、"手机配件"、"手机" 等。 -
category_id IN (...): 只保留products表中category_id属于这些分类 ID 的商品。
整体逻辑
-
先找到所有名字带"手机"的分类 ID(例如 10)。
-
再从商品表中,取出这些分类下的商品,提取
name和attributes里的color。
结果示例
| name | color |
|---|---|
| iPhone 15 Pro | 黑色 |
| 小米 14 Ultra | 白色 |
| ... | ... |
补充说明
-
->>与->的区别:->返回带引号的 JSON 值(如"黑色"),->>返回纯字符串(如黑色)。 -
如果某个商品的
attributes中没有color字段,则color列返回NULL。 -
如果
categories表里匹配到多个 ID,IN会全部包含。mysql> select name,attributes ->> '$.storage' as storage from products where category_id in (select id from categories where name like '%手机%');
+------------------+---------+
| name | storage |
+------------------+---------+
| iPhone 15 Pro | 256GB |
| 华为 Mate 60 Pro | 512GB |
| 小米 14 Pro | 256GB |
| 三星 S24 Ultra | 512GB |
| OPPO Find X7 | 256GB |
| vivo X100 Pro | 256GB |
+------------------+---------+
6 rows in set (0.012 sec)mysql>
mysql>
mysql> select name,attributes ->> '.color' as color,attributes ->> '.storage' as storage from products where category_id in (select id from categories where name like '%手机%');
+------------------+-------+---------+
| name | color | storage |
+------------------+-------+---------+
| iPhone 15 Pro | 黑色 | 256GB |
| 华为 Mate 60 Pro | 青色 | 512GB |
| 小米 14 Pro | 白色 | 256GB |
| 三星 S24 Ultra | 紫色 | 512GB |
| OPPO Find X7 | 蓝色 | 256GB |
| vivo X100 Pro | 白色 | 256GB |
+------------------+-------+---------+
6 rows in set (0.013 sec)mysql> select name,attributes ->> '.color' as color, '.storage' as storage from products where category_id in (select id from categories where name like '%手机%');
+------------------+-------+-----------+
| name | color | storage |
+------------------+-------+-----------+
| iPhone 15 Pro | 黑色 | .storage | | 华为 Mate 60 Pro | 青色 | .storage |
| 小米 14 Pro | 白色 | .storage | | 三星 S24 Ultra | 紫色 | .storage |
| OPPO Find X7 | 蓝色 | .storage | | vivo X100 Pro | 白色 | .storage |
+------------------+-------+-----------+
6 rows in set (0.011 sec)mysql>