前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >javaweb-oracle-1-57

javaweb-oracle-1-57

作者头像
全栈程序员站长
发布2021-05-19 17:22:35
6220
发布2021-05-19 17:22:35
举报
文章被收录于专栏:全栈程序员必看

文章目录

简介

32岁之前默默无闻,后来名声大噪,励志

在这里插入图片描述
在这里插入图片描述

安装oracle以及图形化界面确保没有中文和空格

安装数据库

不写邮件地址 不用在线更新,按钮都去掉, 下一步

在这里插入图片描述
在这里插入图片描述

密码为大小写英文,数字 口令管理,给几个账户开启权限

在这里插入图片描述
在这里插入图片描述

解锁scott,hr

在这里插入图片描述
在这里插入图片描述

配置图形化界面

在这里插入图片描述
在这里插入图片描述

第一次先不点击登录,先无登录进去配置 配置客户端路径

在这里插入图片描述
在这里插入图片描述

查看服务器ip地址,就是本机地址

在这里插入图片描述
在这里插入图片描述

再次登录 注意端口号1521

在这里插入图片描述
在这里插入图片描述

或者

在这里插入图片描述
在这里插入图片描述

那么如何让orcal自动配置,不用每次输入?

找到oracle默认的配置文件,复制到其他地方配置成环境变量自动装填数据 C:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora

在这里插入图片描述
在这里插入图片描述

以后登录界面就是第一种登录方式直接选择,ip什么的直接自动配置

在这里插入图片描述
在这里插入图片描述

有了可选登录项

中文乱码解决

1.查看服务器端编码 select userenv(‘language’) from dual; 我实际查到的结果为:AMERICAN_AMERICA.ZHS16GBK 2.执行语句 select * from V$NLS_PARAMETERS 查看第一行中PARAMETER项中为NLS_LANGUAGE 对应的VALUE项中是否和第一步得到的值一样。 如果不是,需要设置环境变量. 否则PLSQL客户端使用的编码和服务器端编码不一致,插入中文时就会出现乱码. 3.设置环境变量 计算机->属性->高级系统设置->环境变量->新建 设置变量名:NLS_LANG,变量值:第1步查到的值, 我的是 AMERICAN_AMERICA.ZHS16GBK 4.重新启动PLSQL,插入数据正常

orcal体系结构

  1. 数据库 Oracle 数据库是数据的物理存储。这就包括(数据文件 ORA 或者 DBF、控制文件、联机日 志、参数文件)。其实 Oracle 数据库的概念和其它数据库不一样,这里的数据库是一个操作系统 只有一个库。可以看作是 Oracle 就只有一个大数据库。
  2. 实例 一个 Oracle 实例(Oracle Instance)有一系列的后台进程(Backguound Processes)和内存结构 (Memory Structures)组成。一个数据库可以有 n 个实例。 (—解释—:)【数据库侧重于硬件文件,实例侧重于进程】
  3. 用户 用户是在实例下建立的。不同实例可以建相同名字的用户。 (—解释—:)【管理表的基本单位 mysql:当前数据库下有几张表 oracle:某用户下有几张表 做一个项目创建新的数据库,别的是创建数据库,这里是创建用户。区别】
  4. 表空间 表空间是 Oracle 对物理数据库上相关数据文件(ORA 或者 DBF 文件)的逻辑映射。一个数 据库在逻辑上被划分成一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构。每 个数据库至少有一个表空间(称之为 system 表空间)。 每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件 只能属于一个表空间。 (—解释—:)【当数据库很大就需要拆分,逻辑空间】
在这里插入图片描述
在这里插入图片描述
  1. 数据文件(dbf、ora) 数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个 或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于 一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数 据文件,只能删除其所属于的表空间才行。 注: 表的数据,是有用户放入某一个表空间的,而这个表空间会随机把这些表数据放到 一个或者多个数据文件中。 由于 oracle 的数据库不是普通的概念,oracle 是有用户和表空间对数据进行管理和存放的。 但是表不是有表空间去查询的,而是由用户去查的。因为不同用户可以在同一个表空间建立同 一个名字的表!这里区分就是用户了! (—解释—:)【物理文件】
在这里插入图片描述
在这里插入图片描述

操作流程

创建表空间-创建用户,操作表

创建表空间

表空间? ORACLE 数据库的逻辑单元。 数据库—表空间 一个表空间可以与多个数据 文件(物理结构)关联 一个数据库下可以建立多个表空间,一个表空间可以建立多个用户、一个用户下可以建立 多个表。 文件-新建-sqlwindow

