打死也要掌握的SQL面试题系列

    技术2022-07-14  89

    假设有一张表,有主键ID,其他字段,A,B,C,D.假设两行的记录中,A字段的值相等,则表示两行记录出现重复,现在要求编写SQL,删除重复的记录,只保留一条不重复的记录。 保留ID最小的记录保留ID最大的记录注意,需要考虑不要删除了不重复的记录 delete from t_repeat where id not in (select max(id) id from t_repeat group by a) #出现错误的提示: #[Err] 1093 - You can't specify target table 't_repeat' for update in FROM clause​​ #这个错误是MySQL数据库不支持“先select出同一表中的某些值,再update这个表(在同一语句中)​​” ​ #解决办法: #利用中间表的思想 delete from t_repeat where id not in ( select temp.id from (select max(id) id from t_repeat group by a) temp ) ​ 问题延伸,假设判断重复的依据是A和B都重复,该如何实现上述的需求? delete from t_repeat where id not in ( select id from (select min(id) id from t_repeat group by a,b) temp ) 有一张学生表,有id,name,course,score字段。查询每门课都大于80分的学员姓名 select name from t_student_score GROUP BY name having min(score)>80

     

    查询Java学科,考试分数前三名的学员信息 select name,score,course from t_student_score where course='java' order by score DESC limit 0,3 #对成绩倒序排序,去前3条记录 查询总分超过180的学员姓名及总分数 select name,sum(score) from t_student_score GROUP BY name HAVING sum(score)>180 #聚合函数不能放在where子句里面 行列转换,表有字段,学员姓名,科目,分数

    要求转换成

    select NAME from t_student_score t1 GROUP BY t1.name; select NAME, ( select score from t_student_score t2 where t2.course='java' and t2.name=t1.name ) as 'java', ( select score from t_student_score t2 where t2.course='SQL' and t2.name=t1.name ) as 'SQL' from t_student_score t1 GROUP BY t1.name; 查询学生成绩表中,总分数前三名的学员信息 select s.name,sum(s.score) from t_student_score s group by s.name order by sum(s.score) desc limit 0,1 从一张考勤表中,找出员工每天的上班和下班的打卡时间。 表中有字段,ID,name,time(打卡时间)效果如下:

    SQL如下:

    select name,date(time),min(time) as '上班时间',max(time) as '下班时间' from t_card_record group by date(time),name 从订单表中,查询出2018年,订单总金额超过10000的用户,假设该表有如下字段,ID,order_no,user_id,order_time,total_money select o.user_id,sum(o.total_money) from t_order o where o.order_time BETWEEN '2018-01-01' and '2018-12-31' group by o.user_id HAVING sum(o.total_money)>10000 查询2018年入职的员工数量,假设员工表的字段有,ID,employee_no,name,entry select count(1) from t_employee where entry BETWEEN '2018-01-01' and '2018-12-31' 如何查询爱奇艺2018年上架的类型为科幻,爱情,动作的电影信息。 select * from t_film where publish_time BETWEEN '2018-01-01' and '2018-12-31' and type in('科幻','爱情','动作') 假设有两张表,A表有100条记录,B表有10000条记录,做表关联查询时,哪种效率更高?

    以下两条SQL查询语句,哪种效率更高?

    EXPLAIN select * from t_big b inner JOIN t_small s on b.id=s.id; EXPLAIN select * from t_small s inner join t_big b on s.id=b.id; 优化器会内部做对比 每一次在树里面做一次查找都是log(n),所以对比的是10000*log(100)和100*log(10000) 如何快速复制一张现有表的数据到另一张表 insert into t_other(id,name) select id,name from t_small

     

    Processed: 0.017, SQL: 9