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

  • 9c4e14d3-4768-3dbd-9b87-75a6e2292203-thumb.png
  • 大小: 8.1 KB
  • e4de6517-145f-3fcc-9764-c186e0bbc5f9-thumb.png
  • 大小: 4.2 KB
  • 68e80efb-c0a1-3565-a929-2e0101e9608d-thumb.png
  • 大小: 4.3 KB
  • 1bada32c-5664-37e8-a4c6-42f5a5917b11-thumb.png
  • 大小: 3.8 KB
  • c7fddbe0-f17e-36fb-9d40-d94f2dd8310c-thumb.png
  • 大小: 3.8 KB
  • 9662e40b-5b42-3e49-b499-90a5e8ba7258-thumb.png
  • 大小: 3.4 KB
  • 9f57629d-f54c-3988-94aa-86e5b4eaf052-thumb.png
  • 大小: 2.7 KB
  • 25e0a290-ce47-37ec-9ed7-65e324c92667-thumb.png
  • 大小: 3.6 KB
  • 3dd31ac0-de55-3049-9128-58a483d0556d-thumb.png
  • 大小: 5.2 KB
  • 7ff8a88b-9720-3645-912e-bbfad41c1d52-thumb.png
  • 大小: 4 KB
  • 732359d8-7ffd-341c-b12b-eec2f8bb9d82-thumb.jpg
  • 大小: 248.8 KB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章