大家好,我是RecordLiu。
初学SQL,有哪些合适的练习网站推荐呢?
如果你有编程基础,那么我推荐你到Leetcode这样的专业算法刷题网站,如果没有,也不要紧,你也可以到像牛客网一样的编程网站去练习。
牛客网有很多面向非技术人员的练习题目,很适合入门。
今天给大家分享的是牛客网在线编程SQL篇非技术快速入门题解第一篇。
题目直达链接:牛客网非技术快速入门SQL编程练习题目
切换到SQL篇就能看到了。
我这里先列一下题目分类:
接下来,我们来详细看一看。
基础查询
1.现在运营想要查看用户信息表中所有的数据,请你取出相应结果现在。
示例:user_profile
返回结果
题解
取出所有列可以使用select *,但不建议你使用这种写法,因为性能很差。
更好的方式是查询出所有列来代替select *。
代码参考
简单处理查询结果
2.现在运营只需要查看前两个用户明细设备ID数据,请你从用户信息表 user_profile 中取出相应结果。
示例:user_profile
返回结果
题解
限制返回行数用limit实现,这道题可以使用limit 0,2 或者 limit 2。
limit的第一个参数代表位置,第二个参数代表返回的条数。第一个参数可以省略,默认从位置0开始取数。
由于计算机存储的计数都是从0开始的,所以数据库中的第一行对应位置0,第二行代表位置1,其他行数的位置以此类推。
小提示
对于一些数据量很大的表记录,如果只是抽查一部分数据做参考,我们可以根据表里面的自增长ID做排序后,再结合limit取出数据,这样做,对数据库的查询压力就会小很多。
代码参考
条件查询-基础排序
3.现在运营想要取出用户信息表中的年龄和gpa数据,并先按照gpa升序排序,再按照年龄升序排序输出,请取出相应数据。
示例:user_profile
返回结果
题解
SQL中排序使用order by实现,用关键字asc表示升序,关键字desc表示降序。
多级字段排序规则order by 字段1 关键字,字段2 关键字。
代码参考
条件查询-基础操作符
4.现在运营想要筛选出所有北京大学的学生进行用户调研,请你从用户信息表中取出满足条件的数据,结果返回设备id和学校。
示例:user_profile
返回结果
题解
条件过滤可以使用where实现。一般,表连接的过滤使用on,分组之后的过滤使用having。
执行优先级:
on > where > having。
题目要求是所有北京大学的用户,过滤条件写为where university=‘北京大学’。
代码参考
条件查询-高级操作符
5.现在运营想查看所有大学中带有北京的用户的信息,请你取出相应数据。
示例:user_profile
返回结果
题解
题目要求大学名称带有北京的用户信息,那么学校名称为北京大学、北京师范大学、北京交通大学等等都符合条件。
一种办法办法是使用等值过滤,列举所有可能的情况。过滤条件写成where university in(‘北京大学’,‘北京交通大学’,‘北京师范大学’,‘北京航空航天大学’)。
但很明显,上面方式不简洁,而且需要穷举出所有可能的情况。
如果以后用户信息里面有新增带北京名称的大学,还要往in里面添加值,不利于拓展。
更好的方式是使用模糊匹配来实现这道题。
SQL中可以使用like+通配符来实现模糊匹配。
其中最常用的通配符是 %,代表匹配0个或者多个字符。
比如like ‘北京%’,可以匹配文本:北京、北京大、北京大学、北京交通大学等等。
其他的通配符使用不频繁,我也给你总结下了用法,作为面试时的储备。
- _:匹配任意一个字符
- []:匹配[ ]里面任意一个字符
- [^ ]:不匹配[ ]中的任意一个字符
我来给你举几个例子会明白些:
- 查询名字姓张的用户: like ‘张%’
- 查询名字姓张,且为三个字的用户:like ‘张__’
- 查询名字为张、李、刘的用户:like [‘张’,‘李’,‘刘’]
- 查询名字不带张的用户: not like ‘张%’
- 查询用户编号首位不是1、2、3的用户: like [^123]%
代码参考
高级查询-计算函数
6.运营想要知道复旦大学学生gpa最高值是多少,请你取出相应数据
示例:user_profile
返回结果
题解
题目限制是复旦大学的学生,因此过滤条件为where university=‘复旦大学’。
求最高gpa有两种方式,一种是对gpa字段进行降序排列,然后取出第一条。
第二种方式是使用SQL的计算函数max来实现,max表示取出记录中的最大值。
由于使用聚合函数后,返回的结果会带上聚合标识,所以使用as进行重命名。
我也给你总结了SQL中其他常用于计算的函数:
- avg():返回平均值
- count():返回总条数
- min():返回最小值
- sum():对记录进行求和
代码参考
方法1:
方法2:
高级查询-分组查询
7.现在运营想查看每个学校用户的平均发贴和回帖情况,寻找低活跃度学校进行重点运营,请取出平均发贴数低于5的学校或平均回帖数小于20的学校。
示例:user_profile
其中,question_cnt表示发帖数量,answer_cnt表示回帖数量。
返回结果
题解
要统计每个学校的发帖和回帖的平均值,需要按学校维度分组之后,再进行平均值的计算。
分组使用group by实现,平均值计算使用avg函数。
本题的难点主要在判断 平均发贴数低于5的学校或平均回帖数小于20的学校 条件上,应该在分组之后使用having进行过滤。
代码参考
好了,今天的文章就分享到这里了,如果觉得我的文章对你有帮助,欢迎多分享给你身边的朋友。
最后,送给你一段杨振宁先生说的话:
很多东西常常是在不知不觉中,经过了一个长时期的接触,就自己也不知道什么时候已经懂了。
学习是长期的,希望你每天都有进步哇。