暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MYSQL之牛客网实战笔试题(四)

奈奈八尾 2021-04-19
1015

本次更新的内容为中级题10道,依然以题目+考核知识点+解题代码的内容输出。

话不多说,上题:

#30.使用子查询的方式找出属于Action分类的所有电影对应的title,description吗? 

考点:先left join再子查询,还是直接子查询?

SELECT f.title,  

              f.description

FROM film f

WHERE f.film_id IN (SElECT fc.film_id 

                                 FROM film_category fc

                                 INNER JOIN category c ON fc.category_id=c.category_id 

                                 WHERE c.name="Action")


#50.将employees表中的所有员工的last_name和first_name通过(')连接起来 

考点:sqlite连接是||  ||,mysql连接是 concat

sqlite的用法:

SELECT last_name||"'"||first_name

FROM employees;

mysql的用法:

SELECT CONCAT(last_name,"'",first_name)

FROM employees;


#51.查找字符串'10,A,B' 中逗号','出现的次数cnt 

考点:length,replace

SELECT (LENGTH("10,A,B")-LENGTH(REPLACE("10,A,B",",","")));


#53.按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees 

考点:聚合函数group_concat

SELECT dept_no,

              group_concat(emp_no) as employees

FROM dept_emp

GROUP BY dept_no;


#54.查找排除最大、最小salary之后的当前(to_date = '9999-01-01' )员工的平均工资avg_salary

解法一:

SELECT avg(salary)

FROM salaries

WHERE to_date='9999-01-01' 

AND salary!=(SELECT MAX(salary)

                       FROM salaries 

                       WHERE to_date='9999-01-01')

AND salary!=(SELECT MIN(salary)

                        FROM salaries

                        WHERE to_date='9999-01-01');

解法二:

SELECT (SUM(salary) - MAX(salary) - MIN(salary)) (COUNT(1)-2) avg_salary 

FROM salaries where to_date = '9999-01-01';


#55.分页查询employees表,每5行一页,返回第2页的数据 

考点:limit,limit n offset m

解法一:

SELECT * 

FROM employees

LIMIT 5,5;

解法二:

SELECT * 

FROM employees

LIMIT 5 OFFSET 5


#57.使用含有关键字exists查找未分配具体部门的员工的所有信息

考点:子查询 exists,子查询where,子查询from的区别

解法一:

SELECT *

FROM employees

WHERE NOT EXISTS (SELECT emp_no

                                     FROM dept_emp 

                                   WHERE employees.emp_no=dept_emp.emp_no)

解法二:

SELECT *

FROM employees 

WHERE emp_no NOT IN (SELECT emp_no FROM dept_emp);

解法三:

SELECT *

FROM employees e

LEFT JOIN dept_emp  d ON e.emp_no=d.emp_no 

WHERE d.dept_no is null;


#63.输出通过的题目的排名,通过题目个数相同的,排名相同,此时按照id升序排列

考点:dense_rank,ranking,row_number的区别

SELECT id,

              number,

             dense_rank() over( order by number desc) as dk

FROM passing_number

ORDER BY number DESC,id asc;


#73.查询用户分数大于其所在工作(job)分数的平均分的所有grade的属性,并且以id的升序排序

考点:avg,笛卡尔积的运用

select g.id,

           g.job,

           g.score

from grade g ,(select id,

                                   avg(score) over(partition by job) as avgscore

                         from grade ) a 

where g.id=a.id and g.score>a.avgscore

order by g.id;


#78.写出一个sql语句查询在2025-10-15以后,同一个用户下单2个以及2个以上状态为购买成功的C++课程或Java课程或Python课程的user_id,并且按照user_id升序排序

考点:要求较多,注意细节

解法一:

select o.user_id

from order_info o 

where o.product_name in ("C++","Java" ,"Python") 

and o.date>"2025-10-15" and o.status="completed"

group by o.user_id

having count(*)>1  

order by o.user_id;

解法二:

select distinct(user_id)

from order_info

where  date>"2025-10-15" 

 and product_name in("C++","Java","Python")

 and status="completed"

and user_id in  (select user_id 

                          from order_info 

                          where status="completed" and date>"2025-10-15" 

                          and product_name in("C++","Java","Python")

                          group by user_id 

                         having count(*)>1)

 order by user_id;

解法三:

select user_id 

 from order_info 

 where status="completed" and date>"2025-10-15" and product_name in("C++","Java","Python")

 group by user_id 

 having count(*)>1;


文章转载自奈奈八尾,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论