Oracle数据库入门

Oracle基础概念

数据库:
数据的仓库

以前存数据:内存,文件
内存: int num = 10; 问题,临时
文件: xml/json 解析/操作起来麻烦

永久存放,方便解析/处理-> 数据库
主流关系型数据库:

  • Oracle

产品免费,服务收费,强大稳定性,安全性

  • MySQL

MySQL AB开源,2008被SUN公司收购,然后和java打包2009年卖给了Oracle!有社区版和企业版!产品免费,服务收费!

  • SqlServer

微软开发,强大的图形化工具,方便使用

  • db2

IBM,多个操作系统,多个硬件

Oracle版本:
oracle8i/9i:internet,开始走向网络,之前单机
oracle10g: grid网格计算,提高访问速度,避免舍近求远问题!
oracle 12c: cloud,云开发

oracle11g:目前主流

不同版本只有部署运维差异较大,其他没有很大区别!

数据库服务器:
将数据库部署在服务器上!
Oracle服务器:

  1. 基于关系型的数据库(RDBMS)
    关系型->二维表:Oracle/MySQL/SqlServer/DB2…
    非关系数据库: NoSQL:not noly sql, redis/mongodb: 基于key value结构
  2. 组成结构:
    一个PGA对应一个客户端
    两阶段提交:减少数据库访问次数!
    img

数据库安装

Oracle 安装过程

  1. 官网下载安装包
  2. 然后解压后,点击setup启动安装
    img
    img

img

img
img
img

  1. 配置数据库密码
    img
    img

  2. 继续安装
    img

  3. 等待加载
    img

img
Oracle数据库不像其他数据库一样,Oracle只有一个实例!

  1. 重点输入密码,继续安装
    img

  2. 安装成功
    img

  3. 验证
    通过刚刚我们未锁定的账户名和密码进行连接数据库!
    img

连接Oracle

  • 方式一
-- 打开cmd窗口
-- 1.输入sqlplus回车
sqlplus
-- 输入用户名
scott
-- 输入密码
123456

img

  • 方式二
    img
-- 找到sqlplus窗口
-- 然后操作和上述步骤一样
-- 输入用户名(方案名)
-- 输入密码

img

查看当前用户

show user;
img
方案就是用户,用户就是方案!

数据表的基本概念

实体:类似于java中的类
记录:java中的对象(一行数据)
字段:java中的属性,列
表:同一个实体中将记录和字段组合起来就是一张表!

查看当前系统表

  • select * from tab;
    img

  • 查看emp
    select * from emp
    img

  • 设置行长度!
    set linesize 150;
    如果我们设置行长度,可以看到一行显示不了这一条记录!
    img

  • set pagesize 300
    设置一页展示的大小
    img

  • 查看表结构
    desc table_name;
    img

  • 查询字段并起别名
    select empno as "编号",ename "姓名",job 月薪 from emp;
    img
    注意:
    as: 可以省略!
    "":当遇到一些特殊字符,Oracle关键字,空格不能省略
    img

  • 清屏
    host cls;
    img

  • 修改上一条语句错误
    c /form/from;

c /form/from;
--显示修改后的sql!
-- /斜杠表示确认修改执行sql
/

