sql语句的一些应用

我们在平时不管是查询还是建表的时候,都会用到一些关键字,但是这些关键字怎么用呢?有一写比较少用的,我们这里说一下,例如group by ,having,左连接,子查询(带in),行转列等高级用法。

还有建表的一些知识,例如:建表的时候用三范式还是反范式,为什么?

首先是group  by 和having,group  by是指分组,分组的话,我们必须要配合函数进行使用,分组之后可以求和,求平均数,计数等。常用聚合函数有:count() 计数、sum() 求和、avg() 平均数、max() 最大值、min() 最小值。

例如:我们有一个学生表student,里面有学生的姓名name,年龄age,年级grade。那么我们可以计算每个年级的学生有多少人,如下:

select grade as '年级', count(grade) from test_student group by grade;

我们往往还会组合having关键字,having表示筛选,类似于where,是对已经分组的group进行筛选,where 是先筛选后分组,having是先分组后筛选。

例如:我们要统计看那个年纪的人数大于200。如下:

select grade as '年级', count(grade) from test_student group by grade having count(grade) >= 200;

有的时候还会运用到表连接,这时候就会用到inner join 、left join  、right join 和 full join关键字了,比如查询学生表和成绩表中对应学号的学生的成绩。这种时候就会用到表连接,不过这个时候就要看是用哪一种表连接了,inner join 是获取到左右表对应相等且都为非空的值。left join 是以左表为主表,获取左表对应右表的所有数据,没有就设置为null。right join 是以右表为主表,获取右表对应左表的所有数据,没有就设置为null。而full join 是全表连接,即不管是左表还是右表,都获取全部的数据,不管是左表还是右表的数据为空,都展示出来。

总结一下两表连接查询选择方式的依据:
1、 查两表关联列相等的数据用内连接。
2、 Col_L是Col_R的子集时用右外连接。
3、 Col_R是Col_L的子集时用左外连接。
4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
5、 求差操作的时候用联合查询。

然后就是行列转换了,就是把原来的行进行拆分转化为列。行转列主要适用于对数据作聚合统计。

还有就是设计数据库的时候的三范式和反范式,三范式就是:

第一范式(1NF):确保每一列的原子性
如果每一列都是不可再分的最小数据单元,则满足第一范式。例如:

地址为:中国浙江,那么实际上就可以再进行拆分为:中国,浙江

第二范式:非键字段必须依赖于键字段
如果一个关系满足1NF,并且除了主键以外的其它列,都依赖与该主键,则满足二范式(2NF),第二范式要求每个表只描述一件事。

例如:订单id,订单号,商品名称,商品价格,实际上,知道了订单号,就知道了商品的信息。和主键id并没有关联关系。

第三范式:在1NF基础上,除了主键以外的其它列都不传递依赖于主键列,或者说: 任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

例如:订单中,比如卖车,知道车的车型code,就知道了车型名称,知道了车型名称,也能知道车型code,所以两个是传递依赖的,只需要存一个就够了。三范式的话就是以时间换空间,缩小字段数量,但是查询的时候就会用更多的时间,而反范式就是以空间换时间,添加几个冗余字段,查询的时候使用更少的时间。例如在订单表里,存了定金和尾款字段,如果想要知道总价,如果是以三范式,那么就不需要存储总价,每次需要的时候去算,而反范式就是多存储一个冗余字段总价,那么每次获取总价就可以直接获取,而不需要去计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值