持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
SQL
sql(Structured Query Language)结构化查询语言,其实大白话理解就是一个用于和数据库进行交互的语言。 不同的数据库其实语法是不一样的 比如 mongo redis mysql oracle ...对于关系型的数据库 mysql|oracle 还是有很多共通点的这里就不仔细描述了,进入正文↓
本文主要说的是mysql(oracle类似)
sql语法顺序
select[distinct]
from
join(如left join)
on
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优化总结类的记录文章。