代码语言:javascript
复制
--创建表空间,地址,初始带下,自动递增,递增大小
create tablespace learnAAA
datafile 'c:\learnAAA.dbf'
size 10m
autoextend on
next 10m;
--删除表空间,如果直接删除文件会提示表空间占用,删除表空间后解除占用,
--文件没有删除
drop tablespace learnAAA;

执行sql语句,查看表空间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建用户

代码语言:javascript
复制
--创建用户,登录时要使用的用户名的密码,用户所属表空间
create user learnAAA
identified by learnAAA
default tablespace learnAAA;
在这里插入图片描述
在这里插入图片描述

还需要补充权限信息,暂时还不能登录,以为能够管理的表不同 授权

代码语言:javascript
复制
--给用户授权
--oracle数据库中常用角色
connect--连接角色,基本角色
resource--开发者角色
dba--超级管理员角色
--给learnAAA用户授予dba角色,上面的都是注释,只有下面的语句执行
grant dba to learnAAA;

由此新用户获得了权限

在这里插入图片描述
在这里插入图片描述

数据类型和表的创建

数据类型

No 数据类型 描述
No 数据类型 描述

data具体到datatime的时分秒

表格

列名,类型

代码语言:javascript
复制
---创建一个person表
create table person(
       pid number(20),
       pname varchar2(10)
);
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改表

括弧是命令组的意思,单列可以不写括弧

代码语言:javascript
复制
---修改表结构
---添加一列
alter table person add (gender number(1));
代码语言:javascript
复制
---修改列类型
alter table person modify gender char(1);
---修改列名称
alter table person rename column gender to sex;
---删除一列
alter table person drop column sex;

操作表

commit rollback

在这里插入图片描述
在这里插入图片描述

若不提交,那便是脏数据,可有可无,rollback四大皆空 使用框架会自动提交,然而使用原始工具就需要手动提交

代码语言:javascript
复制
---查询表中记录
select * from person;
----添加一条记录
insert into person (pid, pname) values (1, '小明');
commit;
----修改一条记录
update person set pname = '小马' where pid = 1;
commit;

----三个删除
--删除表中全部记录
delete from person;
--删除表结构,先删掉数据,然后删掉索引,效率低
drop table person;
--先删除表,再次创建表。效果等同于删除表中全部记录。
--在数据量大的情况下,尤其在表中带有索引的情况下,该操作效率高。
--索引可以提供查询效率,但是会影响增删改效率。
truncate table person;

序列

数据库一般都是多人操作,每个人修改各不相同,尤其是id的增长,如何确定? 使用序列

在这里插入图片描述
在这里插入图片描述

逻辑关系 依赖于虚表 参数有下一次与当前,若未初始化当前无数据则报错

代码语言:javascript
复制
----序列不真的属于任何一张表,但是可以逻辑和表做绑定。
----序列:默认从1开始,依次递增,主要用来给主键赋值使用。
----dual:虚表,只是为了补全语法,没有任何意义。
create sequence s_person;

因此以后无确定的id,为内部自动增长 id只要确保唯一即可,至于断层是一定存在的,因为涉及增删改查,必定无法连续

代码语言:javascript
复制
select s_person.nextval from dual;
----添加一条记录
insert into person (pid, pname) values (s_person.nextval, '小明');
commit;
select * from person;
代码语言:javascript
复制
CREATE SEQUENCE 序列名
[INCREMENT BY n] 每次增加值
[START WITH n] 开始值
[{
   MAXVALUE/ MINVALUE n|NOMAXVALUE}] 最大最小用不上
[{
   CYCLE|NOCYCLE}] 恐怖循环,无用
[{
   CACHE n|NOCACHE}];比如走到8,下一次缓存9 10,直接用,更快,但不明显。

scott用户案例,可模拟复杂操作

解锁用户

代码语言:javascript
复制
----scott用户,密码tiger。
--解锁scott用户
alter user scott account unlock;
--解锁scott用户的密码【此句也可以用来重置密码】
alter user scott identified by tiger;
--切换到scott用户下
在这里插入图片描述
在这里插入图片描述

emp:编号,名字,工作,职位,入职日期,薪水,奖金,部门编号(外键)

在这里插入图片描述
在这里插入图片描述

salgrade:dept:部门编号(主键),名字,部门地址

在这里插入图片描述
在这里插入图片描述

工资表,工资等级,最低,最高

在这里插入图片描述
在这里插入图片描述

显示全部数据

