Oracle之单表查询和常用函数实例讲解
一、oracle概念
1.
oracle 数据库是数据的物理存储。这就包括(数据文件 ora 或者 dbf、控制文件、联机日志、参数文件)。其实 oracle 数据库的概念和其它数据库不一样,这里的数据库是一个操作只有一个库。可以看作是 oracle 就只有一个大数据库。
2. 实例
一个 oracle 实例(oracle instance)有一系列的后台进程(backguound processes)
和内存结构(memory structures)组成。一个数据库可以有 n 个实例(集群模式)。
3. 用户
用户是在实例下建立的。不同实例可以建相同名字的用户。 、
oraclede用户划分:
系统管理员:sys,最高权限,以dba身份登录
一般管理员 system 日常管理数据库试用
普通用户 :数据库初始化自带的用户,管理员创建的用户(开发使用)
用户在操作管理表空间之前需要授予权限
4. 表空间
表空间是 oracle 对物理数据库上相关数据文件(ora 或者 dbf 文件)的逻辑映射。
一个数据库在逻辑上被划分成一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构。每个数据库至少有一个表空间 ( 称之为 system 表空间 ) 。
每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。
数据库与表空间是1:n(n可以为1)
5. 数据文件(dbf、ora)
数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。
注: 表的数据,是有用户放入某一个表空间的,而这个表空间会随机把这些表数
据放到一个或者多个数据文件中。
由于 oracle 的数据库不是普通的概念,oracle 是有用户和表空间对数据进行管理和存放的。但是表不是有表空间去查询的,而是由用户去查的。因为不同用户可以在同一个表空间建立同一个名字的表!这里区分就是用户了!
二、oracle基本查询(列的注意事项)
--一、基本查询 --oracle的dual虚拟表 作用是补全查询语法 select 1+1 --错误 select 1+1 count from dual; select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; 查询系统时间 ---查询员工编号 员工姓名 员工工作 select empno,ename,job from emp; --1. 给列起别名 --1)给列起别名 使用as,as可以省略 --2)使用规则 a:特殊字符 b空格 c:数字 必须使用双引号括起来 --3)特殊字符中的#$_,不在首位也可以不用加双引号 select empno as "员工编号" , ename 员工姓名#, job "工 作" , sal "123" from emp; --2.去除重复使用 distinct, -- 对查询结果去重,写在列名前 --例:查询员工表中工作 select distinct job from emp; --3.对列值计算的查询 注意null值 --例:查询员工年薪 select sal*12+comm from emp; --为null的会忽略 --4.nvl(v1,v2) 判断v1是否为空,如果不为空返回v1 如果为空返回v2 --例:查询员工年薪 select nvl(sal*12+comm,0) from emp select concat(sal*12+comm,0) from emp select nvl(sal*12+comm,0) sal from emp order by sal desc; --5.concat列值的拼接,oracle支持两个参数拼接 |mysql中支持多个 --需求:通过查询得到 编号 姓名结果数据 员工编号:=7369 员工姓名:=smith select concat('员工编号==',empno) from emp; select concat(concat('编号: ==',empno),'===姓名: ==',ename) from emp; --嵌套使用 select concat(concat('编号:==',empno),'===姓名:==',ename) from emp; --6 || : oracle特有连接符 可以拼接多个 select '编号=='||empno from emp; select '编号=='||empno||'---姓名=='||ename as 员工简介 from emp;
二、条件查询
where 条件表达式 1. 比较运算 = > < >= <= != <> 2.逻辑运算 and or not 3.其余运算 1)like 模糊查询 ( % 匹配任意个 _ 站位一个) 2)between ...and... 判断区间 包含边界 3)in | not in 判断范围 4)is null | is not null 判断空值
--1 --需求:查询员工的工作 不是manager的员工信息 select * from emp where job !='manager' --方案1 select * from emp where job <>'manager' --方案2 --使用not实现不是manager的员工信息 --java非表达式 !job.equals('manager') --方案3 select * from emp where not job ='manager' --2模糊查询 --查询员工姓名包含m的员工信息 select * from emp where ename like '%m%' --查询员工姓名第二位为m的员工信息 select * from emp where ename like '_m%' --3between ... and... 大的在后 --查询工资位于1500---3000的员工信息 select * from emp where sal between 1500 and 3000 --4 in --查询员工的工作是 manager 和 president select * from emp where job in('manager','president') select * from emp where job ='manager' or job ='president' --5.not|is not --查询有奖金的员工信息 select * from emp where comm is not null select * from emp where not comm is null
三、查询的排序
关键字:order by 列 asc|desc
1)desc降序排序
2)asc 升序 默认升序
3)nulls last 将null值至于末尾:oracle特有语法
--将员工数据按照工资从小到大排序 select * from emp order by sal --将员工数据按照奖金从小到大排序 select * from emp order by comm --将员工数据按照奖金从大到小排序 --null倒序排序的问题 select * from emp order by comm desc --使用关键字 nulls last 将null值至于末尾 select * from emp order by comm desc nulls last
四、单行函数
针对表中每条记录的列值处理
1. 数值函数
2. 字符函数
3. 日期函数
4. 转换函数
5. 通用函数
1.数值函数
/* 数值函数 对数值做处理 1四舍五入 round(v1,v2) v1原始数值 v2是保留的小数位数 2数值截取 trunc(v1,v2) v1原始数值 v2是保留的小数位数 不做四舍五入运算 3求余数 mod(v1,v2) v1是被模数 v2是模数 10%3 结果为===1 */ --1四舍五入运算 select round(43.726) from dual; --默认位数是0 select round(43.726,0) from dual;--44 select round(43.726,1) from dual; --43.7 select round(43.726,2) from dual; --43.73 select round(43.726,-1) from dual; --40 select round(43.726,-2) from dual;--0 select round(53.726,-2) from dual;--100 --2截取操作 select trunc(43.726) from dual; --43 select trunc(43.726,0) from dual;--43 select trunc(43.726,1) from dual; --43.7 select trunc(43.726,2) from dual; --43.72 select trunc(43.726,-1) from dual; --40 select trunc(43.726,-2) from dual;--0 select trunc(53.726,-2) from dual;--0 --3求余数--答案为1 select mod(10,3) from dual;
2.字符函数
字符函数
1)获取长度 length()
2)截取字符串 substr(v1,v2,v3)v1原始字符串 v2截取起始位置 v3截取的长度,v**2为负值为倒着截取,如-2表示倒着截取后两位**
3)替换字符串 replace(v1,v2,v3)v1原始字符串v2 要被替换的字符换 v3替换成的字符 –替换匹配的所有字符
4)大小写互换 upper() lower() 验证码
图片验证码 xyz6 xyz6 xyz6 xyz6
数据库匹配转成同一个格式判断
5) 去除空格 trim() 去除两端的空格
--1.abcde-- select length('abcde') from dual; --2.截取字符串 --从0和1开始截取都是第一位 select substr('abcde',0,2) from dual; -- ab select substr('abcde',1,2) from dual; -- ab select substr('abcde',-1,2) from dual;--e select substr('abcde',-2,200) from dual;--de --3.替换字符串 hello select replace('hello','l','o') from dual; --heooo --4.大小写互换 忽略大小写 查询员工姓名为smith的信息 select * from emp where upper(ename)=upper('smith'); select * from emp where ename=upper('smith'); select * from emp where ename=upper('smith'); --5.去除空格__abc_de_ select trim(' abc de ') from dual;--abc de select replace(' abc de ',' ','') from dual;
3 日期函数
1).获取当前时间 sysdate
2).给时间增加月数 add_months(v1 date,v2 month)
3 .获取两个时间间隔月数,日期后的写在前
/* 日期函数 1.获取当前时间 sysdate 2.给时间增加月数 add_months(v1date,v2month) 3.获取两个时间间隔月数,日期后的写在前 months_between(date1,date2) */ --1.获取当前时间 select sysdate from dual; --2.给当前时间增加一个月 select add_months(sysdate,1) from dual; -- ticket -- id tickeynum creatime validate -- 1 111111 2018-4-1 2018-4-28 -- 2 222222 2018-3-2 2019-2-3-- --查询一个月内要过期的票 select * from ticket where sysdate4. 转换函数 1) . to_number : 数值和字符的互换 2).to_char() :日期转字符串, 分钟日期使用mi 3).to_date() :字符串转日期, 24小时使用hh24
/* 转换函数 1.数值和字符的互换 to_number() 2.日期转字符串 to_char(v1,v2) v1要转的日期 v2转换后的格式 3.字符串转日期 to_date(v1,v2) v1字符串格式 v2 日期 */ select '123'+1 from dual; --1默认识别数值格式的字符串自动化转换 select to_number('123')+1 from dual; --2将系统时间转成特定格式的字符显示 select to_char(sysdate,'yyyy-mm-dd') from dual; select to_char(sysdate,'yyyy') from dual; select to_char(sysdate,'mm') from dual; select to_char(sysdate,'dd') from dual; --获取当前的星期 select to_char(sysdate,'day') from dual; select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;--oracle分钟使用mi --将字符串转换日期 select to_date('2018-04-04','yyyy-mm-dd') from dual; select to_date('2018-04-04','yyyy-mm-dd hh:mi:ss') from dual; --jsp页面取值 是日期格式取值 yyyy-mm-dd 会自动补充时分秒显示 00:00:00 select to_date('2018-04-04 10:43:43','yyyy-mm-dd hh:mi:ss') from dual; select to_date('2018-04-04 18:43:43','yyyy-mm-dd hh:mi:ss') from dual; --java jsp页面区分24和12 使用大写hh hh select to_date('2018-04-04 18:43:43','yyyy-mm-dd hh24:mi:ss')五、通用函数
通用函数 nvl(v1,v2)
concat
nvl2(v1,v2,v3) 判断v1是否为null如果为null返回v3 不为null返回v2
select nvl2(1,2,3) from dual; ---2 select nvl2(null,2,3) from dual;--3五、多行函数 聚合函数
使用表中多条记录参与运算 结果返回一条
count 统计记录数 sum 求和运算 max 求最大值 min 求最小值 avg 求平均值
1.查询员工的数量(count(1)最优)
select count(1) from emp;
2.分组统计
group by 列,列2 将分组后的列值完全一致 分为一组
分组之后过滤数据使用 having 聚合函数
分组前过滤使用 where
3分组的规则:
group by作为分组 select 语句中只能查询group by后的列和聚合函数
--1.查询员工的数量(count(1)最优) -- 1)三种模式 如果表中存在唯一索引 效率一致 -- 表中没有索引推荐后两种 select 'abc' from dual; select count(*) from emp; select count(empno) from emp; select count(1) from emp; --2)使用奖金的列统计数量 select count(comm) from emp;-- 4 select sum(comm) from emp; --2200 select avg(comm) from emp;--550 /* 2.分组统计 group by 列,列2 将分组后的列值完全一致 分为一组 分组之后过滤数据使用 having 聚合函数 分组前过滤使用 where */ --查询每个部门的平均工资 select * from emp; select deptno,avg(sal) from emp group by deptno --查询部门平均工资大于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 --统计同一个工作,同一个部门的员工数量 select deptno,job,count(1) from emp group by deptno,job /* 3分组的规则: group by作为分组 select 语句中只能查询group by后的列和聚合函数 */ select ename,deptno,avg(sal) from emp group by deptno,ename
下一篇: 在网页中引入图片字体教程