?
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結果。
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