在这里插入图片描述
在这里插入图片描述
单行函数
代码语言:javascript
复制
--单行函数:
作用于一行,返回一个值。
---字符函数
select upper('yes') from dual;--YES
select lower('YES') from dual;--yes
----数值函数
select round(56.16, -2) from dual;---四舍五入,后面的参数表示保留的位数,正数是小数点后的,负数则推进到整数部分56=100
select trunc(56.16, -1) from dual;---直接截取,不在看后面位数的数字是否大于5.   正数是小数点后的,负数则推进到整数部分56=50
select mod(10, 3) from dual;---求余数
----日期函数
----查询出emp表中所有员工入职距离现在几天。
select sysdate-e.hiredate from emp e;--日期可以加减,得到的单位是天
----算出明天此刻
select sysdate+1 from dual;
----查询出emp表中所有员工入职距离现在几月。
select months_between(sysdate,e.hiredate) from emp e;
----查询出emp表中所有员工入职距离现在几年。
select months_between(sysdate,e.hiredate)/12 from emp e;
----查询出emp表中所有员工入职距离现在几周。
select round((sysdate-e.hiredate)/7) from emp e;
----转换函数
---日期转字符串
select to_char(sysdate, 'fm yyyy-mm-dd hh24:mi:ss') from dual;--mm此处没有大小写要求,注意分钟和月份区别,fm可以去前0,hh24表示24h制
---字符串转日期
select to_date('2018-6-7 16:39:50', 'fm yyyy-mm-dd hh24:mi:ss') from dual;
----通用函数
---算出emp表中所有员工的年薪
----奖金里面有null值,如果null值和任意数字做算术运算,结果都是null。
select e.sal*12+nvl(e.comm, 0) from emp e;
条件表达式

等值判断

代码语言:javascript
复制
---条件表达式
---条件表达式的通用写法,mysql和oracle通用
---给emp表中员工起中文名,没有逗号,无论些多长都当做一列内容
select e.ename, 
       case e.ename
         when 'SMITH' then '曹贼'
           when 'ALLEN' then '大耳贼'
             when 'WARD' then '诸葛小儿'
               --else '无名'
                 end
from emp e;

范围判断

代码语言:javascript
复制
---判断emp表中员工工资,如果高于3000显示高收入,如果高于1500低于3000显示中等收入,
-----其余显示低收入
select e.sal, 
       case 
         when e.sal>3000 then '高收入'
           when e.sal>1500 then '中等收入'
               else '低收入'
                 end
from emp e;

起别名 然而通常不会用,因为确保代码可重复。可能oracle和mysql互用

代码语言:javascript
复制
----oracle中除了起别名,都用单引号。
----oracle专用条件表达式
select e.ename, 
        decode(e.ename,
          'SMITH',  '曹贼',
            'ALLEN',  '大耳贼',
              'WARD',  '诸葛小儿',
                '无名') "中文名"             
from emp e;
多行函数
代码语言:javascript
复制
--多行函数【聚合函数】:作用于多行,返回一个值。,使用count(*)底层使用的还是1,相当于计算主键这一列
--代码选中执行
--分号表示分段,否则认为是一句话
select count(1) from emp;---查询总数量
select sum(sal) from emp;---工资总和
select max(sal) from emp;---最大工资
select min(sal) from emp;---最低工资
select avg(sal) from emp;---平均工资
分组查询

复杂查询不要一次写完,要分开填充内容,为了直观 对于原始列可以原样显示,否则需要处理。分组查询时表结构会发生改变,原先的结构可能已经不适用 得到的必须是分组的共同特性

代码语言:javascript
复制
---分组查询
---查询出每个部门的平均工资
---分组查询中,出现在group by后面的原始列,才能出现在select后面
---没有出现在group by后面的列,想在select后面,必须加上聚合函数。
---聚合函数有一个特性,可以把多行记录变成一个值。
select e.deptno, avg(e.sal)--, e.ename
from emp e
group by e.deptno;
---查询出平均工资高于2000的部门信息
select e.deptno, avg(e.sal) asal
from emp e
group by e.deptno
having avg(e.sal)>2000;
能用别名查询吗?

where优先级大于别名,条件不满足不会查 这里不能用s

代码语言:javascript
复制
---所有条件都不能使用别名来判断。
--比如下面的条件语句也不能使用别名当条件
select ename, sal s from emp where sal>1500;
引申:select中优先级
代码语言:javascript
复制
---查询出每个部门工资高于800的员工的平均工资
select e.deptno, avg(e.sal) asal
from emp e
where e.sal>800
group by e.deptno;
----where是过滤分组前的数据,having是过滤分组后的数据。
---表现形式:where必须在group by之前,having是在group by之后。
---查询出每个部门工资高于800的员工的平均工资
---然后再查询出平均工资高于2000的部门
select e.deptno, avg(e.sal) asal
from emp e
where e.sal>800
group by e.deptno
having avg(e.sal)>2000;
多表查询的一些概念

笛卡尔积,数据无用

