SQL练习:2(简单)+1(中等),常规题(group by\order by\avg...)

简介: SQL练习:2(简单)+1(中等),常规题(group by\order by\avg...)

简说Python,号主老表,Python终身学习者,数据分析爱好者,从18年开始分享Python知识,原创文章227篇,写过Python、SQL、Excel入门文章,也写过Web开发、数据分析文章,老表还总结整理了一份2022Python学习资料和电子书资源,关注后私信回复:2022 即可领取。

SQL15 查找employees表emp_no与last_name的员工信息

image.png

我的思路: 这个从题目标题无法看出需求,需要具体看描述:查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列。直接按照需求写sql即可,这里判断员工编号是否为奇数,可以使用%对2取余数进行判断,余数为1即为奇数。

我的题解:

select *
from employees
where emp_no % 2 = 1
and last_name != 'Mary'
order by hire_date desc 
;

涉及知识点:

  • 完整sql执行顺序(每天看一遍,不信记不住):
from -> where -> group by -> having -> select -> order by -> limit
  • sql 取余数可以直接使用 %
  • order by hire_date desc 按hire_date列降序排序

提交结果:

image.png其他题解:

select *
from employees
where emp_no&1 = 1
and last_name != 'Mary'
order by hire_date desc 
;

这里判断是否为奇数,也可以使用位运算进行判断,任何数和1的位运算结果如果是1,则是奇数,否则运算结果为0,则为偶数。

这个是真的涨见识了,位运算很好的应用实践。

SQL16 统计出当前各个title类型对应的员工当前薪水对应的平均工资

image.pngimage.png

我的思路: 比较常规,首先明确需求:结果给出title以及平均工资avg,并且以avg升序排序,所以先将titles和salaries进行join连接,然后根据title进行分组求salary的平均值即可,最后按照平均值进行升序排序。

我的题解:

select title, avg(salary) as avg_s
from (
select a.emp_no, a.title, b.salary
from titles as a
join salaries as b
on a.emp_no = b.emp_no
and a.to_date = b.to_date
and a.to_date = '9999-01-01') as c 
group by title
order by avg_s
;

涉及知识点:

  • 完整sql执行顺序(每天看一遍,不信记不住):
from -> where -> group by -> having -> select -> order by -> limit
  • 窗口函数:avg使用
  • group by 分组
  • order by 排序,默认是升序

提交结果:

image.png

SQL17 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

image.png

我的思路: 这个只有一个表,蛮简单的,直接按照salary降序排序,取出第二列数据即可。

我的题解:

select emp_no, salary
from salaries
where to_date = '9999-01-01'
order by salary desc
limit 1,1
;

涉及知识点:

  • 完整sql执行顺序(每天看一遍,不信记不住):
from -> where -> group by -> having -> select -> order by -> limit
  • order by salary desc 降序排序
  • 从指定位置开始取出指定行:limit m,n 从m+1行开始,取出n行数据

提交结果:

image.png

其他题解:上面解法有局限性,如果排名第一的有很多个,那么取出来的还是薪水最高的,所以好的方法应该是直接按第二的薪水进行筛选。

所以我们先找出第二薪水是多少,然后筛选出薪水等于第二薪水的行即可。

select emp_no, salary
from salaries
where to_date = '9999-01-01'
and salary = (
    select salary
    from salaries
    group by salary
    order by salary desc 
    limit 1,1
)
order by salary desc
;

题目地址:https://www.nowcoder.com/ta/sql

相关文章
|
2月前
|
SQL Perl
PL/SQL经典练习
PL/SQL经典练习
14 0
|
5月前
|
SQL 分布式计算 数据挖掘
Hive SQL初级练习(30题)
Hive SQL初级练习(30题)
|
2月前
|
SQL
SQL语句两个字段或多个字段同时order by 排序
SQL语句两个字段或多个字段同时order by 排序
41 0
|
2月前
|
SQL 存储 Oracle
SQL,Group By 真扎心,原来是这样
SQL,Group By 真扎心,原来是这样
38 0
|
2月前
|
SQL 关系型数据库 数据处理
详解SQL语句中的GROUP BY和聚合函数COUNT、SUM、AVG、MIN和MAX。
详解SQL语句中的GROUP BY和聚合函数COUNT、SUM、AVG、MIN和MAX。
34 0
|
2月前
|
SQL
SQL中GROUP BY语句与HAVING语句的使用
SQL中GROUP BY语句与HAVING语句的使用
23 1
|
4月前
|
SQL
SQL语句多表查询练习
SQL语句多表查询练习
12 0
|
4月前
|
SQL 关系型数据库 MySQL
mysql查询语句练习总结(涵盖所有sql语法)
mysql查询语句练习总结(涵盖所有sql语法)
|
5月前
|
SQL 数据库
SQL HAVING 子句详解:在 GROUP BY 中更灵活的条件筛选
HAVING子句被添加到SQL中,因为WHERE关键字不能与聚合函数一起使用。
76 0
|
6月前
|
数据库
解决which is not functionally dependent on columns in GROUP BY clause;...sql_mode=only_full_group_by
解决which is not functionally dependent on columns in GROUP BY clause;...sql_mode=only_full_group_by
45 0