oracle日常训练

打印表种所有数据

select * from T_GIRL;

创建一个表

create table 表名
(
  字段名1 数据类型 null,
  字段名2 数据类型 not null,
  ......,
  字段名n 数据类型 null
);

create table T_GIRL
(
  id        char(4)         not null,   -- 编号
  name      varchar2(30)    not null,   -- 姓名
  yz        varchar2(20)        null,   -- 颜值
  sc        varchar2(20)        null,   -- 身材
  weight    number(4,1)     not null,   -- 体重,单位:kg
  height    number(3)       not null,   -- 身高,单位:cm
  birthday  date            not null,   -- 出生时间,可精确到秒。
  memo      varchar2(1000)      null    -- 备注
);

插入数据

insert into wjx (ID,name) values ('1111','qqqq');
insert into wjx (ID,name) values ('2222','wwww');
insert into wjx (ID,name) values ('3333','eeee');
insert into wjx (ID,name) values ('4444','rrrr');

查询数据

where是查找表中的某个字段,from是查看某个表

select ID,name from wjx where ID=1111 and name='qqqq';

修改数据

update wjx set ID='7531',name='快快' where name='qqqq'

删除数据

delete from wjx where name='快快'

删除表

drop table wjx

设置主键

方法一:

alter table wjx add constraint PK primary key(ID)

方法二:

在定义表的时候就直接指定主键

create table wjx
(
 ID char(4) null ,--身份证
 name varchar(30) null,--姓名
 primary key(id)    -- 指定id为表的主键
)

Oracle事务

假设有A,B两个用户,每个用户账户上有1万元,现在A给B转了1千元,那么此时A就只有9000元,B就有11000元。

执行逻辑如下:

create table affairs

( ID char(1) null, --身份

Money number(10,1) null --账户

)

alter table affairs add constraint my_id primary key(ID)

insert into affairs (ID,money)values('B',10000);

insert into affairs (ID,money)values('A',10000);

先创建事务表 affairs,然后添加数据,设置主键

打印内容

select *from affairs

模拟A转给B

update affairs set Money=Money-1000 where ID='A'

这个时候A就只有9千了,

但是再开一个窗口,从另一个进程看,值还是没有变化

因为前一个进程没有提交修改,若要提交则输入commit

提交后,则在第二个进程里面可以看到此时的数据已经更新。

使用rollback返回上一步操作

但是如果使用commit提交后就没用了。

此时是9千

减去1000

使用rollback返回上一步

关于Oracle的事务只学习这些

虚表

虚表目前只需要执行两个功能:只会用到两个代码

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')from dual //获取数据库的日期时间
select user from dual //查看当前登录用户。

序列

序列生成器简称序列

创建一个简单的序列:

create sequence 序列名
       [minvalue n]
       [maxvalue n]
       [increment by n]
       [start with n]
       [cache n|nocache]
       [order|noorder]
       [cycle|nocycle];

create sequence SEQ_GIRL; 
//创建一个简单的序列

使用序列的方法有两种:

第一:使用虚表显示

select SEQ_GIRL.nextval from dual; -- 获取序列SEQ_GIRL的下一个值。

select SEQ_GIRL.currval from dual; -- 获取序列SEQ_GIRL的当前值。

在新的会话中,必须先使用nextval来产生一个值后才可以使用currval进行查看。产生的值默认为1

第二:使用SQL语句实现

先定义一个表

//定义一个表
create table T_GIRL
(
  name    varchar2(10),     -- 姓名
  keyid   number(10)        -- 记录编号
);


//插入数据
insert into T_GIRL2(name,keyid) values('西施'  ,SEQ_GIRL.nextval);
insert into T_GIRL2(name,keyid) values('妲已'  ,SEQ_GIRL.nextval);
insert into T_GIRL2(name,keyid) values('杨玉环',SEQ_GIRL.nextval);
insert into T_GIRL2(name,keyid) values('李师师',SEQ_GIRL.nextval);

//显示数据
select* from t_girl2

