Oracle数据库的练习

1.概述

数据库database
存取数据
txt,excel
优点:书存储量大,存取方便,易于管理,安全性高
数据库的分类:
oracle中大型数据
sql server
mysql
中小型数据库
开源免费
用于集群部署
db2:
处理海量的数据
mongodb
非关系型数据库
oracle版本
12c
11g
10g
grid网格技术
XE:10g简化的版本
服务端和客户端
CS,BS
客户端:sql plus
pl sql developer
浏览器
java程序jdbc
服务端
server
DBMS:数据库管理系统
内存
自动配置一个数据库实例
ORCL
自动配置一个数据库的实例
ORCL
db文件存放在硬盘里面
端口号:
oracle:1521
mysql:3306
2.常用指令
连接切换账户:

conn system

显式当前的账户
show user;
用户级别:
SYS
系统管理员,维护数据库的基本的信息
登录的dba的身份
SYSTEM:
普通管理
管理普通用户,设置普通用户的权限
可以使用normal身份,也可以使用dba身份
dba身份,normal身份
SCOTT:普通
更新用户密码

alter user system indetified by system;

查看当前数据库的信息

select * from v$database;

查看当前数据库下的用户

select * from dba_users;

创建用户

 create user c##zhangsan identified by zhangsan;

在12C版本中,新创建用户要求加C##’
授权回收用户

grant create session to c##zhangsan;

授权和回收用户:

grant create session to c##zhangsan;
revoke create session from c##zhangsan;

授予和回收角色

grant resource to c##zhangsan;
revoke resource from c##zhangsan;

锁定账户
alter user c##lisi account lock;

解锁用户
alter user c##lisi account unlock;
alter user c##lisi account unlock;
常见的表的指令
表:数据管理的最基本的逻辑单元
列:column字段
行:row记录(数据)
创建表

create table stu(id number(3),name varchar2(5),sex char(1),addr varchar2(5))

查看表的结构:

desc stu;

添加数据

insert into stu values(101,'tom','m','即');

查询数据

select * from stu;

更新数据

update stu set sex='f' where id=101;

删除数据
delete from stu where id=101;
CRUD:增加,删除改查
查看当前用户下的表
select * from user_tables;

3.数据类型

data type
强数据类型
字符串:
char(size)
定长,
不会自动回收
size:1-2000字节
varchar2(size)
变长
DBMS在合适的时机回收剩余的字节空间
size:1-4000个字节

create table stu2(name varchar2(30),sex char(1),pid char(18),addr varchar2(100))

编解码:
查看数据库的编码格式
select userenv(‘language’) from dual;
–dual虚表:
编译:
字符-》字节码
UTF-8:1个中文占用3个字节
解码:字节码-》字符
解码:字节码-》字符
编译:字符-》字节码
编译:字符-》字节码
解码:字节码-》字符
解码:字节码-》字符
GBK:一个中文占用2个字节
UTF-8:一个中文占用3个字节
nchar(size)
size:代表字符长度
create table t4(name nchar(5));
long最多放2G字节
clob最多放4G字节
数值类型:
number(p,s)
number§
不超过p位的整数,小数位,四舍五入
number(p,s)
p>s>0
整数位:不超过p-s位
小数位s位
超过四舍五入
不足的时候用0补齐
s<0<p
整数位:不超过p-s位
对小数点左侧的s位清零(四舍五入)
小数位:
没有小数位,直接清零
number整数小数自适应
较少使用用
numeric(size)
等用number(size)
int帧数
日期date

SQL> select sysdate from dual;

SYSDATE
-----------
2020/12/22

SQL> insert into t3 values(to_date('1999-09-09','yyyy-mm-dd'));
insert into t3 values(to_date('1999-09-09','yyyy-mm-dd'))

ORA-00942: 表或视图不存在

SQL> select to_char(birthday,'yyyy-mm-dd') from t3;
select to_char(birthday,'yyyy-mm-dd') from t3

ORA-00942: 表或视图不存在

SQL> select to_char(birthday,'yyyy-mm-dd hh:mi:ss') from t3;
select to_char(birthday,'yyyy-mm-dd hh:mi:ss') from t3

ORA-00942: 表或视图不存在

二进制数据(图片,影音)
raw(size)
size:2000字节
long raw
blob

P4-SQL语法

SQL:结构化查询语言
structured query language
DCL数据控制语句
用户相关的指令
DDL:数据定义对表的结构的操作
DML:数据操作语句
对记录(数据)的操作(增删改)
DQL:数据查询语句占用DBMA7成以上的事件
TCL:事物操作
DDL:
创建表

