几道面试题

 

1.如何用一条语句把一张表的数据插入到另一张数据库表中?

 

2.如何用一条语句把一张表的数据插入到另一张不存在的数据库表中?

 

3.有如下A、B两个表,如何将A表的数据查询出来,结果如B所示?

         A表:

姓名

科目

分数

张三

语文

60

李四

数学

65

张三

英语

70

张三

数学

75

李四

语文

80

李四

英语

68

 

         B表:

姓名

语文

数学

英语

总分

张三

 

 

 

 

李四

 

 

 

 

 

4.有如下几个类,我先运行TestA,再运行TestB,那么:

         class A:

public class A {
    public static int a = 6;
}

 

class TestA:

public class TestA {
    public static void main(String args[]) {
       A a = new A();
       a.a++;
       System.out.println(a.a);
    }
}

 

class TestB:

public class TestB {
    public static void main(String args[]) {
       A b = new A();
       System.out.println(b.a);
    }
}

 

(1)运行TestA的时候输出的结果是什么?

 

(2)运行TestB的时候输出的结果是什么?

 

(3)运行TestA和TestB的结果为什么相同或不相同?

 

5.有一个employee表,其结构如下所示:

empNo

int

empName

varchar2(20)

age

int

salary

number(7,2)

假设这个表的数据量很大,有几千万,请你用一条你觉得最有效率的SQL语句统计出如下四种类型的人数:

  • age>30 and salary>10000
  • age>30 and salary<10000
  • age<30 and salary>10000
  • age<30 and salary<10000

 6.写一个程序输出类似于“ABC”这样字符串的所有排列组合,如字符串“ABC”应当对应ABC、ACB、BAC、BCA、CBA和CAB。

 

 7.在try后面紧跟着一个return语句,那么之后的finally中包含的内容是否还会执行呢?如果执行是在return之前还是之后执行呢?


 解答:

 

1.如何用一条语句把一张表的数据插入到另一张数据库表中?

 

insert into tableA select * from tableB

 

2.如何用一条语句把一张表的数据插入到另一张不存在的数据库表中?

 

select * into tableB from tableA;
-------或者是下面这种写法
create table tableB as select * from tableA;

 

3.有如下A、B两个表,如何将A表的数据查询出来,结果如B所示?

         A表:

姓名

科目

分数

张三

语文

60

李四

数学

65

张三

英语

70

张三

数学

75

李四

语文

80

李四

英语

68

 

         B表:

姓名

语文

数学

英语

总分

张三

 

 

 

 

李四

 

 

 

 

这里我们用一个t_student表来表示A表,其建表语句如下所示:

create table t_student(name varchar2(4), course varchar2(4), score int);

那么这个时候要用一条SQL语句把A表的数据查询出B表的结果,我们可以如下定义我们的SQL语句:

select a.name 姓名,sum(case when course='语文' then score end) 语文,sum(cas
e when course='英语' then score end) 英语,sum(case when course='数学' then score
 end) 数学,b.total 总分 from t_student a, (select name, sum(score) total from t_
student group by name) b where a.name=b.name group by a.name,b.total order by a.
name desc;

 这条语句的总体思路是:

  • 先用分组的形式查询出每个人的总成绩
  • 用case when的形式把课程列分为多列,这样满足的那一列的成绩就是当前人当前课程的成绩,其他的成绩在当前行为空

姓名       语文       数学       英语

---- ---------- ---------- ----------

张三         60

张三                    75

张三                               70

李四                               68

李四         80

李四                    65

 

  • 把上述两个结果按照相同的姓名连接起来并按照姓名和总分分组,这样我们查询出来的结果就可以显示姓名和总分,那么我们没有按照成绩进行分组,那么当我们用分组语句的时候该如何查询出我们的成绩呢?这个时候sum就起作用了,根据之前分析的,每个人每门成绩只有一个有效值,其他的为空,所以我们对它进行汇总的结果还是其当前课程的成绩,这就可以满足我们在分组的情况下查询出对应的成绩。(在进行分组查询的时候,只能查询出对应的分组字段和统计字段)
  • 最后一步进行排序是为了按照“张三”,“李四”那样的顺序排列

 上面查询出来的结果会如下所示:

姓名       语文       英语       数学       总分

------ ------ ------- ------- --------

张三         60         70         75        205

李四         80         68         65        213

 

4.有如下几个类,我先运行TestA,再运行TestB,那么:

         class A:

public class A {
    public static int a = 6;
}

 

class TestA:

