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