欢迎关注,敬请点赞!
不会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属于情况二。
欢迎关注,敬请点赞!
返回顶部