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;
这个题有点难度,不太会
这个题注意掌握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函数解题
select substring_index(profile,',',-1) gender,count(*) number from user_submit group by gender;
# 先使用substring_index分割出来是人员是哪一种性别,然后进行分组,然后就和上面的一样了
这个问题需要我们知道一个函数叫做group_concat(x,y)
select dept_no, group_concat(emp_no) as employees -- 先使用dept_no 字段来进行分组,然后使用group_concat函数来进行字符串的连接
from dept_emp
group by dept_no;
这个题需要用到limit的用法.
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);
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;
这个题需要进行两次分组,才能正确的解决问题.
记住连接的是两个表,就算是上一个运算过后的结果也可以当作一个表来使用,并且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);
记住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';
SQL246 获取employees中的first_name
select first_name from employees order by substr(first_name,-2,2);
SQL245 查找字符串中逗号出现的次数
使用lenght函数和replace函数进行曲线救国,先将要查询的数量变成空格然后使用length减去这个替换后的长度就是答案
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;