外观
Oracle数据库
1.oracle的历史
1.文件型数据库
2.层状数据库
3.关系性数据库管理系统
3.1二维表存储数据
3.2表之间有外键关系
3.3符合实体关系模型
2.Oracle分类
1.历史版本 8i,9i,10g,11grid,12c
2.功能版本
1.企业版
2.标准版
3.Express快捷版
特点
1.安装包只有300M多 ,有1.5G多
2.免费进行开发、部署和分发
3.XE 将最多存储 4GB 的用户数据
4.最多使用 1GB 内存,并在主机上使用一个 CPU
5.只能建立1个数据库
3.数据库使用者角色
1.数据开发人员
2.DBA 数据库管理人员
3.BI(商业分析人员)
4.Oracle xe数据库的安装
不要安装在中文路径(D:\oraclexe)
在本子上记录密码
1.启动oracle
2.查看数据库是否正常启动
使用SQl Plus连接数据库管理系统
默认2个用户
1.sys 系统中权限最高的用户 不能使用norma身份登录
2.system 系统中权限最高的用户 它可以使用norma身份登录
用户登录oracle有3个常用角色
1.sysdba 数据管理者
2.sysoper 数据库操作者
3.normal 普通身份登录
登录
查看监听状态
3.sqlplus的使用
sqlplus命令
登录
退出
连接
断开连接 disconn
sql语句
PL Sql语句 (过程化SQL语句)
创建表空间
create tableSpace TB_TEST2
datafile 'D:\oraclexe\app\oracle\oradata\XE\TB_TEST2.dbf'
size 10M
autoextend on next 1m;
创建用户
create user test_user2
identified by 123456
--default tableSpace TB_TEST2;
授权
grant resource,connect to test_user2;
resource 用户角色表示的是 对象的所有者 增删改模式对象
connect用户角色表示的是 连接数据库,对对象进行CRUD 的权限
4.安装PL SQLDelvoper及PLD的使用
1.SQL窗口
2.命令窗口 执行sqlPlus
3.程序窗口 定义各种模式对象
5.varchar与varchar2的区别?
1.varchar是标准sql里面的, varchar2是oracle提供的独有的数据类型。
2.但是oracle准备在下一版本,不支持varchar类型。
3.varchar对于汉字占两个字节,对于数字,英文字符是一个字节,占的内存小,varchar2具体要看数据库使用的字符集
4.varchar对空串不处理,varchar2将空串当做null来处理。
3.Oracle的常见操作
1.生产系统中一个服务器一般=只使用一个Oracle数据库,一个数据库实例只能连接一个数据库,多个软件系统工作在同一个服务器,一定要共用数据库,为了区分模式对象,需要依据软件系统建立不同的用户
2.Oracle数据库不自动提交事务,执行ddl(数据定义语言)会自动提交事务
1.选择操作
横向选择部分行(在结果集中选出部分记录行)
关系运算:=,!=,<>,>,<,>=,<=,in,not in,is null,is not null,between..... and,like,
逻辑运算:not and or
is null 是判断结果是否为null的唯一条件,=null不可使用
like:模糊查找(%表示多个字符,_表示一个字符)关系运算的优先级高于逻辑运算
>some 等同于 >any 大于最小的
>all 大于最大的
exist按行匹配,不经过投影过程,效率略高
2.排序
结果集默认不排序,按照聚集索引及内容排序
order by子句,可以多个关键字排序,多个关键字使用逗号分开,每个关键字可单独设置排序规则(ASC升序(默认)DESC为降序)
一般只在结果集的末尾排序
3.分组
group by .... having........分组后的条件
分组的投影字段,要么是分组条件列,要么是聚合函数的列
having 执行在分组之后,
where子句先执行可以把结果集范围缩小,提高查询效率
having一般用于限制聚合列,分组用于消除重复
4.连接
笛卡儿积:行数为两表行数的乘积,列数为两表列数的和
等值连接:表1 join 表2 on 条件
行数由查询条件决定,列数为两表之和
推荐 inner join 表2 on 条件的写法
左外连接:outer join 表2 on 条件
记录数取决于连接条件,保证左表数据全部显示
左联与等联的区别:
1.都可以连接2表
2.都可以连接字段
3.若引用表等于被引用表,数据符合引用完整性,等联与左联无区别
若数据不符合规范,,左联更安全,总能保证左表的所有记录会被加载
(编号转名称是最常用的应用场景)
--DML 数据操纵语言
--查
-- 1.投影(对字段的操作)
-- 1.1 选取全部字段
select * from emp;
-- 1.2 选取部分字段
select empno from emp;
select empno,ename from emp;
-- 1.3 选取部分字段,并且调整顺序
select ename,empno from emp;
-- 1.4 可以使用函数,或者计算,产生表达式
select substr(ename,1,2) from emp;
--null做任何运算结果都是null
select ename,sal,comm,sal+nvl(comm,0) from emp;
-- 1.5 别名
select ename,sal,comm,sal+nvl(comm,0) as 收入 from emp;
select ename,sal,comm,sal+nvl(comm,0) as "收 入" from emp;
select ename,sal,comm,sal+nvl(comm,0) "收 入" from emp E;
select ename,sal,comm,sal+nvl(comm,0) "收 入" from emp as E;--不行,表的别名是没有as
--1.6 常数列
select ename,1 常数列,sysdate,'abcd' from emp;
--1.7 剔重
select distinct job from emp;--只按投影列表(选择的字段列表)来剔重
select dist job from emp;-- 不行
-- 2.选择
-- 在结果集中选择出部分记录行
select * from emp
where ;
--关系运算 =,!=,<>,>,<,>=,<=,in,not in,is null ,is not null,between ...and ,like
-- 逻辑运算 not and or
-- 逻辑谓词 some any all exists
= 是单的
between ...and 是闭区间
is null 是判别null的正确方式,不能用=null
like
select * from emp
where comm=null ;--错
select * from emp
where comm is null ;
select * from emp
where ename like 'A';--错
select * from emp
where ename like '%A%';
select * from emp
where ename like 'A____';
select * from emp
where deptno=10 or deptno=20
select * from emp
where (deptno=10) or (deptno=20)
select * from emp
where sal>some (select sal from emp where deptno=10) --任意一个
select * from emp
where sal>any (select sal from emp where deptno=10) --任意一个
select * from emp
where sal>all (select sal from emp where deptno=10) --全部
select * from emp E1
where exists(select 1 from emp E2 where E1.Deptno=E2.deptno and E2.Deptno=10 )
-- exists 按记录行匹配,不经过投影,所以效率高
-- 3.排序
--结果集不排序,默认认为是无序的,是按照聚集索引,内容排列顺序
select ename,job from emp
order by empno, job asc,ename desc --可以多个关键字排序 ,用逗号分开
--每个关键字是可以,单独设置升序(asc)降序(desc)
--可以使用没有投影的字段排序
--一般不在子查询中排序,只在结果集最后排序
-- 4.分组
--group by
--having
--分组的2个用处
--1.使用聚合函数 max,min,sum,count,avg
--2.剔重
select count(1) from emp --把所有记录视作一组
--分组的投影字段,分组条件列,或者是聚合列
select deptno,min(ename),count(1) from emp
where deptno>0 --where 先执行,能把结果集限制的更小,处理的数据更少,效率高
group by deptno
having count(1)>0 --having 分组条件列,或者是聚合列,在分组后执行
-- having 一般只用于限制聚合列
--(精确的)消除重复
select job,min(empno) from emp
group by job
-- 5.连接
select * from emp
select * from dept
select * from emp,dept
--笛卡尔积
行数=2表之积,列数=2表之和
--等联(内等联结)
行数=取决于连接条件,列数=2表之和
select * from emp,dept
where emp.deptno=dept.deptno
select * from emp
inner join dept on emp.deptno=dept.deptno --推荐
select * from emp
inner join dept on emp.deptno!=dept.deptno
select * from emp
join dept on emp.deptno=dept.deptno
--左联(左联结)
行数=取决于连接条件,保证左表记录返回,列数=2表之和
select * from emp
left outer join dept on emp.deptno=dept.deptno --推荐
select * from dept
left outer join emp on emp.deptno=dept.deptno
order by emp.deptno
select * from dept
left join emp on emp.deptno=dept.deptno --推荐
order by emp.deptno
select * from emp,dept
where emp.deptno=dept.deptno(+) --左联的古典写法
左联与等连的区别?
都可以连接2表
连接字段
如何引用表与被引用表,数据符合引用完整性的,等连和左联没区别
数据不是那么规范,不符合引用完整性,左联更安全,总能保证左表的所有记录会被加载。
!!!编号转名称,是连接的最主要场景
--右联(就是左联的对称)
select * from emp
right outer join dept on emp.deptno=dept.deptno
select * from emp
right join dept on emp.deptno=dept.deptno
select * from emp,dept
where emp.deptno(+)=dept.deptno --右联的古典写法
--全连接(左联+右联)
--保证左表,右表记录都被加载
select * from emp
full outer join dept on emp.deptno=dept.deptno
--自然连接(按2表相同字段名的列,等连)
select * from emp
Natural join dept
-- 6.子查询
--1.单行子查询
select * from emp
where deptno=(
select deptno from Dept
where loc='DALLAS');
--2.多行子查询
select * from emp
where deptno in(
select deptno from Dept
where deptno>10);
--3.多列子查询
select * from emp
where (ename,job)=( select ename,job from emp where empno=7369)
update emp
set sal=0
where (ename,job)=( select ename,job from emp where empno=7369)
--4.标量子查询
select ename,sal,5000-sal 差额 from emp
select ename,sal,(select max(sal) from emp)-sal 差额 from emp
--5.相关子查询
select ename,sal,deptno,
(select max(sal) from emp E1 where Emp.Deptno=E1.Deptno)-sal 差额 from emp
--6.DDL子查询(复制表与数据)
create table EmpInDept10
as
select empno,ename,sal from emp
where deptno=10
select * from EmpInDept10
-- 7.联合
-- 并集
select * from emp
where deptno=10
union --带剔重
select * from emp
select * from emp
where deptno=10
union all --不带剔重
select * from emp
--不需要字段一致,只要数据类型一致,字段数量一致
select empno,ename from emp
where deptno=10
union
select empno,job from emp
--交集
select * from emp
where deptno=10
INTERSECT
select * from emp
--差集
select * from emp
minus
select * from emp
where deptno=10
4.Oracle常用函数
1.字符函数
1.ASCii('abcd')获取首字母的ASCII码
2.chr(n)获取n对应ASCII码的字符
3.concat(str1,str2)连接两个字符
4.instr(str1,str2[n])查找从n开始str2在str1中出现的位置,未找到为0;
5.length(Str)返回str的长度
6.lpad( str,n,char)格式化str,转为n位,不够的在左边补char,rpad类似
7.ltrim(str,str2)去除str1里面的str2
8.replace(str1,str2)去除str1里面的str2
9.replace(str1,str2,str3)将str1里面的str2用str3代替
10.substr(str ,n,l)截取字符,支持反向截取
2.数字函数
1.floor(n)向下取整
2.ceil(n)向上取整
3.round(n)绝对值四舍五入
4.round(n,l)保留l位小数四舍五入
5.mod(x,y)取x%y
6.power(x,y)取x^y
3.日期函数
1.current_date()|current_timestrap()|sysdate()|systimestrap()获取系统当前时间
2.month_between(date1,date2)获取两个date之间的月数
3.add_months(date,n)返回n个月后的日期
4.last_day(date)返回指定日期的月份的最后一天的日期
5.next_day(date)返回指定日期月份的后一天日期
4.转换函数
1.to_date(str,掩码)字符串转日期
2.to_char(str,掩码)
3.to_number(str,掩码)
5.其他函数
nvl(null,0)null保护
nvl(str,str1)使用str1代替str
nvl2(str,str1,str2)
三目运算
rownum>3表示显示查询结果的前两行
/*函数*/
--单行函数
--字符函数
--dual系统提供的测试表
select 'abcdef' from dual;
select ascii('abcdef') from dual;--97
select ascii('a') from dual;
select chr(97) from dual;--a
select concat('ab','cd') from dual;--abcd
select concat('ab','cd','ef') from dual;--错
select 'ab'||'cd' from dual;--abcd
select 'ab'+'cd' from dual;--错
select 3+2 from dual;
select '3'+'2' from dual;--自动转换
select '3'+'2'+10 from dual;--自动转换
select instr('abcdef','abc') from dual;--1
select instr('abcdef','bbc') from dual;--0
select instr('abcdefabc','abc',2) from dual;
select instr('abcdefabc','abc',1,2) from dual;
select length('123456') from dual;
select lpad('123',5,0) from dual;
select lpad('123456',5,0) from dual;--截取,填充
select rpad('123',5,0) from dual;
select rpad('123456',5,0) from dual;
select ltrim(' 123456 ') from dual;
select ltrim('123456','12') from dual;
select ltrim('21232456','312') from dual;
select trim(' 21232456 ') from dual;
select replace('1231245612','12') from dual;
select replace('1231245612','12','*') from dual;
select substr('12345678',2) from dual;
select substr('12345678',2,3) from dual;
select substr('12345678',-2) from dual;--反向截取
--数学函数
select floor(-3.14) from dual;-- -4
select ceil(-3.14) from dual;-- -3
select round(-3.14) from dual;-- -3
select round(-3.14,1) from dual;-- -3.1
select mod(8,5) from dual;-- 3
select power(8,2) from dual;-- 64
--日期函数
select CURRENT_DATE from dual;--2021/10/19 11:36:46
select SYSDATE from dual;--2021/10/19 11:37:18
select CURRENT_TIMESTAMP(9) from dual;--19-10月-21 11.37.47.833000000 上午 +08:00
select SYSTIMESTAMP(9) from dual;--19-10月-21 11.38.25.140000000 上午 +08:00
select SYSDATE+1 from dual;--天
select date'2021-10-19'- date'2021-10-16' from dual;
select SYSDATE- date'2021-10-16' from dual;
select months_between(date'2021-6-19', date'2021-10-16') from dual;
select ADD_MONTHS(date'2021-6-19',3) from dual;
select last_day(date'2021-10-16') from dual;
select last_day(date'2020-02-16')-3 from dual;
select next_day(sysdate,2) from dual;--下周一
select next_day(sysdate,'星期一') from dual;--下周一
select ROUND(sysdate,'year') from dual;
select ROUND(sysdate,'month') from dual;
select extract(day from sysdate) from dual;
select extract(year from sysdate) from dual;
--转换函数
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
select to_char(sysdate,'dd')+10 from dual;
select to_date('2021-10-19 11:51:44','yyyy-mm-dd hh24:mi:ss') from dual;
select to_char(1234567.879,'$000,000,000.00') from dual;
select to_number('$001,234,567.88','$000,000,000.00') from dual;
--其它函数
select nvl(null,2) from dual;
select empno,nvl(comm,0) from emp;
select empno,nvl(comm,'a') from emp;--错
--三目运算
select nvl2(1,2,3) from dual;
--多选一结构
select decode(5,1,'甲',2,'乙','爱咋咋') from dual;
6.分支结构
case 表名
when 值1 then 值1-1
when 值2 then 值2-1
when 值2 then 值2-1
else 默认值
end case
desc 表名 获取表结构
数值类型:无界定符
字符串:单引号界定
日期:date’字符串'/to_date函数
添加字段:alter table add 字段名 类型
批量插入:insert into 表名 select ........
删除数据:强烈建议先查看、备份再删除
分页:rownum伪列:是系统提供的特殊字段,用来表达结果集的序号
ininCap()函数首字母大写