Oracle实战练习

#登录到sqlplus; 
#用户名:scott 密码:tiger

#或者在命令提示符下
sqlplus sys/dys as sysdba ;    #管理员登录到sqlplus

alter user scott account unlock;   #解开用户

#清空sqlplus屏幕中的记录
clear scr;
#查看表结构
desc emp;  

#select 语句
select ename, sal*12 from emp;
desc emp;
#表字段的别名
select ename, sal*12 as annual_sal from emp;

#在表中运用运算
select 2*3 from emp; #查出来的是14条记录, 因为emp表中有14条记录

#查看虚表dual
desc dual;

#在dual表中运算
select 2*3 from dual;

#查看系统时间
select sysdate from dual;   #显示一条记录

#使用""来保持原来的格式
select ename, sal*12 as"annual sal" from emp;

#查看表中的字段值为空的记录
select ename, comm from emp; #因为任何含有空值的表达式最后显示结果仍是空值

#字符串连接,使用||
select ename||sal from emp;
 
#distinct 查询,去除重复行
 select distinct deptno from emp;
 select distinct deptno,job from emp;   #两个在一起的组合重复的去掉,distinct 可以修饰一个或多个字段

#where过滤条件
#查询部门编号是10的员工信息
 select * from emp where deptno=10;
#查询名称是CLARKR部门员工信息
 select * from emp where ename ='CLARK';
 select ename, sal from emp where sal>1500;
#比较每个字符的ascii码谁大谁小
 select ename, sal from emp where ename>'CBA';
#查询工资在800和1500之间
 select ename, sal from emp where sal between 800 and 1500;
#或者
 select ename, sal from emp where sal>=800 and sal<=1500;
 
#空值处理
select ename, sal,comm from emp where comm is null;
select ename, sal,comm from emp where comm=null; #这样写是错误的
select ename, sal ,comm from emp where comm is not null;
#in查询
 select ename,sal, comm from emp where sal in (800,1500,2000);
 select ename, sal, comm from emp where ename in('SMITH','KING','ABC'); #表示查询符合在集合范围内的一个或者多个
 select ename, sal from emp where sal not in(800,1000);
#日期处理
 select ename, sal, hiredate from emp where hiredate>'20-2月-81';
 #或者
 select ename, sal, hiredate from emp where hiredate >'20-2月-1981';
 
 #and 处理, or处理
 select ename, sal from emp where deptno=10 and sal>1000;
 select ename, sal from emp where deptno=10 or sal>1000;
 
 #模糊查询
 select ename from emp where ename like'%ALL%';  #%百分号表示1个或者多个
 #查出名称第二个是A的
 select ename from emp where ename like'_A%';
 #如果是%,用转义字符
  select ename from emp where ename like'%/%%';
 #用escape识别转义字符
  select ename from emp where ename like'%$%%' escape '$';
 #按部门编号降序排列
  select * from dept order by deptno desc;
 #按empno升序排列
 select empno, ename from emp order by empno asc;  #默认是升序排列
 #过滤后再排序
 select empno, ename from emp where deptno<>10 order by empno asc;
 select ename, sal, deptno from emp order by deptno asc;
 #排序两个条件
 select ename, sal, deptno from emp order by deptno asc, sal ;
 
 #综合排序条件
  select ename, sal*12 annual_sal from emp where ename not like'_A%' and sal
  800 order by deptno;
 
  #SQL函数
  select lower(ename) from emp; #转换成小写
  #第二个字母是a的
   select ename from emp where lower(ename) like'_a%';
  #或者
   select ename from emp where ename like'_a%' or ename like'_A%';
 #截取字符串
  select substr(ename,2,3) from emp; #从第二个字符串开始,截取3个字符串
  select ascii('A') from dual;   #查出ascii码
  select round(23.652) from dual;  #四舍五入
 #四舍五入,保留小数点两位
  select round(23.652,2) from dual;
  select round(23.652,1) from dual;
  select round(23.652,-1) from dual;
 #把数字或者日期转换为某种形式
 select to_char(sal,'$99,999.9999') from emp;  #9代表一位数字
 #人民币
 select to_char(sal, 'L99,999.9999') from emp;
 
 #对日期进行转换
 select hiredate from emp;
 select to_char(hiredate, 'YYYY-MM-DD HH:MI:SS') from emp;
 select to_char(sysdate, 'YYYY-MM-DD') from dual;
 
 select ename, hiredate from emp where hiredate> to_date('1981-2-20 12:34:36
','YYYY-MM-DD HH24:Mi:SS');

 select sal from emp where sal>to_number('$1,250.00','$9,999.99');
#计算年薪,如果comm是为null的话,则让其显示0
 select ename, sal*12 + nvl(comm, 0) from emp; 
 
 #max函数
 select max(sal) from emp;
 #min函数
 select min(sal) from emp;
 #avg函数
 select avg(sal) from emp;
 #avg函数,将其转换成to_char形式
 select to_char(avg(sal),'99,999.9999') from emp;
 #保留两位小数
 select round(avg(sal),2) from emp;
 select sum(sal) from emp;
 select count(*) from emp;
 select count(*) from emp where deptno=10;
 select count(ename) from emp;   #14条记录
 select count(distinct(deptno)) from emp; #3条记录
 
 #group by 语句
 select avg(sal) from emp group by deptno;
 select max(sal) from emp group by deptno, job;
 select ename from emp where sal=(select max(sal) from emp);
 select deptno, max(sal) from emp group by deptno;
 
 #having子句,使用having对分组进行限制
 select avg(sal), deptno from emp group by deptno;
 select avg(sal), deptno from emp group by deptno having avg(sal) >2000;
 select avg(sal) from emp where sal>1200 group by deptno having avg(sal) >15
00 order by avg(sal) desc;

#子查询
 select ename, sal from emp where sal=(select max(sal) from emp);
 select ename, sal from emp where sal> (select avg(sal) from emp);
 #下面这么写法是错误的
 select ename, sal ,deptno from emp where sal=(select max(sal) from emp group by
deptno);    #第 1 行出现错误:
#RA-01427: 单行子查询返回多个行

 select ename, sal from emp join(select max(sal) max_sal, deptno from emp gr
oup by deptno) t on (emp.sal=t.max_sal and emp.deptno = t.deptno);

#理解子查询的关键是把其当成一张表
#求出每个员工的上司是谁
select e1.ename, e2.ename from emp e1, emp e2 where e1.mgr=e2.empno;
select ename, dname, grade from emp e, dept d, salgrade s where e.deptno =
d.deptno and e.sal between s.losal and s.hisal and job<>'CLEAK';

#没有表连接,默认是笛卡儿积
select ename, dname from emp, dept;
#或者
select ename, dname from emp cross join dept;
#有连接条件
select ename, dname from emp,dept where emp.deptno = dept.deptno;
#或者
select ename, dname from emp join dept on(emp.deptno = dept.deptno);
select ename, dname from emp join dept using(deptno);  #使用using的条件是两个表中有相同的字段

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值