SQL语句:
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| product_id | int |
| low_fats | enum |
| recyclable | enum |
+-------------+---------+
product_id 是该表的主键(具有唯一值的列)。
low_fats 是枚举类型,取值为以下两种 ('Y', 'N'),其中 'Y' 表示该产品是低脂产品,'N' 表示不是低脂产品。
recyclable 是枚举类型,取值为以下两种 ('Y', 'N'),其中 'Y' 表示该产品可回收,而 'N' 表示不可回收。
输入:
Products 表:
+-------------+----------+------------+
| product_id | low_fats | recyclable |
+-------------+----------+------------+
| 0 | Y | N |
| 1 | Y | Y |
| 2 | N | Y |
| 3 | Y | Y |
| 4 | N | N |
+-------------+----------+------------+
SELECT product_id
FROM Products
WHERE
low_fats = 'Y'
AND
recyclable = 'Y'
输出:
+-------------+
| product_id |
+-------------+
| 1 |
| 3 |
+-------------+
WHERE referee_id <> 2
OR referee_id IS NULL
select name, population, area
from World
where area >= 3000000
or population >= 25000000
超级SQL语句:
超级SQL语句:
-- 目标:从电商数据库中统计每位顾客在“电子产品或书籍”类别的消费情况,
-- 展示订单数、总消费、平均/最高/最低商品价格,并只保留满足一定条件的顾客。
-- 涵盖 SELECT、DISTINCT、FROM、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT/OFFSET 等常见语法。
SELECT
c.id AS customer_id, -- 列别名:给输出列起一个更清晰的名字
c.name AS customer_name,
COUNT(DISTINCT o.id) AS order_count, -- 聚合函数:统计不同订单数量(去重)
SUM(p.price * oi.quantity) AS total_spent, -- 聚合函数:计算总消费(单价×数量求和)
AVG(p.price) AS avg_price, -- 聚合函数:平均商品单价(按行参与聚合)
MAX(p.price) AS max_price, -- 聚合函数:最高商品单价
MIN(p.price) AS min_price -- 聚合函数:最低商品单价
FROM Customer c -- 数据来源:顾客表(起别名 c,便于后续引用)
JOIN Orders o -- 内连接:只保留能匹配到的行(有订单的顾客)
ON c.id = o.customer_id -- 连接条件:顾客与订单通过 customer_id 对应
JOIN OrderItems oi -- 订单明细:每个订单包含多条商品记录
ON o.id = oi.order_id -- 明细通过 order_id 关联到订单表
JOIN Products p -- 商品表:为明细行提供商品属性(价格、类别等)
ON oi.product_id = p.id -- 明细通过 product_id 关联到商品表
WHERE
c.active = 'Y' -- 行过滤:只选取活跃顾客
AND (p.category = 'Electronics' OR p.category = 'Books') -- 行过滤:类别是电子或书籍
AND p.price BETWEEN 10 AND 500 -- 行过滤:商品单价在 [10, 500] 范围内
GROUP BY
c.id, c.name -- 分组:按顾客维度聚合(聚合函数在组内计算)
HAVING
COUNT(DISTINCT o.id) >= 2 -- 组过滤:只保留订单数 ≥ 2 的顾客(HAVING 作用在聚合结果上)
AND SUM(p.price * oi.quantity) > 100 -- 组过滤:总消费 > 100
ORDER BY
total_spent DESC, -- 排序:总消费降序
avg_price ASC -- 次级排序:平均价格升序(默认 ASC,可省略)
LIMIT 10 -- 只取前 10 行(不同数据库可能用 TOP/NFETCH)
OFFSET 0; -- 从第 0 行开始偏移(分页用)SQL语句顺序:
写的顺序:SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
执行顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMITSQL字符长度:
MySQL / MariaDB CHAR_LENGTH() 或 LENGTH() sql SELECT tweet_id FROM Tweets WHERE CHAR_LENGTH(content) > 15;
PostgreSQL LENGTH() sql SELECT tweet_id FROM Tweets WHERE LENGTH(content) > 15;
SQL Server LEN() sql SELECT tweet_id FROM Tweets WHERE LEN(content) > 15;
Oracle LENGTH() sql SELECT tweet_id FROM Tweets WHERE LENGTH(content) > 15;表连接:
你写 SELECT u.unique_id, e.name,结果表就会先显示 unique_id 再显示 name。
如果你写 SELECT e.name, u.unique_id,结果表就会先显示 name 再显示 unique_id
🧩 示例数据
Customer 表
id name
1 Alex
2 Jane
3 Mark
Orders 表
order_id customer_id
101 1
102 1
103 2
104 4
🔗 四种 JOIN 的结果表
1. INNER JOIN
sql
SELECT c.id, c.name, o.order_id
FROM Customer c
INNER JOIN Orders o ON c.id = o.customer_id;
结果:
id name order_id
1 Alex 101
1 Alex 102
2 Jane 103
2. LEFT JOIN
sql
SELECT c.id, c.name, o.order_id
FROM Customer c
LEFT JOIN Orders o ON c.id = o.customer_id;
结果:
id name order_id
1 Alex 101
1 Alex 102
2 Jane 103
3 Mark NULL
3. RIGHT JOIN
sql
SELECT c.id, c.name, o.order_id
FROM Customer c
RIGHT JOIN Orders o ON c.id = o.customer_id;
结果:
id name order_id
1 Alex 101
1 Alex 102
2 Jane 103
NULL NULL 104
4. FULL OUTER JOIN
sql
SELECT c.id, c.name, o.order_id
FROM Customer c
FULL OUTER JOIN Orders o ON c.id = o.customer_id;
结果:
id name order_id
1 Alex 101
1 Alex 102
2 Jane 103
3 Mark NULL
NULL NULL 104
🎯 总结
INNER JOIN → 只保留匹配的行
LEFT JOIN → 左表全保留,右表没匹配时填 NULL
RIGHT JOIN → 右表全保留,左表没匹配时填 NULL
FULL OUTER JOIN → 两边都保留,没匹配的地方填 NULL