做题修炼Java+SQL(第三天)

一、Java混合部分

1、构造方法特征
具有与类相同的名称;
不含返回类型;
不能在方法中用return语句返回一个值,不能用void修饰构造方法;
接口不允许被实例化,所以接口中没有构造方法;
不能被static、final、synchronized、abstract和native修饰;
每一个和.java文件同名的public类可以有多个构造方法,构造方法允许重载;
构造方法不能被继承;
在类实例化的时候,系统自动调用。
构造方法就是类构造对象时调用的方法,主要用来实例化对象。
在这里插入图片描述
2、若事务T对数据对象A加上X(eXclusive)锁,则只允许其他事务对数据对象A加S(Share)锁,而不能加X锁,直到T释放A上的锁。
解析:错
共享锁【S锁】
又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

排他锁【X锁】
又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

3、SQL语言 四大类:
DQL(数据查询语言):数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块
DML(数据操纵语言):插入、更新、删除
DCL(数据控制语言):数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等
DDL(数据定义语言):数据定义语言DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等

4、窗体是连接用户和表之间的纽带,以交互窗口方式表达表中的数据

解析:窗体是一种文档,可以用来收集信息。它包括两部分,
一部分是由窗体设计者输入的,填写窗体的人无法更改的文字或图形。窗体设计者可以插入希望得到回答的问题、选项列表、信息表格等。

另一部分是由窗体填写者输入的,用于从填写窗体者处收集信息并进行整理的空白区域。窗体设计者可以在文档中插入窗体域或 ActiveX 控件,为窗体填写者提供用于收集数据的位置。

5、运动会比赛信息的数据库,有如下三个表:
运动员ATHLETE(运动员编号 Ano,姓名Aname,性别Asex,所属系名 Adep), 项目 ITEM (项目编号Ino,名称Iname,比赛地点Ilocation), 成绩SCORE (运动员编号Ano,项目编号Ino,积分Score)。
写出目前总积分最高的系名及其积分,SQL语句:

SELECT Adep,SUM(Score)   FROM ATHLETE,SCORE  
WHERE ATHLETE.Ano=SCORE.Ano 
GROUP BY Adep  
HAVING SUM(Score)>=ALL
(SELECT SUM(Score) FROM ATHLETE,SCORE  
WHERE ATHLETE.Ano=SCORE.Ano 
GROUP BY Adep )

注意:
All:对所有数据都满足条件,整个条件才成立;
Any:只要有一条数据满足条件,整个条件成立;
Some的作用和Any一样 .
having 用于分组(group by)之后的筛选;

[多选]6、已知如下的命令执行 java MyTest a b c 请问哪个语句是正确的?
A、args[0] = “MyTest a b c”
B、args[0] = “MyTest”
C、args[0] = “a”
D、args[1]= “b”

解析:CD
对于java命令,类名后面跟着的就是main函数的参数,多个参数则用空格隔开。 main方法的形参是一个string数组所以对于java mytest a b c传入的参数算是一个string数组。 即args[0]=a ;args[1]=b ;args[2]=c。

java 8中基本数据类型:byte,short,int,long,double,float,boolean,char

[多选]7、JDK1.7版本之前,接口和抽象类描述正确的有( )
A、抽象类没有构造函数。
B、接口没有构造函数。
C、抽象类不允许多继承。
D、接口中的方法可以有方法体。

解析:BC
A.抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已
B.在接口中 不可以有构造方法,在接口里写入构造方法时,编译器提示:Interfaces cannot have constructors。
C.Java不允许类多重继承
D.jdk1.8后接口中的方法可以有方法体,jdk1.8之前不可以有方法体
接口特性:

1、使用interface关键字;
2、接口没有构造方法,不能用于实例化对象;
3、实现类必须重写接口中所有的抽象方法,否则就必须声明为抽象类;
4、接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错);
5、接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,其他修饰符都会报错);
6、接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
注:JDK 1.8 以后,在JDK1.7的基础上增加了static静态方法和default默认方法。

抽象类特性:

