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

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

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

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

choices表:

错误代码:

select * from choices
group by no
having sorce=min(sorce)

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

正确代码:

select * from choices
where sorce=(select min(sorce) from choices)

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

students表:

choices表:

select sname from students
where sid in
(select sid from choices where cid=1001)

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

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

students表:

choices表:

select sname from students
where not exists
(
    select * from courses where not exists
    (
        select * from choices where sid=students.sid
        and cid=courses.cid
    )
    
)

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

delete from exam_record
where score<60 and 
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)

INSERT INTO exam_record_before_2021(uid, exam_id, start_time, submit_time, score)
SELECT uid, exam_id, start_time, submit_time, score
FROM exam_record
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)

SELECT
    uid,
    nick_name,
    achievement
FROM user_info
WHERE nick_name LIKE '牛客%号'
    AND achievement BETWEEN 1200 AND 2500
    AND uid IN (
        SELECT uid
        FROM (
            SELECT uid, start_time AS act_time
            FROM exam_record
            UNION
            SELECT uid, submit_time AS act_time
            FROM practice_record
        ) temp
        GROUP BY uid
        HAVING DATE_FORMAT(MAX(act_time), '%Y%m') = 202109
    )

题解:

  • 先从表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_牛客题霸_牛客网

SELECT
	t1.emp_no AS emp_no,
	salary,
	last_name,
	first_name 
FROM
	employees t1
	JOIN salaries t2 ON t1.emp_no = t2.emp_no 
WHERE
	t2.to_date = '9999-01-01' 
	AND salary = (
SELECT
	MAX( salary ) 
FROM
	salaries 
WHERE
	salary < ( SELECT MAX( salary ) FROM salaries WHERE to_date = '9999-01-01' ) 
	AND to_date = '9999-01-01' 
	)

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

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

select (
select salary from salaries
where emp_no = '10001'
order by to_date desc limit 1
)-(
select salary from salaries
where emp_no = '10001'
order by from_date asc limit 1
)
growth ;

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

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

CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));

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

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

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

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

ignore关键字:insert ignore into

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

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

select s1.emp_no,(s1.salary-s2.salary) as growth
from (select emp_no,salary from salaries where to_date='9999-01-01') as s1
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
on s1.emp_no = s2.emp_no
order by growth

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

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

一表二用:

select de.emp_no,dm.emp_no as manager_no,
s1.salary as emp_salary,s2.salary as manager_salary
from dept_emp de,dept_manager dm,salaries s1,salaries s2
where de.dept_no=dm.dept_no
and de.emp_no=s1.emp_no
and dm.emp_no=s2.emp_no
and s1.salary>s2.salary
and s2.to_date='9999-01-01'
and s1.to_date='9999-01-01';

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 SQL Server 上进行进制安装,可以按照以下步骤操作: 1. 下载 SQL Server 安装文件,并将其解压缩到本地文件夹。 2. 在解压缩的文件夹中,找到“setup.exe”,右键单击并选择“以管理员身份运行”。 3. 在“SQL Server Installation Center”窗口中,选择“Installation”选项卡,然后单击“New SQL Server stand-alone installation or add features to an existing installation”。 4. 接受许可协议,并等待安装程序检查系统兼容性。 5. 在“Setup Role”页面上,选择“SQL Server Feature Installation”。 6. 在“Feature Selection”页面上,选择要安装的 SQL Server 功能,并单击“Next”。 7. 在“Installation Rules”页面上,确保所有规则都通过,然后单击“Next”。 8. 在“Instance Configuration”页面上,选择要安装的 SQL Server 实例的名称和实例的根目录,并选择要使用的安全性模式。根据需要配置其他选项,然后单击“Next”。 9. 在“Server Configuration”页面上,配置 SQL Server 数据库引擎和 SQL Server Agent 的服务帐户和密码。根据需要配置其他选项,然后单击“Next”。 10. 在“Database Engine Configuration”页面上,根据需要配置数据库引擎身份验证模式、数据文件和日志文件的位置以及其他选项。根据需要配置其他选项,然后单击“Next”。 11. 在“Ready to Install”页面上,查看安装摘要,确保所有配置都正确,然后单击“Install”。 12. 等待安装程序完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值