img

  • ed直接在记事本中修改上一条错误语句
    img
    记得要有权限!管理员cmd窗口下可进行!
    关闭,回车,预览结果,/确认!
    img

  • 列的计算
    select empno, sal, sal*12 年薪 from emp;
    img

  • select控制列,where控制行!
    img

  • 日期/字符串/字符. 用单引号''
    img

  • 关键字/命令大小写不敏感
    img

  • 数据大小写敏感
    img

  • 运算符
    操作运算符: + - * / %
    关系运算符:> >= < <= =
    注意:
    等于:=
    不等于: !=或者<>
    null判断:is null或者is not null
    img
    逻辑运算符: or and not
    img
    注意: 执行顺序
    where执行顺序:从右往左!

  • null的计算
    任何数字和null计算都为null
    img
    需要对null处理: null->0

    • nvl:if
      nvl(comm,0): if comm is null comm=0
      img
    • nvl2: if else
      nvl2(comm,comm,0): if(comm==null) return 0 else return comm;
      img
  • 对查询的结果集去重
    distinct
    img

  • 连接符
    concat()或者 ||
    类似于java中字符串拼接hello+world-> helloworld
    img
    注意:字符单引号

  • dual临时表
    单行单列,学习时使用的临时表
    img

  • 日期
    修改日期格式 alter session set nls_date_format='yyyy-mm-dd';
    img

  • 范围查询:数字/日期
    between min and max; [min,max 闭区间
    img
    img

  • 模糊查询
    like 通配符 %:任意字符 _:匹配一个字符
    img
    查询姓名长度大于4的员工信息不可用函数
    img
    查询字段中包含_的结果
    _进行转义,转义符可以任意!
    like '%\_%' escape '\';escape:表示转义字符!

  • not in里不能出现null
    出现了null查询结果就必然为空!
    img
    等价写法:
    select * from emp where comm not(comm = 300 or comm = 500);
    所以null不能和=判断!

  • 排序
    order by asc(默认升序) desc(降序)
    order by 字段名|表达式|序号
    img
    序号(就是第几列)
    img
    表达式
    img

  • null默认是最大值
    img
    通过nulls lastnull放最后!
    img

  • 追加命令
    a :append
    img

  • 多列排序
    select * from emp order by sal desc,comm asc;
    img

Orcale函数

单行函数:一次操作一行
多行函数:一次操作多行返回一个结果

单行函数

字符函数:

  • lower(变小写),upper(变大写),initcap(每个单词首字母大写)
    img
  • substr(str,begin,len); begin:从1开始数!
    img
  • length(str); 字符长度!
    img
  • lengthb(str) 字节数
    img
    注意: 英文/数字字符和字节数一样!
    中文/特殊符号就不同!
    utf8: 一个汉字/符号 占3个字节!
    gbk: 占2个字节!
    img
    img
  • instr(str1,str2); 在str1找str2返回位置(开始位置为0)
    img
  • lpad(str,n,'c')/rpad():str需要占n位,不够就用字符c填充!
    img
  • trim():去首尾任意字符,无参默认去空格!trim(c from str) 去指定字符c
    img
  • replace(str,c,r);: 将str字符中的c替换成r
    img

数值函数

  • round(num,n);numn位四舍五入,保留n位!
    n>0:保留几位小数!
    n=0:保留整数
    n<0:保留几位整数

img

  • trunc(num,n);截取,舍尾!
    img
  • mod(num,n);num进行n求余!
    img

日期函数

  • sysdate:关键字当前时间
    img
  • 格式化:日期-> 字符
    to_cahr(date,format) 日期date转成fromat格式字符
    img
  • 日期+-数字: 步幅是天,结果是日期
    img
  • 日期-日期:结果是天数
    img
  • months_between(日期1,日期2);:日期1-日期2得出相差多少月
    img
  • add_months(日期,n):日期+n个月
    img
  • last_day(日期):当前月最后是那一天img
  • next_day(date,w):下一个w星期几的时间!
    img
  • round(date,x)/trunc(date,x):对日期四舍五入或舍去 x可取:month/year/day对年月日四舍五入或者舍去

通用函数

  • nvl,nvl2 :if if else
  • nullif(a,b): if(a==b) null else a
    img
  • coalesce(a,b) if a!=null: a elif b!=null: b else null返回第一个不为null的值!
    img
  • 条件判断函数
    decode(字段,条件1,返回值1,条件2,返回2...最后表达式);
    img
  • case表达式
case 表达式
when 条件1 then 返回1
when 条件2 then 返回2
...
else 返回值n
end

![img])(https://i-blog.csdnimg.cn/blog_migrate/5fc8ec0c8f0e2f4d1748157ace1ad3d5.png)

转换函数

源类型目标类型
nvarchar2/nchar等字符number/date
number/datenvarchar2/nchar等字符

img
img

  • 显式转换
    img
    to_number格式
格式简介
9数字
00
$美元符号
L本地货币符号
.小数点
,千分位

to_date格式

格式简介示例
yyyy数字表示年2019
year英文表示年twenty twelve
mm数字表示的月09
mon月(与系统语言相关)9月
dy星期几(与系统语言相关)星期一
day星期几(与系统语言相关)星期一
dd每个月的第几天02

img
img
img
img
img

多行函数/组函数/聚合函数

  • count():求字段列数,且自动排除null
    img
    distinct组合使用可以求部门数!
    img
  • count max sum min avg这里和mysql一样!
    img
  • group by 分组注意事项

分组查询时,不在聚合函数中的列,必须在group by中!

img
多次分组
img

  • 对组进行筛选 having
    img

SQL语句

SQL语句类型:
SQL:数据查询语言select
DML:数据操作语言insert,delete,update
DDL: 数据定义语言 create/drop/truncate/alter table
DCL:数据控制语言 grant,revoke

DML

insert

语法:
insert into table_name (字段1,字段2,...) value (字段值1,字段值2...);
字段值和字段值一一对应,数据类型个数顺序一致!
注意:这里的into不能省略
img

img
多行插入

img
Oracle并不支持像MySQL一样的多行插入
insert into table_name (...)values(...),(...)...;
多行插入语法

insert all 
       into table_name  VALUES ('活塞',1990)
       INTO table_name  VALUES ('公牛',1991)
       INTO table_name  VALUES ('公牛',1992)
       SELECT 1 FROM DUAL; --需要借助dual表!

img
注意:
SQL92不能省略字段,SQL99标准可以省略字段名insert emp (可省略) values();

  • 动态输入插入的值
    & 通过&占位符进行动态输入
insert into table_name(&name1,&name2...) values(&value1,&value2...);

img
img

批量插入数据

创建新表

批量插入前表不存在,插入后就生成了新表!创建表好插入数据一次搞定!

create table table_name
as select * from emp;

不但复制了emp表中的数据,并且将emp表结构也复制了!

1.复制表结构和全部数据
img
2.复制表结构和部分数据
img
3.创建表结构不存在数据
img

在旧表中插入

已存在表,然后进行数据插入!

方式一:

insert into table_name (empno,ename,sal) select empno,ename,sal from emp; 

img
方式二:

可以通过事务的方式进行多行插入!

begin
insert into emp
values(-1,'lisi','m',7788,'03-12月-81',9998,1000,20);
insert into emp
values(-2,'zhan','m',7788,'03-12月-81',9998,1000,20);
end;

img

如果插入海量数据:
1.数据泵
2.SQL Loader
3.外部表

delete

delete删除

语法:

delete from tab_name 
where ...;

注意:

1.不加where为全表删除,可以通过rollback回退
2.加上where删除表中部分数据
3.delete from tab_name*

全表删除

delete from tab_name; 删除表中的数据,删除完后可rollback回退

img
truncate from tab_name; 属于DDL语句不能回退!

img
测试deletetruncate删除全表的时间

打开sql执行时间
set timing on;
关闭sql执行时间
set timing off;

img
img
总结:

事务:
delete支持事务,truncat不支持事务!
时间:
对于少量数据: delete效率高,一行一行删除
对于海量数据:truncate效率高

  • a. drop table丢弃整张表

  • b. 重新创建表

闪回:
delete支持闪回,truncate不支持闪回
空间:
delete不会释放空间(换个空间放数据,类似于回收站)
truncate会释放空间,彻底删除
delete会产生碎片,truncate不会
产生碎片太多,可以整理碎片
a. alter table tab_name move;
img
b.可以通过数据导入导出

update

update tab_name set 字段名1=value1,字段名2 = value ...
where ...;

修改整张表数据!
img
where语句修改指定数据

DDL

create/drop/truncate/alter

create

创建表:
create table tab_name
(
	id number,
	name varchar(10),
	age number
);

img
注意事项:

1.权限和空间问题
2.表名命名规则:
a.字母开头
b.表名只包含:大小写字母,数字,_,&,#;
c.长度1-30个字符
d.不能与其他数据库中的对象重名(表,视图,索引,触发器,存储过程…)
e.不能与保留字重命
查看保留字: DBA账户
sqlplus / as sysdba
然后执行语句…

  • 设置某个字段宽度:
    字符:col 字段名 for a7;
    数字: col 字段名 for 9999;
    img

alter

  • 追加新列
alter table tab_name add 字段名 字段类型;

img

  • 修改列
    • 修改列的长度
      alter table tab_name modify 字段名 字段类型;
    • 修改类的类型
      alter table tab_name modify 字段名 字段类型;

img
注意:

blob/clob不能修改 ->先删除此列,重新追加!

  • 删除列
    alter table tab_name drop column 字段名;
    img

  • 重命名列
    alter table tab_name rename column 字段名 to 新字段名名;

img

drop

drop删除表(放入回收站)

drop table tab_name;

img
drop删除后,表还在tab中,也就是放入了回收站

  • 查看回收站:
    show recyclebin;
    img

  • 清空回收站:
    purge recyclebin;
    img

  • 还原回收站:
    闪回

删除表并清空回收站
drop table tab_name purge;
img

连接

内连接/外连接/自连接/层次连接

交叉连接(笛卡尔积),所有情况的组合,不推荐使用
select * from tab_name1,tab_name2;
img

  • 内连接:
    • 通过where连接
      img

    • 通过inner join on连接
      img

多张表通过相同字段连接,匹配成功则显示,否则不显示

  • 外连接

    • 左外连接

    以左表为基准,去匹配右表数据,如果匹配成功,则全部显示,匹配不成功右边部分为null

    --方式1
    select * from tab1 left (outer) join tab2 on 条件;
    -- 方式2 Oracle独有
    select * from tab1 t1,tab2 t2 where t1.no = t1.no(+); 
    

    img

    • 右外连接

    以右表为基准,去匹配左表数据,如果匹配成功,则全部显示,匹配不成功左边部分为null

    -- 方式1
    select * from tab1 right (outer) join tab2 on 条件;
    -- 方式2 Oracle独有
    select * from tab1 t1,tab2 t2 where t1.no(+) = t1.no; 
    

    [!(img-ZVL9XlK3-1721894681792)(https://i-blog.csdnimg.cn/blog_migrate/58ced5ebf39c5b407d7cdec3b382a8b9.png)

    • 全外连接

    左外连接加上右外连接然后去重

  • 自连接

    一张表当两张表用

select * from tab t1,tab t2 where ...;
  • 层次连接

树形层次

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bug 郭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值