可以发现使用SEQ_GIRL.nextval虚表打印后,每次的序号都不需要手动制定了,自动按照1,2,3,4......排序,但是序号是不可逆的,就算此时把表删掉,这些已经累计的值还是会保留,回滚也无效

序列裂缝:就是序列不连续

伪列

rowid:表的每一行数据都有一个地址,在每一行数据的头部,Oracle就是通过rowid来实现访问数据的。一句话:rowid存放的是行码的物理地址

索引

索引相当于就是表的目录,通过索引可以快速查找目标内容,就不需要再轮询查询了,查找步骤是:先通过索引,找到目标的一些rowid伪列号,然后通过伪列号找到具体一行数据

创建索引:

create index 索引名 on 表名(字段名1,字段名2,......,字段名n);

create index IDX_GIRL_1 on T_GIRL(name)

唯一索引法可以使用折半查询法,而且主键也是唯一索引

删除索引

当把表删除后,索引也会自动删除,也可以手动删除索引

drop index 索引名字

索引的使用

使用字段时,如果表达式左边的字段是表达式,那么就不会使用索引,如果只有字段,才会使用索引。

where\order by和distinct

where子句

oracle里面没有=和==的区分,而且只有=,=表示相等

这句是对的,返回的是单行子集

select empno,ename,job,sal from EMP

where deptno=(select deptno from DEPT where dname='ACCOUNTING');

这句是错的,返回的是多行子集

select empno,ename,job,sal from EMP

where deptno=(select deptno from DEPT);

但是这行是对的,虽然返回多行子集,但是使用了关键字in

select empno,ename,job,sal from EMP

where deptno in (select deptno from DEPT);

order by子句

就是将数据按照指定规则排列

asc是从上到下逐渐变大增序

desc是从上到下逐渐变小降序

可以有多种排序方式,类似于excel里面的排序,以下就是先按照体重升序排列,然后再按照升高降序排列(相同情况触发)

select *from t_girl order by weight asc ,height desc

distinct

就是筛选出重复项

原本有很多重复的

但是使用distinct后就没有了

表达式运算

在SQL语句中,只要有字段出现的地方都可以用表达式,比如在语句里面使用加减法,或者是添加字符串

比如要在名字前面加一个姓名:,那就使用单引号包括住姓名,然后用||表示拼接

或者直接运算

拼接单引号

同时运行两行数据要加分号

Oracle函数

时间函数

就是to_char和to_date

nvl函数

nvl(x,value)如果x为空,就返回value,否则返回x

select nvl(name,'绝世美女'),nvl(age,22) from tt;

表示如果轮循到name是空的,则就添上绝世美女,如果age是空的,则显示22,

在插入值时,可以用null表示空

decode函数

就是一个if-else

decode(字段,1,返回值1,2,返回值2,3,返回值3,4,返回值4,缺省值)

相当于是if(字段=1)return  返回值1 else

if(字段=2)return  返回值2 else

if(字段=3)return  返回值3 else
......
retutrn 缺省值

create table tt(name varchar2(20),
                yz number(1),
                sc number(1));
insert into tt values('西施',1,1);
insert into tt values('东施',2,2);
insert into tt values('北施',3,3);
insert into tt values('南施',4,4);
insert into tt values('中施',5,5);
select * from tt;
select name,decode(yz,1,'绝世',2,'盛世',3,'花容',4,'香花','赞'),decode(sc,1,'绝',2,'妙',3,'巧',4,'好','赞') from tt;

userenv

select user,sysdate,userenv('isdba'),userenv('language'), userenv('lang'), userenv('sid') from dual;

用来实现获取当前指定信息,比如此时的用户,此时的时间,此时的语言

聚合函数

就是很多小函数的集合

|-----------|---------|---|
| min(字段) | 最小值 | |
| max(字段) | 最大值 | |
| avg(字段) | 平均值 | |
| sum(字段) | 求和 | |
| count(*) | 就记录多少数目 | |

select min(yz),max(yz),avg(yz),count(*),sum(yz) from tt

除了count(*)会考虑null的数据外,其余函数都不会考虑null的数据

分组函数

就是excel里面的多级筛选,指定哪些要显示,哪些不显示,指定要显示的范围

