一、Oracle数据库中的数据类型
1.1、关于mysql数据库中的数据类型
* int 整数型
* bigint 长整型
* float 单精度浮点型
* double 双精度浮点型
* char 字符型【长度不可变】
* varchar 字符型【长度可变】
* date 日期类型
* blob 二进制大对象【Binary Large OBject, 存储图片、声音、视频...】
* clob 字符大对象【Character Large OBject,可以存储4G+的字符串】
1.2、关于oracle数据库中的数据类型
* number
-number(3) 整数型:3表示长度,最大值是999
- number(3,2) 浮点型:3是有效数字的个数,2是小数位的个数
- 案例:
create table t_product(
price number(3,2)
);
insert into t_product(price) values(10); //ORA-01438: 值大于为此列指定的允许精度
insert into t_product(price) values(1); //可以
insert into t_product(price) values(1.2356); //可以
* char 字符型【长度不可变】
* varchar2 字符型【长度可变】
* date 日期类型
* blob 二进制大对象【Binary Large OBject,存储图片、声音、视频...】
* clob 字符大对象【Character Large OBject,可以存储4G+的字符串】
1.3、关于blob类型:
create table t_movie(
id number(10) primary key,
name varchar2(32),
image blob
);
当一张表中的某个字段的数据类型是blob的时候,该字段插入数据的时候不能使用insert语句,
insert语法无法完成,必须使用编程语言中提供的IO流来完成插入操作。
1.4、char和varchar的区别
* char是定长字符串
* varchar是可变长度字符串
* 假设在建表的时候,给name字段设置的数据类型是char(10),将来向这个name字段中插入"jack"的时候,
底层实际上存储的是:“jack+6个空格"。使用不恰当的时候会浪费存储空间。
* 假设在建表的时候,给name字段设置的数据类型是varchar(10),将来向这个name字段中插入"jack"的时候,
底层实际上存储的是:“jack"。它会根据数据的实际长度进行空间的分配。
* char和varchar怎么选择使用?
- 当某个字段中存储的数据长度是不变的,例如:性别、生日这样的字段还是采用char类型来定义,
效率高,也不会浪费空间。
- 当这个字段的长度不固定的时候,例如,这个字段是用来存储一个人的简介的时候,建议采用varchar类型。
1.5.varchar和varchar2的区别
* varchar是SQL语句当中的标准,所有的数据库都支持。
* varchar2是varchar第二代,是Oracle数据库中特有的,其它数据库中没有。
* varchar采用一个字节编码
* varchar2采用两个字节编码,所以varchar2可以容纳更多国家的语言。varchar2的容量较大。
* 在实际开发中尽量使用标准,使用varchar,即使在程序中使用了varchar,到Oracle数据库中也会自动变成varchar2
二、数据处理函数
2.1什么是单行函数?
一个输入最终对应一个输出,这种函数不会一次处理多行,一行一行进行处理。
2.2常用的单行函数
* lower
- SQL> select lower(ename) as ename from emp;
ENAME
--------------------
smith
allen
ward
jones
martin
blake
clark
king
turner
james
ford
miller
以上由大写变成小写是查询结果集变成小写了。数据库表没有变,因为这只是一个DQL语句。
- 需求:找出员工smith的薪水,前提是不知道数据库表中存储的是大写的SMITH,还是小写的smith,
也有可能是大小写混合的Smith。
SQL> select ename,sal from emp where lower(ename) = 'smith';
ENAME SAL
-------------------- ----------
SMITH 800
* upper
SQL> select ename,sal from emp where upper(ename) = 'SMITH';
ENAME SAL
-------------------- ----------
SMITH 800
SQL> select lower('ABC') as ename from dual;
ENAME
------
abc
SQL> select upper('abc') as ename from dual;
ENAME
------
ABC
* substr
- SQL> select substr('abcdef',3,2) as ename from dual;
ENAM
----
cd
- 找出员工名字中第二个字母是A的
* 模糊查询
select ename from emp where ename like '_A%';
ENAME
---------
WARD
MARTIN
JAMES
* select ename from emp where substr(ename,2,1) = 'A';
ENAME
----------
WARD
MARTIN
JAMES
* length
SQL> select length('abc') as namelength from dual;
NAMELENGTH
----------
3
* trim
SQL> select trim(' a b c ') as ename from dual;
ENAME
--------------
a b c
SQL> select length(trim(' a b c ')) as enamelength from dual;
ENAMELENGTH
-----------
7
* concat
SQL> select concat('abc','def') as ename from dual;
ENAME
------------
abcdef
* ||
SQL> select 'abc'||'def'||'xx' as ename from dual;
ENAME
----------------
abcdefxx
* nvl
- 在mysql数据库当中是ifnull,在Oracle数据库当中是nvl
- 什么时候使用空值处理函数呢?
* 只要有空值参与的数学运算需要提前进行空值处理。要不然最终结果就是空。
- 计算年薪:
select ename,(sal + comm) * 12 as yearsal from emp;
ENAME YEARSAL
-------------------- ----------
SMITH
ALLEN 22800
WARD 21000
JONES
MARTIN 31800
BLAKE
CLARK
KING
TURNER 18000
JAMES
FORD
MILLER
select ename,(sal + nvl(comm,0)) * 12 as yearsal from emp;
ENAME YEARSAL
-------------------- ----------
SMITH 9600
ALLEN 22800
WARD 21000
JONES 35700
MARTIN 31800
BLAKE 34200
CLARK 29400
KING 60000
TURNER 18000
JAMES 11400
FORD 36000
MILLER 15600
* case..when..then..when..then..else..end
select
ename,sal,(case job when 'MANAGER' then sal * 1.1 when 'SALESMAN' then sal * 1.5 else sal end)newsal
from
emp;
ENAME SAL NEWSAL
-------------------- ---------- ----------
SMITH 800 800
ALLEN 1600 2400
WARD 1250 1875
JONES 2975 3272.5
MARTIN 1250 1875
BLAKE 2850 3135
CLARK 2450 2695
KING 5000 5000
TURNER 1500 2250
JAMES 950 950
FORD 3000 3000
MILLER 1300 1300
* decode【Oracle中特有的,和以上的case可以达到同等效果】
select
ename,sal,decode(job,'MANAGER',sal * 1.1,'SALESMAN',sal * 1.5,sal) newsal
from
emp;
这种方式别人写能看懂就行,不要求自己掌握。可读性差。
* round
SQL> select round(123.456) as result from dual;
RESULT
----------
123
SQL> select round(123.456,1) as result from dual;
RESULT
----------
123.5
SQL> select round(123.456,2) as result from dual;
RESULT
----------
123.46
SQL> select round(123.456,0) as result from dual;
RESULT
----------
123
SQL> select round(123.456,-1) as result from dual;
RESULT
----------
120
* to_date
1、to_date函数的作用:将varchar类型转换成date类型
2、to_date函数的最终运算结果类型是:DATE类型
3、to_date函数的语法格式:to_date('字符串日期','日期格式')
4、关于日期格式:
* 回顾java中的日期格式:
yyyy-MM-dd HH:mm:ss SSS【全日期格式】
* 回顾java中:java.lang.String-->java.util.Date怎么转换?
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date time = sdf.parse("1980-10-11");
* Oracle数据库中的日期格式:
YYYY 年
MM/MON 月【假设月份是七月份,MM表示的话:07,MON表示的话:7月】
DD 日
HH 时
MI 分
SS 秒
* Oracle数据库默认的日期格式是:DD-MON-YY
5、to_date函数的使用案例:
* 创建一张学生表,学生有生日,生日用日期类型
-删除学生表
SQL> drop table t_student; //Oracle和MySQL都支持
SQL> drop table if exists t_student; //Oracle不支持,MySQL支持
-创建表的DDL:
create table t_student(
name varchar(32),
birth date
);
* 向t_student表中插入数据
//错误:'1980-10-11'日期字符串和Oracle默认的日期格式不同,而且'1980-10-11'是字符串类型,类型不匹配。
insert into t_student(name,birth) values('jack','1980-10-11');
//可以:birth是date类型,'11-10月-80'这个字符串日期正好和Oracle数据库默认的日期格式相同
//存在类型自动转换
insert into t_student(name,birth) values('jack','11-10月-80');
//可以:以下使用了手动转换
insert into t_student(name,birth) values('jack',to_date('1980-10-11','YYYY-MM-DD'));
6、to_date函数多数使用在insert操作当中,数据库表中某个字段是日期类型,不能直接将字符串给这个字段,除非
这个字符串的格式恰好和数据库默认的日期格式相同。要不然必须手动调用to_date函数进行类型转换。
------------------------------------------------------------------------------------------------------------------
* to_char
1、to_char函数的作用:将DATE转换成具有特定格式的VARCHAR
2、to_char函数的运算结果是:VARCHAR类型
3、to_char函数的语法格式:to_char(日期数据,'日期格式')
4、回顾java中的日期格式化:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date time = new Date();
String strTime = sdf.format(time);
5、案例:
查询所有学生的生日,要求学生生日显示格式是:"2000-10-11"
select name,to_char(birth,'YYYY-MM-DD') as birth from t_student;
NAME BIRTH
---------------------------------------------------------------- -----------
jack 1980-10-11
jack 1980-10-11
SQL> select name,birth from t_student; //存在自动类型转换,按照Oracle默认的日期格式转换
NAME BIRTH
---------------------------------------------------------------- --------------
jack 11-10月-80
jack 11-10月-80
以上SQL语句还可以写成另外一种形式:
select name,to_char(birth,'DD-MON-YY') as birth from t_student;
NAME BIRTH
---------------------------------------------------------------- --------------
jack 11-10月-80
jack 11-10月-80
6、to_char函数多数使用在查询语句当中,以特定格式的字符串展示该日期的时候使用。
------------------------------------------------------------------------------------------------------------------
* to_number【了解】
* VARCHAR ---> NUMBER
------------------------------------------------------------------------------------------------------------------
重点:
在Oracle数据库当中怎么获取Oracle数据库的系统时间?
SQL> select sysdate from dual;
SYSDATE
--------------
15-8月 -16
SQL> select to_char(sysdate,'YYYY-MON-DD HH:MI:SS') as nowTime from dual;
NOWTIME
--------------------------------------------------
2016-8月 -15 03:58:16