• SQL错题集(二)


     1.查询出生日期大于所有女同学出生日期的男同学的姓名及系别

    students表:

    snosnameclassssexbdaybplaceIDNumsdeptphone
    1311104李嘉欣13英语11995-05-28山西太原330204199405281056人文学院15900002211
    1311105苏有明13英语11994-04-16内蒙古包头330204199504162036人文学院15900002222
    1711101赵薇17物流11999-02-11安徽合肥330203199902110925经管学院15900001177
    1711102陆毅17物流11999-02-17上海330203199902170017经管学院15900001188

    1. select sname,sdept from students
    2. where bday>(select max(bday) from students where ssex="女")

    注:日期在前的被认定为小的

    2.找出选修课程成绩最差的选课记录

    choices表:

    错误代码:

    1. select * from choices
    2. group by no
    3. having sorce=min(sorce)

    错误原因:分组时用的聚合函数统计的是分组后每一组的数据结果

    正确代码:

    1. select * from choices
    2. where sorce=(select min(sorce) from choices)

    3.查询所有选修编号1001的课程的学生的姓名

    students表:

    choices表:

    1. select sname from students
    2. where sid in
    3. (select sid from choices where cid=1001)

    易错点:where sid in 不是 where sid =,后面可能会返回多个结果,所以得用in

    4.查询了选修所有课程的学生姓名

    students表:

    choices表:

    1. select sname from students
    2. where not exists
    3. (
    4. select * from courses where not exists
    5. (
    6. select * from choices where sid=students.sid
    7. and cid=courses.cid
    8. )
    9. )

    5.删除记录(一)_牛客题霸_牛客网 (nowcoder.com)

    1. delete from exam_record
    2. where score<60 and
    3. timestampdiff(minute,start_time,submit_time)<5

    时间差:

    • TIMESTAMPDIFF(interval, time_start, time_end)可计算time_start-time_end的时间差,单位以指定的interval为准,常用可选:
      • SECOND 秒
      • MINUTE 分钟(返回秒数差除以60的整数部分)
      • HOUR 小时(返回秒数差除以3600的整数部分)
      • DAY 天数(返回秒数差除以3600*24的整数部分)
      • MONTH 月数
      • YEAR 年数

    6.插入记录(二)_牛客题霸_牛客网 (nowcoder.com)

    1. INSERT INTO exam_record_before_2021(uid, exam_id, start_time, submit_time, score)
    2. SELECT uid, exam_id, start_time, submit_time, score
    3. FROM exam_record
    4. WHERE YEAR(submit_time) < '2021';

    插入记录的方式汇总:

    • 普通插入(全字段):
    INSERT INTO table_name VALUES (value1, value2, ...)
    • 普通插入(限定字段):
    INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...)
    • 多条一次性插入:
    INSERT INTO table_name (column1, column2, ...) VALUES (value1_1, value1_2, ...), (value2_1, value2_2, ...), ...
    • 从另一个表导入(全字段):
    INSERT INTO table_name SELECT * FROM table_name2 [WHERE key=value]
    • 从另一个表导入(限定字段字段):
    INSERT INTO table_name SELECT (column1, column2, ...) FROM table_name2 [WHERE key=value]

    题解:此题应该用最后一种插入方式

    7.筛选限定昵称成就值活跃日期的用户_牛客题霸_牛客网 (nowcoder.com)

    1. SELECT
    2. uid,
    3. nick_name,
    4. achievement
    5. FROM user_info
    6. WHERE nick_name LIKE '牛客%号'
    7. AND achievement BETWEEN 1200 AND 2500
    8. AND uid IN (
    9. SELECT uid
    10. FROM (
    11. SELECT uid, start_time AS act_time
    12. FROM exam_record
    13. UNION
    14. SELECT uid, submit_time AS act_time
    15. FROM practice_record
    16. ) temp
    17. GROUP BY uid
    18. HAVING DATE_FORMAT(MAX(act_time), '%Y%m') = 202109
    19. )

    题解:

    • 先从表exam_record中筛选出月份是2021年9月提交的用户ID。
    • 再从表practice_record中筛选出月份是2021年9月提交的用户ID

     知识点:where、date_format

    where date_format(submit_time, '%Y%m') = '202109'

    再从user_info表中筛选出成就值在1200到2500之间,uid在上述两个任意一个中,且nick_name能匹配牛客在首,号在结尾的情况。

     知识点:like、where、in

    where nick_name like '牛客%' and nick_name like '%号'

    8.获取当前薪水第二多的员工的emp_no以及其对应的薪水salary_牛客题霸_牛客网

    1. SELECT
    2. t1.emp_no AS emp_no,
    3. salary,
    4. last_name,
    5. first_name
    6. FROM
    7. employees t1
    8. JOIN salaries t2 ON t1.emp_no = t2.emp_no
    9. WHERE
    10. t2.to_date = '9999-01-01'
    11. AND salary = (
    12. SELECT
    13. MAX( salary )
    14. FROM
    15. salaries
    16. WHERE
    17. salary < ( SELECT MAX( salary ) FROM salaries WHERE to_date = '9999-01-01' )
    18. AND to_date = '9999-01-01'
    19. )

    难点:这题要求不准用order by,所以只能先查出原表最高工资,再查出除了原表最高工资以外的最高工资(第二高工资)

    9.查找员工编号emp_no为10001其自入职以来的薪水salary涨幅(总共涨了多少)growth_牛客题霸

    1. select (
    2. select salary from salaries
    3. where emp_no = '10001'
    4. order by to_date desc limit 1
    5. )-(
    6. select salary from salaries
    7. where emp_no = '10001'
    8. order by from_date asc limit 1
    9. )
    10. growth ;

    注:这题如果只考虑薪资不下降得话很简单,但是如果考虑下降就必须得用最后一天的工资减第一天的工资

    10. 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分

    1. CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL,
    2. `birth_date` date NOT NULL,
    3. `first_name` varchar(14) NOT NULL,
    4. `last_name` varchar(16) NOT NULL,
    5. `gender` char(1) NOT NULL,
    6. `hire_date` date NOT NULL,
    7. PRIMARY KEY (`emp_no`));

    考察: CONCAT 函数可以将多个字符串连接成一个字符串,但分隔符需要指定多次,如要达到 “a:b:c” 的效果就需要指定两次 ":"

    1. SELECT CONCAT(last_name, ' ', first_name) as Name
    2. FROM employees

    11.于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作

    actor_idfirst_namelast_namelast_update
    3EDCHASE2006-02-15 12:34:33

    ignore关键字:insert ignore into

    1. insert ignore into actor
    2. values(3,'ED','CHASE','2006-02-15 12:34:33')

    12.查找在职员工自入职以来的薪水涨幅情况_牛客题霸_牛客网 (nowcoder.com)

    1. select s1.emp_no,(s1.salary-s2.salary) as growth
    2. from (select emp_no,salary from salaries where to_date='9999-01-01') as s1
    3. inner join (select e.emp_no ,s.salary from employees e left join salaries s on e.emp_no=s.emp_no and e.hire_date=s.from_date ) as s2
    4. on s1.emp_no = s2.emp_no
    5. order by growth

    解:先查找入职工资表,再查找现在工资表,最后把两个salary相减

    13.获取员工其当前的薪水比其manager当前薪水还高的相关信息_牛客题霸_牛客网

    一表二用:

    1. select de.emp_no,dm.emp_no as manager_no,
    2. s1.salary as emp_salary,s2.salary as manager_salary
    3. from dept_emp de,dept_manager dm,salaries s1,salaries s2
    4. where de.dept_no=dm.dept_no
    5. and de.emp_no=s1.emp_no
    6. and dm.emp_no=s2.emp_no
    7. and s1.salary>s2.salary
    8. and s2.to_date='9999-01-01'
    9. and s1.to_date='9999-01-01';

  • 相关阅读:
    数据仓库、数据中台、大数据平台的关系?
    DG failover TNS description list ,ADG service name 不一样的tnsnames.ora的设置
    大话设计模式之抽象工厂模式
    Go语言面试题
    ubuntu安装 notepad
    MySQL索引、事务与存储引擎
    年已过半,年终立的Flag实现了几个?
    LabVIEW中的数据通信方法
    MYSQL——毫秒值和日期类型数据的转换,DATE_SUB的用法
    解决ElementUI表格el-table-column添加fixed底部被遮挡的方法汇总
  • 原文地址:https://blog.csdn.net/qq_62767608/article/details/127712558