一、基础语法架构(书写顺序 vs 执行顺序)
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
核心规则:
SELECT
决定输出内容,FROM
定位数据源,WHERE
过滤原始数据GROUP BY
将数据分组,HAVING
过滤分组后的数据ORDER BY
排序结果,LIMIT
控制输出行数
(执行顺序与书写顺序不同,FROM
先于SELECT
执行)SELECT语句(数据查询的基石)
SELECT [DISTINCT] 字段列表
FROM 表名
[WHERE 条件]
[GROUPBY 分组字段]
[HAVING 分组条件]
[ORDERBY 排序字段 [ASC|DESC]]
[LIMIT 行数];
INSERT语句(5种插入方式)
-- 全字段插入(字段顺序必须匹配)
INSERT INTO 用户 VALUES (1, '张三', '杭州');
-- 指定字段插入(推荐写法)
INSERT INTO 用户(姓名, 城市) VALUES ('李四', '北京');
-- 批量插入(效率最高)
INSERT INTO 订单(用户ID, 商品)
VALUES (101, 'iPhone15'), (102, 'iPadPro');
-- 从查询结果插入(跨表复制)
INSERT INTO 杭州用户备份
SELECT*FROM 用户 WHERE 城市='杭州';
-- 带子查询的插入(动态生成数据)
INSERT INTO 高消费用户
SELECT 用户ID FROM 订单
GROUPBY 用户ID HAVINGSUM(金额) >10000;
UPDATE语句(必须带WHERE条件!)
UPDATE 订单
SET 状态 = '已发货'
WHERE 支付时间 < '2023-12-31'
AND 物流单号 IS NOT NULL;
DELETE语句(高危操作需谨慎)
DELETE FROM 临时日志
WHERE 创建时间 < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 分析杭州用户购买电子产品的消费习惯
SELECT
u.用户ID,
u.姓名,
COUNT(o.订单ID) AS 订单总数,
AVG(o.金额) AS 平均客单价,
MAX(o.金额) AS 最高消费额
FROM 用户 u
INNERJOIN 订单 o ON u.用户ID = o.用户ID
WHERE u.城市 ='杭州'
AND o.商品类别 ='电子产品'
AND o.创建时间 BETWEEN'2023-01-01'AND'2023-12-31'
GROUPBY u.用户ID
HAVING 订单总数 >=3
ORDERBY 最高消费额 DESC
LIMIT 10;
技术要点:
BETWEEN
精确控制时间范围HAVING
过滤聚合后的结果-- 将未支付超7天的订单移入历史表
INSERTINTO 订单历史
SELECT*FROM 订单
WHERE 状态 ='未支付'
AND 创建时间 < DATE_SUB(NOW(), INTERVAL7DAY);
-- 清理原表数据(事务保证原子性)
START TRANSACTION;
DELETEFROM 订单
WHERE 订单ID IN (
SELECT 订单ID FROM 订单历史
WHERE 来源表 ='订单'
);
COMMIT;
安全提示:事务操作防止数据丢失
连接类型 | 语法示例 | 应用场景 |
---|---|---|
INNER JOIN | FROM A JOIN B ON A.id=B.id | 仅保留两表匹配记录(默认) |
LEFT JOIN | FROM A LEFT JOIN B ON ... | 保留左表全部记录 |
RIGHT JOIN | FROM A RIGHT JOIN B ON ... | 保留右表全部记录 |
FULL OUTER JOIN | FROM A FULL JOIN B ON ... | 保留两表所有记录(需数据库支持) |
CROSS JOIN | FROM A CROSS JOIN B | 生成笛卡尔积(谨慎使用) |
类型 | 示例 | 特点 |
---|---|---|
标量子查询 | SELECT (SELECT MAX(金额) FROM 订单) AS 最高消费 | 返回单个值(出现在SELECT列表) |
列子查询 | WHERE 用户ID IN (SELECT DISTINCT 用户ID FROM 高消费用户) | 返回一列值(用于IN/NOT IN) |
行子查询 | WHERE (城市, 年龄) = (SELECT 城市, AVG(年龄) FROM 用户 GROUP BY 城市) | 返回单行多列 |
关联子查询 | WHERE EXISTS (SELECT 1 FROM 订单 WHERE 用户ID=外部表.用户ID) | 内外表产生关联 |
-- 错误1:GROUP BY遗漏字段
SELECT 城市, 姓名, SUM(金额) -- 姓名未参与分组!
FROM 订单
GROUPBY 城市;
-- 错误2:WHERE中使用聚合函数
SELECT 用户ID, AVG(金额)
FROM 订单
WHEREAVG(金额) >1000; -- 应改用HAVING
-- 错误3:滥用SELECT *
SELECT*FROM 用户 JOIN 订单... -- 导致网络传输冗余数据
-- 创建覆盖索引(避免回表)
CREATE INDEX idx_user_city ON 用户(城市) INCLUDE (姓名, 注册时间);
-- 复合索引排序规则
CREATE INDEX idx_orders_search ON 订单(用户ID DESC, 创建_time ASC);
-- 函数索引处理特殊场景
CREATE INDEX idx_email_domain
ON 用户(SUBSTRING_INDEX(email, '@', -1));
实验数据:在100万条订单数据中,为用户ID+创建时间
添加复合索引后,查询速度从2.1秒提升至0.03秒
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有