Oracle_day01
1. Oracle简介
Oracle公司的一款关系型数据库管理系统,分布式数据库,实现了分布式处理功能。
2. Oracle数据库的体系结构
-
数据库
Oracle数据库是数据的物理存储,与其它数据库不同,一个操作系统只有一个Oracle数据库,可以看做Oracle就只有一个大数据库。
-
实例
一个Oracle实例(Oracle instance)有一系列的后台进程(background processes)和内存结构(memory structures)组成。一个数据库可以有n个实例。
-
数据文件(dbf)
数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的 ,真正是在某一个或多个数据库文件中。一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属的表空间才行。
-
表空间
表空间是Oracle对物理数据库上相关数据文件的逻辑映射。表空间由多个数据文件组成,数据文件只能属于一个表空间。表空间为逻辑单位,数据文件为物理单位。每个数据库至少有一个表空间(称为system表空间)。
-
用户
用户是在实例下建立的,不同实例中可以建相同名字的用户。表不是由表空间去查的,而是由用户去查的,因为不同用户可以在同一个表空间建同一个名字的表。Oracle是由用户和表空间对数据进行管理和存放的。
数据库 ---> 数据库实例 ---> 表空间(逻辑单位)(用户) ---> 数据文件(物理单位)
地球 ---> 一个国家 ---> 省份(逻辑单位)(公民) ---> 山川河流(物理单位)
3. sql简介
sql: structured query language,简称sql,结构化查询语言。用于存取数据以及查询,更新和管理数据库系统,也是数据库脚本文件的扩展名。
sql分类:
-
DDL
数据库定义语言。create, alter, drop, truncate。
-
DML
数据库操作语言。insert, update, delete。
-
DCL
数据库控制语言。通过grant, revoke获取许可,确定单个用户和用户组对数据库对象的访问。
-
DQL
数据查询语言。select...from...where。
4. sql语法
4.1 基本查询
--基本查询
select * from tab;--查询所有表
select * from emp;--查询emp表 select 1 from emp;--14*1个1 select empno,ename,job from emp;--查询表中的某些列 --别名查询,as关键字可省略 --别名中不萌有特殊字符或关键字,如果有就加双引号。 select empno as 部门编号,ename as 部门名称,job as 工作 from emp; select empno 部门编号,ename 部门名称,job 工作 from emp; select empno "部门 编号",ename 部门名称,job 工作 from emp;
4.2 distinct去重
/*
distinct去重
单列去重:只显示非重复数据
多列去重:整行数据完全相同时才去重
*/
select distinct job from emp;--单列去重 select distinct job,deptno from emp;--多列去重
4.3 四则运算
select 1+1;
/*
在mysql中结果为2;
在oracle中报错:from keyword not found where expected,
需要补上dual表,oracle中的虚表,伪表,主要是用来补齐语法结构
*/
select 1+1 from dual;--在oracle和mysql中都为2
4.3 nvl函数
--查询员工年薪
select sal*12 from emp;
--查询员工年薪+奖金(comm中存在null值) select sal*12+comm from emp;--错误 /* comm为空(null)的行查询结果显示该行也为空,因为null值表示不确定,不可预知的内容, 不能做四则运算;需要使用nvl函数,将comm为null值的在进行运算时设置为0 */ select sal*12+nvl(comm,0) from emp;--正确
4.4 字符串拼接
/*
拼接符拼接:oracle特有字符串拼接符:||
函数拼接:concat(str1,str2),mysql和oracle中都有
*/
--查询员工姓名
--拼接符拼接
select '姓名:'||ename from emp; --函数拼接 select concat('姓名:',ename) from emp; /* oracle中单引号和双引号区别: 双引号:关键字,对象名,字段名,别名 单引号:指定字符串文本时,转义符 */
4.5 条件查询
/*
关系运算符:> >= = < <= != <>(不等号)
逻辑运算符:and or not
其它运算符:
like 模糊查询
in(set) 在某个集合中
between..and..在某个区间内
is null 判断为空
is not null 判断不为空
*/
--模糊查询
--查询员工姓名第三个字符是O的员工信息
select * from emp where ename like '__O%';--前两位用_表示 --查询员工姓名中包含%的员工信息 select * from emp where ename like '%%%'; --错误,查询的是所有 select * from emp where ename like '%\%%' escape '\'; select * from emp where ename like '%&%%' escape '&'; --escape '\'即声明\为转义符,也可使用&等其它字符 --查询员工工资在1500和3000之间的员工名称 select ename from emp where sal>=1500 and sal<=3000; select ename from emp where sal between 1500 and 3000; --查询名字在某个范围的员工信息 ('JONES','SCOTT','FORD') select * from emp where ename in ('JONES','SCOTT','FORD');
4.6 排序
/*
order by
升序:asc ascend(默认)
降序:desc descend
如果某列有null值,可指定null值排在前面和后面:nulls first,nulls last,
默认null值在前
同时排列多列,用逗号隔开
*/
--查询员工信息,按奖金降序
select * from emp order by comm desc nulls last; --查询部门编号和工资,按部门升序,工资降序 select empno,sal from emp order by empno asc,sal desc;--结果还是按empno升序排列,这就导致sal近乎无序
4.7 函数
/*
函数必须要有返回值
单行函数:对某一行中的某个值进行处理
数值函数 字符函数 日期函数 转换函数 通用函数
多行函数:对某一列的所有行进行处理
max,min,count,sum,avg
*/
--多行函数
--统计工资总和
select sum(sal) from emp; --查询最低工资 select min(sal) from emp; --统计数据条数,直接写一个常量比写*更高效,也可写一个具体的列 select count(*) from emp; select count(1) from emp; select count(ename) from emp; --统计平均奖金 select avg(comm) from emp;--550,显然是错误的,因为有null值 select sum(comm)/count(1) from emp;--2200/14=157.142857142857 select avg(nvl(comm,0)) from emp;--157.142857142857 --几种取整方式 --ceil(n)取大于等于n的最小整数 select ceil(sum(comm)/count(1)) from emp;--158 select ceil(-12.5) from dual;--(-12) --floor(n)取小于等于n的最大整数 select floor(sum(comm)/count(1)) from emp;--157 select floor(-12.5) from dual;--(-13) --round(n,t)四舍五入,t表示保留小数点后几位有效数字 --如果t为负数即处理整数部分 select round(147.128,2) from dual;--147.15 select round(147.128,0) from dual;--147 select round(147.128,-1) from dual;--150 select round(147.128,-2) from dual;--100 select round(147.128,-3) from dual;--0 --trunc(n,t)截断,t表示保留小数点后几位数字, --如果t为负数即处理整数部分,处理完设为0 select trunc(147.128,2) from dual;--147.12 select trunc(147.128,0) from dual;--147 select trunc(147.128,-1) from dual;--140 select trunc(147.128,-2) from dual;--100 select trunc(147.128,-3) from dual;--0 --mod(n,t)求余,n/t后取余数 select mod(9,3) from dual;--0 select mod(9,2) from dual;--1 --substr(str,起始索引,长度)截取字符 --不论起始索引为0还是1,都是从第一个字符截取 select substr('abcdef',0,3) from dual;--abc select substr('abcdef',1,3) from dual;--abc select substr('abcdef',2,3) from dual;--bcd --length(str)获取字符串长度 select length('abcdef') from dual;--6 --trim(str)去掉字符串左右两边空格 select trim(' abc def ') from dual;--abc def --replace(str,s1,s2)替换字符,将str中的s1替换为s2 select replace('hello','l','o') from dual;--heooo --日期函数 --sysdate查询今天日期 --查询的是oracle所在机器日期,我的oracle安装在虚拟机上,所以这是虚拟机上的日期 select sysdate from dual; --add_months查询三个月后的今天的日期 select add_months(sysdate,3) from dual; --查询三天后的日期 select sysdate+3 from dual; --查询员工入职天数 select sysdate-hiredate from emp; --查询员工入职周数 select (sysdate-hiredate)/7 from emp; --查询员工入职月数,由于每月天数不同,所以使用months_between(date1,date2) select months_between(sysdate,hiredate) from emp; --查询员工入职年数 select months_between(sysdate,hiredate)/12 from emp; --转换函数 --to_number(str)字符转数值,鸡肋,默认已经转换 select 100+'10' from dual;--110 select 100+to_number('10') from dual;--110 --to_char(n)数值转字符 select to_char(800.11) from dual;--800.11 select to_char(800.00) from dual;--800 --CL格式 --'9,999.99'用于指定格式 select to_char(1298.219,'9,999.99') from dual;--1,298.21 select to_char(1298.219, '9,999.9') from dual;--1298.2 --'0'表示在对应位置返回对应的字符,如果没有则以'0'填充