1、抽象类、抽象方法使用abstract关键词完成。
2、抽象类可以定义构造方法,不能被实例化
3、抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
4、抽象类中的抽象方法只是声明,不包含方法体body。
5、构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
6、抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
7、抽象类的方法默认访问权限为protected。
注意:JDK 1.8 以后,抽象类的方法默认访问权限变为default。

抽象类和接口的区别:

  • JDK1.7

1、接口的方法默认是 public,所有方法在接口中不能有实现,而抽象类可以有非抽象的方法。
2、接口中除了 static、final 变量,不能有其他变量,而抽象类中则不一定。
3、一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过 extends 关键字扩展多个接口。
4、接口方法默认修饰符是 public,抽象方法可以有 public、protected 和 default 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰!)

  • JDK1.8改动

1、在 jdk 7 或更早版本中,接口里面只能有常量变量和抽象方法。这些接口方法必须由选择实现接口的类实现。
2、jdk8 的时候接口可以有默认方法和静态方法功能。
3、Jdk 9 在接口中引入了私有方法和私有静态方法

[多选]8、有var d = new Date(‘2018-05-09’),可以设置为6月份的操作是?()
A、d.setMonth(7);
B、d.setMonth(6);
C、d.setMonth(5);
D、d.setDate(40);

解析:CD
1、d.setDate(n);
n表示一个月中的一天的一个数值(1 ~ 31):
0 为上一个月的最后一天
-1 为上一个月最后一天之前的一天
如果当月有 31 天:
32 为下个月的第一天
如果当月有 30 天:
32 为下一个月的第二天;
40 为下一个月的第9天;

2、setMonth(n),这里是0-11分别对应1-12月

[多选]9、关于语义化,以下说法正确的有:
A、div元素本身不具有语义,但是可以结合class、title、lang属性来表示具有语义的一组内容
B、b元素和strong元素都可以用来表示强调
C、legend元素用于对表单控件进行分组,而fieldset元素用来表示它的标题
D、time元素用于表示时间、address元素用于表示地址

解析:AD
B.b表示加粗,strong表示重要文本
C.fieldset用来分组,而legend用来分组描述
legend :为 fieldset 元素定义标题(caption)
fieldset :将表单内的相关元素分组。

二、SQL部分

1、删除重复电子邮箱
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+
Id 是这个表的主键。

例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+

解析:

DELETE p1 FROM Person p1,
    Person p2
WHERE
    p1.Email = p2.Email AND p1.Id > p2.Id

2、上升的温度
编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id 。
返回结果 不要求顺序 。
查询结果格式如下例:

Weather
+----+------------+-------------+
| id | recordDate | Temperature |
+----+------------+-------------+
| 1  | 2015-01-01 | 10          |
| 2  | 2015-01-02 | 25          |
| 3  | 2015-01-03 | 20          |
| 4  | 2015-01-04 | 30          |
+----+------------+-------------+

