第一章Oracle数据库

2018-10-28  本文已影响0人  小猿人儿

Oracle数据库体系结构

系统

实例

表空间

数据表

数据文件

用户

    用户的分类:

        系统管理员 sys 相当于mysql的root

        一般管理员  system

        普通用户

总结:一个Oracle数据库系统可以创建多个数据库,每个数据库称为实例,在实例中可以分配多个表空间,每个表空间里可以创建多个数据表,而每个表空间里的表数据库都存储在一个数据文件里,要查询表空间里的表数据就需要在本实例下给表空间指定个用户,由用户去访问表空间的表及表的数据。

简单查询

SQL分组:

DML(data Manipulation Language)数据库操作语言  用于检索或者修改数据

DDL(data  Definition Language)数据定义语言,用于定义数据的结构,创建,或者修改是哪出数据的对象

DCL(data  control  Language)数据控制语言 用于定义数据库的权限

基本查询

语法:select [distinct] * | 字段  [别名] [字段 [别名]]  from 表名成 [别名];

位置:打开Oracle ---文件下方的小太阳-SQL窗口

查询所有员工的所有数据

select  * from emp;

位置:选中查询语句,点击齿轮,执行即可

修改显示别名(中文编号,姓名,职位)

select  empno,ename,job from emp;

select empno as "员工编号" ,ename "员工姓名”,job “职位” from ep;

查询乱码

执行select userenv("language") from  dual;---复制编码,---设置环境变量(变量名:NLS _LANG ,变量值:复制过来的编码)

去重复行(职位)

查询公司的所有职位

select distinct job from emp;

列拼接(编号,姓名,职位)

要求输入结果为:编号是7369的雇员,姓名是Smith,工作是clerk

