(1) FROM
(2) JOIN
(3) ON
(4) WHERE
(5) GROUP BY
(6) WITH {CUBE | ROLLUP}
(7) HAVING
(8) SELECT
(9) DISTINCT
(10) ORDER BY
(11)
序号的每个步骤会产生一个虚拟表,如果想要记住这个觉得可能对sql写的多的人自然就记住,可以通过sql逻辑记住前置条件(比如:我是这样想的sql执行第一肯定要去拿表所以from最先,之后就是可能存在的表的拼接利用join,以及join的条件on,后面对得到初步的表进行where条件过滤,等过滤结束如果有必要分组的话按照group by进行分组,而想要group by进行相应条件再次过滤后就需要having条件,最后筛选出字段数据,删除重复对应字段,按顺序排序)
这个是有必要去自己去写sql的时候去注意的,因为系统上线后过段时间就会出现很多问题,当然具体问题还是得具体分析,看完收货满满。
参考:https://blog.csdn.net/weixin_53601359/article/details/115553449
原因:
原因:
原因:
原因:大数据量导致查询时间长,资源浪费,网络传输长。
原因:索引像个目录一样可以快速查找到想要数据
ALTER TABLE `表` ADD INDEX 索引名
返例:
select * from `表` where NAME=123
上面的123没有加单引号导致在做sql查询时候mysql做了隐式转换,转成数字进行比较。
改为:
select * from `表` where NAME='123'
原因:mysql查询优化器不走索引成本低,放弃索引。
反例:
EXPLAIN
SELECT * FROM student
WHERE DATE_ADD(birthday,INTERVAL 7 DAY) >=NOW();
正例:
EXPLAIN
SELECT * FROM student
WHERE birthday >= DATE_ADD(NOW(),INTERVAL 7 DAY);
反例:
EXPLAIN
SELECT * FROM student WHERE id+1-1=+1
正例:
EXPLAIN
SELECT * FROM student WHERE id=+1-1+1
理由:
正例:
INSERT INTO student (id,NAME) VALUES(4,'name1'),(5,'name2');
理由:事务开启关闭是需要时间的。
理由:一次性删除太多数据,可能造成锁表,会有lock wait timeout exceed的错误,所以建议分批操作。
商品状态(state):1-上架、2-下架、3-删除
理由:
反例:先过滤后分组
select job,avg(salary) from employee
group by job
having job ='president' or job = 'managent';
正例:先分组后过滤
select job,avg(salary) from employee
where job ='president' or job = 'managent'
group by job;
创建复合索引,也就是多个字段
ALTER TABLE student ADD INDEX idx_name_salary (NAME,salary)
满足复合索引的左侧顺序,哪怕只是部分,复合索引生效。
特例:
EXPLAIN
SELECT * FROM student WHERE salary=3000 AND NAME='name1'
理由:
复合索引也称为联合索引当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则
联合索引不满足最左原则,索引一般会失效,但是这个还跟Mysql优化器有关的
理由:
例子:查询所有部门的所有员工。
#in子查询
SELECT * FROM tb_user WHERE dept_id IN (SELECT id FROM tb_dept);
#这样写等价于:#先查询部门表
SELECT id FROM tb_dept#再由部门dept_id,查询tb_user的员工
SELECT * FROM tb_user u,tb_dept d WHERE u.dept_id = d.id
List<> resultSet;
for(int i=0;i
上一篇:kubectl-k8s用户切换
下一篇:SAP 创建会计冲销凭证