- 浏览: 172133 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
gwill_21:
dwr.xml找不到怎么办,难道要自己手写dwr.xml?痛苦 ...
DWR框架 —— 用户注册验证 -
recoba7:
MLDN魔乐科技 Oracle学习笔记 (5) -
lanni2460:
呵呵 尽管现在才看到这个 但是我真的觉得 李老师 讲的很好呢 ...
严重声明,那些恶意诋毁MLDN及李兴华老师的其他培训机构统统走开 -
chian_xxp:
只要把功能实现了,代码结构合理了,代码性能提高了,该注意的注意 ...
业务、业务、业务。。。 -
wzpbb:
密码多少啊??? 给一下啊
MLDN 魔乐科技 Oracle 学习笔记(2)
今天是周六,以往的时候我都可以在家睡大觉了,其实我还算是个比较懒的女孩子,但是我现在可是真不敢懒了,我今天把李兴华老师讲解的全部笔记都整理了下,要是别人问我“MLDN怎么样”,我现在肯定会说,MLDN真是不错,李老师真是辛苦极了,没想到过,没想到会有这样教课的老师,觉得收获太大,压力太大,但是老师说过,现在的努力马上会得到极大的收获,所以,我在坚持着。
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 子查询(重点)
子查询即在select语句中嵌套了另一个select语句;
子查询在操作中分为以下三类:
• 单列子查询:查询的结果是一个内容,一行一列
• 单行子查询:查询的结果将返回多个查询的列
• 多行子查询:查询结果返回多行多列的内容
在子查询中还存在以下三种查询的操作符号:
• IN:表示在一个指定的范围中取值
• ANY:与查询结果中的每一个内容进行匹配,使用起来有三种形式:=ANY、>ANY(大于最小的)、<ANY(小于最大的)
• ALL:分为两种:>ALL(大于最大的)、<ALL(小于最小的)
2.6 Oracle的关联查询的各种连接
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;
不能写筛选条件;
2.6.2 自然连接NATURAL JOIN(了解)
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;
2.6.3 JOIN …USING(了解)
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(字段)只能是简单列,即不能加限定词;
2.6.4 内连接INNER JOIN …ON(了解)
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 ;
2.6.5 外连接(重点)
外连接包括左外、右外、全外连接;
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;
2.7 SQL*Plus的各种操作符
下列是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
2.7.1 算术运算符(重点)
算术运算符:+、-、*、/
例如:
SELECT empno,ename,(sal+NVL(comm,0))*12 income FROM emp;
2.7.2 比较运算符(重点)
比较运算符:<、<=、>、>=、=、<>(!=)、
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 SQL*Plus的函数
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
2、 数值函数:
• 四舍五入: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
3、 日期函数:
• MONTHS_BETWEEN():求出两个日期间的月数
• ADD_MONTHS():一个日期上加上指定月数之后的日期
• NEXT_DAY():表示下一个的今天的具体日期,第二个参数为星期,如果是英文版本,则采用’monday’等
• LAST_DAY():求出给定日期所在月的最后一天
注意:
• 日期 – 数字 = 日期
• 日期 + 数字 = 日期
• 日期 – 日期 = 数字(天数)
获得系统当前日期用sysdate
4、 转换函数:
• TO_CHAR():将内容变为字符串
• TO_NUMBER():将内容变为数字
注意:(1)要把日期转换成字符串,可以指定要取出的日期的数字:
|- 年:yyyy
|- 月:mm
|- 日:dd
(2)去掉前导0加fm
(3)指定金额格式用’货币符号999,999,999’, 货币符号用L表示提取当前字符集所在国家货币符号
5、 通用函数:NVL或DECODE函数
• NVL(字段或表达式,0)函数,如果参数1为null,将其变为0
• DECODE()函数
DECODE(列 | 表达式,匹配条件1,结果1,匹配条件2,结果2,…) ;类似于IF..ELSE语句
2.8.2 分组函数(重点)
在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 ;
2.9 ROWNUM
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;
整理的笔记较多,基本上都是之前写过的,这可是我当时花了一天的时间整理完的。进今天才有机会给大家,真是对不起了,呵呵,大家加油,我也加油
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 子查询(重点)
子查询即在select语句中嵌套了另一个select语句;
子查询在操作中分为以下三类:
• 单列子查询:查询的结果是一个内容,一行一列
• 单行子查询:查询的结果将返回多个查询的列
• 多行子查询:查询结果返回多行多列的内容
在子查询中还存在以下三种查询的操作符号:
• IN:表示在一个指定的范围中取值
• ANY:与查询结果中的每一个内容进行匹配,使用起来有三种形式:=ANY、>ANY(大于最小的)、<ANY(小于最大的)
• ALL:分为两种:>ALL(大于最大的)、<ALL(小于最小的)
2.6 Oracle的关联查询的各种连接
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;
不能写筛选条件;
2.6.2 自然连接NATURAL JOIN(了解)
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;
2.6.3 JOIN …USING(了解)
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(字段)只能是简单列,即不能加限定词;
2.6.4 内连接INNER JOIN …ON(了解)
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 ;
2.6.5 外连接(重点)
外连接包括左外、右外、全外连接;
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;
2.7 SQL*Plus的各种操作符
下列是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
2.7.1 算术运算符(重点)
算术运算符:+、-、*、/
例如:
SELECT empno,ename,(sal+NVL(comm,0))*12 income FROM emp;
2.7.2 比较运算符(重点)
比较运算符:<、<=、>、>=、=、<>(!=)、
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 SQL*Plus的函数
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
2、 数值函数:
• 四舍五入: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
3、 日期函数:
• MONTHS_BETWEEN():求出两个日期间的月数
• ADD_MONTHS():一个日期上加上指定月数之后的日期
• NEXT_DAY():表示下一个的今天的具体日期,第二个参数为星期,如果是英文版本,则采用’monday’等
• LAST_DAY():求出给定日期所在月的最后一天
注意:
• 日期 – 数字 = 日期
• 日期 + 数字 = 日期
• 日期 – 日期 = 数字(天数)
获得系统当前日期用sysdate
4、 转换函数:
• TO_CHAR():将内容变为字符串
• TO_NUMBER():将内容变为数字
注意:(1)要把日期转换成字符串,可以指定要取出的日期的数字:
|- 年:yyyy
|- 月:mm
|- 日:dd
(2)去掉前导0加fm
(3)指定金额格式用’货币符号999,999,999’, 货币符号用L表示提取当前字符集所在国家货币符号
5、 通用函数:NVL或DECODE函数
• NVL(字段或表达式,0)函数,如果参数1为null,将其变为0
• DECODE()函数
DECODE(列 | 表达式,匹配条件1,结果1,匹配条件2,结果2,…) ;类似于IF..ELSE语句
2.8.2 分组函数(重点)
在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 ;
2.9 ROWNUM
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;
整理的笔记较多,基本上都是之前写过的,这可是我当时花了一天的时间整理完的。进今天才有机会给大家,真是对不起了,呵呵,大家加油,我也加油
评论
3 楼
famingyuan
2009-08-15
就是说,你做的很棒。
2 楼
zisefeiniao
2009-08-10
汗,许久没来了,啥意思啊?
1 楼
famingyuan
2009-07-30
你真是个好女孩,请原谅我这么说!
发表评论
-
本小姐回来啦 —— 超级感谢MLDN
2009-08-10 13:24 1600我又回来了!哈哈,报告一个好消息,我已经成功入职博彦科 ... -
现在开始积极的找工作
2009-07-05 19:13 1174学习差不多了,得赶在毕业前找到一个工作啊,本小姐这段时 ... -
素质教育 —— 模拟面试
2009-06-30 19:10 1043今天一天都安排了职业素质的培养,包括简历的指导、技术面 ... -
EJB实体Bean开发的复合主键映射
2009-06-29 21:36 1685复合主键的映射:在Hibernate中是通过一个主键类来完成复 ... -
EJB实体Bean开发
2009-06-29 21:33 988EJB实体Bean开发的数据库连接采用数据源连接池的方式,因此 ... -
EJB3.0
2009-06-28 14:14 1228EJB是SUN公司提出的开发 ... -
JBoss服务器配置
2009-06-25 21:21 2079哦,哦,哦,EJB的准备课程啊。 这里开发使用的是 JB ... -
Spring结合iBATIS进行开发
2009-06-25 21:19 960使用Spring管理iBATIS完全可以参照Spring+Hi ... -
ibatis开发框架
2009-06-25 21:17 1254iBATIS为一个ORMapping框架,可以帮助开发人员完成 ... -
WebService分布式开发
2009-06-24 22:23 1904WebService:用来跨语言传递数据。 数据交互是通过XM ... -
北京下雨了
2009-06-18 19:56 771上次在公交车上,听到电视里放《北京下雨了》,那么北京今天 ... -
JQuery
2009-06-10 21:03 12581、JQuery的基本语法 ... -
AJAX中使用JSON
2009-06-10 21:02 1301在Java开发中,如果要使用JSON进行开发,需要一些支持,这 ... -
AJAX框架 —— JSON基本知识
2009-06-10 21:01 941我真想知道这年头到底有多少种框架。 1、JSON ... -
还应该多帮助同学,才能让自己进步快
2009-06-08 21:57 987今天对于本小姐来讲还真是相对轻松的一天啊,上周完成了任 ... -
业务、业务、业务。。。
2009-06-03 18:41 1142项目就是业务,项目中都是业务,技术就这么点东西,只要把 ... -
IBM Project 继续中ing....
2009-06-02 19:08 872项目就是要坚持的做下去,而且要想到做到最好,虽然框架很好 ... -
实际开发了
2009-06-01 18:17 877今天开始新的项目了,项目老师帮我们搭建好了SVN服务器, ... -
web学习笔记 —— 数据源
2009-05-31 19:56 1019使用数据源可以提升数据库的操作性能,当然,不管使用与否,对于程 ... -
SSH(Spring + Struts + Hibernate)
2009-05-31 19:47 2488Spring结合Hibernate ...
相关推荐
2011 MLDN李兴华oracle课堂笔记
【标题】:“北京MLDN 李兴华JSP笔记”是李兴华老师关于JavaWeb技术,特别是JSP(JavaServer Pages)的详实学习资料,由MLDN( Multimedia Learning and Development Network,多媒体学习与发展网络)发布。这份笔记...
文档包含内容主要有两部分:一部分是Oracle 10G安装和配置(一个Word文档),另一部分是2011版魔乐MLDN李兴华老师的Oracle上课笔记,共计4个文档,内容和视频教程内容一致,视频内容可以再电驴上下载。
【标题】"2011MLDN李兴华Oracle课堂笔记PDF档" 是一份由学习者根据李兴华老师的Oracle教学视频截屏整理而成的学习资料,具有极高的实用价值。李兴华老师在IT行业内以其深入浅出的Oracle教学而闻名,这份笔记几乎与他...
最近在学ORACLE,总之这一套下来oracle入门是肯定没问题的了....与视频同时服用效果更佳!! 本资料共包含以下附件: MLDN李兴华Oracle笔记 带书签版.pdf
【李兴华笔记】系列是针对Java学习的一套宝贵资料,主要由多个PDF文档组成,包括笔记011至笔记019。这些笔记详细涵盖了Java编程语言的基础知识和高级特性,适合初学者以及有一定经验的开发者进行复习和提升。以下是...
2011MLDN李兴华Oracle课堂笔记(高清视频截屏版),100%与李老师的文档一样,不会差一个字,是我上班的时候看视频截屏下来的,但是几乎看不出是截屏,现在网络上面还没有李老师的原版文档,为了大家不在辛苦去找,我才...
是在李老师同学那里拷过来的,李老师的原版<2011MLDN李兴华Oracle课堂笔记>,不用资源分,不是冒充的,下来看看到底是不是真的,因为太多人用2009版的冒充2011版的,实在看不下去了,就给把原版几经周折弄出来了。...
这份笔记由李兴华整理,涵盖了Oracle和MySQL的相关知识点,以下是对其中部分关键知识点的详细解读: ### Oracle数据库 #### 1. Oracle的简介与历史 - **Oracle的起源**:Oracle公司成立于1977年,由Larry Ellison...
从给定文件内容中可以提炼出以下Oracle以及软件开发相关的知识点: 1. Oracle安装及配置:这是一切Oracle学习的基础,需要掌握如何在不同操作系统上安装Oracle数据库,并进行基本的配置工作,包括环境变量的设置,...
《李兴华核心技术笔记》通过深入浅出的方式,将复杂的Java技术体系进行了细致的剖析,为初学者和进阶者提供了一条清晰的学习路径。通过阅读这些笔记,读者不仅可以掌握Java编程的基础,还能了解到一些高级特性和实战...
《MLDN 李兴华 魔乐科技网上最全笔记》是一份集大成的Java学习资源,由知名IT教育机构魔乐科技的李兴华老师精心编撰。这份笔记覆盖了Java技术的三大核心领域:JavaSE(标准版)、Oracle数据库管理和JavaEE(企业版)...
《MLDN李兴华13天Java培训配套笔记Word版》是魔乐科技(MLDN)知名讲师李兴华的Java编程教学课程的精华总结,旨在帮助学员深入理解和掌握Java编程语言。虽然缺少第一天的内容,但这个笔记集合包含了从第二天到第十三...
《mldn的李兴华Oracle笔记》是一份详尽且深入的学习资料,它涵盖了Oracle数据库系统的各个方面,适合对Oracle技术感兴趣的初学者以及有经验的DBA进行学习和参考。李兴华,作为一位在IT业界知名的Oracle专家,他的...