select concat(concat(concat(concat(concat('编号是:7',empno),’的雇员,姓名是:’,ename,'工作是:'),job) from emp;

=====select '编号是' || empno ||  '的雇员,姓名是:'||' , 工是:' || job   from emp;

统计每人的年薪,年薪等于月薪*12+年终奖(sal月薪,comm年中奖,

没有年终奖的没有统计出来,我们的第一个bug

语法:select sal*12+comm from emp;

使用nvl(v1,v2)处理空值V1不为空返回V1,为空返回V2

select a.empno,a.sal*12+vvl( comm,0)  from  emp  a;

单行单列虚拟表dual

dual是一张只有一个字段,一行记录的表,一个单单列的虚拟表,用来测试一些数据值最方便

查询当时时间   

得到guid

运算

select sysdate from dual;

select sys_guid() from dual;

select 1+1 from dual;   -----计算1+1

查询

3.4.1关系运算

>,<,>=,<=,!=(<>),=

3.4.2逻辑运算

逻辑运算符:and  or  not 

3.4.3其他运算

范围运算:between and ,like,in,not in, is null,is not null 

查询出基本工资大于2000的所有雇员信息

select   *  from  emp  where sal >2000;

查询出所有职位是办事员的雇员信息

select  * from emp where job='办事员';

查询工资在2000-3000之间全部雇员信息(不包含)

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

查询职位是办事员或者销售人员的全部信息

select  *  from   emp  where job='办事员'  or  job=“销售人员”

select   *  from   emp  where  job in ("办事员","销售人员");

查询出所有不是办事员的雇员信息

select *  from   emp  where job  not  in "办事员";

select  *  from  emp   where job !="办事员"

selecet  *  from  emp  where  job  <>"办事员";

查询入职时间在1981/4/2-1999/1/1的员工信息

select *  from   emp  where hirdate between  头 data("1981/4/2",yyyy/mm/dd)  and  to data("1999/1/1",yyyy/mm/dd);

查询出所有没有奖金的雇员信息

select *  from emp where  comm is  null;

查询出雇员编号是1,2,3 的雇员信息

select  *  from  emp   where emno in (1,2,3,);

select  *  from  emp  where emno =1 or emno =2 or emno=3;

查询出员工编号不是1,2,3的雇员信息

select   *  from   emp  where  emno  not  in  (1,2,3);

查询出雇员姓名以字母A开头的全部雇员信息

select  *  form  emp where ename like "A %";

查询出雇员姓名第二个字母是A的全部雇员信息

select  *  from   emp   where ename like "_A%";

查询出所有带有A 的全部雇员信息

select  *  from emp where ename like "%A%";

排序

order by 卸载所有SQL语句最后,可以指定多个排序字段

升序(ASC):默认,不写也是升序

降序(DESC):用户需要指定,由大到小排序

查询所有员工的雇员信息,要求按照工资升序排序

select   *  from  emp   order  by  sal  【asc】;

按照工资由高到低排序,如果工资相同,则按照雇佣日期由早到晚排序

select *   from   emp  order by  sal  desc,hiredate;

select   *  from  emp  order by sal desc,hiredate desc;

排序中的空值问题

当排序的字段有可能存在null,时就会产生问题,我们可以用null  first ,nulls  last 来指定null 值显示的位置。

查询雇员的奖金 从低到高

select  * from  emp  order  by  comm;

select  *  from  emp order by comm first  nulls;

原始数据需要加工才能使用

Oracle  给我们提供了常用的处理数据的函数,就像JAvA的类库,不需要所有的东西都要我们自己实现。

Oracle常用函数


/*

  一、基本查询

  语法:

    select 字段

    from 表名

*/

--查询所有员工的信息

select * from emp;

--查询显示指定列(编号、姓名、职位)

select empno,ename,job from emp;

--修改显示别名(中文编号、姓名、职位)

select empno as "员工编号",ename "员工姓名",job 职位 from emp;

select userenv('language') from dual;

--所有职位

select distinct job from emp;

--编号是:7369 的雇员, 姓名是:smith,工作是:clerk

select concat(concat(concat(concat(concat('编号是:7',empno),' 的雇员, 姓名是:'),ename),',工作是:'),job) from emp;

select '编号是:' || empno || ' 的雇员, 姓名是:' || ',工作是:' || job from emp;

--年薪

--select a.empno,a.sal,a.comm,sal*12+comm "年薪" from emp a;

select a.empno,a.sal,a.comm,sal*12+nvl(comm,0) "年薪" from emp a;

select sal*12+decode(comm,null,0,comm) from emp;

--单行单列虚拟表dual

select 1+1 from emp where empno=7369;

/*

      1、查询当时时间

      2、得到guid

      3、运算

*/

常用函数

单行函数

影响每行记录的值,影响多少行返回多少行

多行函数多条记录参与运算,而返回一条记录,

单行函数主要分为以下五类:字符函数,数字函数,日期函数,转换函数,通用函数

l返回字符串并将字符串的第一个字母变为大写,其他字母小写

select   ename,initcap(ename)  from  emp;

select   ename,lower(ename)  from  emp;

length(ename)  求长度

replace("A","B")  A替换B

nvl(expr1,expr2):expr1 是否为空,如果为空, expr2,如果不为空,expr1的值。

使用coalesce函数

    与nvl函数相比优点是:同时处理交替的多个值,如果第一个表达式为空,返回下个表达式,对其他的参数进行coalesce

条件表达式:

在SQL中使用if-then-else逻辑

使用两种方法:

case表达式

decode函数

case表达式在需要使用if-then-else逻辑时,

case 带匹配的值  when  comparison_expr1 then return_expr1 

[when comparson_expr2 then return_expr2 

when comparison_exprn then return_exprn  

else  else_expr]

end

练习:查询部门号为10,20,30的员工信息,若部门号为10,则打印其工资的1.1倍,20号部门,则打印其工资的1.2倍,30号部门打印其工资的1.3倍

    select ename,deptno,

    case deptno when 10 then sal * 1.1

    when 20 then sal * 1..2

    when 30 then sal * 1.3

    else sal 

    end 

from emp;

decode函数

在需要使用if-then-else逻辑时

decode(col | expression,search1,result1,

[,search2,resut2,....,]

[,default])

练习:查询部门号为10,20,30的员工信息,若部门号为10,则打印其工资的1.1倍,20号部门,则打印其工资的1.2倍,30号部门打印其工资的1.3倍

select enamel, deptno,decode(deptno,10,sal*1.1,20,sal*1.2,30,sal*1.3) from emp;

多表查询

主键:oid 唯一能标识一行的字段,非空,唯一特点。

外键:可以在一张表中通过一个外键定位到另外一张表的主键

1,笛卡尔集合:

世界杯小组赛,采用笛卡尔集合的方式布局

中国对  日本对  伊朗队,各对一场。

第一个表的数据,与第二个表的数据一一匹配一次。

select *  from emp,dept;

多表查询,一定要避免笛卡尔集合,在一些表中,可能会存在一个外键,关联另一个表的主键,(或者是两张表当中有些)

上一篇下一篇

猜你喜欢

热点阅读