幾道面試題
最近正在換工作,面試了幾家公司,做了一些筆試題,現(xiàn)把其中幾道還有點(diǎn)意思的題貼出來。在這邊文章中我想先把這幾道題貼出來,之后再進(jìn)行解答。
1.如何用一條語句把一張表的數(shù)據(jù)插入到另一張數(shù)據(jù)庫表中?
2.如何用一條語句把一張表的數(shù)據(jù)插入到另一張不存在的數(shù)據(jù)庫表中?
3.有如下A、B兩個表,如何將A表的數(shù)據(jù)查詢出來,結(jié)果如B所示?
A表:
姓名 | 科目 | 分?jǐn)?shù) |
張三 | 語文 | 60 |
李四 | 數(shù)學(xué) | 65 |
張三 | 英語 | 70 |
張三 | 數(shù)學(xué) | 75 |
李四 | 語文 | 80 |
李四 | 英語 | 68 |
B表:
姓名 | 語文 | 數(shù)學(xué) | 英語 | 總分 |
張三 |
|
|
|
|
李四 |
|
|
|
|
4.有如下幾個類,我先運(yùn)行TestA,再運(yùn)行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)運(yùn)行TestA的時候輸出的結(jié)果是什么?
(2)運(yùn)行TestB的時候輸出的結(jié)果是什么?
(3)運(yùn)行TestA和TestB的結(jié)果為什么相同或不相同(站長網(wǎng))?
解答:
1.如何用一條語句把一張表的數(shù)據(jù)插入到另一張數(shù)據(jù)庫表中?
- insert into tableA select * from tableB
2.如何用一條語句把一張表的數(shù)據(jù)插入到另一張不存在的數(shù)據(jù)庫表中?
- select * into tableB from tableA;
- -------或者是下面這種寫法
- create table tableB as select * from tableA;
3.有如下A、B兩個表,如何將A表的數(shù)據(jù)查詢出來,結(jié)果如B所示?
A表:
姓名 | 科目 | 分?jǐn)?shù) |
張三 | 語文 | 60 |
李四 | 數(shù)學(xué) | 65 |
張三 | 英語 | 70 |
張三 | 數(shù)學(xué) | 75 |
李四 | 語文 | 80 |
李四 | 英語 | 68 |
B表:
姓名 | 語文 | 數(shù)學(xué) | 英語 | 總分 |
張三 |
|
|
|
|
李四 |
|
|
|
|
這里我們用一個t_student表來表示A表,其建表語句如下所示:
- create table t_student(name varchar2(4), course varchar2(4), score int);
那么這個時候要用一條SQL語句把A表的數(shù)據(jù)查詢出B表的結(jié)果,我們可以如下定義我們的SQL語句:
- select a.name 姓名,sum(case when course='語文' then score end) 語文,sum(cas
- e when course='英語' then score end) 英語,sum(case when course='數(shù)學(xué)' then score
- end) 數(shù)學(xué),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的形式把課程列分為多列,這樣滿足的那一列的成績就是當(dāng)前人當(dāng)前課程的成績,其他的成績在當(dāng)前行為空
姓名 語文 數(shù)學(xué) 英語
---- ---------- ---------- ----------
張三 60
張三 75
張三 70
李四 68
李四 80
李四 65
- 把上述兩個結(jié)果按照相同的姓名連接起來并按照姓名和總分分組,這樣我們查詢出來的結(jié)果就可以顯示姓名和總分,那么我們沒有按照成績進(jìn)行分組,那么當(dāng)我們用分組語句的時候該如何查詢出我們的成績呢?這個時候sum就起作用了,根據(jù)之前分析的,每個人每門成績只有一個有效值,其他的為空,所以我們對它進(jìn)行匯總的結(jié)果還是其當(dāng)前課程的成績,這就可以滿足我們在分組的情況下查詢出對應(yīng)的成績。(在進(jìn)行分組查詢的時候,只能查詢出對應(yīng)的分組字段和統(tǒng)計(jì)字段)
- 最后一步進(jìn)行排序是為了按照“張三”,“李四”那樣的順序排列
上面查詢出來的結(jié)果會如下所示:
姓名 語文 英語 數(shù)學(xué) 總分
------ ------ ------- ------- --------
張三 60 70 75 205
李四 80 68 65 213
4.有如下幾個類,我先運(yùn)行TestA,再運(yùn)行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)運(yùn)行TestA的時候輸出的結(jié)果是什么?
7
(2)運(yùn)行TestB的時候輸出的結(jié)果是什么?
6
(3)運(yùn)行TestA和TestB的結(jié)果為什么相同或不相同?
雖然變量a是類A的靜態(tài)變量,但是TestA和TestB是兩個不同的應(yīng)用程序,TestA中改變的變量a的值不會影響到TestB中的結(jié)果。