一、oracle常用数据类型

一、  数据定义语言(ddl)

数据定义语言ddl(data definition language)用于改变数据库结构,包括创建、更改和删除数据库对象。

用于操纵表结构的数据定义语言命令有:

create table

alter table

truncate table

drop table

eg、

--创建tb_stu表数据结构

create table tb_stu(

id number,

name varchar2(20)

);

 

--修改tb_stu表数据结构,新增一列

alter table tb_stu add pwd varchar2(6);

--修改字段

alter table tb_stu modify pwd varchar2(20);

--重命名表: rename table_name1 to table_name2;

RENAME student TO tb_student;

--重命名列:alter table table_name rename column col_oldname to colnewname;

ALTER TABLE student RENAME COLUMN pwd TO pwd1;

--删除字段

alter table tb_stu drop column pwd;

--删除tb_stu表数据

truncate table tb_stu;

--删除tb_stu表

drop table tb_stu;

二、  数据操作语言(dml)

数据操纵语言dml(data manipulation language)用于检索、插入和修改数据,dml利用insert、select、update 及 delete 等语句来操作数据库对象所包含的数据。

(1)、利用现有的表创建表

语法:create table <new_table_name> as

select column_names from <old_table_name>;

eg、

1)、create table tb_dept as select * from dept;

2)、create table tb_dept as select a.deptno, a.dname from dept a;

3)、create table tb_dept as select * from dept a where a.deptno=10;

(2)、选择无重复的行,使用distinct关键字

eg、select distinct a.dname from tb_dept a;

(3)、使用列别名

select a.deptno 部门编号, a.dname "部门 名称" from tb_dept a;

--中间有空格,用""

 

(4)、插入来自其他表中的记录

语法:insert into <table_name> [(cloumn_list)]

select column_names from <other_table_name>;

eg、insert into student2 select * from student;

三、  事务控制语言(tcl)

放到“事务”讲解

四、  数据控制语言(dcl)

放到“用户和权限”讲解

五、  sql操作符

六、  oracle函数

1、字符函数

initcap(char)函数:首字母大写

eg、select initcap('hello') from dual;

输出结果:Hello

lower(char)函数:字母全部转换为小写

eg、select lower('heLLo') from dual;

输出结果:hello

upper(char)函数:字母全部转换为大写

eg、select upper('hello') from dual;

输出结果:HELLO

ltrim(char,set)函数:去掉左边指定的字符

eg、select ltrim('xyzadmin','xyz') from dual;

输出结果:admin

rtrim(char,set)函数:去掉右边指定的字符

eg、select rtrim('xyzadmin','admin') from dual;

输出结果:xyz

translate(char, from, to)函数:返回将from中的每个字符替换为to中相应字符以后的string

eg、1)、select translate('jack','j','b') from dual; --将j替换为b

输出结果:back

2)、select translate('123abc','2dc','4e') from dual;

输出结果:143ab

解析:2替换为4,

d因为字符串里没有,所以不作替换,

c由于没有对应的替换字符,所以字符串里的c会被删除

replace(char, searchstring, [rep string]) 函数:替换

eg、select replace('jack and jue' ,'j', 'bl') from dual;

输出结果:black and blue

instr(char, m, n)函数:返回截取的字符串在源字符串中的位置,没有返回0

eg、select instr ('worldwide', 'd') from dual;

输出结果:5

instr(C1,C2,I,J) -->判断某字符或字符串是否存在,存在返回出现的位置的索引,否则返回小于1;在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 出现的位置,默认为1

substr(char, m, n)函数:截取字符串

eg、select substr('abcdefg', 3, 2) from dual;

输出结果:cd

concat(expr1, expr2)函数:连接字符串

eg、select concat('Hello',' world') from dual;

输出结果:Hello world

chr(number)函数:给出整数,返回对应的字符;

eg、select chr(54740), chr(65) from dual;

输出结果:赵 A

lpad和rpad函数:粘贴字符

lpad在列的左边粘贴字符

rpad在列的右边粘贴字符

eg、SELECT lpad('林计钦', 10, '*') FROM dual;

输出结果:****林计钦

注意:不够字符则用*来填满

trim函数:去除字符串左右两边的空字符串;如果不指定,默认为空格符。

length(char)函数:返回字符串的长度

eg、select length('abcdef') from dual;

输出结果:6

2、日期时间函数

add_months函数:增加或减去月份

eg、

select to_char(add_months(to_date('2011-11-30','yyyy-mm-dd'),2),'yyyy-mm-dd') from dual;--前进

输出结果:2012-01-31

select to_char(add_months(to_date('2011-11-30','yyyy-mm-dd'),-2),'yyyy-mm-dd') from dual;--后退

输出结果:2011-9-30

