Oracle学习笔记(不完整)

看李兴华老师的学习视频,做一些笔记,便于日后复习回顾。

一、Oracle简介

Oracle公司是世界上最大的软件提供商之一,与它并列的还有Microsoft和Adobe。随着Oracle的发展,它已经成为了企业办公平台的最大软件提供商之一。

Oracle中文含义为"甲骨文",在古希腊神话之中被翻译为“神谕”、“上帝的宠儿”,实际上Oracle公司起源来自于最早的IBM一个分析人员的论文——《论关系型数据库的发展》。

在Oracle数据库之中,主要经历了如下几个重要的版本:

     --Oracle 8/Oracle 8i(1CD):”i“表示的是internet,表示Oracle的开始

     --Oracle 9(3CD):属于Oracle 8i的稳定版本

     --Oracle 10g(630M):使用了网格计算的方式,提升了数据库的分布式

     --Oracle 11g(1.7G):属于Oracle 10g的稳定版本(推荐使用)

     --Oracle 12C:指的是云服务的支持

二、Orcle的安装与配置

     1、Oracle的安装

Ⅰ)下载地址:https://www.oracle.com(有两个压缩包,需要解压到一个文件夹中)

Ⅱ)点击setup.exe就可以开始安装,安装建议关闭杀毒软件和网络,如果安装出错比较麻烦 

           安装选项:安装和配置数据库

           系统类:服务器类型

           网络安全选项:单实例数据库安装

           安装类型:高级安装

           数据库版本:企业版

           安装位置:F:\app\XXXX\product\11.2.0\dbhome_1默认一般仓库

           配置类型:一般用途/事务处理

           配置选项:字符编码UTF-8编码 示例方案勾上

           方案口令:用户名密码同意统一设置为“oracleadmin”,忽略警告

           先决条件检查:出错了的话就直接忽略

           点击完成。

  本次会自动的实现数据库的创建,但是每一个数据库都要进行额外的配置。

  随后使用口令管理程序。主要操作以下的几个用户(设置经典口令):

     --超级管理员:sys/change_on_install;

     --普通管理员:system/manager;

     --普通用户:scott/tiger;

     --大数据用户(样本数据库才有):sh/sh,解锁;

这个时候表示Oracle软件安装完成,数据库也安装完成。

Ⅲ)在安装完之后,相关服务都会设置为自动启动,右键点击此电脑->管理->服务和应用程序->服务,找到Oracle相关的服务将自动改为手动(双击修改),而我们每次启动的时候只需要启动两个服务即可:

       OracleOraDb11g_home1TNSListener:是监听服务,如果要通过程序或者是不同的客户端连接Oracle数据库,此服务必须启动,否则无法连接;

       OracleServiceORCL:数据库的实例服务,它的命名标准OracleServiceSID,每当为系统增加一个数据库的时候都会自动出现一个类似的服务名称。在默认情况下,SID的名称和数据库的名称是完全一致的,在网络上使用的是SID的名字

     2、Oracle的卸载   

       Ⅰ)Oracle正常安装完成

            -- 使用Oracle提供的卸载程序

            -- 重新启动电脑,进入到安全模式(启动时按住F8)

            -- 找到系统上的对应的磁盘路径,并且删除

            -- 运行注册表命令 regedit.exe,搜索所有与oracle有关的内容,并且删除

            -- 程序启动电脑后就可以重新执行安装

Ⅱ)Oracle安装失败

            -- 重新启动电脑,进入到安全模式(启动时按住F8)

            -- 找到系统上的对应的磁盘路径,并且删除

            -- 运行注册表命令 regedit.exe,搜索所有与oracle有关的内容,并且删除

            -- 程序启动电脑后就可以重新执行安装

Ⅲ)如果以上操作不行,就需要重新安装操作系统了。

三、SQLPlus命令

记了半天忘了保存。。。改天补上把TAT

四、SQL简介&数据表分析

1、SQL简介

SQL会分为三种类型:

     DML(数据库操作语言,开发中使用的):数据库的查询与更新操作(重点)

     DDL(数据定义语言,开发前的设计):数据对象的创建(表、用户),例如CREATE、DROP、ALTER

     DCL(数据库控制语言,系统人员工作):进行权限的管理操作

2、SCOTT用户表的结构

SCOTT用户一共有四张数据表

命令一:查询一个用户下的所有表

