oracle数据库入门(Windows)

这篇博客介绍了Oracle数据库的数据类型,包括CHAR、VARCHAR2、NCHAR和NVARCHAR2,以及数值类型的NUMBER。同时,详细讲解了如何使用SQL语句进行数据表的操作,如DML操作、选择无重复行、带条件和排序的查询、创建新表以及使用列别名。此外,还分享了一些使用技巧,如查看表行数、删除重复行的方法,并提到了SQL函数和分析函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据类型:

字符类型
         CHAR数据类型:固定长度的字符串1~2000字节,如果字节没有达到设定长度的字节,会用空格填充,如果不是固定长度的字节,使用该类型会比较占用磁盘空间;如果超过长度,数据库会返回错误报告。
         VARCHAR2数据类型:支持可变长度字符串1~40000字节。相对CHAR类型比较有优势(选择使用)。
         NCHAR数据类型:国家字符集使用方法和CHAR相同,却别在于NCHAR用来存储Unicode字符集类型,即双字节字符数据。
         NVARCHAR2数据类型:与NCHAR类似,在使用上用于存储需要国际化的可变长字符串。

数值类型
         NUMBER数据类型可以存储正数、负数、零、定点数和精度为38位的浮点数。
         数据类型格式:NUMBER(p,s) p为精度,表示数字的有效范围;s为范围,小数点后面的位数。
         用法:column_name NUMBER{P=38,S=0}  column_name NUMBER(p){定点数}   column_name NUMBER(p,s){浮点数}

Oracle学习参考教程:http://www.hechaku.com/Oracle/

使用SQL语句操作数据表

创建表stuInfo

create table stuInfo
(
stuNo char(6) not null, -- 学号
stuName varchar2(20) not null, --学员姓名
stuAge number(3,0) not null, --年龄
stuID number(18,0), --身份证号
stuSet number(2,0) --座位号
);

依次插入数据

insert into stuinfo(stuNo,stuName,stuAge,stuSet) values('5','张三','20','5');

从语法的角度介绍DML操作

(1)选择无重复的行----->要防止选择重复的行,可以在SELECT命令中包含DISTINCT(去重复)子句。

-- 不重复显示所有学员的姓名和年龄
select distinct stuName,stuAge from stuInfo;

结果:

(2)带条件和排序的SELECT命令

-- 按照姓名升序排序,如果姓名相同,则按照年龄降序排序
select stuNo,stuName,stuAge 
from stuInfo
where stuAge>17
order by stuName ASC,stuAge DESC;

输出结果:

(3)使用列别名

--使用别名显示姓名、年龄和身份证号
select stuName as "姓名",stuAge as "年龄",stuID as "身份证号" from stuinfo;

(4)利用现有的表创建新表

Oracle允许利用现有的表创建新表,语法:

CREATE TABLE <newtable>
     AS
SELECT {*|column(s)}
FROM <oldtable>[WHERE <condition>];

此命令可以把现有表中的所有记录复制到新表中,也可以仅复制选定的列或只复制结构而不复制记录。Oracle复制的新表不能复制表的索引和主外键等设置。

create table newStuInfo
   AS 
select * from stuInfo;

上述语句创建了(复制)newStuInfo表,此表是stuInfo表及其所有记录的完全复制。

新表结果:

下列语句创建newStuInfo2表,包含stuInfo表部分字段:

create table newStuInfo2
  as
select stuName,StuNo,StuAge from stuInfo;

输出结果:

表结构:

还可以仅复制表的结构,而不复制记录:

create table newStuInfo3
  as
select * from stuInfo where 1=2;

复制的newStuInfo3表结构:

从使用技巧的角度介绍DML操作

(1)查看表中的行数

select count(*) from stuInfo;

上述语句效率执行低。

select count(1) from stuInfo;

上述语句执行效率更高一点,两选择第二种比较有优势。

(2)取出stuName、stuAge列不存在重复数据的记录

select stuName,stuAge
from stuInfo
group by stuName,stuAge
having(count(stuName||stuAge)<2);

     输出结果:

        “||”操作符为连接操作符,功能是将两部分内容连接到一起。COUNT函数的参数只能有一个,所以用连接操作符连接。

(3)删除stuName,stuAge列重复的行(保留一行)

delete from stuInfo
where rowid not in(
   select max(rowid)
     from stuInfo
      group by stuName,stuAge);

删除后查询结果:

使用SQL函数操作数据表

参考博客:https://www.cnblogs.com/superdrew/p/8053956.html

Oracle的转换函数实例展示

--自动类型转换
select 1+'1' from dual;

--前面是字符串,会自动转换成date类型
select add_months('1-7月-2017',2) from dual;

--to_number   to_char   to_date
select sysdate from dual;
--把日期函数转换成字符串:to_char()
select sysdate,to_char(sysdate) from dual;

--自己定义日期的格式
select sysdate,to_char(sysdate,'YYYY-MM-DD HH24:MI:ss') from dual;
select sysdate,to_char(sysdate,'YYYY-MM-DD') from dual;
select sysdate,to_char(sysdate,'HH24:MI:ss') from dual;

--将数字转换成字符串:to_char
select 123,to_char(123) from dual;
--9代表占位符,如果位数少于前面的数字,都会显示#
--L代表本地货币符号
select 123,to_char(123,'999') from dual;

--to_date 将字符串转换成日期类型
select months_between(sysdate,'2017-12-17') from dual;
--to_date() 必须要指定日期的格式
select months_between(sysdate,to_date('2017-12-17','YYYY-MM-DD')) from dual;


--to_number 将字符串转数字  字符串必须只有数字
select '123',to_number('123.000') from dual;

oracle滤空函数示例

--nvl相当于java中的条件运算符      a?b:c
--查询所有员工的姓名,职位,薪水,提成和总工资
select ename,job,sal,comm,sal+comm income from emp;
select ename,job,sal,nvl(comm,o) comm,sal+nvl(comm,0) income from emp;

--nvl2:有三个参数,第一个参数为null,返回第三个参数的值,否则返回第二个
select ename,job,sal,comm,nvl2(comm,sal+comm,sal) income from emp;
--两者数据类型一定要一致
select comm,nvl(comm,'无') from;  --如果数据类型不一致,将出现报错现象。

--decode 功能类似 switch...case...
--查询所有员工的职位,并且以中文显示
select distinct job from emp;
select decode(job,'CLERK','职员','SALESMAN','销售员','PRESIDENT','不知道',
'MANAGER','经理','ANALYST','分析师') as job   from emp;

分析函数使用

学习参考博客:

https://www.linuxidc.com/Linux/2015-04/116349.htm

https://blog.youkuaiyun.com/cc_0101/article/details/80884076

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值