目录

  • 一、最爱考的sql笔试题
  • 1.1 创建表及数据
  • 1.2 笔试题
  • 1.2.1 查询每门课程的最高分、最低分、平均分
  • 1.2.2 查询每门课的最高分学生的信息
  • 1.2.3 查询每每门课的前三名
  • 1.2.4 删除自动编号不同其他信息相同的学生
  • 二、课程题
  • 2.1 查询每门课程成绩都大于80分学生的学号
  • 2.2 查询课程001的成绩大于课程002成绩的学号
  • 三、推测题
  • 3.1 已知表中推测sql
  • 3.2 表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列
  • 3.3 请取出当天的记录
  • 3.4 按显示格式写出sql语句
  • 3.5 从tab1,tab2中取出如tab3所列格式数据
  • 3.6 使用一条SQL求出四个球队所有比赛组合
  • 3.7 有两个表A和B,均有key和value两个字段,如果B的key在A中也有,就把B的value换为A中对应的value
  • 3.8 按结果显示写出sql语句
  • 3.9 计算总订单价格大于100的订单号和总订单价格


一、最爱考的sql笔试题

大佬们___先活动活动颈椎

mysql 时间大于15天 mysql 时间大于昨天_sql语句

1.1 创建表及数据

/*
 Navicat MySQL Data Transfer

 Source Server         : 三丰153
 Source Server Type    : MySQL
 Source Server Version : 80018
 Source Host           : 43.226.148.253:3306
 Source Schema         : seata-test

 Target Server Type    : MySQL
 Target Server Version : 80018
 File Encoding         : 65001

 Date: 28/03/2021 10:18:44
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自动编号',
  `sno` bigint(20) NOT NULL COMMENT '学号',
  `name` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学生姓名',
  `sex` int(2) NULL DEFAULT NULL COMMENT '1-男,2-女',
  `cno` bigint(20) NULL DEFAULT NULL COMMENT '课程号',
  `score` float(64, 0) NULL DEFAULT NULL COMMENT '分数',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 63 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (36, 4, 'zhangsan4', 1, 2, 99);
INSERT INTO `student` VALUES (38, 5, 'zhangsan5', 1, 6, 47);
INSERT INTO `student` VALUES (40, 6, 'zhangsan6', 1, 7, 37);
INSERT INTO `student` VALUES (42, 5, 'zhangsan5', 1, 7, 98);
INSERT INTO `student` VALUES (43, 6, 'zhangsan6', 1, 1, 63);
INSERT INTO `student` VALUES (44, 1, 'zhangsan1', 1, 6, 81);
INSERT INTO `student` VALUES (45, 5, 'zhangsan5', 1, 1, 80);
INSERT INTO `student` VALUES (46, 3, 'zhangsan3', 1, 2, 99);
INSERT INTO `student` VALUES (47, 4, 'zhangsan4', 1, 1, 73);
INSERT INTO `student` VALUES (48, 4, 'zhangsan4', 1, 7, 53);
INSERT INTO `student` VALUES (49, 2, 'zhangsan2', 1, 1, 47);
INSERT INTO `student` VALUES (50, 4, 'zhangsan4', 1, 6, 85);
INSERT INTO `student` VALUES (51, 3, 'zhangsan3', 1, 1, 64);
INSERT INTO `student` VALUES (52, 5, 'zhangsan5', 1, 2, 53);
INSERT INTO `student` VALUES (53, 6, 'zhangsan6', 1, 2, 44);
INSERT INTO `student` VALUES (54, 6, 'zhangsan6', 1, 6, 77);
INSERT INTO `student` VALUES (55, 2, 'zhangsan2', 1, 7, 58);
INSERT INTO `student` VALUES (56, 3, 'zhangsan3', 1, 7, 97);
INSERT INTO `student` VALUES (57, 2, 'zhangsan2', 1, 6, 68);
INSERT INTO `student` VALUES (58, 2, 'zhangsan2', 1, 2, 59);
INSERT INTO `student` VALUES (59, 1, 'zhangsan1', 1, 1, 88);
INSERT INTO `student` VALUES (60, 1, 'zhangsan1', 1, 2, 84);
INSERT INTO `student` VALUES (61, 3, 'zhangsan3', 1, 6, 66);
INSERT INTO `student` VALUES (62, 1, 'zhangsan1', 1, 7, 89);

SET FOREIGN_KEY_CHECKS = 1;

1.2 笔试题

1.2.1 查询每门课程的最高分、最低分、平均分

select max(score),min(score),avg(score)  from student group by cno

1.2.2 查询每门课的最高分学生的信息

select cno,sno,name,sex,score from student t,
 (select cno,max(score) score from student group by cno) s
 where t.cno = s.cno and t.score = s.score;

1.2.3 查询每每门课的前三名

select  t1.*
 from student t1 where 
 (select count(1) from student t2 where t1.cno = t2.cno)   <= 3
 order by cno,score desc;

1.2.4 删除自动编号不同其他信息相同的学生

delete from
 student 
 where id not in
 ( 
  select min(temp.id) as id from 
  (select * from student) as temp
  group by 
    temp.cno,
    temp.sno,
    temp.name,
    temp.score
 )

二、课程题

2.1 查询每门课程成绩都大于80分学生的学号

表 student

name

score

course

A

85

语文

A

75

数学

A

82

英语

B

75

语文

B

89

数学

B

79

英语

天使美眉

90

语文

天使美眉

100

数学

天使美眉

100

英语

#SQL1:
select name from student
group by name  having min(score) > 80;
#SQL2:
select name from student
group by name having count(score) = sum(case when score > 0 then 1 else 0 end) 
#SQL3
select name from student 
where name not in 
(select distinct(name) from student where socre <= 80);

2.2 查询课程001的成绩大于课程002成绩的学号

  • student表:sno(学号),sname(姓名),sex(性别),dept(系)
  • course课程表:cno(课程号),课程名(cname)
  • sc选课表:sno,cno,grade(成绩)
#SQL1
 select sno from 
 (select sc.* from sc,course where sc.cno = course.cno and cname = '001' ) one
 inner join 
 (select sc.* from sc,course where sc.cno = course.cno and cname = '002' ) two
 on one.sno = two.sno where one.grade > two.grade;

三、推测题

3.1 已知表中推测sql

time

grade

2005-05-09


2005-05-09


2005-05-09


2005-05-09


2005-05-10


2005-05-10


2005-05-10


如果要生成下列结果, 该如何写sql语句

time



2005-05-09

2

2

2005-05-10

1

2

#SQL1
select time,sum(case grade = '胜' when 1 else 0 end) 胜,
sum(case grade = '负' when 1 else 0 end) 负 from tab
group by time;
#SQL2
select t1.time,t1.sucess as 胜,t2.fail as 负
(select time,count(1) sucess from tab where grade = '胜' group by time ) t1,
(select time,count(1) fail from tab where grade = '负' group by time) t2
where t1.time and t2.time;
#SQL3
select t1.time,t1.sucess as 胜,t2.fail as 负
(select time,count(1) sucess from tab where grade = '胜' group by time ) t1 inner join
(select time,count(1) fail from tab where grade = '负' group by time) t2
on t1.time and t2.time;

3.2 表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列

select  case(when A > B then A else B end),case(when B > C then B else C end)  from tab ;

3.3 请取出当天的记录

  • 一个日期判断的sql语句请取出表中日期(SendTime字段)为当天的所有记录 (SendTime字段为datetime型,包含日期与时间)
select  *  from tab where to_char(SendTime,'yyyy-mm-dd') = to_char(sysdate,'yyyy-mm-dd');

3.4 按显示格式写出sql语句

  • 有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):
  • 大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
    显示格式:

语文

数学

英语

及格

优秀

不及格

select 
case(when 语文 >= 80 then '优秀' when 语文 >= 60 then '及格' else '不及格' end) 语文,
case(when 数学 >= 80 then '优秀' when 数学 >= 60 then '及格' else '不及格' end) 数学,
case(when 英语 >= 80 then '优秀' when 英语 >= 60 then '及格' else '不及格' end) 英语
from tab

3.5 从tab1,tab2中取出如tab3所列格式数据

tab1:

mon

dep

yj

一月份

01

10

一月份

02

10

一月份

03

5

二月份

02

8

二月份

04

9

三月份

03

8

tab2:

dep

depname

01

国内业务一部

02

国内业务二部

03

国内业务三部

04

国际业务部

tab3 (result):

dep

一月份

二月份

三月份

01

10

null

null

02

10

8

null

03

5

null

8

04

null

9

null

select dep 
(select yj  from tab1  where mon = '一月份' and tab1.dep = t.dep ) 一月份,
(select yj  from tab1  where mon = '二月份' and tab1.dep = t.dep) 二月份,
(select yj  from tab1  where mon = '三月份' and tab1.dep = t.dep) 三月份
 from  tab2 t ;

求总销售额

select 
sum(case when mon = '一月份' then yj else 0 end)  一月份 ,
sum(case when mon = '二月份' then yj else 0 end)  二月份 ,
sum(case when mon = '三月份' then yj else 0 end)  三月份 
from  tab1 , tab2 where tab1.dep = tab2.dep;

3.6 使用一条SQL求出四个球队所有比赛组合

  • SQL题目:
    一个表team,里面只有一个字段name, 一共有4条纪录,分别是a,b,c,d, 对应四个球队,现在四个球队进行比赛,
    用一条sql语句显示所有可能的比赛组合。
  • 创建表和插入数据
create table team(name varchar2(30));
 
insert into team values('a');
insert into team values('b');
insert into team values('c');
insert into team values('d');
  • 思路:

使用笛卡尔积连接,并使当前大小值只与比它大的值连接。

select t1.name,t2.name from team t1,team t2 where t1.name < t2.name;

3.7 有两个表A和B,均有key和value两个字段,如果B的key在A中也有,就把B的value换为A中对应的value

update  A set A.value = B.value where key in (select key from B where A.key = B.key);

3.8 按结果显示写出sql语句

courseid

coursename

score

1

java

70

2

oracle

90

3

xml

40

4

jsp

30

5

servlet

80


为了便于阅读,查询此表后的结果显式如下(及格分数为60):

courseid

coursename

score

mark

1

java

70

pass

2

oracle

90

pass

3

xml

40

fail

4

jsp

30

fail

5

servlet

80

pass

select *,case(when score >= 60 then 'pass' else 'fail' end) mark from tab ;

3.9 计算总订单价格大于100的订单号和总订单价格

mysql 时间大于15天 mysql 时间大于昨天_Server_02

o_num

o_item

f_id

quantity

item_price

30001

1

a1

10

5.2

30001

2

b2

3

6.00

30001

3

bs1

5

11.2

30001

4

bs2

15

9.2

30002

1

b3

2

20.00

30003

1

c0

100

10.00

30004

1

o2

50

2.50

30005

1

c0

5

10.00

30005

2

b1

10

8.99

30005

4

a2

10

2.20

30005

4

m1

5

14.99

select   o_num,sum(quantity*item_price) as orderTotal from  orderitems group by o_num having sum(quantity*item_price) >= 100;