侧边栏壁纸
博主头像
Java与大数据 博主等级

行动起来,活在当下

  • 累计撰写 2 篇文章
  • 累计创建 3 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

初学Oracle(更新中...)

超级管理员
2021-10-31 / 0 评论 / 0 点赞 / 257 阅读 / 0 字

前言

首先,Oracle的安装在这里就不多介绍了,本文本质上算是Oracle学习过程中的一个记录,基本都是基础,也是工作中涉及Oracle的常用知识,可以说学会了以下知识就完全够资格当一个SQL boy了。当然,本人算是比较讨厌文字的,所以本文不会用过多的文字作介绍。

关于用户

Oracle安装好之后有两个默认的用户,但是一般是DBA(数据库管理员)进行管理,一般只会创建其他用户给普通员工使用,不过也还是需要了解一下用户创建等内容。

Oracle的两个默认用户:

sys 超级管理员:可以管理所有用户的所有内容

system 一般管理员:管理常用的日常操作

创建一个自己的用户 (例如 用户:zx 密码:123456)

create user zx identified by 123456;

修改某个用户的密码

alter user zx identified by 111222;

删除某个用户

drop user zx;

给用户赋予不同的权限

grant connect,resource,dba to zx;

SQL 语句:结构化的查询语言

DCL:数据控制语言(grant)

DDL:数据定义语言(create alter drop truncate)

DQL:数据查询语言(select)

DML:数据操纵语言(insert update delete)

一、表格

1 建表

create table 表格名字 (

列的名字 数据类型 约束条件 ,

列的名字 数据类型

);

例:创建一个学生表

create table student(

stuid integer, --整数

sname varchar2(12), --字符串(长度)--不定长

ssex char(3), --字符串(长度)--定长

shigh number(4,2), --小数(总长度,小数的长度)

mobile char(11),

birth date --日期

);

大文件可用数据类型(一般大于4GB) CLOB 文本的大文件(html 小说...) BLOB 二进制文件的大文件(图片 视频 音乐...)

约束条件:

primary key 主键约束,不能重复也不能为空,一表一主键,可联合主键

not null 非空约束,可以重复但是不能为空

Unique 唯一约束,可以为空但是不能重复

check(限制条件) 检查约束,限制用户的输入范围控制在规定范围内

create table student_2(
stuid integer primary key,
sname varchar2(12) not null,
ssex char(3) check(ssex='男' or ssex='女'),
shigh number(4,2) check(shigh>=1 and shigh<=3),
mobile char(11) unique,
birth date
);

2 修改表结构

新增列

alter table 表名 add 列名 数据类型 约束条件;

alter table student add parent_name varchar2(12) not null;

删除列

alter table 表名 drop column 列名;

alter table student drop column shigh;

修改列 修改的是列的数据类型

alter table 表名 modify 列名 新的数据类型 约束条件;

alter table student modify mobile number(11);

重命名列

alter table 表名 rename column 旧列名 to 新列名;

alter table student rename column mobile to phone;

表的重命名

alter table 旧表名 rename to 新表名;

alter table student rename to stu;

3 修改表中的约束条件

建表的时候,约束条件的名字是系统自动分配的,单独的操作约束条件,名字需要自己来取

新增主键约束

alter table 表名  add constraint  pk_表名_列名  primary key (列名);
alter table stu add constraint pk_stu_stuid primary key(stuid);

新增唯一约束

alter table stu add constraint uni_stu_phone unique(phone);

新增非空约束

alter table stu add constraint ck_stu_sname check(sname is not null);

新增检查约束

alter table stu add constraint ck_stu_ssex check(ssex='男' or ssex='女');

删除约束

alter table 表名 drop constraint 约束名;
alter table stu drop constraint sys_c0010405;

4 外键约束的添加

子表的数据必须来自于父表,父表的列,必须是主键

1.先需要一个父表

create table class_info(

cid integer primary key,

cname varchar2(12),

tname varchar2(12)

);