SELECT * FROM tab;

命令二:查询一个表的结构

DESC 表名称

范例:查看dept表结构

DESC dept;

1、部门信息表:dept

No列名表类型描述
1DEPTNONUMBER(2)表示部门编号,最多由2位数字组成
2DNAMEVARCHAR2(14)表示部门名称,最多由14个字符组成(一个中文占3个字符)
3LOCVARCHAR2(13)部门位置

2、雇员信息表:emp

No列名表类型描述
1EMPNONUMBER(4)雇员编号,最多只能由4位数字组成
2ENAMEVARCHAR2(10)雇员姓名
3JOBVARCHAR2(9)雇员职位
4MGRNUMBER(4)每个雇员的领导的编号
5HIREDATEDATE雇佣日期,里面包含日期和时间
6SALNUMBER(7,2)基本工资,小数点最多只占2位,整数最多只占5位
7COMMNUMBER(7,2)佣金,一般只有销售才会有佣金的概念
8DEPTNONUMBER(2)部门编号,指的是雇员对应的部门信息

3、工资等级表:salgrade

No列名表类型描述
1GRADENUMBER工资等级
2LOSALNUMBER该等级最低工资
3HISALNUMBER该等级最高工资

                                                   GRADE      LOSAL        HISAL
                                                        -------------- -------------- ---------------          如果工资为2500,则等级为4
                                                                1              700           1200
                                                                2              1201         1400
                                                                3              1401         2000
                                                                4              2001         3000 
                                                                5              3001         9999

4、工资表:bonus(没有数据)

No列名表类型描述
1ENAMEVARCHAR2(10)雇员姓名
2JOBVARCHAR2(9)雇员职位
3SALNUMBER基本工资
4COMMNUMBER佣金

五、SQL简单查询

1、基本操作

②SELECT [DISTINCT] * | 列名称 [别名] , 列名称 [别名] ,... ①FROM 表名称 [别名] ;

在以上SQL语句中,首先执行的是FROM子句,因为必须通过FROM子句确定数据的来源。

     “||”连接效果(很少在查询出现) :

SELECT '雇员编号:'||EMPNO||',姓名:'||ENAME||',收入:'||SAL FROM EMP;

2、别名设置

出现的任何字符串都要求使用“ ' ”声明,而别名不需要做声明,直接使用即可。

SELECT '雇员编号:'||EMPNO||',姓名:'||ENAME||',收入:'||SAL INFO FROM EMP;

3、实现四则运算与字符串的连接显示

六、SQL限定查询

1、WHERE子句的使用顺序

【③控制要显示的数据列】SELECT [DISTINCT] * | 列名称 [别名] , 列名称 [别名] ,...

【①确定数据来源】FROM 表名称 [别名]

【②确定满足条件的数据行】[WHERE 过滤条件(s)];

2、各种限定查询符号的使用

2.1、关系运算符:>、<、>=、<=、<>(!=);

2.2、逻辑运算符:AND、OR、NOT;

2.3、范围运算符:BETWEEN...AND;

     查询所有在1981年雇佣的雇员

          1981-01-01:'01-1月 -81'、'01-1月 -1981';

          1981-12-31:'31-12月 -81'、'31-12月 -1981';

SELECT * FROM emp WHERE hiredate BETWEEN '01-1月 -81' AND '31-12月 -81';

2.4、谓词范围:IN、NOT IN;

SELECT * FROM emp WHERE empno IN (7369,7788,9999,7566);

SELECT * FROM emp WHERE empno NOT IN (7369,7788,9999,7566);

SELECT * FROM emp WHERE NOT empno IN (7369,7788,9999,7566);

     注意:关于NOT IN与NULL的问题

          在使用NOT IN进行范围判断的时候,如果范围里面包含有NULL,那么不会有任何的结果

SELECT * FROM emp WHERE empno IN (7369,7788,9999,7566,null);

SELECT * FROM emp WHERE empno NOT IN (7369,7788,9999,7566,null);

2.5、空判断:IS NULL、IS NOT NULL;

     查询所有有佣金的雇员信息:

SELECT * FROM emp WHERE comm IS NOT NULL;

SELECT * FROM emp WHERE NOT comm IS NULL;

2.6、模糊查询:LIKE;

     “_”:匹配任意的一位字符;

     “%”:匹配任意的零位、一位或多位字符。