代码语言:javascript
复制
---多表查询中的一些概念
---笛卡尔积
select *
from emp e, dept d;
---等值连接
select *
from emp e, dept d
where e.deptno=d.deptno;
---内连接,早期写法,现在一般写上面的
select *
from emp e inner join dept d
on e.deptno = d.deptno;

左连接和右连接的区别 创建一种从属关系,以一方为主体必须全部显示,另一方配合 右连接,右为主体,左连接,左为主体

代码语言:javascript
复制
---查询出所有部门,以及部门下的员工信息。【外连接】
select *
from emp e right join dept d
on e.deptno=d.deptno;
---查询所有员工信息,以及员工所属部门
select *
from emp e left join dept d
on e.deptno=d.deptno;

特有的方法 谁拥有+号谁是从属,对方为主体,匹配左右连接 当然通用更常用,容易迭代更换

代码语言:javascript
复制
---oracle中专用外连接
select *
from emp e, dept d
where e.deptno(+) = d.deptno;
自连接

表格自己连接自己 用于匹配数据 适合内部有重复有意义数据的情况,从不同的角度看成多张表

代码语言:javascript
复制
select * from emp;
---查询出员工姓名,员工领导姓名
---自连接:自连接其实就是站在不同的角度把一张表看成多张表。
select e1.ename, e2.ename
from emp e1, emp e2
where e1.mgr = e2.empno;
------查询出员工姓名,员工部门名称,员工领导姓名,员工领导部门名称
--员工查询员工的部门,领导查询领导的部门,从emp中得到员工领导,从dept中得到部门信息
select e1.ename, d1.dname, e2.ename, d2.dname
from emp e1, emp e2, dept d1, dept d2
where e1.mgr = e2.empno
and e1.deptno=d1.deptno
and e2.deptno=d2.deptno;

sql语句并不是不报错就是对的,要正确处理需求

子查询

子查询返回一个值,集合,表

代码语言:javascript
复制
---子查询
---子查询返回一个值,就直接认为这个查询是个值就行,如果直接写=有隐患
(—解释—:)【因为ename不是主键不能确定唯一,如果子查询出是集合,=就错了】
---查询出工资和SCOTT一样的员工信息
select * from emp where sal in
(select sal from emp where ename = 'SCOTT')
---子查询返回一个集合
---查询出工资和10号部门任意员工一样的员工信息
select * from emp where sal in
(select sal from emp where deptno = 10);
---子查询返回一张表
---查询出每个部门最低工资,和最低工资员工姓名,和该员工所在部门名称
---1,先查询出每个部门最低工资,以查询到的结果作为表进入查询条件
select deptno, min(sal) msal
from emp 
group by deptno;
---2,三表联查,得到最终结果。
select t.deptno, t.msal, e.ename, d.dname
from (select deptno, min(sal) msal
      from emp 
      group by deptno) t, emp e, dept d
where t.deptno = e.deptno
and t.msal = e.sal
and e.deptno = d.deptno;
分页查询
代码语言:javascript
复制
----oracle中的分页
---rownum行号:当我们做select操作的时候,
--每查询出一行记录,就会在该行上加上一个行号,
--行号从1开始,依次递增,不能跳着走。

----排序操作会影响rownum的顺序.rownum不属于这个表,不需要加前缀。
--这里介绍执行顺序,先执行查询,再按条件排序,所以rownum顺序会乱
select rownum, e.* from emp e order by e.sal desc
----如果涉及到排序,但是还要使用rownum的话,我们可以再次嵌套查询。
select rownum, t.* from(
select rownum, e.* from emp e order by e.sal desc) t;


----emp表工资倒叙排列后,每页五条记录,查询第二页。
----rownum行号不能写上大于一个正数。,先执行where查询,rownum只能从1开始如果写这个是查不出来的
select * from(
    select rownum rn, tt.* from(
          select * from emp order by sal desc
    ) tt where rownum<11
) where rn>5

这个查询rownum的条件查不出来,从1开始条件不满足的 因此这里嵌套了3层,先查询出所有的rownum,如果直接写rownum不行,因为不属于新查询的表,起个别名就行了 因为就一张表,对于缓存表起不起别名都无所谓 一般对于分页查询所使用的值都是外部传人的

在这里插入图片描述
在这里插入图片描述

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100232.html原文链接:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 简介
  • 安装数据库
  • 配置图形化界面
  • 中文乱码解决
  • orcal体系结构
  • 操作流程
    • 创建表空间
      • 创建用户
      • 数据类型和表的创建
        • 数据类型
          • 表格
            • 修改表
              • 操作表
                • 序列
                  • scott用户案例,可模拟复杂操作
                  相关产品与服务
                  数据库
                  云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档