携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情
1.Oracle的体系结构
2.本地连接服务器
3.基本查询
/*
执行多行语句要用';'分隔开
基本查询语句
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.条件查询
/*
条件查询:
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.排序
/*
对查询的数据做排序
关键字 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.单行函数
*
对查询的数据做排序
关键字 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.分组的使用
/*
聚合函数搭配分组使用
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;