前段时间项目中需要做数据管理和迁移的工作,于是又重新拾起了数据库,在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(字符串,替换字符) |
如果字符串为空则替换,否则不替换 |