Oracle 笔记文档格式.docx
- 文档编号:3107245
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:80
- 大小:119.46KB
Oracle 笔记文档格式.docx
《Oracle 笔记文档格式.docx》由会员分享,可在线阅读,更多相关《Oracle 笔记文档格式.docx(80页珍藏版)》请在冰点文库上搜索。
如果现在连接的是用户管理员(sys):
则在连接的最后必须写上ASSYSDBA。
以系统管理员的身份登录。
connsys/change_on_installassysdba;
那么这个时候再次发出之前的查询命令,会提示如下错误:
SQL>
select*fromemp;
select*fromemp
*
第1行出现错误:
ORA-00942:
表或视图不存在
此错误表示emp不存在。
因为emp表示属于scott用户下的表,而sys用户本身没有,所有如果现在在不同用户下想访问emp表的话,则比训加上用户名,即:
表的完整名称:
“scott.emp”.
如果现在希望知道当前连接的用户是那一个?
Showuser;
显示当前正在连接的用户
一个数据库中会存在多张表,那么通过一下命令得到一个数据库总全部表的名称:
Select*fromtab;
在开发中使用最多的就是查看表的结果,可以使用desc表名称的形式查看一个表的完整结构。
在列的类型中主要有一下几个类型:
Number(4):
表示数字,长度为4
Varchar2(10):
表示字符串,只能容纳10个长度
Date:
表示如期
Number(7,2):
表示数字,其中小数占2位,整数位占5位,总共是7位。
默认库认识
所有的表
在说有讲解中所使用到的表全部都是在scot用户下的表,所以必须了解在此用户下有那几张表,以及每张表的作用是什么。
雇员表(emp)
雇员表中记录每个雇员的基本信息。
雇员表(EMP)
NO
字段
类型
描述
1
EMPNO
NUMBER(4)
雇员编号
2
ENAME
VARCHAR2(10)
雇员姓名
3
JOB
VARCHAR2(9)
工作职位
4
MGR
雇员的领导编号
5
HIREDATE
DATE
雇佣日期
6
SAL
NUMBER(7,2)
月薪
7
COMM
奖金
8
DEPTNO
NUMBER
(2)
部门编号
部门表(dept)
表示一个具体的部门信息
DNAME
VARCHAR2(14)
部门名称
LOC
VARCHAR2(13)
部门位置
工资等级表(SALGRADE)
工资等级制度
GRADE
NUMBER
等级名称
LOSAL
此等级的最低工资
HISAL
此等级的最高工资
奖金表(BONUS)
雇员的工资以及奖金
雇员工作
雇员工资
雇员奖金
对于各个不同的数据库来讲,重点是掌握SQL语句,因为现在的数据库全是以SQL语句为操作标准,在实际中,各个数据库就是提供的函数不同。
SQL简介
SQL(StructuredOueryLanguage,结构查询语言)是一个功能强大的数据库语言.SQL通常用于与数据库的通讯。
ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言。
SQL功能强大,概括起来,它可以分位以下几组:
DML(DataManipulationLanguage,数据库操作语言)——用于检索或者修改数据
DDL(DataDefintionLanguage,数据库定义语言)——用于定义数据库的结构,如创建、
或者删除数据库对象
DCL(DataControlLanguage,数据库控制语言)——用于定义数据库用户的权限
简单查询语句
Select*|具体的列别名from表名称;
如果过现在假设,只需要查询出雇员的编号、姓名、工作的话,则就需要指定查询的列。
Selectempno,ename,jobfromemp;
查询的时候可以指定查询的返回列的名称,即为一个列起别名。
Selectempno编号,ename姓名,job工作fromemp;
现在要查询出所有的工作。
肯定要查询的是一个job字段,
Selectjobfromemp;
以上的查询的结果似乎有一些不妥,因为工作存在重复值,既然要查询的是工作,所以肯定应该将重复的内容消除掉,所以在查询的时候可以用过Distinct直接消除重复列。
Selectdistinctjobfromemp;
但是在消除重复列的时候,有一点必须说明,如果要同时查询多列,则必须保证所有列都重复才能消除。
例如:
查询雇员的编号以及工作。
因为雇员编号不重复,所以此时证明说有的列没有重复,所以不能清楚。
一个新的要求:
要求查询出雇员的编号,姓名,工作,但是显示的格式:
编号是7369的雇员,姓名是smith,工作是clerk.
要想实现此种功能,则可以使用Oracle中提供的字符串连接操作,使用||表示。
如果要加入一些显示信息的话,所有其他的拱顶信息要使用“’”括起来。
select'
编号是:
'
||empno||'
雇员,姓名是:
||ename||'
,工作是:
||jobfromemp;
在查询中也可以用使用四则运算功能,例如:
要求,求出每个雇员的姓名及年薪。
Selectename,sal*12fromemp;
在成程序中sql*12意义很不明确,所以最好为这个运算结果起一个别名,
但是在起别名的时候一定要回避中文。
Selectename,sal*12incomefromemp;
程序中可以支持+、-、*、/的语句,所有的语句要有优先顺序,先乘除后加减
限定查询(where子句)
Select{distinct}*|具体的列别名from表名{wehre条件(s)}
范例:
查询每月可以得到奖金的雇员信息
奖金comm
只要字段中纯在内容,则表示此内容不为空null,如果存在则会显示具体的值。
不为空字段表示isnotnull/isnot
要求查出,基本工资大于1500,同时可以领取奖金的雇员信息。
此时应该是两个条件,而且两个条件必须同时满足。
既然要求两个条件全部满足,必须使用AND操作符进行条件的连接。
Select*fromempwheresal>
1500andcommisnotnull;
范例:
要求查询,基本工资大于1500,或者可以领取奖金的雇员信息。
如果要表现出或者的概念使用OR进行连接,表示两个条件有一个满足即可。
1500ORcommisnotnull;
之前使用NOT可以取反,把真的条件变假,假的变为真。
要求查询出,基本工资不大于1500,同时不可以领取奖金的雇员信息。
此时相当于整体的条件取反。
Select*fromempwherenot(sal>
1500andcommisnotnull);
查询基本工资大于1500小于3000的雇员信息
满足2两个条件:
sal>
=1500,sal=<
3000
在SQL语境中,提供了一个专门的指定范围查询的过滤语句:
between最小值AND最大值
Select*fromempwheresalBETWEEN1500AND3000;
实际上BETWEEN….AND操作等价:
SAL>
=1500ANDSAL=<
3000包含等于功能。
查询出在1981年雇佣的全部雇员信息
select*fromempwherehiredatebetween'
1-1月-81'
AND'
31-12月-81'
;
除了可以支持数字也支持日期
要求查询出姓名是smith的雇员信息
Select*fromempwhereename=’smith’;
SMITH
在执行查询语句之后,并不会返回结果。
后来发现smith是大写的SMITH
在Oracle中是对大小写敏感的,所以此时在查询的时候必须以大写的形式进行编写。
要求查询出雇员编号是7369、7499、7521的雇员的具体信息
在之前的做法:
是empno=7369ORempno=7499ORempno=7521
但在实际的操作中,可以用IN完成。
Select*fromempwhereempnoIN(7369,7499,7521);
要求查询出雇员编号不是7369、7499、7521的雇员的具体信息
Select*fromempwhereempnoNOTIN(7369,7499,7521);
IN操作符不光可以用在数字上,也可以用在字符串的信息上
要求查询出姓名是SMITH、ALLEN、KING的雇员信息
Select*fromempwhereenamein('
SMITH'
'
ALLEN'
KING'
);
提示:
如果在指定的查询范围中指定了额外的内容,则不影响程序的运行。
在一般的日常见到的站点中进程发现有模糊查找功能,即输入一个指定的关键字,
把符合的内容全部查询出来,在SQL中使用LIKE语句完成。
在使用LIKE语句的时候要注意通配符的问题,在LIKE语句中主要使用以下两种通配符:
“%”:
可以匹配任意长度的内容
“__”:
可以匹配一个长度的内容
查询出所有的雇员姓名中第二个字母包含“M”的雇员信息
select*fromempwhereenamelike'
_M%'
查询出雇员姓名中包含字母M的雇员信息
此时,表示可以出任意的位置上出现字母M
%M%'
但是要提醒大家的是:
如果在使用LIKE的时候没有指定查询的关键字,则表示查询全部。
%%'
;
使用Like还可以方便的进行日期的查找功能。
要求查询出在1981年的雇员信息。
select*fromempwherehiredatelike'
%81%'
在操作条件中还可以使用:
>
、>
=、=、<
、<
=等计算的符
不在SQL中如果要使用不等于符号,可以有两种形式:
“<
”、“!
=”
查询雇员编号不是7369的雇员信息
Select*fromempwhereempno<
7369______Select*fromempwhereempno!
=7369
对查询的记过进行排序(Orderby子句)重点
在查询结果需要通过其他编号进行排序,需要用到ORDERBY
Select{DISTINCT}*|具体列别名from表名称{where条件(s)}
{ORDERBY排序的字段1,排序的字段2ASC|DESC}
按工资排序
select*fromemporderbysal;
之前是由低到高的顺序完成,现在采用由高到低排序
select*fromemporderbysaldesc;
要求查询出10部门的所有雇员信息,查询的信息按照工资由高到低排序,如果工资相等,则按雇佣日期由早到晚排列。
:
此时存在两个排序条件,第一个是降序,第二个是升序。
Select*fromemp
wheredeptno=10ORDERBYsalDESC,hiredateASC;
排序的操作肯定是放在整个SQL语句的最好执行。
单行函数(重点)
数据库系统中,每个数据库之间唯一不用的最大区别点就是在于函数的支持上,
使用函数可以完成一系列的操作。
单行函数语法:
functionname(columnexpression[arg1,arg2,…….])
参数说明:
function_name:
函授名称
column:
数据库列名
expression:
字符串或计算表达式
arg1,arg2:
在函数中使用参数
单行函数分类;
字符函数:
接受字符输入并且返回字符或者数值
数值函数:
接受数值输入并返回数值
日期函数:
对日期型数据进行操作
转换函授:
从一种数据类型转换为另一种数据类型
通用函授:
NVL函数、DECODE函数
字符函数
是专门处理字符的,例如,可以将大写字符变为小,还能求出字符的长度。
将小写字符变为大写的字符
Selectupper(‘smith’)fromdual;
一般用户在查询一个姓名的时候有可能考虑到这个人的姓名是大写字母存在的还是小写字母保存的?
那么此时,为了方便用户的使用就可以使用upper函授完成。
Select*fromempwhereename=upper(‘smith’);
还可以使用lower()函授将一个字符串变为小写字母表示。
Selectlower(‘HELLOWORLD’)fromdual;
还可以使用initcap()函授将单词的第一个字母大写。
Selectinitcap(‘HELLOWORLD’)fromdual;
使用此函数将雇员表中的雇员姓名变为开头字母大写
SelectINITCAP(ename)fromemp;
字符串除了可以使用“||”连接之外,还可以使用concat()函数进行操作。
Selectconcat(‘hello’,’world’)fromdual;
但是此中方式不方便。
不建议使用。
在字符函数中可以进行字符串的截取、求出字符串的长度、进行指定内容的替换
字符串截取:
substr()
字符串长度:
length()
内容替换:
replace()
Selectsubstr('
hello'
1,3)截取字符串,
length('
)字符串长度,
replace('
l'
x'
)字符串替换
fromdual;
但是在substr()函数的时候有一点需要提醒大家注意,跟面试有关:
Oracle中substr()函授的截取点是从0还是从1开始。
|-从0或1开始效果是一样的,因为Oracle比较只能。
要求显示所有雇员姓名以及姓名的后三个字符。
因为雇员姓名的字符串长度不一样,所有只能整个的长度在减去2,这样进行截取操作。
selectename,substr(ename,Length(ename)-2,length(ename))fromemp;
此时,功能实现了,但是操作比较麻烦,实际上在substr()函数中提供了一种非常方便的机制,
只需要输入的位置是负数级表示倒着进行。
selectename,substr(ename,-3,3)fromemp;
数值函数
数值函数主要包含一下几种:
四舍五入:
Round()
截取小数位:
trunc()
取余(取模):
mod
四舍五入操作
Selectround(789.536)fromdual;
当然,在Round()函数中也可以指定保留小数
Selectround(789.536,2)fromdual;
在使用round()函数中还可以直接对整数进行四舍五入。
Selectround(789.536,-2)fromdual;
trunc()与round()不同的是在操作中不保留任何的小数。
而且小数点也不会执行四舍五入。
验证trunc()
Selecttrunc(789.536)fromdual;
通过trunc()也可以指定小数点的保留位数
Selecttrunc(789.536,2)fromdual;
使用负数表示位数
Selecttrunc(789.536,-2)fromdual;
范例使用mod()函数可以进行取余的操作。
selectmod(10,3)fromdual;
日期函数
在Oracle中提供了很多与日期操作相关的函数,包括加减日期等等。
但是在日期进行加或减结果的时候有一些规律:
日期-数字=日期
日期+数字=日期
日期–日期=数字(天数)
显示10部门雇员进入公司的星期数
如果要想完成此操作,就需要知道当前的日期。
在Oracle中可以通过sysdate。
Selectsysdatefromdual;
求出星期数:
当前日期-雇佣-日期=天数/7=星期数
selectempno,ename,(sysdate-hiredate)/7fromemp;
———selectempno,ename,round((sysdate-hiredate)/7)fromemp;
在Oracle中提供一下日期函数支持
Months_Between():
求出给定日期范围的月数
Add_months():
在指定日期上加上指定的月数,求出之后的日期
Next_day():
下一个的今天是那个一个日期
Last_day():
求出给定日期的最后一天日期
验证months_between()
selectempno,ename,months_between(sysdate,hiredate)fromemp;
-
程序有小数点可以使用Round()进行
验证add_months()
selectadd_months(sysdate,4)fromdual;
验证NEXT_DAY()函数
此函数求出下一次给定日期数
selectnext_day(sysdate,'
星期一'
)fromdual;
验证LAST_day()求出本月最后一天日期
selectlast_day(sysdate)fromdual;
转换函数
转换函数主要有一下几种:
To_char:
转换成字符串
To_number:
转换成数字
To_date:
装换成日期
查询所有雇员的雇员编号、姓名、雇佣日期。
selectempno,ename,hiredatefromemp;
将年月日拆分
selectempno,ename,to_char(hiredate,'
yyyy'
)year,
to_char(hiredate,'
mm'
)months,
dd'
)dayromemp;
还可以使用to_char()函数进行日期显示的转换功能。
Oracle中默认的日期格式:
19-4月-87
中国的喜欢格式:
1987-04-19
selectempno,ename,
yyyy-mm-dd'
)
fromemp;
从行结果中发现出现05,01。
这个称为前导。
如果不希望显示,可是使用fm
To_char()函数除了可以用在日期上,也可以用在数字上。
例如:
要查询全部的雇员编号、姓名、工资
selectempno,ename,salfromemp;
数字格式化
selectempno,ename,to_char(sal,'
99,999'
)fromemp;
如果此时,希数字可以明确的表示区域,可以使用一下两种符号:
$表示美元
L表示Local的缩写,以本地的语言进行金额的显示
$9,999'
____selectempno,ename,to_char(sal,'
L99,999'
To_Number是可以将字符串变为数字的一种函数。
Selectto_number('
123'
)+to_number('
To_date()函数可以将一个字符串变为达特型的数据。
有个2009-2-16是一个字符串,现在需要转换date类型。
selectto_date('
2009-02-16'
通用类型
范例求出每
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 笔记