Oracle基本使用

130 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

image.png

1.Oracle的体系结构

image.png

2.本地连接服务器

image.png

3.基本查询

image.png

/*
执行多行语句要用';'分隔开

基本查询语句
select 列名/* from 表名
*/
/*查询所有*/
select * from emp;
--查询字段
select empno,ename,job from emp;
--使用别名
--别名的规则 as可省略,空格 数字 特殊字符(#$除外)必须使用双引号
select empno "员工编号", ename "员工姓名", job "工作" from emp;
select empno 员工编号, ename 员工姓名, job 工作 from emp;
--列值的运算
select sal*12 from emp;
select sal*12+comm from emp;
--null值参与运算时,结果为空
--解决:使用nvl(v1,v2) v1:被判断的值,v2:为空返回v2,不为空返回v1
select sal*12+nvl(comm,0) from emp;
select nvl(sal*12+comm,sal*12) from emp;
--查询结果重复,去重        去重关键字:distinct
select job from emp;--结果有重复
select distinct job from emp;--distinct去重
--列值的拼接       拼接的关键字:concat(拼接的名称,拼接的字段)
--oracle只支持两个值的拼接
select concat('ename:',ename) from emp;
--拼接多重嵌套实现
select concat(concat('empno:',empno),ename) from emp;
--Oracle特有连接符  ||
select 'empno:'||empno||',ename:'||ename from emp;
select '工号:'||empno||',姓名:'||ename 员工介绍 from emp;

4.条件查询

image.png

/*
  条件查询:
       select * from 表名 条件筛选需要的数据
       条件筛选关键字 where 列
         条件表达式 比较运算  > < >= <= = != <>
                    逻辑运算  and  or  not
                    其余运算  like                模糊查询   % 匹配0个或者多个
                                                             _ 占位一个长度
                              in  not in           判断范围
                              between and           判断区间 包含边界
                              is null  is not null  判断空值
*/
select * from emp;
--查询job不是manager的    区分大小写
select * from emp where job !='MANAGER';
select * from emp where job <>'MANAGER';
--查询job不是MANAGER的并且薪资大于2000的
select * from emp where job <>'MANAGER' and sal>2000;
--查询姓名包含 O 的员工
select * from emp where ename like '%O%';
--select * from emp where ename like "%O%";--不能用""
--查询姓名第二个字母为 O 的员工
select * from emp where ename like '_O%';
--查询部门是20和 30 的
select * from emp where deptno in(20,30);
--查询工资在1500-3000的      使用between and 包含两边
select * from emp where sal between 1500 and 3000;
--查询有奖金的员工
select * from emp where comm is not null;
select * from emp where comm is not null and comm !=0;
select * from emp where comm>0;
--null值的判断就是 is null  如果有比较运算符 跟null值做对比
select * from emp where comm != null;--结果是UNKNOW

5.排序

image.png

/*
  对查询的数据做排序
     关键字  order by 列 排序类型
             升序  asc  默认 可以不写
             降序  desc
*/
select * from emp;
select * from emp order by sal asc;--asc是默认,可以不写
select * from emp order by sal desc;
--按奖金的升序排序
select * from emp order by comm;
--奖金降序
select * from emp order by comm desc;--null值应在所有值后
select * from emp order by nvl(comm,0) desc;--奖金为0的和null的出现混乱
--将Null置于最后,使用nulls last
select * from emp order by comm desc nulls last;

6.单行函数

image.png

*
  对查询的数据做排序
     关键字  order by 列 排序类型
             升序  asc  默认 可以不写
             降序  desc
*/
select * from emp;
select * from emp order by sal asc;--asc是默认,可以不写
select * from emp order by sal desc;
--按奖金的升序排序
select * from emp order by comm;
--奖金降序
select * from emp order by comm desc;--null值应在所有值后
select * from emp order by nvl(comm,0) desc;--奖金为0的和null的出现混乱
--将Null置于最后,使用nulls last
select * from emp order by comm desc nulls last;

7.单行函数:




/*
  单行函数
      概念理解:单行函数针对每条记录中的数值做处理 nvl()

      数值函数
         对数值做处理的函数
         四舍五入  round(v1,v2) v1是原始的数值 v2是小数位数
         截取数值  trunc(v1,v2) v1是原始的数值 v2是小数位数
                                不做四舍五入
         求余数  10%3  ==1    mod(10,3)   ==1
      字符函数
      日期函数
      转换函数
      通用函数

  多行函数 聚合函数
     概念理解:多条记录参与运算,结果为一条记录
      sum    求和运算
      count  统计记录数
      avg    求平均值
      max    求最大值
      min    求最小值
*/
--单行函数
--数值函数  45.546
/*
  表dual 没有实际意义  目的是为了补全查询语法
  公司项目一启动 输出语句 select * from dual;
*/
select * from dual;
--四舍五入
select round(45.546,0) from dual; --46
select round(45.546,1) from dual; --45.5
select round(45.546,2) from dual; --45.55
select round(45.546,3) from dual; --45.546
select round(45.546,-1) from dual;--50
select round(45.546,-2) from dual;--0
select round(55.546,-2) from dual;--100
--截取数值  和四舍五入原理相同,不做四舍五入
select trunc(45.546,0) from dual; --45
select trunc(45.546,1) from dual; --45.5
select trunc(45.546,2) from dual; --45.54
select trunc(45.546,3) from dual; --45.546
select trunc(45.546,-1) from dual;--40
select trunc(45.546,-2) from dual;--0
select trunc(55.546,-2) from dual;--0
--求余数 mod()
select mod(10,3) from dual;--1
/*
  字符函数是对字符串做处理
  获取长度   length()
  截取字符   substr(v1,v2,v3) v1是原始字符串 v2是截取起始位置,v3截取的长度个数
  替换字符   replace(v1,v2,v3) v1是原始字符串 v2是被替换的字符,v3替换后的字符
                              替换所有匹配的字符串
  去除空格   trim()   去除两端的空格
  大小写转换 upper()  lower()
        //使用场景: 验证码  EXye12     EXye12
*/
select length('asdfsd') from dual;--6
--截取字符串,起始位置0和 1 都是从第一个位置开始
select substr('abcdef',1,3) from dual;--abc
select substr('abcdef',0,3) from dual;--abc
select substr('abcdef',-1,3) from dual;--f
select substr('abcdef',-2,3) from dual;--ef
--替换字符
select replace('hello','l','2') from dual;--he22o
select replace('hello','ll','2') from dual;--he2o
--去除空格,去除两边空格
select trim('  dsfsd df df   ') from dual;
--去除所有空格可用替换
select replace('asfd sdf f ',' ','') from dual;
--大小写转换
select upper('NDSndaskf') from dual;--转换为大写
select lower('sdfSDFEdsf') from dual;--转换为小写
/*
   日期函数
     获取系统时间
       oracle 使用 sysdate 获取年月日时分秒
     给系统增加月数 add_months(sysdate,3)
       ticket   validate 过期时间
                validate+1>sysdate
                validate<sysdate
     获取两个时间间隔的月数 months_between(s1,s2)

*/
--获取系统时间
select sysdate from dual;
--查看几个月后的日期   按照整月计算 不会计算具体天数
select add_months(sysdate, 4) from dual;
--获取间隔月数          获取员工工作月数
select months_between(sysdate,hiredate) from emp;
--查看员工入职的天数 --计算天数 日期和日期计算的结果为天数
select sysdate-hiredate from emp;
/*
  通用函数
     concat   参数值的拼接
     nvl(v1,v2)      判断空值
     nvl2(v1,v2,v3)   判断空值 判断v1如果为空 返回v3 不为空返回v2
     --nvl更通用 使用场景 开发更多用于数据返回
        安卓ios客户端向服务器请求数据  不处理返回""
*/
--第二种判断null
select nvl2(comm,comm,0) from emp;
/*
  转换函数
    to_number 转换数值to_number('1334')
    to_char  转换字符数值||字符串
             日期转字符(日期,格式)
    to_date   字符转日期('日期格式的字符串',日期格式)
*/
select to_number('123') from dual;
select '2332'||234 from dual;--这是进行了拼接
--数据库判断字符为数值格式 会自动转型
select '123'+242 from dual;
--数值转字符 查询员工的工资 显示货币符号 $800
select to_char(sal,'$999,999,999') from emp;
--select to_char(sal,'$888,999,999') from emp;--不符合进制
--日期和字符的转换
--日期转换为字符串
select to_char(sysdate,'yy-mm-dd') from dual;--年月日
select to_char(sysdate,'day') from dual;--查询星期几
select to_char(sysdate,'yy-mm-dd hh:mi:ss') from dual;--oracle数据库使用mi代替分钟
--字符串转换日期
select to_date('2011-1-1','yy-mm-dd') from dual;
select to_date('2011-1-1','yy-mm-dd hh:mi:ss') from dual;--不会自动补0,jsp页面会
select to_date('2011-1-1 11:11:11','yy-mm-dd hh:mi:ss') from dual;
select to_date('2011-1-1 17:11:11','yy-mm-dd hh24:mi:ss') from dual;--hh24代表24小时制

7.多行函数

/*
 多行函数 聚合函数
     概念理解:多条记录参与运算,结果为一条记录
     特点 忽略空值的记录 值中存在null 不会参与运算
      sum    求和运算
      count  统计记录数
      avg    求平均值
      max    求最大值
      min    求最小值
*/
select sum(sal) from emp;
select count(*) from emp;--14
select count(comm) from emp;-- 4 null值不做运算

8.分组的使用

image.png

/*
  聚合函数搭配分组使用
     group by 列
  分组之后过滤数据 having
  分组之前使用where
  分组使用规则
    grouby 作为分组 select语句中 只能查询group by后面的列和聚合函数
*/
select * from emp;
--查询每个部门的平均工资
select deptno,avg(sal) from emp group by deptno;
--查询同一工作,同一部门的员工
select deptno,job,count(*) from emp group by deptno,job;
--查询部门平均工资 > 2000的部门编号
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
--查询语句的执行顺序  先走表  走条件判断 生成结果 起别名
--查询部门的平均工资 参与平均工资运算的员工工资都要大于1500
select deptno,avg(sal) from emp where sal>1500 group by deptno;
--在上面基础之上 查询部门平均工资 大于2500
select deptno,avg(sal) from emp where sal>1500 group by deptno having avg(sal)>2500;