1.去除重复的行:
SELECT DISTINCT ename FROM emp;
2.连接表达式
SELECT ename||'的部门号是'||deptno FROM emp;
3.处理NULL
SELECT NVL(ename,'noname') FROM emp; --如果某行ename为空则显示noname,不为空则显示ename的值.
4.日期类型显示格式
如果表arwen中列birthday为date类型
SELECT TO_CHAR(birthday,'YYYY-MM-DD') FROM arwen
5.WHERE 子句中的BETWEEN ..AND
相当于大于等于且小于等于
6.LIKE模糊查询.%表示0到多个字符_表示单个字符
7.转义字符:
如果表中有%,_这样的符号需要用到转义字符\
假如表arwen中的ename是a%name.查找
SELECT * FROM arwen WHERE ename LIKE 'a\%name';
也可以这样写SELECT * FROM arwen WHERE ename LIKE 'as%name' ESCAPE 's'; --s可以替换成其他任何字符
8.多列排序:
排序中NULL被当作最大值处理
SELECT ename,deptno,sal FROM emp
ORDER BY ename ASC,sal DESC; --ASC表示升序,默认都是按升序.DESC降序.此处表示先用名字排序.名字相同再用sal排序.
特殊情况:如果用UNION连接两个表,排序时不能指定列.只能用数字
SEELCT deptno,dname FROM dept
UNION
SELECT empno,ename FROM emp
ORDER BY 1; --表示参照第一列来排序,如果写成2就是用第二列
9.分组函数
SELECT AVG(empno),SUM(empno),MAX(empno),MIN(empno),COUNT(empno) FROM emp;
--其中的分组函数分别表示平均值,总和,最大值,最小值,总行数
分组函数中NULL被忽略掉不在计算范围之类.所以如果empno为空则计算的不是整个表的总行数.而COUNT(*)总是表的总行数.
10.GROUP BY用法
上面的分组函数是应用于整个表,假如我们只计划表中某个部门的平均值等等.
SELECT deptno,AVG(sal) FROM emp
GROUP BY deptno;
如果想在大组中再分成小组计算.例如每个部门分组,再每个职位分组.
SELECT deptno,job,AVG(sal) avg_sal,FROM emp
GROUP BY ROLLUP(deptno,job);
DEPTNO JOB AGV_SAL
-------------------------------------------------------------------
10 CLERK 4500
10MANAGER8500
10 6500
20CLERK5000
20 MANAGER 9000
20 7000
6750
其中6500是部门10的平均工资,7000是部门20的平均工资.6750是两个部门的平均工资.
注意如果查询语句去年ROLLUP则加颜色的数字就不会出现.
SELECT deptno,job,AVG(sal) avg_sal,FROM emp
GROUP BY CUBE(deptno,job);
DEPTNO JOB AGV_SAL
-------------------------------------------------------------------
10 CLERK 4500
10 MANAGER 8500
10 6500
20 CLERK 5000
20 MANAGER 9000
20 7000
6750
CLERK 4750
MANAGER 8750
如果只显示平均工资大于5000的职位:
SELECT deptno, job,AVG(sal) avg_sal FROM emp
GROUP BY deptno,job
HAVING AVG(sal) >5000;
注意:如果HAVING改成WHERE会出错.WHERE子句中不能有分组函数