Oracle数据库
1.1 Oracle简介
Oracle的在希腊中翻译成“神喻”,把神说的话称为神喻。但是在中国的商周时代,一般情况下会把刻龟壳上的文字当作上天的指示,所以有时候会将Oracle的中文翻译成“甲骨文”。
Oracle公司是在1976年的成立,最早是受了IBM一个员工的论文影响,此论文称为“论关系型数据库的发展”。
Bruce Scott是Oracle的技术负责人,只是后来他离开了Oracle公司。自己开办了一个新的开发数据库的公司,并开发了一套数据库:PointBase。
PointBase在2005年的时候随着BEA公司的WebLogic打包附送。
Larry Ellison,是一个风云人物。
1.2 Oracle安装(掌握)
现在使用的Oracle版本是10G的版本。
如果要安装的话,必须先禁用Windows防火墙。
如果要安装必须进入到“Oracle 10G/install/setup.exe”目录之中,才可以执行安装的操作。
现在将Oracle安装在“D:/oracle/product/10.1.0/db_1”目录之中。
选择安装企业版。
所有的数据库的密码现在都设置为“oracleadmin”。
安装完之后会出现以下的界面,等待进行口令管理的设置,此时先暂停操作:
数据库的配置向导,选择口令管理。
Oracle中的主要几个用户:
• 超级管理员:sys/change_on_install(保持默认没有√,只需要重新设置新口令为change_on_install,否则默认采用oracleadmin)
• 普通管理员:system/manager(保持默认没有√,只需要重新设置新口令为manager,否则默认采用oracleadmin)
• 普通用户:scott/tiger(scott要解锁即把√去掉)
此时,安装完成,选择退出即可。
1.3 Oracle的相关服务(掌握)
Oracle安装完成之后,会出现以下的系统服务:
以上的服务是在Oracle安装完成之后添加的,最主要的几个服务是:
• 监听服务:OracleOraDb10g_home1TNSListener
• 数据库服务:OracleServiceMLDN
|- 命名格式:OracleService数据库,此处数据库的名称是MLDN,所以服务是: OracleServericeMLDN
在开发中以上的两个服务是必须启动的,否则是无法使用Oracle进行程序开发的。
如果想要使用Web工作方式,则还需要启动OracleOraDb10g_home1iSQL*Plus服务。
为了保证系统的启动够快,最好将以上的服务修改为手动启动,否则每次系统启动都会自动启动这些服务,浪费时间。
1.4 Oracle的结构化查询工具(了解)
Oracle提供的结构化查询工具对用户界面比较友好,主要SQL工具包括:
SQL*Plus
iSQL*Plus
PL/SQL
SQL*Plusw
SQL*Plus
SQL*Plus是Oracle的工具之一,以命令行方式进行数据库操作,它可以接受和执行SQL命令以及PL/SQL块。SQL*Plus可以用于:
输入、编辑、存储、检索和运行SQL命令以及PL/SQL块
为任意表列出列定义(desc 表名)
向用户发送消息,并从用户接受响应
可以通过“sqlplus”命令打开。
注意:在命令行的方式下输入用户名和口令时,口令不可见(为隐藏)。
iSQL*Plus
iSQL*Plus也是Oracle的结构查询工具,主要用在Web的工作方式上。它可以识别SQL语句,并将其提交给Oracle服务器以便执行该语句。可以执行能够使用SQL*Plus完成的所有任务。此工具的优点在于可以通过浏览器访问它。除此之外,它还提供了可以修改SQL语句的联机编辑功能。还可以使用iSQL*Plus将查询结果格式化为基本报告。iSQL*Plus既可以访问远程数据库,也可以访问本地数据库。
isqlplus IE客户端登录:http://localhost:5560/isqlplus/ –确认isqlplus服务已经启动。
企业管理器IE客户端登录:http://localhost:1158/em/console/ –确认“OracleDBConsole…”服务已经启动。
PL/SQL
PL/SQL是SQL的扩展,PL/SQL块中可以包含与控制语句流集成的任意数目的SQL语句。这样,PL/SQL就将SQL的数据操纵能力和过程语言的数据处理能力结合到了一起。
SQL*Plusw
在windows窗口下进行数据库的操作,是在开发中最常使用到一种工具。
可以通过“sqlplusw”命令打开。
在操作中主机字符串主要是输入数据库的名称,如果现在一台电脑上只有一个数据库,则可以不输入,会自动找到本机的数据库进行连接。
SQL是在二十世纪七十年代初由IBM公司发明并开发的。SQL即为Structured Query Language(结构化查询语句),它是关系数据库管理系统的标准语言。Oracle公司所实现的SQL完全符合ANSI/ISO 标准的SQL数据库语言。
为了与数据库进行通信,SQL支持下列命令类别:
• DDL(Data Definition Language,数据定义语言)——用于定义数据的结构,如创建、修改或者删除数据库对象(CREATE TABLE、ALTER TABLE、DROP TABLE、TRUNCATE TABLE、RENAME…TO、DESC)
• DML(Data Manipulation Language,数据操作语言)——用于检索或者修改数据(INSERT、SELECT、DELECT、UPDATE)
• Transaction control(事务处理控制语言)–(COMMIT、SAVEPOINT、ROLLBACK)
• DCL(Data Control Language,数据控制语言)——用于定义数据库用户的权限(GRANT、REVOKE)
1.5 Oracle的组件(了解)
一般的数据库都包含下列组件:
Database Files(数据库文件/数据文件)
Control Files(控制文件)
Redo Log Files(恢复日志文件)
Tablespaces(表空间)
Segments(段)
Extents(数据区)
这些组件可以按以下方式进行分类:物理组件和逻辑组件。
物理组件是数据实际所在的操作系统文件。而用户无法直接访问这些文件中的信息,用户需要使用逻辑组件访问信息。
数据库的物理组件是组成数据库的操作系统文件。Oracle数据库的这些文件为数据库信息提供了实际物理存储空间。这些操作系统文件有三种类型:数据文件、控制文件、恢复日志文件。
数据文件:这些文件包括所有数据库数据,如用户数据、系统数据和Overhead数据的数据。逻辑数据库结构的数据存储在这些文件中。
控制文件存储数据库的物理结构,即与数据库相关的所有文件的信息。该信息包括:数据库名称、数据文件和恢复日志文件的名称及其位置、时间戳。
恢复日志文件由RDBMS(关系数据库关系系统)用于记录对数据库所做的更改。
逻辑组件决定数据库中物理空间的使用。数据库有下列逻辑组件:
Tablespaces(表空间)
Segments(段)
Extents(数据区)
Schema Objects(模式对象)
表空间、段和数据区是逻辑结构,它们将决定模式对象物理存储空间的使用。
使用块、数据区、段、表空间可以完成对存储空间的更加细微的控制。
数据块代表定义数据库存储粒度的最细级别。数据块大小定义为一定数目的字节数,此数目通常取决于操作系统。
数据区由一定数目的相邻数据块组成。
段是数据区的集合。
表空间中的数据存储在分配的数据库空间(称为段)中。Oracle数据库包含多种段类型,例如数据段、索引段、回滚段、临时段等等。
Oracle数据库中的典型表空间是:
1. SYSTEM表空间,用于存储数据库管理自身所需的所有信息,即数据词典信息。
2. DATA表空间,用于存储实际数据。
3. USER表空间,用于存储关于用户的信息。
4. TOOLS表空间,用于存储不同工具所需的数据库对象。
5. TEMP表空间,用于存储在大型排序操作过程中所创建的所有临时表。它一般在处理过程中用作缓冲存储空间。
1.6 SQL*PLUS命令
设置SQLPLUS环境:
set linesize 200 设置一行显示200个字符
set pagesize 20 设置每页显示20行
在sqlplus中切换用户:conn scott/tiger; conn system/manager; conn sys/change_on_install as sysdba;
查询当前登录的用户:show user;
在sqlplus中编辑SQL语句:”ed” + 回车,编辑好后,保存关闭,然后输入“/”按回车即可执行刚刚编辑的语句
在sqlplus中创建SQL文本:”ed” +文本名(如:ed 1)
在sqlplus中执行指定SQL文本:”@”+文本名(如:@ 1)
SQLPLUS /nolog nolog是不登陆
quit/exit 退出
clear screen 清除屏幕
spool 文件名 (spool c:/abc.txt) 创建日志文件
spool off 关闭日志文件后自动保存日志
2.1 Oracle的主要数据类型(重点)
1、字符型
CHAR 当需要固定长度的字符串时,可以使用CHAR类型,范围 1–2000个字节。CHAR(10) ,表示指定长度为10,当输入’张三’ 后自动添6个空格把10个字节补满 ‘张三 ‘,如果不指定长度,默认为1;
VARCHAR2 支持可变长度的字符串,范围1—4000个字节,VARCHAR 2(10),但当输入张三’,在数据库中仍存储’张三’,4个字节,不自动增加字符。注意,定义此数据类型时,必须指定其大小。
CLOB (Character Large OBject),表示大的文本对象,可以存放海量文字。可以存储到4G的大小。CLOB对于存储非结构化的XML文档非常有用。
2、数字
NUMBER 范围:10的-38次方–10的38次方,可以表示小数,也可以表示整数。NUMBER (4) 最大表示4位整数,-9999 到 9999;NUMBER (5,2)表示5位有效数字,2位小数的 一个小数 -999.99 到 999.99。
3、日期
DATE 包含年月日和时分秒 7个字节
4、图片
BLOB(Binary LOB)表示大的二进制对象,可以存放图片、电影、音乐,最大可以存储到4G的大小。
BFILE(Binary Files)用于在数据库之外的操作系统文件中存储二进制文件。
2.2 Oracle的数据定义语言(DDL)
数据定义语言用于创建对象(例如表)、修改对象的结构以及删除所创建的对象。
2.2.1 创建表(重点)
CREATE TABLE命令
CREATE TABLE 【schema.】表名称
(
字段名称 字段类型 DEFAULT 默认值 ,
字段名称 字段类型 DEFAULT 默认值 ,
字段名称 字段类型 DEFAULT 默认值 ,
…
);
说明:
关键字“schema.”表示对象所有者的名称,如果我们在自己的方案中创建表,则不需要指定所有者姓名。
在对表名称命名时,第一个字母应该是字母表中的字母,可以有字母、数字、下划线组成,Oracle保留字不能用来对表命名,表名的最大长度应<=30,不能与其他表重名。
2.2.2 修改表结构(了解)
增加列
ALTER TABLE 表名 ADD(新增字段名1 数据类型)【DEFAULT 默认值】 【NOT NULL】【约束】,…);
修改列
ALTER TABLE 表名 MODIFY (字段名1 数据类型【DEFAULT 默认值】【NOT NULL】【约束】,…);
注意:(1)修改某字段的时候,如果原来该字段原来没有设置约束,那么可以增加约束;
(2)修改某字段的时候,如果原来该字段已经存在(除了非空约束之前的其他)约束,而此处重新指定新的约束,将不起作用,仍然按照原来的约束存在,要修改此约束只能通过单独的修改约束的语句进行修改(方法为先删除原来的约束,然后重新增加新的约束);
删除列
ALTER TABLE 表名称 DROP COLUMN 字段名;
删除大型表中的列可能要花费相当长的时间。一种较快的替代方法是使用ALTER TABLE命令的SET UNUSED选项将此列标记为未用。在这种情况下,尽管数据仍然保留在表中,但它不再可用。在将某个列标记为未用之后,如果需要,可以向表中添加与此列相同的另一个列。未用的列可以在以后需要收回此列数据所占用的空间时进行删除。
ALTER TABLE 表名称 SET UNUSED(字段名);
2.2.3 删除表(重点)
DROP TABLE 表名;
2.2.4 截断表(了解)
一般如果要想删除一张表的全部数据:
DELETE FROM 表名称 ;
但是,如果直接执行了以上的SQL语句的话,则数据是无法立刻释放掉空间的。
所以在Oracle中提供了一种截断表的语法,此语法可以直接释放存储空间,语法如下:
此命令是Oracle特有的。
TRUNCATE TABLE 表名称 ;
2.2.5 重命名表(了解)
在Oracle中还有以特有命令,即可以将一个表重新命名,命名的语法如下:
RENAME 表名称 TO 新的表名称 ;
2.2.6 查看表结构(掌握)
DESC 表名称;
2.3 SCOTT用户下的主要表结构介绍
2.3.1、雇员表(emp)
雇员表中表示的是一个个的雇员信息
雇员表(emp)
No. 列名称 类型 描述
1 EMPNO NUMBER(4) 雇员编号,所有的雇员编号以四位的数字形式出现
2 ENAME VARCHAR2(10) 雇员姓名,VARCHAR2表示的是字符串,长度是10位
3 JOB VARCHAR2(9) 雇员工作,VARCHAR2表示的是字符串,长度是9
4 MGR NUMBER(4) 领导编号
5 HIREDATE DATE 雇佣日期,使用日期形式表示
6 SAL NUMBER(7,2) 表示基本工资,使用小数表示,7表示一共7位数字,其中小数是2位,整数是5位,可以使用FLOAT表示
7 COMM NUMBER(7,2) 表示奖金,也可以称为佣金
8 DEPTNO NUMBER(2) 部门编号,是两位数字表示
2.3.2、部门表(dept)
部门表(dept)
No. 列名称 类型 描述
1 DEPTNO NUMBER(2) 部门编号,两位数字表示
2 DNAME VARCHAR2(14) 部门名称
3 LOC VARCHAR2(13) 部门位置
2.3.3、工资等级表(salgrade)
工资等级表(salgrade)
No. 列名称 类型 描述
1 GRADE NUMBER 等级编号
2 LOSAL NUMBER 此等级的最低工资
3 HISAL NUMBER 此等级的最高工资
2.3.4、奖金表(bonus)
奖金表(bonus)
No. 列名称 类型 描述
1 ENAME VARCHAR2(10) 雇员姓名,与雇员表的内容相对应
2 JOB VARCHAR2(9) 雇员工作,与雇员表的内容相对应
3 SAL NUMBER 雇员月薪,与雇员表的内容相对应
4 COMM NUMBER 雇员奖金,与雇员表的内容相对应
2.4 Oracle的数据操纵语言(DML)
数据操纵命令是使用最频繁的SQL命令。它们用于查询和操纵现有表中的数据,DML命令如下:
INSERT
DELETE
UPDATE
SELECT
2.4.1 增加记录(重点)
INSERT语句的语法如下:
INSERT INTO 表名称(字段列表)VALUES(对应的各字段的取值);
在插入数据的时候,需要注意的是如果该值是字符串,需要将其用单引号引起来,或者通过TO_CHAR()函数将其转换为字符串;如果该值是日期值,也需要用单引号引起来,并且按照Oracle默认的日期格式插入(‘dd-mm月-yyyy’),或者通过TO_DATE()函数将其转换为日期。
提示:(1)如果某个字段没有值可添加并且该字段可空就以NULL代替,或者在罗列字段名处不写
(2)如果某个表中的字段列出,而在对应值处没有该列的值,那么则自动添加该列默认值,或者NULL,所以需要自动添加默认值的列应列在最后,而不能在中间。
2.4.2 删除记录(重点)
DELETE FROM表名 WHERE 删除条件;
提示:(1)如果省略删除条件则表示删除表中所有记录,但在COMMIT之前,可通过ROLLBACK恢复;(2)如果想直接删除全表的数据,并且从内存中清除,即不可ROLLBACK则可以通过截断表命令删除表的数据:TRUNCATE TABLE 表名;
2.4.3 修改记录(重点)
UPDATE 表名 SET 字段名1=字段值1,… WHERE 修改条件;
2.4.4 查询记录(重点)
简单查询(一表查询)
SELECT DISTINCT字段列表 | * | 分组函数 | 有关字段的计算表达式
FROM 表 别名
【WHERE 筛选条件(不可包含分组函数)】
【GROUP BY 分组条件 HAVING 筛选条件(可包含分组函数)】
【ORDER BY 排序依据 DESC | ASC】;
注意:
(1) 如果有分组情况,那么SELECT 后面就只能跟分组条件和分组函数,不可以包含其他列;
(2) 如果筛选条件包含分组函数,则只能将此条件放在HAVING子句,不能放在WHERE 子句中;
2.5 Oracle的SELECT查询语句
2.5.1 简单查询(重点)
简单查询(一表查询)
SELECT DISTINCT字段列表 | * | 分组函数 | 有关字段的计算表达式
FROM 表 别名
【WHERE 筛选条件(不可包含分组函数)】
【GROUP BY 分组条件 HAVING 筛选条件(可包含分组函数)】
【ORDER BY 排序依据 DESC | ASC】;
注意:
(3) 如果有分组情况,那么SELECT 后面就只能跟分组条件和分组函数,不可以包含其他列;
如果筛选条件包含分组函数,则只能将此条件放在HAVING子句,不能放在WHERE 子句中;
2.5.2 关联查询(重点)
关联查询:
一个数据库中有多张表,而表与表之间是有联系的。
表与表之间的关联是通过字段中的数据的内在联系来发生,而不是靠相同的字段名来联系的或者是否有主外键的联系是没有关系的;
当需要消除笛卡尔积的时候,就要编写关联条件, N个表 关联条件一定有N-1个
关联查询(多表查询)
SELECT DISTINCT字段列表 | * | 分组函数 | 有关字段的计算表达式
FROM 表 别名,……
【WHERE 筛选条件(s)(不可包含分组函数)】
【GROUP BY 分组条件 HAVING 筛选条件(可包含分组函数)】
【ORDER BY 排序依据 DESC | ASC,…】;
注意:
(1) 简单查询的那两条注意也得满足;
(2) 如果需要消除笛卡尔积,则需要在WHERE子句中加上关联条件;
(3) 在使用多表查询的时候一般情况下都会写一个别名,这样使用会比较方便;
(4) 如果是根据一张表中的几个字段发生关联,那么可以自己与自己关联,采用别名进行区别,例如emp e,emp m 关联条件e.mgr=m.empno;
(5) 多表查询的时产生的笛卡尔积,通过关联字段进行条件的过滤;
(6) 如果使用“SELECT *”则关联字段列会显示两次,如果避免,就需要一一列出需要显示的字段;
2.5.3 子查询(重点) 2.6 Oracle的关联查询的各种连接 2.6.2 自然连接NATURAL JOIN(了解) 2.6.3 JOIN …USING(了解) 2.6.4 内连接INNER JOIN …ON(了解) 2.6.5 外连接(重点) 2.7 SQL*Plus的各种操作符 2.7.1 算术运算符(重点) 2.7.2 比较运算符(重点) –并集(去重复) –交集(两表中相同的) –并集(未消重复) –差集(两表中不同的) 2.8 SQL*Plus的函数 例如: 2、 数值函数: 3、 日期函数: 4、 转换函数: 5、 通用函数:NVL或DECODE函数 2.8.2 分组函数(重点) 注意点: 2.9 ROWNUM
子查询即在select语句中嵌套了另一个select语句;
子查询在操作中分为以下三类:
• 单列子查询:查询的结果是一个内容,一行一列
• 单行子查询:查询的结果将返回多个查询的列
• 多行子查询:查询结果返回多行多列的内容
在子查询中还存在以下三种查询的操作符号:
• IN:表示在一个指定的范围中取值
• ANY:与查询结果中的每一个内容进行匹配,使用起来有三种形式:=ANY、>ANY(大于最小的)、
2.6.1 交叉连接CROSS JOIN(了解)
SELECT 字段列表
FROM table1 CROSS JOIN table2;
结果产生“笛卡尔积”。
例如:
select d.dname, e.ename, d.deptno
from emp e cross join dept d;
结果为14*4=56行;
曾犯错误:
select d.dname, e.ename, d.deptno
from emp e cross join dept d
where e.deptno=d.deptno;
不能写筛选条件;
SELECT 字段列表
FROM table1 NATURAL JOIN table2;
自然连接“NATURAL JOIN”,自动进行关联字段的匹配。
例如:
select dname, ename, deptno
from emp natural join dept ;
结果为14行;
不能加限定词,所以也不需给表取别名
曾犯错误:
select e.dname, e.ename, e.deptno
from emp e natural join dept d;
SELECT 字段列表
FROM table1 JOIN table2 USING(关联字段);
select dname, ename, deptno
from emp join dept using (deptno);
结果为14行;
曾犯错误:
select dname, ename, deptno
from emp join dept using (emp.deptno);
using(字段)只能是简单列,即不能加限定词;
SELECT table1.column,table2.column
FROM table1 INNER JOIN table2 ON(table1.column_name=table2.column_name)
WHERE 其他条件;
INNER可写可不写;
例如:
select dept.dname, emp.ename, dept.deptno
from emp join dept on (emp.deptno=dept.deptno);
或者
select dept.dname, emp.ename, dept.deptno
from emp inner join dept on (emp.deptno=dept.deptno);
结果为14行;
一般on中写连接条件,where中写其他的条件
select dname,ename,a.deptno
from emp a join dept b on a.deptno = b.deptno
where a.deptno = 10 ;
外连接包括左外、右外、全外连接;
SELECT table1.column,table2.column
FROM table1 LEFT | RIGHT | FULL OUTER JOIN table2
ON(table1.column_name=table2.column_name)
WHERE 其他条件;
OUTER关键字可写可不写;
左连接
左连接表示以左边的表为准,筛选初所有的满足条件的记录;
例如:
select dept.dname, emp.ename, dept.deptno
from emp left join dept on (emp.deptno=dept.deptno);
结果为14条;
如果有员工,没有部门值,那也将被筛选出来。
右连接
右连接表示以右边的表为准,筛选初所有的满足条件的记录;
例如:
select dept.dname, emp.ename, dept.deptno
from emp right join dept on (emp.deptno=dept.deptno);
结果为15条,其中有一条是deptno=40,而员工姓名无对应值;
全外连接
以两个表为准,筛选出所有的记录;
例如:
select dept.dname, emp.ename, dept.deptno
from emp full outer join dept on (emp.deptno=dept.deptno);
结果为15条;
如果有没有员工的部门,或者有没有部门的员工的记录都会被筛选出来。
2.6.6 自连接(重点)
SELECT 字段列表
FROM table1 别名1,table2 别名2,…
WHERE 条件;
例如:
SELECT e.ename 员工姓名,m.ename 领导姓名
FROM emp e,emp m
WHERE e.mgr=m.empno;
下列是SQO*Plus支持的各种操作符:
算术运算符:+、-、*、/
比较运算符:<、<=、>、>=、=、<>(!=)、LIKE(NOT LIKE)、IN(NOT IN)、BETWEEN …AND(NOT BETWEEN …AND)、IS NULL(IS NOT NULL)
逻辑运算符:AND、OR、NOT
连接操作符:||
集合操作符:UNION、UNION ALL、INTERSECT、MINUS
算术运算符:+、-、*、/
例如:
SELECT empno,ename,(sal+NVL(comm,0))*12 income FROM emp;
比较运算符:<、<=、>、>=、=、<>(!=)、
LIKE(NOT LIKE) ‘匹配字符模式’、
IN(NOT IN)(与列表中的任意值进行匹配)、
BETWEEN …AND…(NOT BETWEEN …AND…)检查是否在两个值之间、
IS NULL(IS NOT NULL)检查是否为空
例如:查询名字中带‘A’字母,并且其基本工资>=3000的员工;
SELECT empno,ename,sal FROM emp
WHERE sal>=3000 AND ename LIKE ‘%A%’;
提示:
字符匹配模式有两种:
|- 单个字符匹配:“_”
|- 多个字符匹配:“%”
2.7.3 逻辑运算符(重点)
逻辑运算符:AND(与)、OR(或)、NOT(非)
2.7.4 连接运算符(重点)
连接操作符:||
在Oracle中可以使用“||”进行连接,那么也可以使用CONCAT()函数进行连接。
例如:
查询员工的姓名和雇用日期,并且雇用日期采用xx年xx月xx日的格式显示。
SELECT ename,TO_CHAR(hiredate,’yyyy’) || ‘年’ || TO_CHAR(hiredate,’mm’)|| ‘月’ || TO_CHAR(hiredate,’dd’) || ‘日’ hiredate FROM emp;
例如:
SELECT CONCAT(‘hello ‘,ename) FROM emp ;
两种结构比起来,还是“||”方便。
2.7.5 集合运算符(掌握)
在SQL语句中集合操作有:交、差、并,可以使用以下的几个操作完成:
• UNION:将多个查询结果合并到一个结果之中,没有重复的内容
• UNION ALL:将多个查询结果合并到一个结果之中,可以有重复内容
• INTERSECT:返回多个查询结果中相同的部分
• MINUS:返回两个查询结果中的差集
–为了进行集合操作演示,先创建一张临时表temp
–SQL脚本
DROP TABLE temp;
CREATE TABLE temp AS SELECT * FROM emp WHERE deptno=20;
SELECT * FROM emp UNION SELECT * FROM temp;
SELECT * FROM emp INTERSECT SELECT * FROM temp;
SELECT * FROM emp UNION ALL SELECT * FROM temp;
SELECT * FROM emp MINUS SELECT * FROM temp;
2.8.1 单行函数(重点)
1、 字符函数:
• UPPER(‘字符串’或字段名):转大写,一个参数
• LOWER(‘字符串’或字段名):转小写,一个参数
• INITCAP(‘字符串’或字段名):首字母大写,一个参数
• CONCAT(‘字符串1’ 或字段名, ‘字符串2’ 或字段名):将字符串连接在一起,两个参数
• SUBSTR(列的名称,截取的开始点,截取的长度):提取字符串的某一特定部分,三个参数
• LENGTH(‘字符串’或字段名):返回字符串的长度,一个参数
• INSTR:在字符串中查找某个子串的位置,两个参数
• LPAD:以左对齐的方式填充字符型数据,三个参数
• RPAD:以右对齐的方式填充字符型数据,三个参数
• TRIM(‘字符串’或字段名):去除字符串头部或尾部的空白,一个参数
• LTRIM(‘原字符串’,’需要在左边截掉的字符串’)
• RTRIM(‘原字符串’,’需要在右边截掉的字符串’)
• REPLACE(列或表达式,原始内容,其替换的内容) :替换,三个参数
• TRANSLATE(列或表达式,原始内容,其替换的内容):三个参数
• SOUNDEX()用于比较拼写不同但发音相似的词。
SELECT UPPER(ename) FROM emp;
SELECT LOWER(ename) FROM emp;
SELECT INITCAP(ename) FROM emp;
SELECT CONCAT(‘mldn:’,ename) FROM emp;
SELECT SUBSTR(ename,1,3) FROM emp;取名字的前三个字符,起始下标可以是1或者0;
SELECT LENGTH(ename) FROM emp;
SELECT INSTR(‘HELLO’,'LL’)FROM dual; 结果为3
SELECT LPAD(ename,7,’*') FROM emp;第一个参数是要用左填充显示的字符串,第二个参数是指示返回值总长度的数字,即以多宽来显示此字符串,第三个参数是填充字符;
SELECT LTRIM(‘xyzadnams’,'xyz’) FROM dual; adnams
SELECT REPLACE(‘jack’,'j’,'b’) FROM dual; back
SELECT TRANSLATE(‘jack’,'j’,'b’) FROM dual; back
SELECT ename FROM emp WHERE soundex(ename)=soundex(‘smith’); SMITH
• 四舍五入:ROUND(数据,[保留几位小数,不写表示不保留小数,正数为保留小数点后几位,负数表示保留小数点左起几位])
• 舍弃小数:TRUNC(数据)
• 取模(余数):MOD(被除数,除数)
去掉全部的小数点 SELECT ROUND(789.34567) FROM dual ; 789
指定保留位数 SELECT ROUND(789.34567,2) FROM dual ; 789.35
指定位数为负数 SELECT ROUND(789.34567,-2) FROM dual ; 800
• MONTHS_BETWEEN():求出两个日期间的月数
• ADD_MONTHS():一个日期上加上指定月数之后的日期
• NEXT_DAY():表示下一个的今天的具体日期,第二个参数为星期,如果是英文版本,则采用’monday’等
• LAST_DAY():求出给定日期所在月的最后一天
注意:
• 日期 – 数字 = 日期
• 日期 + 数字 = 日期
• 日期 – 日期 = 数字(天数)
获得系统当前日期用sysdate
• TO_CHAR():将内容变为字符串
• TO_NUMBER():将内容变为数字
注意:(1)要把日期转换成字符串,可以指定要取出的日期的数字:
|- 年:yyyy
|- 月:mm
|- 日:dd
(2)去掉前导0加fm
(3)指定金额格式用’货币符号999,999,999’, 货币符号用L表示提取当前字符集所在国家货币符号
• NVL(字段或表达式,0)函数,如果参数1为null,将其变为0
• DECODE()函数
DECODE(列 | 表达式,匹配条件1,结果1,匹配条件2,结果2,…) ;类似于IF..ELSE语句
在Oracle中提供了以下的分组函数,供用户使用:
No. 函数 描述
1 COUNT() 求出一共有多少条记录
2 SUM() 求出一列的数据总和,基本上在数字列上使用
3 MAX() 求出最大值
4 MIN() 求出最小值
5 AVG 求出平均值
范例:求出公司每月要开支的工资总数
SELECT SUM(sal) FROM emp ;
范例:求出最高工资、最低工资
SELECT MAX(sal),MIN(sal) FROM emp ;
范例:求出公司的平均工资
SELECT AVG(sal) FROM emp ;
(1)分组函数可以单独出现,如果连同分组函数,一起查询出了其他的列,则必须放在GROUP BY 语句之中。
SELECT deptno,COUNT(*) FROM emp ; —-错误
正确的代码:
SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno ;
(2)分组统计的时候,查询结果只能包含分组条件和分组函数;
SELECT ename,deptno,COUNT(*)
FROM emp
GROUP BY deptno ;—-错误
(3)如果筛选条件中包含分组函数,则必须使用HAVING子句
错误的代码:
要求显示出平均工资大于2000的部门编号和平均工资
SELECT deptno,AVG(sal) FROM emp
WHERE AVG(sal)>2000
GROUP BY deptno ;
正确的代码:
SELECT deptno,AVG(sal) FROM emp
GROUP BY deptno HAVING AVG(sal)>2000 ;
(4)分组函数可以嵌套使用,但是嵌套之后的分组函数查询的结果中是不能包含分组条件的。
范例:各个部门的平均工资
SELECT deptno,AVG(sal) FROM emp
GROUP BY deptno ;
现在要求求出平均工资最高的工资值
SELECT deptno,MAX(AVG(sal)) FROM emp
GROUP BY deptno ;
以上的代码在操作的时候出现了错误。
SELECT MAX(AVG(sal)) FROM emp
GROUP BY deptno ;
ROWNUM是一个伪列。它本身存在于各个数据库表之中,例如,现在有如下的查询语句:
SELECT ROWNUM,empno,ename,job,sal,deptno FROM emp ;
从以上的代码中,发现前面自动进行编号。
ROWNUM的作用可以完成部分的信息读取,例如:现在就要求读取emp表中的前5条记录。
则ROWNUM的结果<=5即可。
SELECT ROWNUM,empno,ename,job,sal,deptno FROM emp WHERE ROWNUM<=5 ;
如果现在假设要想取出的是6~10条?
• 很自然的可以想到使用BETWEEN…AND完成。
SELECT ROWNUM,empno,ename,job,sal,deptno FROM emp WHERE ROWNUM BETWEEN 6 AND 10 ;
但是,以上的查询没有任何的结果。所以,如果现在假设要想完成此功能,则只能通过子查询完成,在子查询中取出前10条记录,之后再从这10条记录中取出后5条。
SELECT temp.* FROM (SELECT ROWNUM rn,empno,ename,job,sal,deptno FROM emp WHERE ROWNUM<=10) temp WHERE temp.rn>5;
2.10 dual哑元表
dual哑元表 没有表需要查询的时候 可以用它
例如:
select ‘Hello World’ from dual;
select 1+1 from dual;
查询系统时间 select sysdate from dual;