真是久違的近期小結系列。。。。
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) ;