Result table:
+----+
| id |
+----+
| 2  |
| 4  |
+----+
2015-01-02 的温度比前一天高(10 -> 252015-01-04 的温度比前一天高(20 -> 30

解析:

SELECT
    weather.id AS 'Id'
FROM weather
JOIN weather w 
ON DATEDIFF(weather.date, w.date) = 1
AND weather.Temperature > w.Temperature

3、行程和用户
Trips 表中存所有出租车的行程信息。每段行程有唯一键 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键。Status 是枚举类型,枚举成员为 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。

+----+-----------+-----------+---------+--------------------+----------+
| Id | Client_Id | Driver_Id | City_Id |        Status      |Request_at|
+----+-----------+-----------+---------+--------------------+----------+
| 1  |     1     |    10     |    1    |     completed      |2013-10-01|
| 2  |     2     |    11     |    1    | cancelled_by_driver|2013-10-01|
| 3  |     3     |    12     |    6    |     completed      |2013-10-01|
| 4  |     4     |    13     |    6    | cancelled_by_client|2013-10-01|
| 5  |     1     |    10     |    1    |     completed      |2013-10-02|
| 6  |     2     |    11     |    6    |     completed      |2013-10-02|
| 7  |     3     |    12     |    6    |     completed      |2013-10-02|
| 8  |     2     |    12     |    12   |     completed      |2013-10-03|
| 9  |     3     |    10     |    12   |     completed      |2013-10-03| 
| 10 |     4     |    13     |    12   | cancelled_by_driver|2013-10-03|
+----+-----------+-----------+---------+--------------------+----------+

Users 表存所有用户。每个用户有唯一键 Users_Id。Banned 表示这个用户是否被禁止,Role 则是一个表示(‘client’, ‘driver’, ‘partner’)的枚举类型。

+----------+--------+--------+
| Users_Id | Banned |  Role  |
+----------+--------+--------+
|    1     |   No   | client |
|    2     |   Yes  | client |
|    3     |   No   | client |
|    4     |   No   | client |
|    10    |   No   | driver |
|    11    |   No   | driver |
|    12    |   No   | driver |
|    13    |   No   | driver |
+----------+--------+--------+

写一段 SQL 语句查出 2013年10月1日 至 2013年10月3日 期间非禁止用户的取消率。基于上表,你的 SQL 语句应返回如下结果,取消率(Cancellation Rate)保留两位小数。

取消率的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)

+------------+-------------------+
|     Day    | Cancellation Rate |
+------------+-------------------+
| 2013-10-01 |       0.33        |
| 2013-10-02 |       0.00        |
| 2013-10-03 |       0.50        |
+------------+-------------------+

解析:

SELECT T.request_at AS `Day`, 
	ROUND(
			SUM(   IF(T.STATUS = 'completed',0,1)
			)
			/ 
			COUNT(T.STATUS),
			2
	) AS `Cancellation Rate`
FROM Trips AS T
JOIN Users AS U1 ON (T.client_id = U1.users_id AND U1.banned ='No')
JOIN Users AS U2 ON (T.driver_id = U2.users_id AND U2.banned ='No')
WHERE T.request_at BETWEEN '2013-10-01' AND '2013-10-03'
GROUP BY T.request_at

SUM 求和函数,COUNT 计数函数,ROUND 四舍五入函数

4、游戏玩法一
写一条 SQL 查询语句获取每位玩家 第一次登陆平台的日期。
查询结果的格式如下所示:

Activity 表:
+-----------+-----------+------------+--------------+
| player_id | device_id | event_date | games_played |
+-----------+-----------+------------+--------------+
| 1         | 2         | 2016-03-01 | 5            |
| 1         | 2         | 2016-05-02 | 6            |
| 2         | 3         | 2017-06-25 | 1            |
| 3         | 1         | 2016-03-02 | 0            |
| 3         | 4         | 2018-07-03 | 5            |
+-----------+-----------+------------+--------------+

Result 表:
+-----------+-------------+
| player_id | first_login |
+-----------+-------------+
| 1         | 2016-03-01  |
| 2         | 2017-06-25  |
| 3         | 2016-03-02  |
+-----------+-------------+

解析:

select player_id, min(event_date) as first_login
from Activity
group by player_id;

5、游戏玩法二
请编写一个 SQL 查询,描述每一个玩家首次登陆的设备名称
查询结果格式在以下示例中:

Activity table:
+-----------+-----------+------------+--------------+
| player_id | device_id | event_date | games_played |
+-----------+-----------+------------+--------------+
| 1         | 2         | 2016-03-01 | 5            |
| 1         | 2         | 2016-05-02 | 6            |
| 2         | 3         | 2017-06-25 | 1            |
| 3         | 1         | 2016-03-02 | 0            |
| 3         | 4         | 2018-07-03 | 5            |
+-----------+-----------+------------+--------------+

Result table:
+-----------+-----------+
| player_id | device_id |
+-----------+-----------+
| 1         | 2         |
| 2         | 3         |
| 3         | 1         |
+-----------+-----------+

解析:

select player_id, device_id
from Activity
where (player_id, event_date)
in (select player_id, min(event_date)
    from Activity
    group by player_id);

备注: 题目来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/consecutive-numbers

来源:牛客网
链接:https://www.nowcoder.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值