1.nvl(a,b):表示,如果a为null,则显示b。
2.oracle中判断字段是否为null不能用where a=null或where a!=null,这样永远都是false。而是应该用where a is null或where a is not null。
空值:是指无效的,未指定的,未知的或不可预知的值。空值不是空格或0。
3.DISTINCT 用于去除重复数据
(1)如果只是去除一列的重复数据,效果很明显
(2)如果去除两列,发现某一列还是存在重复数据,那是因为,2列合并在一起,才算没有重复,要两列一起看
4.列的别名:紧跟列名,列名和别名之间的关键字AS可以省略,如果别名使用双引号,那么可以在别名中包含空格或特殊的字符,此时别名就区分大小写了。
5.MySql中字段的值是不区分大小写的,而Oracle是区分大小写的。
SELECT * FROM EMP WHERE ENAME='ward';
SELECT * FROM EMP WHERE ENAME='WARD';
如果字段内容是ward小写的,那么oracl的sql条件写成大写就没有查询结果了。
--包括边界,小值在前,大值在后
SELECT * FROM EMP WHERE SAL BETWEEN 1000 AND 2000;
7.IN:注意(如果集合中含有null值,不能使用NOT IN,但可以使用IN)
--等于括号中的一个
SELECT * FROM EMP WHERE DEPTNO IN(10,20,NULL);
--不等于括号中的一个
SELECT * FROM EMP WHERE DEPTNO NOT IN(10,20,NULL);
8.LIKE模糊查询: %表示零个或多个字符 _表示单个字符
--查询名字以S开头的员工信息
SELECT * FROM EMP WHERE ENAME LIKE 'S%';
--查询名字长度为4的员工信息
SELECT * FROM EMP WHERE ENAME LIKE '____';
--查询名字中含有下划线的员工,需要使用转义字符
SELECT * FROM EMP WHERE ENAME LIKE '%\_%' ESCAPE '\';
9.Oracle解析sql是从右至左的,所以在where condition1 or condition2 语句中将为真的那个条件写在condition2上时,效率会高。因为如果condition2写的是false,那么Oralce就会再去解析condition1。
10.Order by
单列排序
--按照年收入(月薪*12+奖金)来排序
SELECT ENAME,SAL,COMM,SAL*12+NVL(COMM,0) FROM EMP ORDER BY SAL*12+NVL(COMM,0)
SELECT ENAME,SAL,COMM,SAL*12+NVL(COMM,0) AS 年收入 FROM EMP ORDER BY 年收入
SELECT ENAME,SAL,COMM,SAL*12+NVL(COMM,0) FROM EMP ORDER BY 4 --4表示第几位,从1开始
多列排序
--ORDER BY 多列
SELECT * FROM EMP ORDER BY DEPTNO ,SAL ;--发现,作用于所有的列,如果第一列相同则按照第二列来排序,以此类推
SELECT * FROM EMP ORDER BY DEPTNO DESC ,SAL;--发现,DEPTNO是倒序,如果DAPTNO一样则按SAL升序排列
--按照奖金升序排列(结果是没有问题的)
SELECT * FROM EMP ORDER BY COMM ASC;
--按照奖金倒序排列(发现NULL值会出现在前面,如果直接这样显示在jsp页面上体验很不好,所以要用NULLS LAST关键字,将NULL值在有值的后面显示)
SELECT * FROM EMP ORDER BY COMM DESC
用nulls last关键字解决。
SELECT * FROM EMP ORDER BY COMM DESC NULLS LAST;