l 排序
select * from dept where deptno <>10 order by deptno asc; //(升序排列)
select ename, sal, deptno from emp order by deptno asc, ename desc; //(按照多个字段排序 首先按照deptno升序排列,当detpno相同时,再按照ename的降序排列)
l 函数
n 搜索结果转换为小写
select lower(ename) from emp; //(函数lower() 将ename搜索出来后全部转化为小写);
n 截取子串
select substr(ename, 2, 3) from emp; //(使用函数substr() 将搜素出来的ename字段从第二个字母开始截,一共截3个字符)
n 字符ASC码转换
select chr(65) from dual; //(函数chr() 将数字转化为AscII中相对应的字符)
select ascii('A') from dual; //(函数ascii()与32中的chr()函数是相反的 将相应的字符转化为相应的Ascii编码)
n 四舍五入
select round(23.232) from dual; //(函数round() 进行四舍五入操作)
select round(23.232, 2) from dual; //(四舍五入后保留的小数位数, 0 个位 -1 十位)
select round(23.652,1) from dual; 结果为: 23.7
select round(23.652,-1) from dual; 20
n 货币操作
select to_char(sal, '$99,999.9999')from emp; //(加$符号加入千位分隔符,保留四位小数,没有的补零)
select to_char(sal, 'L99,999.9999')from emp; //(L 将货币转化为本地币种此处将显示¥人民币)
select sal from emp where sal>888.88 无错.但
select sal from emp where sal>$1,250,00;会出现无效字符错误. 改为:select sal from emp where sal>to_number('$1.250.00','$9,999,99');
n 日期操作
select to_char(hiredate, 'yyyy-MM-DD HH:MI:SS') from emp; //(改变日期默认的显示格式)
select to_char(sysdate, 'yyyy-MM-DD HH:MI:SS') from dual; //(用12小时制显示当前的系统时间)
select to_char(sysdate, 'yyyy-MM-DD HH24:MI:SS') from dual; //(用24小时制显示当前的系统时间)
select birthdate from emp;
显示为:
BIRTHDATE
----------------
17-12月-80
----------------
改为:
select to_char(birthdate,'YYYY-MM-DD HH:MI:SS') from emp;
显示:
BIRTHDATE
-------------------
1980-12-17 12:00:00
-------------------
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; //也可以改为:HH12
TO_CHAR(SYSDATE,'YY
-------------------
2007-02-25 14:46:14
to_date函数:
select ename,birthdate from emp where birthdate > to_date('1981-2-20 12:34:56','YYYY-MM-DD HH24:MI:SS');
如果直接写 birthdate>'1981-2-20 12:34:56'会出现格式不匹配,因为表中的格式为: DD-MM月-YY.
n 替换空值
select ename,sal*12+nvl(comm,0) from emp; 这样可以防止comm为空时,sal*12相加也为空的情况.
l 组函数
45、select max(sal) from emp; // (函数max() 求出emp表中sal字段的最大值)
46、select min(sal) from emp; // (函数max() 求出emp表中sal字段的最小值)
47、select avg(sal) from emp; //(avg()求平均薪水);
48、select to_char(avg(sal), '999999.99') from emp; //(将求出来的平均薪水只保留2位小数)
49、select round(avg(sal), 2) from emp; //(将平均薪水四舍五入到小数点后2位)
50、select sum(sal) from emp; //(求出每个月要支付的总薪水)
l group by
select avg(sal) from emp group by deptno;
select deptno avg(sal) from emp group by deptno;
select deptno,job,max(sal) from emp group by deptno,job;
求薪水值最高的人的名字.
select ename,max(sal) from emp;出错,因为max只有一个值,但等于max值的人可能好几个,不能匹配.
应如下求:
select ename from emp where sal=(select max(sal) from emp);
Group by语句应注意,出现在select中的字段,如果没出现在组函数中,必须出现在Group by语句中.
l Having 对分组结果筛选
Where是对单条纪录进行筛选,Having是对分组结果进行筛选.
select avg(sal),deptno from emp
group by deptno
having avg(sal)>2000;
查询工资大于1200雇员,按部门编号进行分组,分组后平均薪水大于1500,按工薪倒充排列.
select * from emp
where sal>1200
group by deptno
having avg(sal)>1500
order by avg(sal) desc;
l 子查询
问那些人工资,在平均工资之上.
select ename,sal from emp where sal>(select avg(sal) from emp);
l 表连接
n 三张表连接
slect ename,dname, grade from
emp e join dept d on(e.deptno=d.deptno)
join salgrade s on(e.sal between s.losal and s.hisal)
where ename not like '_A%';
把每张表连接 条件不混在一起,然后数据过滤条件全部区分开来。读起来更清晰,更容易懂一点。
n 自连接
不准用组函数,求薪水的最高值(面试题)
select distinct sal from emp where sal not in(select distinct e1.sal from emp e1 join emp e2 on (e1.sal<e2.sal))
推荐一个淘宝旗下网站,每天9块9包邮还返利。现在登录还有9元支付宝红包送你哦!http://invite.etao.com/67121619402a047e.htm