前几天,我在论坛溜达。看到一个人发帖说
做了6年的企业级开发,总是被互联网行业的人认为没技术含量,不就是crud么
先解释下 crud 是什么。crud 就是我们常说的增删改查(create,retrieve,update,delete)
其实,对这个问题,我也思考过。我们所有的业务流程,最终都会抽象出数据模型,保存到数据库中。把业务之间的联系抽象成数据库中表与表,字段与字段之间的联系。实际上,企业的各种系统,在技术层面上确实是在 crud。
不过话说回来了,互联网的系统不是 crud 吗?只不过 crud 的姿势不同罢了,互联网可能是面对高并发的 crud, 我们是面对的是复杂业务流程的 crud。这些业务逻辑还需要一定的行业积淀才能捋清楚。所以在企业级开发上业务和技术基本是五五开,业务比重甚至要大于技术。
所以,今天我们就花很短的时间,来学学简单的 sql.了解下 crud 的姿势。
假如我们有下面一个订单表 order_header,不要在意表里的数据,为了方便说明,瞎填的。
查询
查询是我们平日使用最多的,下面着重说一下:
查询使用 select 关键字,基本结构如下
select from where
假如我们想查找所有已经完工的订单信息,那么 sql 怎么写呢?
select * from order_header where order_status = '完工'
执行后会看到我们需要的结果
select * 代表查询所有列,一般我们会关注我们需要的字段,比如我们要找到订单类型为 1 的并且完工的订单号,我们可以这么写
select order_no from order_header where order_status = '完工' and order_type = 1
我们可以看到只有下面两个符合条件的订单号被选中。在写 sql 中我们要尽量避免 select * ,我们需要哪个字段就取哪个字段,可以节省 sql 查询的时间。
如果要查询订单类型为 1 的或者处于下达状态的订单,sql 怎么写呢?
select order_no from order_header where order_type = 1 or order_status = '下达'
如果要查找开工,下达和完工状态的订单,我们可以用 in 关键字
select order_no, order_type, order_status from order_header where order_status in ( '开工', '完工', '下达' )
除了 in 我们可以使用 like 进行模糊查询,比如我们要查询订单状态中包含 “工” 的所有订单
select order_no from order_header where order_status like '%工%'
这里的 “%” 表示通配符,”%工”表示以工结尾的所有匹配,”工%”表示以工开头的所有匹配。
此外,我们可以用 not in , not like 来取相反的逻辑。
通过 group by 可以进行分组,比如我们按照订单状态来分组,就可以很方便的查看当前有几种状态的订单
select order_status from order_header group by order_status
结果如下图
如果我们想看到每个分组中有多少订单,那个我们可以使用 count() 函数
select order_status, count(1) from order_header group by order_status
结果如下图,可以看到每个分组中订单的数量。除了count(),还有 max(),min(),sum()等函数
如果我们只想看到数量大于 2 的分组,该怎么写?
select order_status, count(1) from order_header group by order_status having count(1) > 2
可以看到,只有数量大于2的分组被查到了。
如果仅仅想去重,比如想知道总共有几种订单类型,那么我们只需要对此列用 distinct 即可。
select distinct order_type from order_header
结果中的订单类型列已经被去重了。
case when ,有时我们会需要简单的判断逻辑,就可以用 case when 了。比如我们想让 订单类型为1 的表示生产订单,订单类型为2 的表示更改订单,订单类型为3 的表示废弃订单。那么我们可以这么写
select order_no, order_type, order_status, case when order_type = 1 then '生产订单' when order_type = 2 then '更改订单' when order_type = 3 then '废弃订单' else '未知类型' end as type_desc from order_header
结果如下图
子查询,有时候我们需要从一个结果集中再次查找,就会用到子查询。比如下面这样写
select order_no, type_desc from ( select order_no, order_type, order_status, case when order_type = 1 then '生产订单' when order_type = 2 then '更改订单' when order_type = 3 then '废弃订单' else '未知类型' end as type_desc from order_header ) t
下节课我们说一下 连接查询和常用到的分析函数,在企业中,单表查询情况是很少的,要关联查询。
插入数据
插入数据我们使用 insert 语句
insert into order_header ( order_no, order_type, order_status, order_date, createdon ) values ( '2018102109', 2, '下达', sysdate( ), sysdate( ) )
看到,最下面就是我们新插入的一行
更新数据
更新数据使用 update 语句,我们更新一下刚才插入的数据的订单号
update order_header set order_no = '112109' where order_no = '2018102109'
我们把 订单号为’2018102109’的一行数据更新为了’112109’,在update时一定要写好 where 条件,如果没有 where 条件,会更新表中所有数据。
删除数据
我们删除刚才加入的一条数据
delete from order_header where order_no = '112109'
运行后,订单号为’112109’的订单就被删除了,delete 时同样要写好 where 条件,如果没有 where 条件,会删除表中所有数据。
下节重点说说 多表连接,常用分析函数。不要走开哦。