months_between(date2,date1)函数:给出date2-date1的月份

eg、select months_between('19-12月-1999','19-3月-1999') from dual;

输出结果:9

last_day函数:返回日期的最后一天

eg、select to_char(last_day(sysdate), 'yyyy-mm-dd hh24:mi:ss') from dual;

输出结果:2011-11-30 23:27:20

round和trunc函数:按照指定的精度进行四舍五入

eg、select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;

输出结果: 56  -55  55  -55

next_day(date,'day')函数:给出日期date和星期几计算下一个星期的日期

eg、select next_day('30-11月-2011','星期三') next_day from dual;

输出结果:07-12月-11

extract(datetime)函数:获取时间函数

eg、

输出结果:

SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL; --获取年

SELECT EXTRACT(MONTH FROM SYSDATE) FROM DUAL; --获取月

SELECT EXTRACT(DAY FROM SYSDATE) FROM DUAL; --获取日

select to_char(sysdate,'hh24') from dual; --获取小时

select to_char(sysdate, 'mi') from dual;--获取分钟

select to_char(sysdate, 'ss') from dual;--获取秒

select extract(year from systimestamp) year

,extract(month from systimestamp) month

,extract(day from systimestamp) day

,extract(minute from systimestamp) minute

,extract(second from systimestamp) second

,extract(timezone_hour from systimestamp) th

,extract(timezone_minute from systimestamp) tm

,extract(timezone_region from systimestamp) tr

,extract(timezone_abbr from systimestamp) ta

from dual;

3、数字函数

abs函数:绝对值

eg、select abs(-15) from dual;

输出结果:15

round(m, n)四舍五入函数:

eg、select round(45.926, 2) from dual;

输出结果:45.93

select round(45.926, -1) from dual;

输出结果:50

select round(245.926, -2) from dual;

输出结果:200

select round(275.926, -2) from dual;

输出结果:300

trunc(m, n)截取函数

一、日期

trunc函数为指定元素而截取的日期值。

其具体的语法格式如下:

TRUNC(date[,fmt])

其中:date 一个日期值

fmt 日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去

如果当日日期是:2011-3-18

select trunc(sysdate) from dual --2011-3-18 今天的日期为2011-3-18

select trunc(sysdate, 'mm') from dual --2011-3-1 返回当月第一天.

select trunc(sysdate,'yy') from dual --2011-1-1 返回当年第一天

select trunc(sysdate,'dd') from dual --2011-3-18 返回当前年月日

select trunc(sysdate,'yyyy') from dual --2011-1-1 返回当年第一天

select trunc(sysdate,'d') from dual --2011-3-13 (星期天)返回当前星期的第一天

select trunc(sysdate, 'hh') from dual --2011-3-18 14:00:00 当前时间为14:41

select trunc(sysdate, 'mi') from dual --2011-3-18 14:41:00 TRUNC()函数没有秒的精确

二、数字

trunc(number,num_digits)

number 需要截尾取整的数字。

num_digits 用于指定取整精度的数字。num_digits 的默认值为 0。

trunc()函数截取时不进行四舍五入

select trunc(123.458) from dual --123

select trunc(123.458,0) from dual --123

select trunc(123.458,1) from dual --123.4

select trunc(123.458,-1) from dual --120

select trunc(123.458,-4) from dual --0

select trunc(123.458,4) from dual --123.458

select trunc(123) from dual --123

select trunc(123,1) from dual --123

select trunc(123,-1) from dual --120

mod(m,n)求余函数

eg、select mod(5,2) from dual;

输出结果:1

ceil(n)函数:取大于等于数值n的最小整数

eg、select ceil(44.778) from dual;

输出结果:45

floor(n)函数:取小于等于数值n的最大整数

eg、select ceil(44.778) from dual;

输出结果:44

4、转换函数

select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;

select to_date('2011-12-01 10:33:56', 'yyyy-mm-dd hh24:mi:ss') from dual;

select to_number('1000') from dual;

5、混合函数

nvl(string1, replace_with)功能:如果string1为null,则nvl函数返回replace_with的值,否则返回string1的值。   

注意事项:string1和replace_with必须为同一数据类型,除非显示的使用to_char函数。

nvl2(e1, e2, e3)的功能为:如果e1为null,则函数返回e3,否则返回e2。

nullif(exp1,expr2)函数的作用是如果exp1和exp2相等则返回空(null),否则返回第一个值。

eg、select nullif('a', 'a') from dual;

输出结果:返回空,无值

select nullif('a', '1') from dual;

输出结果:a

6、分组函数

avg(n)、min(n)、max(n)、sun(n)、count(n)

八、oracle多表查询

多表联合查询