2.然后创建有外键约束的子表

create table student_3(

stuid integer primary key,

sname varchar2(12),

classid integer,

foreign key (classid) references class_info(cid)

);

在一个已经存在的表上,去添加外键约束:

alter table stu

add constraint fk_student3_classid

foreign key(classid) references class_info(cid);

删除外键的约束条件:

alter table stu drop constraint fk_student3_classid;

注意,少用外键:

1.有外键的表格,操作效率会慢;

2.外键会限制父表的操作;

DML的操作:表格内容的修改,必须要使用commit或者是rollback去提交或者回滚表格的数据。

5 插入数据

第一种句式:往表格的每一列都添加一个数据

insert into 表名 values(数据1,数据2…);
如:insert into class_info values(1001,'一年一班','李老师');

第二种句式:往表格的部分列添加数据

insert into 表名(列名1,列名2…) values(数据1,数据2…);

如:insert into class_info(class_id,cname) values(1004,'一年四班');

6 更新数据

update 表格名 set 列=新值 where 列=值;

如:update student_2 set birth=date'2012-9-19' where stuid=2;

7 删除数据

删除整个表格的所有数据:

方法1:delete from 表名;

方法2:Truncate table 表名;

删除选中的部分数据:+ where条件

delete from 表名 where 列=值;

如:delete from class_info where class_id=1002;

8 删除表

drop table 表名;

9 drop、delete、truncate三者的区别

1、drop是删除整个表的结构,包括了其中的数据。

2、delete是一个DML语句,可以回滚和提交,truncate是一个DDL语句,不能回滚和提交的。

3、delete删除数据可以添加where进行数据的筛选,truncate不能添加筛选条件。

4、delete是以行为单位进行数据的删除,truncate是以表为单位清空。

10 表格的复制

注意:不会复制原表中的约束条件

create table 新表的名字 as select * from 另一张表名;

如:create table class_2 as select *from class_info; --结构+数据

create table class_3 as select * from class_infowhere 1=2;–只复制结构

11 DQL语句:数据查询语句

11.1 数据的精确筛选

select 列,列 from emp where条件; --用条件限定行 例:查询工资为5000的员工信息

select * from emp where sal=5000;

11.2 数据的范围查询

例:查询工资小于1500的员工信息

select * from emp where sal<1500;

例:部门不等于20的员工信息

select * from emp where deptno!=20;

11.3 数据的逻辑查询

取反的时候用not,需要同时满足的用and,两者满足一个即可的用or。

例:部门不等于20的员工信息

select * from emp where not deptno=20;

select * from emp where deptno<>20;

例:查询20号部门里面,工资小于1500的员工信息

select * from emp where deptno=20 and sal<1500;

例:查询10号部门或者20号部门员工的信息

select * from emp where deptno=10 or deptno=20;

11.4 数据的模糊查询

例:查询名字中是A字母开头的所有员工信息

select * from emp where ename like 'A%';

例:查询名字中包含I字母的所有员工信息

select * from emp where ename like '%I%';

例:查询第三个字母为I的员工信息

select * from emp where ename like '__I%';

11.5 搜索NULL空值的内容

例:搜索mgr为空的信息

select * from emp where mgr is null;

例:搜索mgr不为空的信息

select * from emp where mgr is not null;

11.6 范围搜索

in:简化当前的sql语句,也可以用来做嵌套的查询

例:搜索7369 7499 7788三个员工的信息

1、select * from emp
where empno=7369 or empno=7499 or empno=7788;

2、select * from emp
where empno in (7369,7499,7788);

between ... and ... :

例:查询工资在1000到3000之间的员工信息(包含1000和3000)

1、select * from emp where sal>=1000 and sal<=3000;

2、select * from emp where sal between 1000 and 3000;

12 通配符和转义符

在Oracle中 % 表示通配符,\ 为转义符,\% 表示一个普通的字符百分号,但字符串中使用% 则需要escape来标注\为转义符:

