【2016-11-09】近期小結
真是久違的近期小結系列。。。。
1.distinct的分組作用
一般來說,大家都知道distinct是用來去重的,卻忽視了他也有分組的作用~下面就來測試一下。
假設有一張aaa的表資料如下:
其中,date和name欄位是一一對應的,而date和name2欄位並不是一一對應的。
1)下面就來測試distinct和group by在date和name欄位上的作用效果:
SELECT DISTINCT DATE,NAME FROM aaa ORDER BY DATE;
SELECT DATE,NAME FROM aaa GROUP BY DATE,NAME ORDER BY DATE;
2)下面繼續測試distinct和group by在date和name2欄位上的作用效果:
SELECT DISTINCT DATE, NAME2 FROM aaa ORDER BY DATE;
SELECT DATE,NAME2 FROM aaa GROUP BY DATE,NAME2 ORDER BY DATE;
可以看出,無論是否一一對應,當distinct作用在2個欄位上時,就相當於group by的去重效果,但是distinct並不能代替group by的作用,比如在select分支上加上count,sum等統計函式。。
2.多個join的執行順序。
一直比較迷惑多個join在內部的執行順序,下面就來驗證一下!
現有A、B、C三張表的資料如下:
A表:
B表:
C表:
1)比如以下sql:
SELECT a.name,
b.`province`,
c.`address`
FROM A a
LEFT JOIN B b ON a.fk = b.`id`
LEFT JOIN C c ON a.fk=c.`fk`
結果如下:
2)sql語句:
SELECT a.name, b.`province`, c.`address` FROM A a RIGHT JOIN B b ON a.fk = b.`id` LEFT JOIN C c ON a.fk=c.`fk`
結果如下:
3)sql語句:
SELECT a.name,
b.`province`,
c.`address`
FROM A a
JOIN B b ON a.fk = b.`id`
LEFT JOIN C c ON a.fk=c.`fk`
結果如下:
仔細觀察每條sql語句的不同之處,對於sql語句裡多個join(不管是inner join還是left join還是right join),執行順序是第一個join的結果集(臨時表)的大小決定最終整個sql語句結果的大小;第一個join的結果集(不分欄位)再跟後面的join繼續連線,然後select出相應的欄位即可。
3.group by、where、left join等執行順序。
語法順序: select ->from->left join->on( and)->where->(and)->group by->having->order by
執行順序:from->left join->on(and)->where->group by->having->select->order by
在使用left join時,on和where條件的區別如下:
1) on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
2)where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
很容易出錯的地方:當在left join後使用on生成臨時表時,會加上and,再對臨時表過濾時,會習慣性再加上and 而不是使用where造成錯誤~
4.同一個字串,通過main方法跑出的解密結果是正常的中文顯示,但是通過資料庫傳遞過來經解密後卻亂碼?
因為字元在字串經過jdbc傳到後臺時,自帶了字元編碼。經過解密後的字串最好統一這樣處理:new String(String str, String charset),其中str為解密後的字串,charset為字元編碼,一般都是UTF-8。
下圖為字元編碼的一張圖:
5.學習一種執行緒安全的單例模式:
private static Singleton instance = null;
/**
* Returns a singleton instance of Singleton.
*
* @return an instance of Singleton.
*/
public synchronized static Singleton getInstance() {
if (instance == null) {
Singleton props = new Singleton();
instance = props;
}
return instance;
}
private Singleton() { }
6、window.frames['downloadFrame']可以獲取id為downloadFrame的iframe元素,而不是name為downloadFrame的iframe。而且得到的是一個js物件……
7.sql語句裡,!='' 會把null的記錄也過濾掉,但is not null不會把''的記錄過濾掉;=‘’和is null則分別只過濾出‘’和null的記錄~ 另:注意這種寫法:SELECT * FROM a WHERE id>1 AND (fk='' OR fk IS NULL) ;