SQL刷题小计

SQL刷题小计

确定哪些订单购买了 prod_id 为 BR01 的产品(2)

这个题可以采用子查询和联合查询

子查询

# 先在第一张表当中查询出id为BRO1的数据然后再将这个数据放在第二张表当中查询
select order_num from orderitems where prod_id='BR01';
select cust_id,order_date from Orders where order_num in (select order_num from OrderItems where prod_id='BR01') order by order_date;

联合查询

# 联合查询 让o1.prod_id='BR01' 并且o2.order_num=o1.order_num 就行
select o2.cust_id,o2.order_date from OrderItems o1,Orders o2 where o1.prod_id='BR01' AND o2.order_num=o1.order_num order by o2.order_date;

返回顾客名称和相关订单号以及每个订单的总价

3个表格联合查询

select c.cust_name, o.order_num, o2.quantity*o2.item_price as OrderTotal -- 这里注意计算最后的价格
from Customers c,
     Orders o,
     OrderItems o2
where c.cust_id = o.cust_id -- 注意查询的条件
  and o2.order_num = o.order_num order by c.cust_name,o.order_num;

确定最佳顾客的另一种方式(二)

这个题有点难度,不太会

SQL104返回产品名称和每一项产品的总订单数

SQL30 统计每种性别的人数

这个题注意掌握SQL中if 语句的用法以及自定义分组查询的用法.

select if(profile like '%female', 'female', 'male') gender, count(*) number
# 先使用if判断profile中是否存在female 如果存在就返回female 否则返回male ,然后以这个进行分组,进行count统计
from user_submit
group by gender;

下面来使用SUBSTRING_INDEX函数解题

SUBSTRING_INDEX函数介绍

select substring_index(profile,',',-1) gender,count(*)  number from user_submit group by gender;
# 先使用substring_index分割出来是人员是哪一种性别,然后进行分组,然后就和上面的一样了

SQL247按照dept_no进行汇总

这个问题需要我们知道一个函数叫做group_concat(x,y)

GROUP_CONCAT用法

select dept_no, group_concat(emp_no) as employees -- 先使用dept_no 字段来进行分组,然后使用group_concat函数来进行字符串的连接
from dept_emp
group by dept_no;

SQL196查找入职员工时间排名倒数第三的员工所有信息

这个题需要用到limit的用法.

limit offic用法

select distinct hire_date from employees order by hire_date desc limit 2,1;
# 先使用子查询查询出第三名的退休时间,然后再使用一个select查询出结果

select *
from employees
where hire_date = (select distinct hire_date from employees order by hire_date desc limit 2,1);

SQL22 统计每个学校的答过题的用户的平均答题数

select t1.university ,count(t2.question_id)/count(distinct t1.device_id)  as avg_answer_cnt from user_profile t1,question_practice_detail t2 where t1.device_id=t2.device_id group by t1.university;

SQL24 统计每个用户的平均刷题数

SQL279 实习广场投递简历分析(二)

这个题需要进行两次分组,才能正确的解决问题.


SQL267 考试分数(二)

记住连接的是两个表,就算是上一个运算过后的结果也可以当作一个表来使用,并且on后面只能跟连接条件,where后面才能进过滤条件.

select t1.id, t1.job,t1.score
from grade t1
         left join (select t2.job job, avg(t2.score) as avg from grade t2 group by t2.job) as t3
                   on t1.job = t3.job where t1.score >t3.avg order by t1.id;

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

因为薪水可能相同这就导致了,可能右很多个第一名,这个就会对limit取第二名产生干扰,所以,需要先进行排序.然后再使用limit.

# 先排序然后使用limit
select emp_no, salary
from salaries
where salary = (select salary from salaries   group by salary order by salary desc limit 1,1);

SQL39 21年8月份练题总数

记住count()里面可以使用distinct来去除重复元素.

select count(distinct device_id) as did_cnt, count(*) as question_cnt
from question_practice_detail
where date_format(date, '%Y-%m') = '2021-08';

SQL257 刷题通过的题目排名

SQL246 获取employees中的first_name

substr函数的使用

select first_name from employees  order by substr(first_name,-2,2);

SQL245 查找字符串中逗号出现的次数

使用lenght函数和replace函数进行曲线救国,先将要查询的数量变成空格然后使用length减去这个替换后的长度就是答案

MySQL查某个字符串中包含指定字符/字符串/代码的个数

mySQL中replace的用法

select id,length(string) - length(replace(string, ',', '')) as cnt
from strings;

SQL238将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005

使用replace进行操作

select * from titles_test;
update titles_test set emp_no=replace(emp_no,10001,10005) where id=5;
posted @ 2023-08-29 09:39  harper886  阅读(12)  评论(0编辑  收藏  举报