例:查询出名字中包含%的员工信息

select * from emp where ename like '%\%%' escape '\';

% 通配符,表示在这个位置有0-N个任意的字符内容

_ 通配符,表示在这个位置有1个任意的字符内容

例:查询出名字第二个字符是 _ 的员工信息

select * from emp where ename like '_\_%' escape '\';

二、函数

1 数字类型

abs(x) 计算绝对值

select abs(-1) from dual; --输出:1

round(x, 小数精度) 四舍五入

select round(1.23456,4) from dual; --输出:1.2346

trunc(x, 小数精度) 截取数字

select trunc(1.23456,4) from dual; --输出:1.2345

ceil(x) 向上取整

select ceil(1.00000001) from dual; --输出:2

floor(x) 向下取整

select floor(1.9999999) from dual; --输出:1

power(x, 次方) 幂运算

select power(3,4) from dual; --输出:81

mod(被除数, 除数) 模运算,取余数运算

select mod(10,3) from dual; --输出:1

2 字符串类型

substr() 字符串的截取 substr(字符串, 开始位置, 连续取值长度) 字符串的截取 开始位置为负数的话,表示倒着数数 如果取值连续长度为空不写的话,就是一直取到最后

select substr('abcdefg',2,4) from dual;--输出:bcd

concat(字符串1, 字符串2) 字符串的拼接,只能拼两个字符串 可用 || 替代concat()

1、select concat(‘abc’,’123’) from emp;--输出:abc123
2、select concat(concat(‘abc’,':'), ‘123’) from emp;--输出:abc:123
3、select ‘abc’||':'|| ‘123’from emp;--输出:abc:123

length(x) 计算字符串的长度

select length(‘abcd’) from emp; --输出:4

replace(x, '旧内容', '新内容') 替换字符串的内容

select replace(‘ABCD’,'A','.') from emp; --输出:.BCD

trim() ltrim() rtrim() 去除字符串左右两边的空格

select trim('     lilei    ') from dual;--输出:lilei

lpad(字符串, 总长度, 填充符号) rpad() 进行左右两边字符的填充

select lpad(ename,6,'-') from emp;
select rpad(ename,6,'#') from emp;

3 日期类型

sysdate 获取当前系统的时间日期

select sysdate from dual;

add_months(日期, 月的数量) 月份的偏移

select add_months(sysdate,-3) from dual;

months_between(日期1, 日期2) 日期的间隔

select months_between(date'2020-09-01',date'2019-08-16') from dual;

last_day(日期) 获取最后一天

select last_day(sysdate) from dual;

获取当前时间所在月的第一天

select trunc(sysdate,'mm') from dual;

获取当前时间所在年的第一天

select trunc(sysdate,'yyyy') from dual;

4 类型转换

将时间转换成字符串 使用to_char()提取日期里面的年月日时分秒周

select to_char(sysdate,'yyyy') from dual;
select to_char(sysdate,'mm') from dual;
select to_char(sysdate,'dd') from dual;
select to_char(sysdate,'hh') from dual;
select to_char(sysdate,'mi') from dual;
select to_char(sysdate,'ss') from dual;
select to_char(sysdate,'day') from dual;

拼接出一个明天早上10点的时间出来,显示成2020/10/21 10:00:00

select concat(to_char(sysdate+1,'yyyy/mm/dd'),' 10:00:00')
from dual;

将字符串转换成时间 to_date(字符串, 时间格式)

select to_date('08-31-1986','mm-dd-yyyy') from dual;
select to_date('08-31-1986 23:59:59','mm-dd-yyyy hh24:mi:ss')  from dual;

select to_date(concat(to_char(sysdate+1,'yyyy/mm/dd'),' 10:00:00') , 'yyyy/mm/dd hh24:mi:ss') from dual;

将字符串转换成数字 to_number(x)

select to_number('123') from dual;
0

评论区