oracle数据库基础知识

发布时间:2017-03-31 00:00:00 编辑:小静 手机版

  --乘法

  select ename,sal *12 from emp;

  --加减乘除都类似

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

  --限定查询

  --奖金大于1500的

  select *from emp where sal>1500;

  --有奖金的

  select *from emp where comm is not null;

  --没有奖金的

  select *from emp where comm is null;

  --有奖金且大于1500的

  select *from emp where sal>1500 and comm is not null;

  --工资大于1500或者有奖金的

  select *from emp where sal>1500 or comm is not null;

  --工资不大于1500且没奖金的

  select *from emp where sal<=1500 and comm is null;

  select *from emp where not (sal >1500 or comm is not null);

  --工资大于1500但是小于3000的

  select *from emp where sal>1500 and sal<3000;

  select *from emp where sal between 1500 and 3000; --between是闭区间,是包含1500和3000的

  --时间区间

  select *from emp where hiredate between to_date('1981-01-01','yyyy-MM-dd') and to_date('1981-12-31','yyyy-MM-dd');

  --查询雇员名字

  select *from emp where ename='SMITH';

  --查询员工编号

  select *from emp where empno=7369 or empno=7499 or empno=7521;

  select *from emp where empno in(7369,7499,7521);

  select *from emp where empno not in(7369,7499,7521); --排除这3个,其他的都可以查

  --模糊查询

  select *from emp where ename like '_M%'; --第2个字母为M的

  select *from emp where ename like '%M%';

  select *from emp where ename like '%%'; --全查询

  --不等号的用法

  select * from emp where empno !=7369;

  select *from emp where empno<> 7369;

  --对结果集排序

  --查询工资从低到高

  select *from emp order by sal asc;

  select *from emp order by sal desc,hiredate desc; --asc 当导游列相同时就按第二个来排序

  --字符函数

  select *from dual;--伪表

  select 2*3 from dual;

  select sysdate from dual;

  --变成大写

  select upper('smith') from dual;

  --变成小写

  select lower('SMITH') from dual;

  --首字母大写

  select initcap('smith') from dual;

  --连接字符串

  select concat('jr','smith') from dual; --只能在oracle中使用

  select 'jr' ||'smith' from dual; --推荐使用

  --截取字符串

  select substr('hello',1,3) from dual; --索引从1开始

  --获取字符串长度

  select length('hello') from dual;

  --字符串替换

  select replace('hello','l','x') from dual; --把l替换为x

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

  --通用函数

  --数值函数

  --四舍五入

  select round(12.234) from dual;--取整的四舍五入 12

  select round (12.657,2) from dual; --保留2位小数

  select trunc(12.48) from dual;--取整

  select trunc(12.48675,2) from dual; --保留2位小数

  --取余

  select mod(10,3) from dual;--10/3取余 =1

  --日期函数

  --日期-数字=日期 日期+数字=日期 日期-日期=数字

  --查询员工进入公司的周数

  select ename,round((sysdate -hiredate)/7) weeks from emp;

  --查询所有员工进入公司的月数

  select ename,round(months_between(sysdate,hiredate)) months from emp;

  --求三个月后的日期

  select add_months(sysdate,6) from dual;

  select next_day(sysdate,'星期一') from dual; --下星期

  select last_day(sysdate) from dual; --本月最后一天

  select last_day(to_date('1997-1-23','yyyy-MM-dd')) from dual;

  --转换函数

  select ename ,

  to_char(hiredate,'yyyy') 年,

  to_char(hiredate,'mm')月,

  to_char(hiredate,'dd') 日

  from emp;

  select to_char(10000000,'$999,999,999') from emp;

  select to_number('20')+to_number('80') from dual; --数字相加

  --查询员工年薪

  select ename,(sal*12+nvl(comm,0)) yearsal from emp; --空和任何数计算都是空

  --Decode函数,类似if else if (常用)

  select decode(1,1,'one',2,'two','no name') from dual;

  --查询所有职位的中文名

  select ename, decode(job,

  'CLERK',

  '业务员',

  'SALESMAN',

  '销售',

  'MANAGER',

  '经理',

  'ANALYST',

  '分析员',

  'PRESIDENT',

  '总裁',

  '无业')

  from emp;

  select ename,

  case

  when job = 'CLERK' then

  '业务员'

  when job = 'SALESMAN' then

  '销售'

  when job = 'MANAGER' then

  '经理'

  when job = 'ANALYST' then

  '分析员'

  when job = 'PRESIDENT' then

  '总裁'

  else

  '无业'

  end

  from emp;

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

  --多表查询

  select *from dept;

  select *from emp,dept order by emp.deptno;

  select *from emp e,dept d where e.deptno=d.deptno;

  select e.*,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno;

  --查询出雇员的编号,姓名,部门编号,和名称,地址

  select e.empno,e.ename,e.deptno,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno;

  --查询出每个员工的上级领导

  select e.empno,e.ename,e1.empno,e1.ename from emp e,emp e1 where e.mgr=e1.empno;

  select e.empno,e.ename,d.dname

  from emp e,dept d ,salgrade s, emp e1

  where e.deptno=d.deptno

  and e.sal between s.losal

  and s.hisal

  and e.mgr=e1.empno;

  select e.empno,e.ename,e1.empno,e1.ename from emp e,emp e1 where e.mgr=e1.empno(+) ;

  --外连接

  select *from emp order by deptno;

  --查询出每个部门的员工

  /*

  分析:部门表是全量表,员工表示非全量表,

  在做连接条件时,全量表在非全量表的哪端,那么连接时全量表的连接条件就在等号哪断

  */

  --左连接

  select * from dept d,emp e where d.deptno=e.deptno(+) order by e.deptno;

  --右连接

  select * from emp e,dept d where e.deptno(+)=d.deptno order by e.deptno;

  -----------------------------作业

  --查询与smith相同部门的员工姓名和雇佣日期

  select *from emp t

  where t.deptno= (select e.deptno from emp e where e.ename='SMITH')

  and t.ename<> 'SMITH';

  --查询工资比公司平均工资高的员工的员工号,姓名和工资

  select t.empno,t.ename,t.sal

  from emp t

  where t.sal>(select avg(sal) from emp);

  --查询各部门中工资比本部门平均工资高的员工号,姓名和工资

  select t.empno,t.ename,t.sal

  from emp t, (select avg(e.sal) avgsal,e.deptno from emp e group by e.deptno) a

  where t.sal>a.avgsal and t.deptno=a.deptno;

  --查询姓名中包含字母u的员工在相同部门的员工的员工号和姓名

  select t.empno,t.ename from emp t

  where t.deptno in( select e.deptno from emp e where e.ename like '%U%')

  and t.empno not in ( select e.empno from emp e where e.ename like '%U%') ;

  --查询管理者是king的员工姓名和工资

  select t.ename,t.sal from emp t

  where t.mgr in

  (select e.empno from emp e where e.ename='KING');

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

  ---sql1999语法

  select *from emp join dept using(deptno) where deptno=20;

  select *from emp natural join dept;

  select *from emp e join dept d on e.deptno=d.deptno;

  select *from dept;

  select *from dept d left join emp e on d.deptno=e.deptno;

  select *from dept d,emp e where d.deptno=e.deptno(+);

  ---分组

  select count(empno) from emp group by deptno;

  select deptno,job,count(*) from emp group by deptno,job order by deptno;

  select *from EMP for UPDATE;

  --group by 后面有的字段,select后才可以有,group by后面没有的字段,select后面绝对不能有

  select d.dname, d.loc, count(e.empno) from emp e, dept d where e.deptno = d.deptno group by d.dname, d.loc ;

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

  --子查询

  select *from emp t where t.sal>(select *from emp e where e.empno=7654);

  select rownum ,t.* from emp t where rownum <6 ;

  --pagesize 5

  select *from(select rownum rw,a.* from (select *from emp ) a where rownum <16) b where b.rw>10;

  select *from (select *from emp) where rownum>0;

  --索引

  create index person_index on person(p_name);

  --视图

  create view view2 as select *from emp t where t.deptno=20;

  select *from view2;

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

  --pl/sql

  --plsql是对sql语言的过程化扩展

  -----

  declare

  begin

  dbms_output.put_line('hello world');

  end;

  -------

  declare

  age number(3);

  marry boolean := true; --boolean不能直接输出

  pname varchar2(10) := 're jeknc';

  begin

  age := 20;

  dbms_output.put_line(age);

  if marry then

  dbms_output.put_line('true');

  else

  dbms_output.put_line('false');

  end if ;

  dbms_output.put_line(pname);

  end;

  --常量和变量

  --引用变量,引用表中的字段的类型

  Myname emp.ename%type; --使用into来赋值

  declare

  pname emp.ename%type;

  begin

  select t.ename into pname from emp t where t.empno=7369;

  dbms_output.put_line(pname);

  end;

  --记录型变量

  Emprec emp%rowtype; --使用into来赋值

  declare

  Emprec emp%rowtype;

  begin

  select t.* into Emprec from emp t where t.empno=7369;

  dbms_output.put_line(Emprec.empno || ' '||Emprec.ename||' '||Emprec.job);

  end;

  --if分支

  语法1:

  IF 条件 THEN 语句1;

  语句2;

  END IF;

  语法2:

  IF 条件 THEN 语句序列1;

  ELSE 语句序列 2;

  END IF;

  语法3:

  IF 条件 THEN 语句;

  ELSIF 条件 THEN 语句;

  ELSE 语句;

  END IF;

  --1

  declare

  pname number:=#

  begin

  if pname = 1 then

  dbms_output.put_line('我是1');

  else

  dbms_output.put_line('我不是1');

  end if;

  end;

  --2

  declare

  pname number := #

  begin

  if pname = 1 then

  dbms_output.put_line('我是1');

  elsif pname = 2 then

  dbms_output.put_line('我是2');

  else

  dbms_output.put_line('我不是12');

  end if;

  end;

  --loop循环语句

  语法2:

  Loop

  EXIT [when 条件];

下页更精彩:首页 上一页 1 2 3 下一页 尾页
本文已影响861
+1
0