通过连接可以建立多表查询,多表查询的数据可以来自多个表,但是表之间必须有适当的连接条件。为了从多张表中查询,必须识别连接多张表的公共列。一般是在WHERE子句中用比较运算符指明连接的条件。

两个表连接有四种连接方式:

* 相等连接

* 不等连接(看作单表查询)

* 外连接(左连接、右连接;左连接即左表全部显示,右表只显示匹配的信息,右连接反之。)

* 自连接(自关联)

1.相等连接

通过两个表具有相同意义的列,可以建立相等连接条件。使用相等连接进行两个表的查询时,只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中

显示雇员名称和所在部门的编号和名称。

执行以下查询:

SELECT a.ename, b.id, b.dname

FROM employee a,dept b

WHERE a.id=b.id

说明:相等连接语句的格式要求是,在FROM从句中依次列出两个表的名称,在表的每个列前需要添加表名,用“.”分隔,表示列属于不同的表。在WHERE条件中要指明进行相等连接的列。

以上训练中,不在两个表中同时出现的列,前面的表名前缀可以省略。所以以上例子可以简化为如下的表示:

SELECT *

FROM emp e, dept d

WHERE e.deptno=d.deptno;

2.外连接

在以上的例子中,相等连接有一个问题:如果某个雇员的部门还没有填写,即保留为空,那么该雇员在查询中就不会出现;或者某个部门还没有雇员,该部门在查询中也不会出现。

为了解决这个问题可以用外连,即除了显示满足相等连接条件的记录外,还显示那些不满足连接条件的行,不满足连接条件的行将显示在最后。外连操作符为(+),它可以出现在相等连接条件的左侧或右侧。出现在左侧或右侧的含义不同,这里用如下的例子予以说明。

使用外连显示不满足相等条件的记录。

显示雇员名称和所在部门的编号和名称。

执行以下查询:

左连接方法一(推荐使用,简洁):

--+(附表)对面的是主表,可以理解为主表全部显示,+号这边如果没有匹配就显示空值

--不管dept是否存在,emp都会显示(emp当主表)

SELECT * FROM emp e, dept d WHERE d.deptno(+)=e.deptno; --左连接

SELECT * FROM emp e, dept d WHERE e.deptno=d.deptno(+); --右连接

--不管emp是否存在,dept都会显示(dept当主表)

SELECT * FROM emp e, dept d WHERE e.deptno(+)=d.deptno; --左连接

SELECT * FROM emp e, dept d WHERE d.deptno=e.deptno(+); --右连接

左连接方法二:

--不管dept是否存在,employee都会显示

SELECT * FROM emp e LEFT JOIN dept d  ON d.deptno=e.deptno;

SELECT * FROM dept d RIGHT JOIN emp e ON d.deptno=e.deptno;

3、自连接(一般用在树形权限结构中)

自连接就是一个表,同本身进行连接。对于自连接可以想像存在两个相同的表(表和表的副本),可以通过不同的别名区别两个相同的表。

SELECT worker.ename||' 的经理是 '||manager.ename AS 雇员经理

FROM employee worker, employee manager

WHERE worker.mgr = manager.empno;

------------

执行结果为:

1.SMITH 的经理是 FORD

2.ALLEN 的经理是 BLAKE

3.WARD 的经理是 BLAKE

注:在操作多表联合查询时,若出现以下情况,将形成笛卡尔积

– 联接条件被省略

– 联接条件无效

– 第一个表中的所有行被联接到第二个表中的所有行上

为了避免笛卡尔积,请始终包括有效的联接条件

何为笛卡尔积?

笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。

九、集合连接

十、扩展

1、cmd控制台登录oracle数据库:sqlplus scott/oracle@orcl

2、获取当前时间

--> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;

输出结果值:2011-11-30 19:40:55

获取当前时间(小数点精确到后面6位,6是可变的)

-->select to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff6') from dual;

输出结果值:2011-11-30 19:45:35.791000

3、查看表结构:desc dept;

4、修改日期格式:alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';(注意:只在当前会话中生效)

5、两种插入空值方式

方法一:insert into tb_stu values(1, null, to_date('20111130', 'yyyymmdd'));

方法二:insert into tb_stu(id, birthday) values(1, to_date('20111130', 'yyyymmdd'));

6、清屏:clear screen;

7、oracle中两个单引号表示一个单引号

eg、update tb_stu set pwd='1''2' where id=1;

8、oracle匹配

eg、select * from tb_stu where pwd like 'A%' --匹配多个

select * from tb_stu where pwd like 'A_' --匹配一个

9、drop table tb_dept purge; --永久删除

drop table tb_dept; --把表放入回收站,并没有彻底的删除表

10、select to_char(33, 'L99.99') from dual; --获取本地货币符号,输出结果为:¥33.00

select to_char(33, '$99.99') from dual; --获取美元