SELECT * FROM emp WHERE ename  LIKE '%%';

虽然以上的代码可以查询全部数据,但是与不使用WHERE子句相比哪个更快? 不使用WHERE查询更快。

七、查询排序

当我们执行查询操作时,默认排序是看插入数据的顺序排序的。

【③控制要显示的数据列】SELECT [DISTINCT] * | 列名称 [别名] , 列名称 [别名] ,...

【①确定数据来源】FROM 表名称 [别名]

【②确定满足条件的数据行】[WHERE 过滤条件(s)]

【④针对查询结果进行排序】[ORDER BY 字段 [ASC|DESC] , 字段[ASC|DESC],...];

     ASC(默认,不写排序方法就是ASC):升序排序

     DESC:降序排序

范例:根据工资由高到低排序

SELECT * FROM emp WHERE job='SALESMAN' ORDER BY sal DESC;

范例:根据工资由高到低排序,如果工资相同就按入职年份从低到高排序。

SELECT * FROM emp ORDER BY sal DESC,hiredate ASC;

SELECT * FROM emp ORDER BY sal DESC,hiredate;

ORDER BY 子句是在SELECT子句之后执行,可以使用SELECT定义的别名。

SELECT empno,ename,sal*12 income FROM emp ORDER BY income;

八、单行函数

所谓的单行函数指的是完成某一具体功能的函数操作,例如:转大写,单行函数的格式:“返回值 函数名称(参数)”。

1、字符串函数

No.函数名称描述
1字符串 UPPER(列 | 字符串)将传入的字符串变为大写字母形式
2字符串 LOWER(列 | 字符串)将传入的字符串变为小写字母形式
3字符串 INITCAP(列 | 字符串)开头首字母大写,其他的字母全部变为小写
4数字 LENGTH(列 | 字符串)取得指定字符串的长度
5字符串 SUBSTR(开始索引,[长度])进行字符串的截取,如果没有设置长度,表示从开始索引一直截取到结尾
6字符串 REPLACE(列 | 字符串,旧内容,新内容)将指定字符串的数据以新数据替换旧数据

     1.1、转大写、小写

          Oracle提供了一个dual虚拟表

          SELECT UPPER('hello') FROM dual;

                   

登录界面往往要一个输入账号名称,这个时候用户不会去特地关注自己打的名字是不是大小写,UPPER()和LOWER()函数就可以很好的解决这一问题,就算输入的姓名是驼峰式的,也可以直接转换成大写字母形式。

          SELECT * FROM emp WHERE ename=UPPER('&inputname');

      1.2、取得字符串的长度

          SELECT LENGTH('HELLOWORLD!!!') FROM dual;

      1.3、字符串截取

          SELECT SUBSTR('helloworld',6) FROM dual;

                         

在程序之中所有的字符串的首字母的索引都是0,但是在Oracle里面所有的字符串的首字母的索引都是1,如果你设置的是0,它也会按照1的方式来进行处理

          SELECT SUBSTR('helloworld',0,5) FROM dual;          

          SELECT SUBSTR('helloworld',1,5) FROM dual; 

                   

          取每个雇员姓名的后三位字母:

          SELECT SUBSTR(ename,LENGTH(ename)-2) FROM emp;

          SELECT SUBSTR(ename,-3) FROM emp;

          此类的设置方式只有Oracle数据库才有,可以设置为负数表示从后往前

2、数值函数

No.函数名称描述
1数字 ROUND(列 | 数字 [,小数位])实现数据的四舍五入
2数字 TRUNC(列 | 数字 [,小数位])实现数据的截取
3数字 MOD(列 | 数字,列 | 数字 )求模(计算余数)

      2.1、ROUND()函数

          SELECT ROUND(789.45646813) FROM dual;

          SELECT ROUND(789.45646813,2) FROM dual;

          如果没有设置小数点的保留位数,那么会直接不保留小数位进行

                   

         小数位可以设置成负数,如果设置成负数,则表示进行整数位的四舍五入:

          SELECT ROUND(789.45,-2) FROM dual;

          SELECT ROUND(720.45,-2) FROM dual;

                                       

                   

      2.2、TRUNC()函数 

          SELECT TRUNC(789.45646813),TRUNC(789.45646813,2),TRUNC(789.45646813,-2) FROM dual;

                 