select deptno,job,min(sal),max(sal),avg(sal),sum(sal),count(*) from EMP 
where deptno in(10,30) 
group by deptno,job 
order by deptno,job;

select *from EMP

而且,只要在函数SQL里面使用了上面的聚合函数,要么就只使用这些函数不显示其他字段,不然系统就会默认这个函数是分组函数,那么就必须在后面加上group by+前面指定显示的字段

having子句

和where子句很像,where是设置从表中获取数据,having是对统计的结果进程过滤

where子句不能使用分组函数,如以下就会报错,是用来>

where deptno in(10,20) and avg(deptno)>10

而having 子句可以使用分组函数,就是><=,只有>=10的数才能通过筛选,还有,having子句要放在分组函数的后面,排序函数的前面

select job,deptno,max(deptno),min(deptno),avg(deptno) from EMP

where deptno in(10,20)

group by job,deptno

having avg(deptno)>=10

order by deptno asc

外键和主键

主键和外键其实没有多大关系,主键是信息的行信息的唯一标识,外键是一种限制。

外键只有和主表、从表一起说才有关系。从表受限制于主表,从表里面的某一个字段取值受限制于主表里面的某一个字段。

构建主从表关系如下:

完成后,从表字段只能取主表字段

删除外键

alter table 从表 drop constraint 外键名;

类似于excel里面的数据验证

别名

相当于在显示的时候换一个列名字

未使用别名

select id ,name ,yz ,sc ,weight ,height ,birthday from t_girl;

使用别名

select id 编号,name 姓名,yz 颜值,sc 身材,weight 体重,height 身高,birthday 出生日期 from t_girl

如果别名中有特殊字符,则用双冒号引用

别名可以用在order by语句中,但是不能用在where中

子查询

就是在select语句中再次调用select语句,实现多重查询。

单行查询

一般要使用到表名限定,就是在字段前面加一个表明.字段名

where使用子查询

就是之前的in ()

使用子查询整表赋值

在insert里面使用select,然后赋值整个表

create table TT(id char(4),name varchar2(20));
insert into tt select id,name from t_girl
select *from tt

在创建表的时候直接赋值

但这只有基本的结构,没有主键,没有索引,没有表约束,没有列约束

子查询很强大,就是excel里面的index和match

表空间

第一:SYSTEM表空间

用于存放数据库的内部字典,在创建数据库时最先被创建,相当于电脑的C盘,对于数据库生死攸关。

第二:SYSAUX是辅助表空间,用于存储数据除了字典以外的其他数据对象,一定程度上减少了表空间负荷

第三:回滚表空间,

TEMP表空间

存放临时数据

USERS表空间

非DBA用户的默认空间

同义词

查看所有表

select*from tab
create sysnonym tab for tt

将表bb取个别名叫tt,可以直接用tt调用tab表

删除同义词

自定义函数

没什么用,但是如果被问到细节就按如下回答

注意

C++不能区分0和空,但是Oracle能区分0和空

如果出现资源正在忙,那就运行commit,提交任务,然后删除表即可。

相关推荐
hummhumm12 分钟前
Oracle 第29章:Oracle数据库未来展望
java·开发语言·数据库·python·sql·oracle·database
gavin_gxh37 分钟前
ORACLE 删除archivelog日志
数据库·oracle
一叶飘零_sweeeet40 分钟前
MongoDB 基础与应用
数据库·mongodb
猿小喵1 小时前
DBA之路,始于足下
数据库·dba
tyler_download1 小时前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
weixin_449310842 小时前
高效集成:聚水潭采购数据同步到MySQL
android·数据库·mysql
Cachel wood2 小时前
Github配置ssh key原理及操作步骤
运维·开发语言·数据库·windows·postgresql·ssh·github
standxy2 小时前
如何将钉钉新收款单数据高效集成到MySQL
数据库·mysql·钉钉
汪小敏同学2 小时前
【Django进阶】django-rest-framework中文文档——快速入门
网络·windows·oracle
Narutolxy4 小时前
MySQL 权限困境:从权限丢失到权限重生的完整解决方案20241108
数据库·mysql