SQL> create table emp(
  2  id number(5),
  3  name varchar2(60),
  4  sex char(1),
  5  birthday date,
  6  photo varchar2(100),
  7  salary number(7,2));

修改表:
添加字段


SQL> alter table emp add(dept varchar2(30));

修改字段的类型

SQL> alter table emp modify department varchar2(60);

删除字段

alter table emp drop column photo;

数据会一起丢失
重命名表

rename emp to employee;

删除表;

drop table employee;

DML:
添加记录:

 insert into emp(id,name,sex) values(101,'zhangsan','f');
insert into emp values(101,'zhangsan','f',null,null,null);

修改记录:

update emp set birthday=to_date('1999-09-07','yyyy-mm-dd');
update emp set sex='m',id=102;
update emp set sex='f',id=103 where photo='abc.jpg'

删除记录

delete from emp;
delete from emp where id=102;

DQL
脚本:
创建表:

create table stus(
id number(5),
name varchar2(30),
sex char(1),
score number(5,2)
,
birthday date
)

插入数据

insert into stus values(101,'tom','m',560,to_date('1998-6-15','yyyy-mm-dd'));
insert into stus values(102,'mary','f',660,to_date('1999-6-15','yyyy-mm-dd'));
insert into stus values(103,'张三','m',760,to_date('1998-7-15','yyyy-mm-dd'));
insert into stus(id,name)values(104,'李四');

insert into stus(id,name) values(105,‘王五’);
基本的查询

select * from stus;
select name,score from stus;
select name,stus.* from stus;

whre条件查询
比较运算n

select * from stus where sex='f';

先执行where语句,再执行查询
其他比较运算符:>,<,>=,<=,!=’
null值不参与比较运算
null的值的比较

select * from stus where sex is null;
select * from stus where sex is not null;

逻辑运算
注入漏洞

select * from users where userName=''and password=''or '1'='1'
select * from stus where score between 560 and 660;闭区间

算数运算,加减乘除

select * from stus where id=101+1;
select * score+10 from stus where id=101;

关键字:
in

select * from stus where id in(101,103,107);

like模糊查询

select * from stus where name like '张%';--转义:%代表0个或者多个字符

distinct过滤重复数据

select distinct sex from stus;

as列的别名

select score*1.1 as ns from stus;

排序查询

select * from stus order by id;
select * from stus order by id asc;
select * from stus order by score desc;
select * from stus order by birthday asc;
--日期类型的排序
select * from stus order by sex,birthday dsec;
--多列排序
select * from stus where score is not null order by score desc;
--where语句和排序的一起使用
分组查询:
select sex,max(score),min(score),sum(score),avg(score) from stus group by sex;
--聚合函数(分组函数)
select count(*) from stus;
--查询记录的条数
select id,avg(score) from stus group by id having avg(score)>=600;

分组后的过滤,having
分页查询:select temp.* fromselect rownum as rn,stus. from stus) temp where rn》=3 and rn<=4;
实现分页的思路::把stus表当中隐藏列rownum转换称为一个临时表的普通列,进行比较运算
rownum不能使用>运算
分页算法:
pageSize*(pageNum-1)+1,pageSzie*pageNum

select temp.* from*select rownum as rn,t.* from*select * from stus wherescore is not nunll order by id desc)t) temp where rn=3 and rn<=4;
select id,avg(score) from stus griup by id having avg(score)is not null order by avg(score)desc;

根据id分组,过滤掉平均成绩为null,剩余的按照成绩降序排序
嵌套查询(子查询)

select * from stus where score=(select max(score) from stus);

单行子查询(单行单列)
合并查询
合并后的数据会自动过滤重复的值

select id from stus union select id from cla;

并集

select cid from stus intersect select id from cla;

交集

select id from stus minus select id from cla;

差集
transaction事务tx
一组DML语句(增删改)
commt:提交告知DBMS根据指令,修改的数据文件
rollback:回退回到上次提交的时间点
事务处理:一组DML语句,同时完成(一起提交),或者同时不完成(已经完成的指令要回退)
多表查询

create table cla(id number(3),name varchar2(30));
insert into cla values(1,'计算机1班');
insert into cla values(2,'计算机2班')

完全连接(笛卡尔积)

select * from stus cross join cla;
select * from stus,cla;

内连接

select * from stus inner join cla on stus.cid=cla.id;

猜你喜欢

转载自blog.csdn.net/weixin_43428283/article/details/111564583
今日推荐