一:MySQL查询
1:单表查询
根据where条件过滤表中的记录,每过滤一次形成一张中间表(中间表对用户是不可见的)。然后根据select的选择列返回最终的结果。
2:两张表连接查询
对两表求积(笛卡尔积:行相乘,列相加)并用on条件和连接类型进行过滤形成中间表,然后根据where条件过滤中间表的记录,并且根据select指定的列返回查询结果。
3:多表连接查询
先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据where条件过滤中间表的记录,并根据select指定的列返回查询结果。
二:MySQL查询语法顺序
1:select
2:from
3:left … join
4:on
5:where
6:group by
7:having
8:order by
9:limit
三:MySQL执行顺序
示例:
select * from student s left join course c on s.id = c.student_id where s.id >10 group by s.id having count(1) > 3 order by s.id desc limit 0,20
1:form(将最近的两张表进行笛卡尔积) 形成中间表 … VT1
2:on (将VT1按照它的条件进行过滤) …VT2
3:left join (保留左表的记录) …VT3
4:where (过滤VT3中的记录,没过滤一次形成一张中间表) VT4 … VTn
5:group by (对VT4的记录进行分组) …VT5
6:having (对VT5中的记录进行过滤) …VT6
7:select (对VT6中的记录选取指定的列) …VT7
8:order by (对VT7的记录进行排序) …游标
9:limit(对排序后的值进行分页)
where 条件执行顺序(影响性能)
1:MySQL从左向右去执行where条件
2:Oracle从右向左去执行where条件
所以,写where条件的时候,优先级高的部分要去编写过滤力度最大的条件语句。