1. 程式人生 > >【2016-11-09】近期小結

【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)  ;