11、oracle中为空的两种表达方式

select '' from dual;

select null from dual;

12、查询当前数据库中的所有表名

select * from tab;

Oracle数据库入门——sql语句和函数详解的更多相关文章

  1. 四、oracle基本sql语句和函数详解

    一.oracle常用数据类型 一.  数据定义语言(ddl) 数据定义语言ddl(data definition language)用于改变数据库结构,包括创建.更改和删除数据库对象. 用于操纵表结构 ...

  2. oracle数据库入门sql语句

    数据库: 命名规范问题 依然是 _流.看来也确实应该抽空 来处理一下 今天吧,不行时间不能浪费.要更加专注.累了 就睡,醒来 就 好好 弄东西.白天 哪怕累一些,强度 大一些,晚上也可以抽空出去.溜溜 ...

  3. Oracle数据库 基础SQL语句练习

    一.说明 第一次使用Oracle,想做一些练习,熟悉一些oracle. 表:使用的是scott用户,默认的表 具体表讲解,可以参考该文档:https://www.cnblogs.com/xjcheng ...

  4. Oracle数据库中序列(SEQUENCE)的用法详解

    Oracle数据库中序列(SEQUENCE)的用法详解   在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...

  5. Oracle数据库常用Sql语句大全

    一,数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSE ...

  6. Oracle数据库的sql语句性能优化

    在应用系统开发初期,由于开发数据库数据比较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目 ...

  7. Oracle数据库高效sql语句的整理

    业务需求说明:由于之前公司后台APP端有一个document表,该表中包含了所有的信息,新的需求就是通过该表创建出一个新的用户表(usertable)和一个档案表(document,该表只保留原doc ...

  8. oracle数据库常用SQL语句(11.29更新)

    笔者日常工作中常用到的sql语句,现总结如下,留作日后查看. 1.按照两列中的最大值取 ,只取两列其中的一列 SELECT * FROM t_doc T ORDER BY GREATEST(T.Loa ...

  9. oracle数据库常用SQL语句

    1)删除表的一列 ALTER TABLE 表名 DROP COLUMN 列名; 2)增加表的一列 且默认值为0 alter table 表名 add 字段名 类型 default '0'; 3)修改表 ...

随机推荐

  1. LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 (转)

    很多伙伴在更新VS2010,或者卸载VS2012安装2010后,建立Win32 Console Project/MFC项目时会出现"LINK : fatal error LNK1123: 转 ...

  2. haproxy负载均衡的安装配置

    haproxy是一款可靠,高性能的并且可以支持TCP/HTTP的负载均衡器,和前面说过的nginx负载均衡类似,这里haproxy对于负载均衡来说更专业,支持的配置选项更多,稳定性也很强,甚至只需要一 ...

  3. 常用CTPN、CRNN文本检测识别框架

    一.SWT识别: yestinsong/Text-Detection( Text Detection System with MSER , SWT and Text Verification(fft ...

  4. 单反毁三代,kindle富一生

    盖kindle 面更香 人皆知有用之用,而莫知无用之用   一个存留记忆的地方:http://i-remember.fr/en   文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论

  5. ROS actionlib学习(一)

    actionlib是ROS中一个很重要的功能包集合,尽管在ROS中已经提供了srevice机制来满足请求—响应式的使用场景,但是假如某个请求执行时间很长,在此期间用户想查看执行的进度或者取消这个请求的 ...

  6. EasyUI tabs update 正确用法

    来源:http://ewoyaofei.blog.163.com/blog/static/343562612012617111734974/ 一直以为 tabs update 是 easyui 的 b ...

  7. android4.3 截屏功能的尝试与失败分析

    1.背景 上一篇讲了在源码中捕获到了android手机的截屏函数(同时按下电源键与音量减,详情http://blog.csdn.net/buptgshengod/article/details/199 ...

  8. Java并发之线程池ThreadPoolExecutor源码分析学习

    线程池学习 以下所有内容以及源码分析都是基于JDK1.8的,请知悉. 我写博客就真的比较没有顺序了,这可能跟我的学习方式有关,我自己也觉得这样挺不好的,但是没办法说服自己去改变,所以也只能这样想到什么 ...

  9. Atitit 数据库 标准库  sdk 函数库 编程语言 mysql oracle  attilax总结

    Atitit 数据库 标准库  sdk 函数库 编程语言 mysql oracle  attilax总结 1.1. 常见的编程语言以及数据库 sql内部函数库标准化库一般有以下api1 1.2. 各个 ...

  10. Android源码阅读笔记二 消息处理机制

    消息处理机制: .MessageQueue: 用来描述消息队列2.Looper:用来创建消息队列3.Handler:用来发送消息队列 初始化: .通过Looper.prepare()创建一个Loope ...