码迷,mamicode.com
首页 > 其他好文 > 详细

练习题

时间:2017-05-21 22:39:01      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:ble   mat   manager   平均工资   _for   count   第一个字符   货币   第一个   

1.select ename as "aa",sal from emp;  //用as关键字,别名用双引

2.select distinct sal from emp;  //distinct 去掉重复的行

3.select ename,sal,deptno from emp order by 3 desc,2 desc ; //对数据按照第三列和第二列 从小到大排序

4.select ename,sal from emp where sal between 1000 and 3000;  //between and  查询某个区间

5.select ename,sal from emp where sal in (1000,2000,3000);  //当条件有多个的时候,用in

6.select ename,deptno from emp where ename like ‘J%‘;  //like 运算,%可以匹配零个或多个字符。

7.select ename,deptno from emp where ename like ‘_A%‘;  //这里的_的意思是 第一个字母必须有 是什么无所谓

8.select ename from emp where ename like ‘%s_%‘ escape ‘s‘;   //这里的escape 意思是将s 定义为转义字符。我们通常是将 / 作为转义字符

9.select ename,comm from emp where comm is null;  //用is null 来查询null值的列

10. not 、and 、 or   //优先级顺序

-------------------------------------------------------------------------------------------------

字符操作函数

大小写操作函数

lower  //将字符串转换成小写

upper  //将字符串转换成大写

initcap  //将字符串转换成首字母大写

字符串操作函数

concat  //将两个字符串连接到一起

length  //求字符串字符的长度(个数)

lengthb //求字符串字节的长度

lengthc //求字符串unicode的长度 

substr  //截取字符串字符的长度

substrb   //截取字符串字节的长度

select substr(‘abcd‘,m,n)  //m为正数的时候表示从头开始截取,为负数的时候表示从尾部开始截取。n表示截取多少位,不写表示截取到尾部

instr  //查找字符在字符串中的位置

select instr(‘abcad‘,‘a‘,1,2);  //表示从第一个字符开始查找,第二个字符a在字符串中的位置。0表示没有在父串中找到该子串

trim  //将子串从父串中删除,一般用来删除空格

select trim(leading ‘a‘ from ‘aabbccaa‘) from dual;  

  leading  //表示从头开始删

  trailing  //表示从尾部开始删

  both  //表示两头都删

replace  //将子串在父串中替换

lpad  //左对齐

rpad  //右对齐

 

操作数字的函数

round(44.98,m)  //四舍五入

trunc(44.98,m)  //截断,全部舍弃

以小数点为核心,m为正数,是取小数点后边的数,m为负数,是取小数点前面的数,0表示小数点位

ceil(44.98)   //直接进位取整

abs(-44.98)  //取绝对值

mod(44.98,m)  //对其取余

 

日期函数

 

元素 结果
YYYY 用数字表示的完整年份
YEAR 拼写出的年份(用英文表示)
RR 显示年份,不显示世纪
MM 月份的两位数值
MONTH 月份的完整名称
MON 月份的三个字母缩写
DY 一周中某日的三个字母缩写
DAY 一周中某日的完整名称
DD 用数字表示的月份中某
mi
ss

select * from nls_session_parameters where parameter=‘NLS_DATE_FORMAT‘;  //查看当前日期的显示格式

alter session set nls_date_format=‘yyyy/mm/dd:hh24:mi:ss‘;

日期之间可以直接相加减

select months_between(sysdate,hiredate) from dual;  //计算两个日期的月间隔

select add_months(hiredate,6) from emp;  //给日期加上6个月,只对月有效,年份不可以。

select next_day(hiredate,‘friday‘) from emp;  //从指定日期算起,下一个Friday是什么时候。

select last_day(hiredate) from emp;  //计算当月最后一天的日期

 

日期的进位和截取

select round(hiredate,‘mm‘) from emp;  //以月份进位

select trunc(hiredate,‘mm‘) from emp;  //以月份截取

 

数据类型的显式转换

日期转化为字符串

