①检索所有比“王华”年龄大的学生姓名、年龄和性别。SELECT语句:
解析:
第一步:先找到王华的年龄
SELECT AGE FROM S WHRE SN = "王华";
第二步:将第一步的结果作为条件进行筛选,比他年龄大的人的信息
SELECT SN,AGE,SEX
FROM S
WHRE AGE > (SELECT AGE FROM S WHRE SN = "王华");
知识点:单行子查询
②有一个User用户表,现要删除整张表(指完全删除表数据和表结构),下面正确的MySQL语句是:
A.DELETE TABLE User; B.DROP TABLE User;
C.TRUNCATE TABLE User; D.DELETE FROM User ;
解析:题目中要求是删除整张表(包括表数据和表结构)。B选项符合要求
知识点:本题主要考查DELETE、DROP、TRUNCATE三者的区别:
DELETE:
语法:DELETE FROM 表名 WHERE 筛选条件
TRUNCATE:
语法:TRUNCATE TABLE 表名; #不允许加条件,不加where
DROP:
DROP TABLE 表名称 #删除表数据和结构
DROP DATABASE #用于删除数据库:
三者区别:
-
数据恢复方面:delete 可以恢复删除的数据,而 truncate 和 drop 不能恢复删除的数据。
-
执行速度方面:drop > truncate > delete。
-
删除数据方面:drop 是删除整张表,包含行数据和字段、索引等数据,而 truncate 和 drop 只删除了行数据。
-
添加条件方面:delete 可以使用 where 表达式添加查询条件,而 truncate 和 drop 不能添加 where 查询条件。
-
重置自增列方面:在 InnoDB 引擎中,truncate 可以重置自增列,而 delete 不能重置自增列
③比赛结果result表内容如下:
Date Win
2017-07-12 胜
2017-07-12 负
2017-07-15 胜
2017-07-15 负
如果要生成下列结果, sql语句是:
比赛日期 胜 负
2017-07-12 1 1
2017-07-15 1 1
解析:
要显示的是比赛日期、胜、负,将胜或者负统计成得分求和,并按日期进行分组
故SQL语句为:
SELECT DATE AS 比赛日期, SUM(CASE WHEN '胜' then 1 else 0 end) AS 胜,SUM(CASE WHEN '负' then 1 else 0 end) AS 负
FROM result
GROUP BY DATE;
知识点:
1.别名:select 原名 as 别名 from 表名;
2.聚合函数:常用的聚合函数SUM(总和)、MAX(最大值)、MIN(最小值)、AVG(平均值)、COUNT(计数);
3.流程控制函数语法:
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
…
else 要显示的值n或语句n
end
4.GROUP BY :将表中的数据分成若干组,需要将SELECT后面的字段名(除了聚合函数)都包含上。
④在gameList表中(player_id, event_date)是主键,如何显示每个玩家(player_id)首次登录的设备号(device_id),并同时显示玩家ID(player_id)?
解析:
需要展示每个玩家(player_id)首次登录的设备号(device_id)并同时展示id,则需要通过子查询的方式获得最小的时间,然后按照id进行展示。
第一步:通过子查询的方式找到每个玩家首次登录的设备号,这里将每个玩家按照时间分等级
SELECT * ,
RANK() OVER(
PARTITION BY player_id
ORDER BY event_date
) AS rank_date
FROM gamelist;
这时就会变成:
player_id | device_id | event_date | games_played | rank_date |
111 | 21 | 2020-01-02 | 6 | 1 |
111 | 21 | 2020-03-01 | 5 | 2 |
212 | 33 | 2020-09-03 | 1 | 1 |
322 | 11 | 2020-01-21 | 0 | 1 |
322 | 44 | 2020-03-02 | 5 | 2 |
第二步:然后按照id进行展示
SELECT player_id, device_id
FROM(第一步 )t
WHERE t.rank_date=1
结果:
SELECT player_id, device_id
FROM(SELECT * ,rank() over (partition by player_id order by event_date ) as rank_date from gamelist )t
WHERE t.rank_date=1
player_id | device_id |
111 | 21 |
212 | 33 |
322 | 11 |
知识点:
Rank()函数:为结果集分区中每一行分配一个排名,行等级由一加上前面的等级指定。 RANK() OVER( PARTITION BY 表达式 ##将结果集划分为分区 ORDER BY 表达式 [ASC|DESC] ##对分区内的进行排序 ) 详细:https://www.begtut.com/mysql/mysql-rank-function.html ⑤某打车公司要将驾驶里程(drivedistanced)超过5000里的司机信息转存到一张称为seniordrivers 的表中,他们的详细情况被记录在表drivers 中,sql语句为: 解析:从drivers表中将信息转存到seniordrivers 的表,只转存满足条件:drivedistanced >= 5000 SQL语句: SELECT * INTO seniordrivers FROM drivers WHERE drivedistanced >= 5000; 知识点: INSERT INTO 语句用于向一张表中插入新的行; SELECT INTO 语句从一张表中选取数据插入到另一张表中。常用于创建表的备份复件或者用于对记录进行存档。 标签:语句,牛客,练习,rank,player,SQL,date,id,SELECT From: https://www.cnblogs.com/liu-myu/p/16666384.html