SQL 查询执行顺序以及随想的查询注意点

143 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

SQL

sql(Structured Query Language)结构化查询语言,其实大白话理解就是一个用于和数据库进行交互的语言。 不同的数据库其实语法是不一样的 比如 mongo redis mysql oracle ...对于关系型的数据库 mysql|oracle 还是有很多共通点的这里就不仔细描述了,进入正文↓

本文主要说的是mysql(oracle类似)

sql语法顺序

select[distinct]  
from  
join(如left joinon  
where  
group by  
having  
union  
order by  
limit

sql语法执行顺序

from  --对查询的指定的表进行可能的计算笛卡尔积

on   -- join_condition的关联过滤数据

join   --join方式

where   --where_condition过滤数据

group by  --进行分组操作

having  --按照having_condition过滤数据

select  --选择指定的列

distinct --指定列去重

union  --union 数据

order by --按照order_by_condition排序

limit --分页获取数量

注意点

分页limit

mysql

查询语法 (其实是index 获取数据)

-- 
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset 

limit 5,-1 (index 五个到最后); limit 5 (前五个) ;limit 0,10 (第一页 index 0,9); limit 10,20 (第二页 index 10 ,19)... 如果不满足的话返回仅有的数量

oracle

oracle 没有limit 只能通过相应的 行号进行分页获取数据分页的话只能使用:

rownum > x and rownum< y

join

先做一个总结吧: 关于查询连接查询来说 主表条件使用 where 查询避免出现问题

CROSS JOIN

SELECT * FROM tab1 CROSS JOIN tab2

笛卡尔积 连接 将两张表的数据直接进行笛卡尔积 好比 a 表 2条数据 b 表3条数据 最后结果是 6条数据 的这种情况

inner

SELECT * FROM tab1 INNER JOIN tab2 ON tab1.id1 = tab2.id2

内连接只返回满足条件on的数据进行笛卡尔积合集

left

将左表的数据全部找出然后和右边的表进行笛卡尔积并且去掉右边中的null记录

注意点:

关于join来说当正常join时 on 后面的and 有可能是不会生效的 eg:

select * from a left join b  on b.age=a.age and a.age=12

以上语句咋一看 我想找出a表中age =12 的并且关联查询b表的部分可能存在的数据 ,但是实际情况是 不会对a表进行数据过滤的 所以对于以上问题 必须

select * from a left join b  on b.age=a.age where  a.age=12
  • 进行左连接时,就有涉及到主表、辅表,这时主表条件写在WHERE之后,辅表条件写在ON后面

right

和上面left 相反

  • 进行右连接时,就有涉及到主表、辅表,这时主表条件写在WHERE之后,辅表条件写在ON后面

where group by + having

注意点①

首先关于查询来说 如果使用group 的话 往往是一个字段或者多个字段,但是一旦分组之后就必须 使用 having 对查询之后的数据进行二次过滤不能使用where

正解:

SELECT field_2 FROM `table` WHERE field_1='rrrr' group by field_2 HAVING field_2='5555'

错误示范:

SELECT patiId FROM `table`  group by patiId WHERE field_1='rrrr';

注意点②

having 二次过滤必须当前查询的字段在 select 返回数据字段中存在否则会出错

示例:

SELECT field_2 FROM `table` WHERE field_1='rrrr' group by field_2 HAVING field_3='5555'

end

随想记录,后面打算再写一个关于mysql 索引以及sql优化总结类的记录文章。