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

猜你喜欢

转载自raising.iteye.com/blog/2336731