3、日期函数

      如果要想处理任何日期,那么都有一个基本的前提,必须知道当前的日期。Oracle专门提供一个伪列“SYSDATE”(SYSTIMESTAMP)。

      SELECT SYSDATE FROM dual;

      SELECT SYSTIMESTAMP FROM dual;

                 

      SELECT ename,job,sal,SYSDATE FROM emp;

                 

       SYSDATE不是emp表中的内容,但是可以查询出来,这就是伪列。SYSDATE伪列里面包含有日期时间的内容,只不过只显示了日期数据。

日期的三个操作公式:

       日期+数字=日期(表示若干天之后的日期)

       日期-数字=日期(表示若干天之前的日期)

       日期-日期=数字(天数)    

对于日期而言,由于每个月的天数是不同的,所以直接进行天数加法实现月数的计算是不准确的。

要求查询出每个雇员的编号、姓名、职位、已经被雇佣的天数:

      SELECT empno,ename,job,SYSDATE-hiredate FROM emp;

No.函数名称描述
1日期 ADD_MONTHS(列 | 日期,月数)在指定的日期上增加若干个月之后的日期
2数字 MONTHS_BETWEEN(列 | 日期,列 | 日期)返回两个日期之间的月数
3日期 LAST_DAY(列 | 日期)取得指定日期所在月的最后一天
4日期 NEXT_DAY(列 | 日期,星期X )返回下一个月指定的星期几的日期

      3.1、ADD_MONTHS()函数

      SELECT ADD_MONTHS(SYSDATE,2) FROM dual;

      3.2、综合:

            要求求出每个雇员到现在为止的雇佣年限

      例如:7698的雇员BLAKE,雇佣日期是1981-05-01,现在日期是:2019-09-03,那么雇佣年限为:34年、03月、10天。精确的日期是必须要用日期函数的。

            第一步:求出年份

                        --方式一:(日期-日期=天数)/365=年;(无法去除闰年)

                        --方式二:MONTHS_BETWEEN(SYSDATE,hiredate)/12=年;

SELECT empno,ename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) YEAR FROM emp;

            第二步:求出月份

                        这时候查询出来的是有小数点的,这些没除尽的就是月份

SELECT empno,ename,hiredate,TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) MONTHS FROM emp;

            第三步:求出天数

                        能求天数的计算操作只有一种形式“日期1-日期2=天数”

                        日期1:使用SYSDATE,表示当前的日期时间;

                        日期2:ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE,hiredate))

                        因为时间跨度太长了,所以必须回避年和月的问题。                       

SELECT empno,ename,hiredate,TRUNC(SYSDATE-ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE,hiredate))) DAYS FROM emp;

4、转换函数

No.函数名称描述
1字符串 TO_CHAR(列 | 日期 | 数字,转换格式)将日期或数字格式化为指定结构的字符串
2日期 TO_DATE(列 |字符串,转换格式)按照指定的转换格式编写字符串后将其变为日期形式
3数字 TO_NUMBER(列 |字符串)将字符串变为数字

     4.1、TO_CHAR()函数

          日期:年(yyyy)月(mm)日(dd)

          时间:时(hh、hh24)分(mi)秒(ss)

          数字:任意数字(9)、本地货币符号(L)

SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd') FROM dual;

SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd HH24:mi:ss') FROM dual;

SELECT TO_CHAR(SYSDATE,'yyyy'), TO_CHAR(SYSDATE,'mm'),TO_CHAR(SYSDATE,'dd') FROM dual;

SELECT TO_CHAR(454357687,'L999,999,999,999,999,999') FROM dual;

     4.2、TO_DATE()函数

SELECT TO_DATE('1889-10-19','YYYY-MM-DD') FROM dual;

     4.3、TO_NUMBER()函数

SELECT TO_NUMBER('1')+TO_NUMBER('2') FROM dual;

SELECT '1'+'2' FROM dual;

在Oracle里面,自动转换功能很强大,所以TO_NUMBER()这个函数的意义不大。

5、通用函数

No.函数名称

 

描述

1数字 NVL(列 | NULL,默认值)如果传入的内容是NULL,则使用默认数值处理,如果不是空则使用原始数据处理
2数据类型 DECODE(列 | 字符串 | 数值,比较内容1,显示内容1,比较内容2,显示内容2,...[,默认显示内容])设置的内容会与每一个比较内容进行比较,如果内容相同,则会使用显示内容进行输出,如果都不相同,则使用最后的默认信息输出,如果不设置默认信息,则为空。

     5.1、NVL()函数