public class TestA {
    public static void main(String args[]) {
       A a = new A();
       a.a++;
       System.out.println(a.a);
    }
}

 

class TestB:

public class TestB {
    public static void main(String args[]) {
       A b = new A();
       System.out.println(b.a);
    }
}

 

(1)运行TestA的时候输出的结果是什么?

 7

(2)运行TestB的时候输出的结果是什么?

 6

(3)运行TestA和TestB的结果为什么相同或不相同?

 虽然变量a是类A的静态变量,但是TestA和TestB是两个不同的应用程序,TestA中改变的变量a的值不会影响到TestB中的结果。

 

 

5.有一个employee表,其结构如下所示:

 

empNo

int

empName

varchar2(20)

age

int

salary

number(7,2)

 

假设这个表的数据量很大,有几千万条数据,请你用一条你觉得最有效率的SQL语句统计出如下四种类型的人数:

  • age>30 and salary>10000
  • age>30 and salary<10000
  • age<30 and salary>10000
  • age<30 and salary<10000

我的思路:

        用case when来进行筛选,用count来进行统计,这样整个数据量只需要统计一遍。 

查询语句: 

select count(case when age>30 and salary>10000 then empNo end) type1, 
count(case when age>30 and salary<10000 then empNo end) type2, 
count(case when age<30 and salary>10000 then empNo end) type3, 
count(case when age<30 and salary<10000 then empNo end) type4 from employee;

 

 

6.写一个程序输出类似于“ABC”这样字符串的所有排列组合,如字符串“ABC”应当对应ABC、ACB、BAC、BCA、CBA和CAB。

        

        我的思想是用递归来处理,我们要把字符串当成一个一个的字符来处理。比如字符串ABC,我们可以先拿出来一个放在前面,其后则跟着另外两个,也就是说字符串ABC的排列应该是字符A+字符串BC的排列、字符B+字符串AC的排列和字符C+字符AB的排列。然后字符BC的排列又应该是字符B和字符串C的排列,就是这样来进行一个递归的操作。具体代码如下所示:

 

	public void printStr(String str) {
		int len = str.length();
		for (int i=0; i<len; i++) {
			String s = String.valueOf(str.charAt(i));
			StringBuffer buffer = new StringBuffer(str);
			buffer.deleteCharAt(i);
			System.out.println(s + buffer);
			printStr(s, buffer.toString());
		}
	}
	
	public void printStr(String start, String str) {
		int len = str.length();
		for (int i=0; i<len; i++) {
			String s = String.valueOf(str.charAt(i));
			StringBuffer buffer = new StringBuffer(str);
			buffer.deleteCharAt(i);
			if (i != 0)
				System.out.println(start + s + buffer);
			printStr(start + s, buffer.toString());
		}
	}

 

7.在try后面紧跟着一个return语句,那么之后的finally中包含的语句是否还会执行呢?如果执行的话是在return之前还是之后呢?

        这里我们先来看一下以下程序:

public class Test {

	public static void main(String args[]) {
		System.out.println(doTryReturn());
	}
	
	private static String doTryReturn() {
		try {
			return doTry();
		} finally {
			doFinally();
		}
	}
	
	private static String doTry() {
		System.out.println("invoke doTry() -------");
		return "doTry";
	}
	
	private static String doFinally() {
		System.out.println("invoke doFinally() -------");
		return "doFinally";
	}
	
}

         运行上述代码后我们可以看到控制台输出如下结果:

 

          这说明在try语句中return之后finally中的语句还是执行了,而且是在return之后执行的。在try里面执行到return之后程序就不再往try以下的语句执行了,而是保存当前的返回结果,接着判断是否存在finally语句,如果存在则接着执行finally语句块,如果finally语句块中同样包含return语句的话,将使用finally中的return结果取代try中的return结果,否则将返回try中的return结果。我们可以看到在上述代码中finally语句块中是没有return语句的,这个时候是返回的doTry。现在我们来做一个测试,我们把finally中的程序改为return doFinally(),即如下:

public class Test {

	public static void main(String args[]) {
		System.out.println(doTryReturn());
	}
	
	private static String doTryReturn() {
		try {
			return doTry();
		} finally {
			return doFinally();
		}
	}
	
	private static String doTry() {
		System.out.println("invoke doTry() -------");
		return "doTry";
	}
	
	private static String doFinally() {
		System.out.println("invoke doFinally() -------");
		return "doFinally";
	}
	
}

           接着我们再运行上述程序,这个时候控制台将输出如下内容:



           这说明确实如我们上面所说,finally存在return时返回的是finally中的return结果。

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值