数据库之Oracle(一)

时间:2022-06-22 02:15:29

  前段时间项目中需要做数据管理和迁移的工作,于是又重新拾起了数据库,在javaEE阶段,我们对于数据库的使用仅限于DML(insert,update,delete,select)。数据库的使用也比较狭隘,只需要能够进行基本的增删改查操作就好。本文中,我将主要介绍Oracle数据库的一些基础知识以及一些常用的函数和PL/SQL。

  Oracle数据库可以说是目前世界上大型企业运用最多的数据库,它是由oracle公司自主研发的,同时也就决定了它的sql语句和其他数据库(Mysql,Sqlserver)等有一些小地方的区别,不过大体来说,很大一部分的sql语句还是遵循普遍的规则。

一 :Oracle开发管理工具

  工欲善其事,必先利其器。Java 有Eclipse,服务器有tomcat,前端有sublime,编辑器有ue,数据库也有自己的管理软件DBMS--Database Management System.DBMS分为两类:基于共享文件和(客户端(Client)—服务端(Server))。客户端主要进行的是用户与之交互的软件,例如客户选择要筛选的条件,后客户端通过网络把改请求传递给服务端,服务端处理完成后返回结果给客户端,呈现给用户。服务端则主要进行连接数据库服务器,对数据进行添加,删除,查询和修改。都是通过服务端来进行的。

在平常使用中,所有的oracle服务器都会安装一个名为Sql*Plus的命令行工具,这个客户端只会在窗口显示SQL>提示符,允许输入命令给Oracle数据库。

另外还会有Oracle SQL DEVELOPR ,在计算机上安装时只显示 SQL DEVELOPR,它支持所有的oracle中sql语句。

二:Oracle 基础知识

  在oracle数据库中,与其他数据库不同的是,存在表空间。Oracle中表空间是像其他数据库一样设置了表空间,会管理该空间内的表,表空间实质是一个虚拟的,人为的创建好以后分配给特定的用户,其他用户登陆是不能够对该表空间中的表做任何操作的。

Create tablespace name

Datafile  ”D:/Oracle/tomspace” size  1024M

Extent management local

Uniform size 5M

在分配好表空间后,我们就要开始创建表.

下面是oracle数据库的字段类型  (注意:其他数据库的int--> number)

字段类型

中文说明

限制条件

其它说明

CHAR

固定长度字符串

最大长度2000 bytes

VARCHAR2

可变长度的字符串

最大长度4000 bytes

可做索引的最大长度749

NCHAR

根据字符集而定的固定长度字符串

最大长度2000 bytes

NVARCHAR2

根据字符集而定的可变长度字符串

最大长度4000 bytes

DATE

日期(日-月-年)

DD-MM-YY(HH-MI-SS)

经过严格测试,无千虫问题

LONG

超长字符串

最大长度2G(231-1)

足够存储大部头著作

RAW

固定长度的二进制数据

最大长度2000 bytes

可存放多媒体图象声音等

LONG RAW

可变长度的二进制数据

最大长度2G

同上

BLOB

二进制数据

最大长度4G

CLOB

字符数据

最大长度4G

NCLOB

根据字符集而定的字符数据

最大长度4G

BFILE

存放在数据库外的二进制数据

最大长度4G

ROWID

数据表中记录的唯一行号

10 bytes ********.****.****格式,*为0或1

NROWID

二进制数据表中记录的唯一行号

最大长度4000 bytes

NUMBER(P,S)

数字类型

P为整数位,S为小数位

DECIMAL(P,S)

数字类型

P为整数位,S为小数位

INTEGER

整数类型

小的整数

FLOAT

浮点数类型

NUMBER(38),双精度

REAL

实数类型

NUMBER(63),精度更高

2.1 DDL(数据定义语言)

2.1.1新建表

     Create  table  tableName( name  number,列2  类型.....);(数据库中多条sql语句需要用‘;’隔开)

主键,外键,约束

在新增是一般都会有各种约束,下面简单说几种。

Name  Varchar2(45)   Primary key  ----主键

Age    number            not null       ----非空约束

Sex    char(3)        default ‘男’      ----默认’男’

Constraint tableName   primary Key(列名1,列名2,列名3...) ---联合主键

Foreigen key            ---外键

建好的表可以在相应的数据库下Tables中看到

2.1.2 删除表

Drop table tableName

2.1.3 修改表

2.1.3.1.向表中添加新字段

ALTER TABLE <table_name> ADD (字段1 类型 [NOT NULL],字段2 类型 [NOT NULL].... );

