Oracle数据库入门——sql语句和函数详解
一、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语句和函数详解的更多相关文章
- 四、oracle基本sql语句和函数详解
一.oracle常用数据类型 一. 数据定义语言(ddl) 数据定义语言ddl(data definition language)用于改变数据库结构,包括创建.更改和删除数据库对象. 用于操纵表结构 ...
- oracle数据库入门sql语句
数据库: 命名规范问题 依然是 _流.看来也确实应该抽空 来处理一下 今天吧,不行时间不能浪费.要更加专注.累了 就睡,醒来 就 好好 弄东西.白天 哪怕累一些,强度 大一些,晚上也可以抽空出去.溜溜 ...
- Oracle数据库 基础SQL语句练习
一.说明 第一次使用Oracle,想做一些练习,熟悉一些oracle. 表:使用的是scott用户,默认的表 具体表讲解,可以参考该文档:https://www.cnblogs.com/xjcheng ...
- Oracle数据库中序列(SEQUENCE)的用法详解
Oracle数据库中序列(SEQUENCE)的用法详解 在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...
- Oracle数据库常用Sql语句大全
一,数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSE ...
- Oracle数据库的sql语句性能优化
在应用系统开发初期,由于开发数据库数据比较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目 ...
- Oracle数据库高效sql语句的整理
业务需求说明:由于之前公司后台APP端有一个document表,该表中包含了所有的信息,新的需求就是通过该表创建出一个新的用户表(usertable)和一个档案表(document,该表只保留原doc ...
- oracle数据库常用SQL语句(11.29更新)
笔者日常工作中常用到的sql语句,现总结如下,留作日后查看. 1.按照两列中的最大值取 ,只取两列其中的一列 SELECT * FROM t_doc T ORDER BY GREATEST(T.Loa ...
- oracle数据库常用SQL语句
1)删除表的一列 ALTER TABLE 表名 DROP COLUMN 列名; 2)增加表的一列 且默认值为0 alter table 表名 add 字段名 类型 default '0'; 3)修改表 ...
随机推荐
- Windows XP Ghost系统安装
一.双击Ghost系统安装工具,进入Ghost界面 二.依次单击[Local]-[Partition]-[From Image],可以简单记作1-2-3. 弹出对话框,选择.GHO文件,比如XP.GH ...
- WIN10平板 如何修改网络IP地址为固定
右击网络,属性,更改适配器设置,然后可以找到当前的无线网络 然后依次点开即可修改IP地址
- wifipineapple执行dnsspoof
ssh连接到wifipineapple: 输入连接信息:ssh root@172.16.42.1 输入密码:pineapplesareyummy 安装依赖基本环境: opkg update opkg ...
- 利用python制作在Linux服务器后台定时运行的任务-邮件提醒
1. 自动任务的功能为: 定时扫描数据库中的记录,然后发邮件 代码如下 scheduleMail.py import pymysql import smtplib from email.mime.te ...
- Swift udp实现根据端口号监听广播数据(利用GCDAsyncUdpSocket实现)
有个小需求,app需要监听pc广播的数据: 代码实现思路: 使用三方库:CocoaAsyncSocket 1.开启udp监听: udpSocket.beginReceiving() 2.读取udp的数 ...
- 怎么去掉Xcodeproject中的某种类型的警告 Implicit conversion loses integer precision: 'NSInteger' (aka 'long') to 'int32
问题描写叙述 在我们的项目中,通常使用了大量的第三方代码,这些代码可能非常复杂,我们不敢修改他们,但是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许很多多的警告,那么 ...
- 扩展layui中的自带字体图标
项目中,虽然layui的字体图标库中已经有了1000多个图标了,但是也有时候不能满足我们自定义图标的需求,所以需要进行自定义,具体步骤如下: 1.在iconfont上找到自己喜欢的图标,也可以上传ui ...
- LeetCode: Subsets 解题报告
Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset ...
- 【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int address,data; ; ]; ]; char *p; /* US ...
- Go Revel - i18n(国际化)
##Messages `Messages`信息是对内容提供翻译的外部文本片段.revel提供了组织每一种语言文本片段的message文件.自动区域查找.基于cookie覆盖的消息嵌套和参数. 术语表: ...