不会SQL,好意思说自己会编程?

欢迎关注,敬请点赞!

【摘要】

  • SQL是结构化查询语言,select语句通过设置合适条件,精确获取需要的数据。

题目:

现有一个会议室管理系统,有一张会议室表(id,名称,位置,大小,投影projection),一张预定表(id,会议室id,起始时间,结束时间,预定人),创建方法及表格如下:

CREATE TABLE meeting (

  id int(11) NOT NULL AUTO_INCREMENT,

  name varchar(50) DEFAULT NULL,

  position varchar(256) DEFAULT NULL,

  size int(11) DEFAULT '0',

  projection int(11) DEFAULT '1',

  PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;

meeting表

id name position size projection
1 room1 101 120 0
2 room2 103 120 1
3 room3 104 150 1
4 room4 201 120 0
5 room5 203 120 1
6 room6 204 150 1
CREATE TABLE `booking` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `meeting_id` int(11) DEFAULT NULL,
  `start_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `end_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `booking_man` varchar(50) DEFAULT 'admin',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4;

booking表

id meeting_id start_time end_time booking_man
1 1 2019/11/12 17:50 2019/11/12 19:50 xiao wang
2 5 2019/11/12 20:50 2019/11/12 22:50 xiao wang
3 3 2019/11/12 20:50 2019/11/12 22:50 xiao liu
4 4 2019/11/12 20:50 2019/11/12 22:50 xiao liu
5 2 2019/11/12 20:50 2019/11/12 22:50 xiao sun
6 1 2019/11/12 22:20 2019/11/12 22:50 xiao sun
7 2 2019/11/12 23:00 2019/11/12 23:40 xiao wang
8 1 2019/11/12 20:50 2019/11/12 21:20 xiao wu
9 3 2019/11/12 23:00 2019/11/12 23:40 xiao liu

任务一:请写SQL语句查出哪些人预定会议室最频繁

select b.booking_man, count(*) c from booking b join meeting m on b.meeting_id = m.id group by b.booking_man order by c desc;

根据题意,需要显示预定会议室的人booking_man和次数count,倒序排列;
简写直接跟在全称后面,中间的as省略,如count() [as] c;
同级的逗号隔开,如b.booking_man, count(
) c;
join on 配合使用,on 可以理解为“满足…条件时”,其作用范围终止于(不包括)后面其它语法如group by、order by、where等;
预定和被预定,意味着两表连接(join)时,booking表的meeting_id = meeting表的id。

预定会议室最频繁的人

任务二: 请写SQL语句查出哪个会议室被预定次数最多

select m.name, count(*) c from meeting m join booking b on m.id = b.meeting_id group by m.name order by c desc limit 3;

根据题意,需要显示会议室名称name和次数,倒序排列,显示前几个(比如前3个);
limit 3表示显示前3个。
会议室预定次数

任务三:请写SQL语句查出哪些人预定了有投影的会议室

返回顶部

select b.booking_man, m.name, b.start_time, b.end_time, m.projection from booking b join meeting m on b.meeting_id = m.id and m.projection = 1;

根据题意,需要显示预定会议室的人booking_man,被预定且有投影(booking表的meeting_id = meeting表的id,且projection = 1),会议室名称(因一个人可能定多个会议室),宜显示起始和结束时间。

哪些人定带投影的会议室

任务四:请写SQL语句查出“该时段”哪些会议室空闲

select now(), m.name from meeting m join booking b on b.meeting_id = m.id and now() between b.start_time and b.end_time union select now(), m.name from meeting m where m.id not in (select b.meeting_id from booking b); 

根据题意,需要显示该时段now(),会议室名称name,(情况一)有预定但当前时间不在起始和结束时间范围内的会议室 联合 (情况二)没有预定,room2和room3属于情况一,room6属于情况二。

当前时间空闲的会议室

欢迎关注,敬请点赞!
返回顶部

原创文章 43 获赞 14 访问量 2874

猜你喜欢

转载自blog.csdn.net/weixin_45221012/article/details/103040573