2.1.3.2 修改表中字段

  ALTER TABLE <table_name> modify(字段1 类型,字段2 类型... );

  2.1.3.3 删除表中字段

    ALTER TABLE <table_name> drop(字段1,字段2,.... );

  2.1.3.4 修改表的名称

    RENAME <table_name> to <new table_name>;

  2.1.3.5 对已经存在的表添加约束

    ALTER TABLE <table_name> ADD CONSTRAINT <constraint_name> 约束类型 (针对的字段名);

    示例:

    Alter table emp add constraint S_F Foreign key (deptno) references dept(deptno);

  2.1.3.6 对表里的约束禁用;

    ALTER TABLE <table_name> DISABLE CONSTRAINT <constraint_name>;

  2.1.3.7 对表里的约束重新启用;

    ALTER TABLE <table_name> ENABLE CONSTRAINT <constraint_name>;

  2.1.3.8 删除表中约束

    ALTER TABLE <table_name> DROP CONSTRAINT <constraint_name>;

    示例:

    ALTER TABLE emp drop CONSTRAINT <Primary key>;

2.2 DML(数据操作语言)

  2.2.1 插入数据

    Insert into  tableName  values(值1,值2,值3.....)

  2.2.2 修改数据

    Update  tableName  set name=’王五’  where age=28

    修改是需要添加Where 查询条件,否则整个表中数据都会被修改

  2.2.3 删除数据

    在删除的时候 有delete 和truncate两种,delete 删除时一般不需要遵从外键约束,而truncate删除时更加彻底,会收到外键约束。

    Delete from  tableName

    Truncate  tableName

  2.2.4 查询数据

    Select name from users

    带别名的查询语句

    Select s.name from users s 表别名不能够添加 as

    Select name (as) a ,age b from users    -->查询出的结果显示的列名分别是 a,b 对于(as)可以省略

    需要注意的是在oracle自带的DBMS中查询语句不能够对表别名添加AS

2.3 序列(例如id自增长)

    在oracle数据库中,列值自动增长需要使用到序列(Sequence).

    Create Sequence sequence_name

    Start with number                          ----初始值

    Increment by number                       ----每次增加的值

    MaxValue  number/NoMaxValue           ----最大值/默认无最大值

    MinValue  number/NoMinValue            ----最小值/默认无最小值

    Cycle/NoCycle                         ----表示达到最大值/最小值后(重新开始/不重新开始,会报错)

    CACHE/NoCACHE                    ----会生成序列号

    在生成序列之后,在添加中可以

    Insert into tableName values(sequence_name.nextval,name,age,sex....)

    可以使用nextval 或currval 两个”伪列”来获取下一个值和当前值。

    Alter sequence  时     1.初始值是不能去修改的;

          2.最大值不能小于当前值,最小值不能大于当前值;

2.4 高级查询

    在实际开发中,对于数据的检索我们使用的时候需要各种各样的条件去限制。

  2.4.1  Where 过滤查询,带条件查询时必须有Where关键字

描述

Sql语句

查询年龄在25 的用户姓名

select  name from users where age=’25’

查询年龄25,性别男的用户姓名

select  name from users where age=’25’ and sex=’男’

   2.4.2  Between, and , or,in,not in运算符查询

 

描述

Sql语句

查询年龄在20-25 之间的用户姓名

Select name from users where age Between(20,25)

Select name from users where age>=20 and age<= 25

Select name from users where age in(20,25)

查询年龄不在20-25之间的用户姓名

Select name from users where age<20 or age>25

Select name from users where age not in (20.25)

  2.4.3  Group By 分组

描述

Sql语句

会通过不同的年龄去分组表中数据,最后得到的一个年龄只有一条数据,显示的数据是id靠前的

Select name from users gruop by age

  2.4.4  Having 过滤分组

描述

Sql语句

显示以年龄分组后数量大于2的用户姓名

Select name,count(*) from users group by age having count(*)>2

   2.4.5  Count() 计算总记录数

描述

Sql语句

查询所有users 表中的记录总数(包括Null)

Select count(*)  from users

查询所有users表中列名不为NUll的记录总数

Select count(列名)  from users

 

   2.4.6  Order By 排序 (asc升序,desc 降序 不写默认升序)

描述

Sql语句

按年龄查找用户姓名,按升序排列)

Select name from users order by age asc

按年龄查找用户姓名,按降序排列

Select name from users order by age desc

  2.4.7  Like 模糊查询 (“_” ,”%”的使用区别)

      使用模糊查询的地方很多,比如百度的搜索框应该就是模糊查询,模糊查询可以更有效的,更全面的搜索到相应的信息。

描述

Sql语句

会查出例如”王阳/李阳”这样的用户年龄 “_”代表前面只有一个字符

Select age from users where name like ’_阳’

会查出名字中最后一个字是阳的用户,例如”李海阳,李阳”