查询出每个雇员的编号、姓名、基本工资、佣金、年薪。

SELECT empno,ename,sal,comm,(sal+comm)*12 FROM emp;

会发现没有佣金的雇员年薪了就为空了。

SELECT null+1 FROM dual;

所以为了确保计算的准确性,我们必须将null替换为默认值0

SELECT empno,ename,sal,NVL(comm,0),(sal+NVL(comm,0))*12 FROM emp;

     5.2、DECODE()函数

SELECT ename,job, DECODE(job,'CLERK','办事员','SALESMAN','销售员','MANAGER','经理','---') FROM emp;

九、多表查询

【③控制要显示的数据列】SELECT [DISTINCT] * | 列名称 [别名] , 列名称 [别名] ,...

【①确定数据来源】FROM 表名称 [别名] ,表名称 [别名]

【②确定满足条件的数据行】[WHERE 过滤条件(s)]

【④针对查询结果进行排序】[ORDER BY 字段 [ASC|DESC] , 字段[ASC|DESC],...];

将emp和dept表进行多表查询

SELECT COUNT(*) FROM emp;

SELECT COUNT(*) FROM dept;

两张表总共就18行

SELECT * FROM emp,dept;

但是查询出来居然有56行记录=emp表的14行记录*dept表的4行记录。重复了4遍。可以看到SMITH出现了四次并且每次对应的部门编号不一样,分别出现了10、20、30、40。如果按照集合的概念来讲就相当于出现了一个乘积的概念。这种积的关系在数据库中称为笛卡尔积。

想要消除笛卡尔积的影响,雇员.deptno =部门.deptno

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;

以上的代码实际上只是消除显示的笛卡尔积,而在数据库的多表查询中笛卡尔积会一直存在。

范例:要求显示每个雇员的编号、姓名、职位、工资、部门名称、部门编号

emp表:编号、姓名、职位、工资;

dept表:部门名称、部门编号;

确定已知的关联字段:

雇员与部门:emp.deptno=dept.deptno

SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc

 FROM emp e,dept d WHERE e.deptno=d.deptno;

表的连接分为两种形式:

内连接(等值连接):所有满足条件的数据都会被显示出来;

外连接(左外连接、右外连接、全外连接):控制左表与右表的数据是否

1、内连接(等值连接):

INSERT INTO emp(empno,ename,job) VALUES ('2211','zzzz','SALESMAN');

SELECT e.empno,e.ename,e.job,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno;

现在只有当满足“e.deptno=d.deptno”这个条件的内容才会显示出来,如果有内容为空则不显示(比如我创建的这个名为zzzz这个人),这就是等值连接。

2、外连接(左外连接、右外连接、全外连接):

让等值判断左右两边有一边的数据可以全部显示出来

     2.1、左外连接:字段=字段(+);

     SELECT e.empno,e.ename,e.job,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno(+);

此时全部的雇员信息可以正常显示出来了

     2.2、右外连接:字段(+)=字段;

     SELECT e.empno,e.ename,e.job,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno(+)=d.deptno;

此时全部的部门信息可以正常显示出来了

在实现外连接的过程中,强烈不建议刻意区分左还是右连接,一切以数据的查询结果之中缺少了什么数据为主

范例:查询每个雇员的姓名、职位、领导姓名

分析:

     确定要使用的数据表:

          emp表:雇员的姓名、职位

          emp表:领导姓名(雇员姓名)

     确定已知的关联字段:

          emp.mgr=memp.empno

     第一步:实现emp表的自身关联查询

     SELECT e.ename,e.job,m.empno,m.ename  FROM emp e,emp m WHERE e.mgr=m.empno(+);

十、SQL1999语法支持

     SELECT [DISTINCT] * | 列 [别名]

     FROM 表名称1

                    [CROSS JOIN 表名称2]

                    [NATURAL JOIN 表名称2]

                    [JOIN 表名称2 ON(条件) | USING (字段)]

                    [LEFT | RIGHT | FULL OUTER JOIN 表名称2]

1、交叉连接:CROSS JOIN,主要功能是产生笛卡尔积,简单的实现多表查询。

2、自然连接:NATURAL JOIN

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值