select ename,to_char(hiredate,‘fmyyyy/mm/dd‘) from emp;  //fm消除前置的零和空格。

数字转换为字符串

元素 结果
9 代表一位数字
0 强制显示零,但不会改变结果
$ 放置一个浮动的美元符号
L 使用浮动的本地货币符号
. 显示小数点
, 显示作为千位指示符的逗号
G 是千分符
D 是小数点

注意:G只能和D一起用  ,只能和.一起使用

select ename,to_char(sal,‘L199,999D000‘) salary from emp;

 

操作数据为null的函数

nvl(expr1,expr2)  //如果 1 为非空就返回1,如果为空就返回2 

nvl2(expr1,expr2,expr3)  //如果 1为非空,就返回2,如果 1 为空,返回3

nullif(expr1,expr2)   //如果1 和 2 相同 就返回空,否则返回 1

coalesce(expr1,expr2)  //返回括号内第一个非空的值

 

case 分支函数

select ename,job,sal,case  //标准case语句
  job when ‘SALESMAN‘ then 1.1 * sal  //这里的when后边不能写大于小于判断条件
  when ‘MANAGER‘ then 1.2 * sal
  else sal end aa
  from emp;

 

scott@TEST>select ename,job,sal,case  //不标准格式的case语句
2 when job=‘SALESMAN‘ then sal*1.1
3 when job=‘CLERK‘ then sal*10
4 when job=‘MANAGER‘ then sal*10  //如果条件出现两次 则只执行第一条命令
5 else sal end aa
6 from emp;

 

decode 函数改写标准的case语句

scott@TEST>select ename,job,sal,decode
2 (job,‘CLERK‘,1.1*sal
3 ,‘SALESMAN‘,1.2*sal
4 , sal)
5 from emp;

select sum(decode(to_char(hiredate,‘yyyy‘),‘1980‘,1,0)) "1980"

    sum(decode(to_char(hiredate,‘yyyy‘),‘1981‘,1,0)) "1981"

    sum(decode(to_char(hiredate,‘yyyy‘),‘1982‘,1,0)) "1982"

      sum(decode(to_char(hiredate,‘yyyy‘),‘1983‘,1,0)) "1983"   from emp;

分组函数

avg、sum、max、min、count

除了count(*)以外,都忽略null值

如果计算某个列的所有函数,可以这样count(nvl(comm,0))

 

group by 分组函数

如果两个列有相同的条件,可以放在一起分组。比如说 同一个部门,同一个年龄段的,这样就可以放在一起分组

having 是对条件再次筛选,出现在group by后边

如果有order by 排序,得放在 group by 子句后边

 

表的连接查询

等值连接:就是两个表有相同的列,当有多个相同的列的时候 要指明连接的列名

非等值连接:两个表没有相同的列,但是一张表和另一张表的某列有关系,比如工资和工资等级判断。

外部连接:比如说 有一个部门编号是40,但是雇员表中40号没有雇员,这个时候 40部门就显示不出来,这个时候需要在 雇员表这边加上 + 来显示,在不含信息的一边加上+。注意,包含一个外部连接的条件 不能使用in运算符,或通过or运算符连接另一个条件

自连接:就是 加个别名访问同一张表

 

交叉连接

自然连接

使用子句

完全或双向外部连接

外部连接的任意连接条件

 

子查询

from子句中的子查询

查询工资大于本部门平均工资的员工

select ename,e.deptno,sal from emp e,(select deptno,avg(sal) a from emp group by deptno) b where e.deptno=b.deptno and sal > a;

相互关联的子查询

select ename,sal,deptno from emp e where sal > (select deptno,avg(sal) from emp a where a.deptno=e.deptno) ;

exists 操作

select ename,empno,mgr from emp e where exists(select 1 from emp where mgr=e.empno);

 

all  any

sal > all(select avg(sal) from emp group by deptno)

练习题

标签:ble   mat   manager   平均工资   _for   count   第一个字符   货币   第一个   

原文地址:http://www.cnblogs.com/sangmu/p/6880716.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!