“%”代表任意字符,任意长度

Select age from users where name like ’%阳’

会查出名字中带有字阳的用户,例如”李海阳,李阳光”,”阳光”

Select age from users where name like ’%阳%’ -->

三、常用函数

    函数的使用在数据库中是十分常见的,函数的存在方便了我们对数据做所需要的处理,更加规范,安全的得到想要的数据。

    字符函数

名称

描述

CONCAT(字符串1,字符串2)

将字符串1和字符串2连接成一个新的字符串
示例: select CONCAT(job,ename) from emp

LPAD(字段,总的大小,添充字符)

左填充即向右对齐
示例: select empno,lpad(sal,10,'*') from emp

RPAD(字段,总的大小,添充字符)

右填充即向左对齐
示例: select empno,rpad(sal,10) from emp

LOWER(字符串)

将字符串全部变成小写;

UPPER(字符串)

将字符串全部变成大写;

INITCAP(字符串)

将字符串变成第一个字母大写,其余都变成小写;

LENGTH(字符串)

求出字符串的长度;

SUBSTR(字符串,开始位置,长度)

从字符串中取子串;
示例: select substr(ename,2,3) from emp;--从ename的第2位开始取3位

INSTR(字符串,字符)

查看字符是否在字符串中存在;不存在返回0;存在则返回字符所在的的位置;如果有两个以上的字符则返回第一个的位置.
示例:select instr(ename,'S') from emp;

TRIM(字符 FROM 字符串)

去掉字符串首尾的字符;
示例: select trim('S' from ename) from emp;

TO_CHAR()

将不是其他类型转成字符类型;
对于日期型可以控制其格式:TO_CHAR(日期,'格式');
其中格式有: 'YYYY' --以4为显示年;
'YEAR' --以标准格式显示年; 'MM' ; 'MON' ; 'DD' ; 'DAY'; 'HH'
; 'MI' ;'SS'

REPLACE(字符串,字符串1,字符串2)

将字符串中的字符1替换成字符2;
示例: select replace(ename,'SC','SS') from emp;

TRANSLATE(字符串,字符串1,字符串2)

替换多的字符;
示例: select translate(ename,'SH','AB') from emp;
--表示将ename中的'S'换成'A','H'换成'B';

ASCII(char)

求字符的ascii码

NLSSORT(字符串)

对字符串排序.

    数学函数

名称

描述

ABS(数字)

一个数的绝对值

CEIL(数字)

向上取整;不论小数后的书为多少都要向前进位;
CEIL(123.01)=124;
CEIL(-123.99)=-123;

FLOOR(数字)

向下取整;不论小数后的书为多少都删除;|
floor(123.99)=123;
floor(-123.01)=-124;

MOD(被除数,除数)

取余数;
MOD(20,3)=2

ROUND(数字,从第几为开始取)

四舍五入;
ROUND(123.5,0)=124;
ROUND(-123.5,0)=-124;
ROUND(123.5,-2)=100;
ROUND(-123.5,-2)=-100;

SIGN(数字)

判断是正数还是负数;正数返回1,负数返回-1,0返回0;

SQRT(数字)

对数字开方;

POWER(m,n)

求m的n次方;

TRUNC(数字,从第几位开始)

切数字;
TRUNC(123.99,1)=123.9
TRUNC(-123.99,1)=-123.9
TRUNC(123.99,-1)=120
TRUNC(-123.99,-1)=-120
TRUNC(123.99)=123

GREATEST(数字列表)

找出数字列表中最大的数;
示例:
select greatest(100,200,-100) from dual; --结果为200

LEAST(数字列表)

找出数字列表中最小的数;

SIN(n)

求n的正旋

COS(n)

求n的余旋

TAN(n)

求n的正切

ACos(n)

求n的反正切

ATAN(n)

求n的反正切

exp(n)

求n的指数

LN(n)

求n的自然对数,n必须大于0

LOG(m,n)

求n以m为底的对数,m和n为正数,且m不能为0

    日期函数

名称

描述

ADD_MONTHS(日期,数字)

在以有的日期上加一定的月份;
示例:
select add_months(hiredate,20),hiredate from emp;

LAST_DAY(日期)

求出该日期的最后一天.

MONTHS_BETWEEN(日期1,日期2)

求出两个月之间的天树(注意返回的天数为小数);
示例:
select months_between(sysdate,hiredate) from emp;

NEW_TIME(时间,时区,'gmt')

按照时区设定时间.

NEXT_DAY(d,char)

返回d指定的日期之后并满足char指定条件的第一个日期

    其他函数

名称

描述

VSIZE(类型)

求出数据类型的大小;

NVL(字符串,替换字符)

如果字符串为空则替换,否则不替换