mysql语句大全及用法

 人参与 | 时间:2026-10-17 07:30:22

mysql语句大全及用法

MySQL的语用法增删改查,说穿了就四个动词:INSERT、全及DELETE、语用法UPDATE、全及SELECT。语用法但真正用起来,全及光这四个词远远不够。语用法我见过太多人卡在JOIN和GROUP BY上,全及也见过有人把索引当摆设,语用法一条查询跑出三秒延迟。全及

基础CRUD——别小看它

INSERT INTO users (name,语用法 age) VALUES ('张三', 25) 这种写法谁都会。但有个小细节——批量插入时,全及用一条语句塞多行比循环单插快十倍不止:INSERT INTO users (name,语用法 age) VALUES ('张三', 25), ('李四', 30), ('王五', 28)。

UPDATE users SET age = 26 WHERE name = '张三' 记得加WHERE。全及不加?语用法那整张表都改了。这不是玩笑,我见过生产事故就是这么发生的。

SELECT的十八般武艺

查询是重头戏。SELECT * FROM users 这种写法,在测试环境没问题,上了生产就等着被DBA骂吧。字段写清楚,SELECT name, age FROM users,减少IO开销。

WHERE子句是精髓。等值查询、范围查询、模糊匹配,各有各的坑。LIKE '%关键字%' 走不了索引,全表扫描。但LIKE '关键字%' 能走索引。差别就在一个百分号的位置。

ORDER BY和LIMIT组合是分页神器。SELECT * FROM orders ORDER BY created_at DESC LIMIT 10 OFFSET 20——注意,OFFSET越大越慢,深分页是性能杀手。优化方案是记住上一页最后一条记录的ID,用WHERE id < 1000 LIMIT 10 代替OFFSET。

JOIN——连接的艺术

INNER JOIN只返回匹配行,LEFT JOIN返回左表全部加右表匹配。很多人搞混,其实记住一句话:LEFT JOIN左边是老大,右边可有可无。

SELECT u.name, o.order_no FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE o.status = 1——这个写法有坑。WHERE条件会把LEFT JOIN变成INNER JOIN,因为NULL值被过滤了。真想过滤右表条件,得把条件放ON里:LEFT JOIN orders o ON u.id = o.user_id AND o.status = 1。

聚合函数和GROUP BY

COUNT(*)、SUM()、AVG()、MAX()、MIN(),配合GROUP BY使用。但记住,SELECT的字段要么在GROUP BY里,要么在聚合函数里。SELECT name, COUNT(*) FROM users GROUP BY age——这语法在MySQL里能跑,但name返回的是随机值,逻辑上不严谨。MySQL 5.7以后默认开了ONLY_FULL_GROUP_BY,直接报错。

子查询和EXISTS

SELECT * FROM users WHERE age > (SELECT AVG(age) FROM users)——子查询可以用,但别嵌套太深。三层以上就考虑拆开写或者用JOIN代替。

EXISTS比IN快,尤其是子查询表大时。SELECT * FROM orders o WHERE EXISTS (SELECT 1 FROM users u WHERE u.id = o.user_id AND u.status = 1)——这里子查询不返回数据,只返回TRUE/FALSE,效率高。

索引——快慢的分水岭

CREATE INDEX idx_user_name ON users(name)——索引建在WHERE、JOIN、ORDER BY频繁使用的字段上。但别每列都建,写入会变慢。联合索引有最左前缀原则:INDEX(name, age) 能匹配name条件,也能匹配name+age,但单独age条件走不了这个索引。

事务和锁

START TRANSACTION; ... COMMIT; 或者ROLLBACK。银行转账必须用。默认隔离级别是REPEATABLE READ,InnoDB引擎。SELECT ... FOR UPDATE 能锁行,但别锁整表——那是性能灾难。

实用小技巧

REPLACE INTO 是DELETE+INSERT的合体,有主键冲突就删掉重插。INSERT ... ON DUPLICATE KEY UPDATE 则是更新。两者区别在于,REPLACE会改变自增ID,后者不会。

SHOW PROCESSLIST 查看当前连接在跑什么SQL。KILL 4000 杀掉慢查询进程。EXPLAIN SELECT ... 看执行计划,type列出现ALL就是全表扫描,得赶紧优化。

MySQL这玩意儿,用久了就发现,大部分问题不是语句不会写,而是没理解数据怎么存、索引怎么走、锁怎么排。多看看执行计划,比背语法有用得多。

顶: 8937踩: 4372