Oracle数据库之第一篇

1 : Oracle 简介 : 是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器IP,端口,用户名、密码,点击:连接
    (CLIENT/SERVER)或B/S体系结构的数据之一.
    
    2 : Oracle数据库的体系结构:
        数据库: database
            Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF,控制文件,联机日志,参数文件).其实Orcale数据库的概念和其他数据不一样,这里的数据库是一个操作系统只有一个库.可以
            看做是Orcale就只有一个大数据库.
        例如 :一个Oracle实例有一系列的后台进程和内存结构组成.一个数据库可以有n个实例.
        
        数据文件(dbf) :
            数据文件是数据库的物理存储单位.数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中.而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间.
            一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行.
        
        表空间 :
            表空间是Oracle对物理数据库上相关数据文件(ORA或者DBF文件)的逻辑映射.一个数据库再逻辑上被划分成一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构.每个数据库至少有一个表
            空间(称之为system表空间).
        
            每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile).一个数据文件只能属于一个表空间.
        
        用户 :
            用户是在实例下建立的.不同实例中可以建相同名字的用户.表的数据,是用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中.
                
            由于oracle的数据库不是普通的概念,oracle是有用户和表空间对数据进行管理和存放的.但是表不是有表空间去查询的,而是由用户去查的.因为不同用户可以在同一个表空间建立同一个名字的表,表里区分就是用户了.
            
        
        Oracle 应用开发实战
        一、Oracle 的基本概念和安装
         Oracle 简介
        ORACLE 数据库系统是美国ORACLE 公司(甲骨文)提供的以分布式数据库为核心的一
        组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S 体系结构的数据库之一。
        比如SilverStream 就是基于数据库的一种中间件。ORACLE 数据库是目前世界上使用最为广
        泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个
        关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。但它
        的所有知识,只要在一种机型上学习了ORACLE 知识,便能在各种类型的机器上使用它。
         Oracle10g 的安装
        1. 解压oracle 数据库安装包,如果是win7 或者win8 系统右键点击setup.exe 选择兼容性,
        以xp 方式,并且以管理员方式运行,以及其他所有用户都按着此规则如图
        
        2. 如果是xp 系统可以直接并双击解压目录下的setup.exe,出现安装界面,如下:
        3. 输入口令和确认口令,如:baidu,点击下一步,出现如下进度条,
        注:此口令即是管理员密码。
        11
        4. 检查先决条件,选中红框所示的选择框,如下图:
        5. 点击“下一步”,出现“概要”界面,点击“安装”。
        11
        6. 出现安装进度条,等待安装完成,如下图:
        7. 安装完成后,自动运行配置向导,如下图,等待其完成:
        8. 完成后,出现“口令管理”界面,点击“口令管理”,如下图:
        11
        9. 将SCOTT 和HR 用户的沟去掉(解锁这两个账户),如下图所示,点击“确定”:
        10. 回到“口令管理”界面,点击“确定”,如下图:
        11. 安装结束,点击“退出”。
        11
         虚拟网卡设置
        本机和虚拟机之间能相互访问,它们的IP 段必须相同,但是本机将会连接不同的网络
        环境(比如教室、宿舍、家庭),那么本机的IP 段会产生变化就连不上虚拟机了,为了避
        免这种情况我们让本机和虚拟机之间用虚拟网卡的方式互相通信,配置方式参考如下文档:
         PLSQL Developer 客户端工具的安装
        1. 网络的测试
        参考:
        11
        2. 安装PLSQL Developer 客户端
        3. 中文乱码的处理
        二、Oracle 数据库的体系结构
         数据库:database
        Oracle 数据库是数据的物理存储。这就包括(数据文件ORA 或者DBF、
        控制文件、联机日志、参数文件)。其实Oracle 数据库的概念和其它
        数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作
        是Oracle 就只有一个大数据库。
         实例:
        11
        一个Oracle 实例(Oracle Instance)有一系列的后台进程(Backguound
        Processes)和内存结构(Memory Structures)组成。一个数据库可以有n
        个实例。
         数据文件(dbf):
        数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中
        的,真正是在某一个或者多个数据文件中。而一个表空间可以由一个
        或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据
        文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个
        数据文件,只能删除其所属于的表空间才行。
         表空间:
        表空间是Oracle 对物理数据库上相关数据文件(ORA 或者DBF 文件)
        的逻辑映射。一个数据库在逻辑上被划分成一到若干个表空间,每个
        表空间包含了在逻辑上相关联的一组结构。每个数据库至少有一个表
        空间(称之为system 表空间)。
        每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文
        件(datafile)。一个数据文件只能属于一个表空间。
         用户:
        用户是在实例下建立的。不同实例中可以建相同名字的用户。
        注: 表的数据,是有用户放入某一个表空间的,而这个表空间会随机把这
        些表数据放到一个或者多个数据文件中。
        由于oracle 的数据库不是普通的概念,oracle 是有用户和表空间对
        数据进行管理和存放的。但是表不是有表空间去查询的,而是由用户
        去查的。因为不同用户可以在同一个表空间建立同一个名字的表!这
        里区分就是用户了!
        11
         SCOTT 用户和HR 用户
        Oracle 为了让学习者更好的进行学习,在安装成功后,也创建了初始的用户,其中SCOTT
        与HR 就是初始的普通用户。这些用户下面都默认存在了表结构,我们重点掌握SCOTT 用户
        下的所有表,如下所示:
        SCOTT 用户下的表
        11
        HR 用户下的表
        11
        三、基本查询
         sql 简介
        结构化查询语言(Structured Query Language)简称SQL(发音:/ˈɛs kjuː ˈɛl/ "S-Q-L"),结构
        化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数
        据库系统;同时也是数据库脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,
        允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解
        具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构
        化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的
        灵活性和强大的功能。
         DML(数据库操作语言): 其语句包括动词INSERT,UPDATE 和DELETE。它们分别用于添
        加,修改和删除表中的行。也称为动作查询语言。
         DDL(数据库定义语言): 其语句包括动词CREATE 和DROP。在数据库中创建新表或删除
        表(CREAT TABLE 或DROP TABLE);为表加入索引等。DDL 包括许多与人数据库目录
        中获得数据有关的保留字。它也是动作查询的一部分。
         DCL(数据库控制语言):它的语句通过GRANT 或REVOKE 获得许可,确定单个用户和用户
        组对数据库对象的访问。某些RDBMS 可用GRANT 或REVOKE 控制对表单个列的访
        问。
         Select 语句的语法格式和示例
        1. 查询语法
        Select * |列名from 表名
        11
        2.别名用法
        在查询的结果列中可以使用别名
        Select 列名别名,列名别名,... from emp;
        别名中,有没有双引号的区别就在于别名中有没有特殊的符号或者关键字。
        3.消除重复的数据
        Select distinct *|列名, ... from emp;
        使用distinct 可以消除重复的行,如果查询多列的必须保证多列都重复才能去掉重复
        4. 查询中四则运算
        查询每个雇员的年薪
        select ename, sal*12 from emp;
        select ename, sal*12 income from emp;
        11
        Sql 中支持四则运算“+,-,*,/”
         什么是空值?
         空值是无效的,未指定的,未知的或不可预知的值
         空值不是空格或者0 。
        注意:*、包含null 的表达式都为null
        *、空值永远不等于空值
        11
         连接符||
        字符串连接查询
        Mysql 中实现方法:
        查询雇员编号,姓名,工作
        编号是:7369 的雇员, 姓名是:smith,工作是:clerk
        字符串的连接使用‘||’
        四、条件查询和排序
         使用where 语句对结果进行过滤
         比较运算符
        11
         其他比较运算符
         逻辑运算符
         Where 语句示例
        1. 非空和空的限制
         示例:查询每月能得到奖金的雇员
        分析:只要字段中存在内容表示不为空,如果不存在内容就是null,
        语法:列名IS NOT NULL
        为空列名IS NULL
        11
         范例:查询工资大于1500 并且有奖金领取的雇员
        分析:多个查询条件同时满足之间使用‘AND’
         范例:查询工资大于1500 或者有奖金的雇员
        分析:多个查询条件或满足,条件之间使用“OR”
         范例:查询工资不大于1500 和没有奖金的人
        语法:NOT(查询条件)
        2.范围限制
        范例:基本工资大于1500 但是小于3000 的全部雇员
        分析:sal>1500, sal<3000
        11
        Between and 等于sal > =1500 and sal <= 3000
        范例:查询1981-1-1 到1981-12-31 号入职的雇员
        分析:between and 不仅可以使用在数值之间,也可以用在日期的区间
        范例:查询雇员名字叫smith 的雇员
        在oracle 中的查询条件中查询条件的值是区分大小写的
        范例:查询雇员编号是7369,7499,7521 的雇员编号的具体信息
        如果使用之前的做法可以使用OR 关键字
        11
        实际上,此时指定了查询范围,那么sql 可以使用IN 关键字
        语法: 列名IN (值1,值2,....)
        列名NOT IN (值1, 值2,...)
        其中的值不仅可以是数值类型也可以是字符串
        范例:查询雇员姓名是’SMITH’,’ALLEN’,’WARD’的雇员具体信息
        3.模糊查询
        在常用的站点中经常会有模糊查询,即:输入一个关键字,把符合的内容全部的查询出
        来,在sql 中使用LIKE 语句完成。
        在LIKE 中主要使用以下两种通配符
        “%”:可以匹配任意长度的内容
        “_”:可以匹配一个长度的内容
        范例:查询出所有雇员姓名中第二个字符包含“M”的雇员
        在LIKE 中如果没有关键字表示查询全部
        11
        查询名字中带有“M”的雇员
        在oracle 中不等号的用法可以有两种形式“<>”和“!=”
        范例:查询雇员编号不是7369 的雇员信息
        11
         使用order by 对结果排序
        1.排序的语法
        在sql 中可以使用ORDER BY 对查询结果进行排序
        语法:SELECT * |列名FROM 表名{WEHRE 查询条件} ORDER BY 列名1 ASC|DESC,列名
        2...ASC|DESC
        范例:查询雇员的工资从低到高
        分析:ORDER BY 列名默认的排序规则是升序排列,可以不指定ASC,如果按着降序排列必
        须指定DESC
        11
        如果存在多个排序字段可以用逗号分隔
        注意ORDER BY 语句要放在sql 的最后执行。
        2.排序中的空值问题
        当排序时有可能存在null 时就会产生问题,我们可以用nulls first , nulls last 来指定null 值
        显示的位置。
        --查询雇员的工资从低到高
        select * from emp order by sal nulls first;
        select * from emp order by sal desc nulls last ;
        11
        五、单行函数
         什么是SQL 的函数?
         函数的类型
         单行函数
        11
         字符函数
        示例:
        接收字符输入返回字符或者数值,dual 是伪表
        1. 字符串的连接可以使用concat 可以使用“||”建议使用“||”
        concat('hello', 'world')
        2. 字符串的截取,使用substr,第一个参数是源字符串,第二个参数是开始索引,第
        三个参数长度,开始的索引使用1 和0 效果相同
        substr('hello', 1,3)
        3. 获取字符串的长度
        length('hello')
        4. 字符串替换,第一个参数是源字符串,第二个参数被替换的字符串,第三个是替换
        11
        字符串
        replace('hello', 'l','x')
         数值函数
         日期函数
         Oracle 中的日期:
        Oracle 中的日期型数据实际含有两个值: 日期和时间。
        默认的日期格式是DD-MON-RR 。
         日期的数学运算
        在日期上加上或减去一个数字结果仍为日期
        两个日期相减返回日期之间相差的天数
        可以用数字除24
         日期函数示例
        1. 范例:查询雇员的进入公司的周数。
        分析:查询雇员进入公司的天数(sysdate – 入职日期)/7 就是周数
        11
        2. 获得两个时间段中的月数:MONTHS_BETWEEN()
        范例:查询所有雇员进入公司的月数
        3. 获得几个月后的日期:ADD_MONTHS()
        范例:求出三个月后的日期
         转换函数
        11
         TO_CHAR 函数对日期的转换
        日期的格式:
         TO_CHAR 函数对数字的转换
        数字转换的格式:
         TO_NUMBER 和TO_DATE 函数
        11
         示例:
        1. TO_CHAR:字符串转换函数
        范例:查询所有的雇员将将年月日分开,此时可以使用TO_CHAR 函数来拆分
        拆分时需要使用通配符
        年:y, 年是四位使用yyyy
        月:m, 月是两位使用mm
        日:d, 日是两位使用dd
        在结果中10 以下的月前面被被补了前导零,可以使用fm 去掉前导零
        2. TO_NUMBER:数值转换函数
        TO_NUMBER 可以把字符串转换成数值
        3. TO_DATE:日期转换函数
        TO_DATE 可以把字符串的数据转换成日期类型
        11
         通用函数
         什么是通用函数?
        这些函数适用于任何数据类型,同时也适用于空值
         常用的通用函数
         通用函数示例
        1.空值处理nvl
        范例:查询所有的雇员的年薪
        我们发现很多员工的年薪是空的,原因是很多员工的奖金是null,null 和任何数值计算都是
        null,这时我们可以使用nvl 来处理。
        11
         条件表达式
         什么是条件表达式?
        在SQL 语句中使用IF-THEN-ELSE
         实现的方式:
        CASE 表达式:SQL99 的语法,类似Basic,比较繁琐
        DECODE 函数:Oracle 自己的语法,类似Java,比较简介
         CASE 表达式
         DECODE 函数
         条件表达式示例: 根据10 号部门员工的工资,显示税率
        六、多行函数
         什么是多行函数?
        分组函数作用于一组数据,并对一组数据返回一个值。
        也叫:组函数、分组函数
        组函数会忽略空值;NVL 函数使分组函数无法忽略空值
        11
         常用的多行函数
         多行函数示例
        1.统计记录数count()
        范例:查询出所有员工的记录数
        不建议使用count(*),可以使用一个具体的列以免影响性能。
        2.最小值查询min()
        范例:查询出来员工最低工资
        3.最大值查询max()
        范例:查询出员工的最高工资
        11
        4.查询平均值avg()
        范例:查询出员工的平均工资
        5.求和函数sum()
        范例:查询出20 号部门的员工的工资总和
         分组数据
        范例:查询每个部门的人数
        11
        范例:查询出每个部门的平均工资
        范例:查询出来部门编号,和部门下的人数
        我们发现报了一个ORA-00937 的错误
        注意:
        1. 如果使用分组函数,SQL 只可以把GOURP BY 分组条件字段和分组函数查询出来,
        不能有其他字段。
        2. 如果使用分组函数,不使用GROUP BY 只可以查询出来分组函数的值
         过滤分组数据
        范例:查询出部门平均工资大于2000 的部门
        11
         WHERE 和HAVING 的区别
        最大区别在于:where 后面不能有组函数
            
练习 SQL语句 :
            /*
                 基本查询
                    select 列名|* from 表名
                */
                select * from emp;
                select emp.*,1+1 from emp;
                select 1+1 from emp where empno=7369--太麻烦
                --获取系统时间
                select sysdate from dual;
                -------------------------------------------
                /*
                  dual  虚拟表 没有实际意义 为了补全oracle数据库查询语法
                */
                --查看虚拟表
                select * from dual;
                select 1+1 from dual;
                /*
                  查询员工表中所有记录
                */
                select * from emp;
                --查询员工的编号和姓名
                select empno,ename from emp;
                --给列起别名特殊字符(#$)和数字需要使用双引号处理
                select empno as "员工编号",ename "员工姓名",job 工作 from emp;

                select empno  "员工!编号",ename "员工姓名",job 工作 from emp;

                select empno  "员工!编号",ename "员工姓名",job "工 作" from emp;

                select empno  "员工!编号",ename "员工姓名",job 123 from emp;

                select empno  "员工!编号",ename "员工姓名",job 工#作 from emp;
                --查询员工的工作 --distinct 关键字去重重复记录
                select distinct job from emp;
                --查询员工的年薪  null值参与运算结果为空
                --使用nvl函数处理空值  nvl(v1,v2) v1是被判断的数值  v1为空v2是返回值                                                --  不为空 返回v1
                select sal*12+comm from emp;
                select sal*12+nvl(comm,0) 年薪 from emp;
                --列值的拼接  员工编号7369员工姓名SMITH
                --mySql 可以用一个函数 concat实现
                --oracle数据库使用concat函数实现  oracle只支持两个参数做拼接
                select concat('员工编号',empno) from emp;
                select concat(concat('员工编号',empno),'员工姓名') from emp;--多重嵌套实现麻烦
                --oracle数据库 特有连接符 ||
                --java '员工编号'+empno+'员工姓名'+ename 
                select '员工编号: '||empno||'员工姓名: '||ename 员工简介 from emp;

                /*
                  条件查询
                      需要使用关键字 where 条件 目的是过滤出满足条件的记录
                      where 后的条件表达式
                           比较运算表达式   > < >= <=  =  != <>
                           逻辑运算        and   or   not
                           其他运算     between  and  判断区间 包含边界
                                        in      not  in  判断范围
                                        like   模糊查询   %  匹配0个或多个
                                                          _  占位一个字符
                                        is null  is not null 判断空值
                */
                ---查询员工的工作不是MANAGER的员工信息
                select * from emp where job !='MANAGER';
                select * from emp where job <>'MANAGER';
                --查询员工工作是SALESMAN 并且工资>1500的员工信息
                select * from emp where job = 'SALESMAN' and sal >1500
                select * from emp where job = 'SALESMAN' or sal >1500
                --查询员工的工资在 1500 和3000范围内
                select * from emp where sal between 1500 and 3000;--会不会提取正好1500和3000?
                --查询员工的工作 是MANAGER 或  PRESIDENT
                select * from emp where job ='MANAGER' or job = 'PRESIDENT'
                --使用in来实现
                select * from emp where job in ('MANAGER','PRESIDENT')
                --查询员工姓名包含M的员工信息
                select * from emp where ename like '%M%'
                --查询员工姓名第二位为M的员工信息
                select * from emp where ename like '_M%'
                --查询有奖金的员工信息
                select * from emp where comm is not null
                --过滤奖金为0的数据
                select * from emp where comm is not null and comm != 0
                select * from emp where comm >  0

                /*
                  根据需求对数据做排序
                     order by 列 排序类型
                          倒叙   desc
                          正序   asc  默认的 可以不写
                */
                --查询员工数据 按照工资做倒叙排序
                select * from emp order by sal desc 
                select * from emp order by sal       --默认正序
                --按照奖金倒叙排序 取第一位最高工资的
                select * from emp order by comm desc 
                --空值倒叙排序 默认在记录之上  处理null值显示记录结尾
                --nulls  last 指定空值记录 置于记录末尾
                select * from emp order by comm desc  nulls last
                select * from emp order by comm   

                /*
                  函数 
                      单行函数
                         理解概念: 针对每条记录中的数值处理 只会影响本条记录
                                    影响多少条 返回多少条  nvl()
                          数值函数
                          字符函数
                          日期函数
                          转换函数
                          通用函数
                      多行函数  聚合函数
                          理解概念: 针对表中多条记录参与运算 结果是一条记录
                         count()  统计记录数
                         sum()    求和运算
                         avg()    求平均值
                         min()    求最小值
                         max()    求最大值
                */
                /*
                  数值函数  对数值做处理的函数
                    四舍五入  round(v1,v2) v1是原始的数值,v2是保留的小数位数
                    截取      trunc(v1,v2) v1是原始的数值,v2是保留的小数位数  不做四舍五入
                    取余数   mod(v1,v2)   10%3   答案 --1
                */
                --47.628四舍五入操作
                select round(47.628) from dual;  --48 默认小数位0
                select round(47.628,0) from dual; --48
                select round(47.628,1) from dual; --47.6
                select round(47.628,2) from dual; --47.63
                select round(47.628,-1) from dual; --50 
                select round(47.628,-2) from dual; --0
                --47.628截取操作
                select trunc(47.628) from dual;  --47
                select trunc(47.628,0) from dual; --47
                select trunc(47.628,1) from dual; --47.6
                select trunc(47.628,2) from dual; --47.62
                select trunc(47.628,-1) from dual; -- 40
                select trunc(97.628,-2) from dual; --0
                --mod函数求余数
                select mod(10,3) from dual;  --1
                /*
                  字符函数  对字符串处理
                     获取字符串长度    length()
                     截取字符串       substr(v1,v2,v3) v1是原始字符串 v2是截取起始位 v3 截取的长度
                     替换字符串       replace(v1,v2,v3) v1是原始字符串 v2被替换的字符串 v3 替换后的字符
                                       替换匹配的所有字符
                     大小写转换  upper()  lower()
                        用于验证码  Xy8Yo  xy98yo  XY8YO
                */
                ---abcde
                select length('abcde') from dual;
                ---截取字符串 从0和1开始都是第一位开始截取
                select substr('abcde',0,2) from dual; --ab 
                select substr('abcde',1,2) from dual; -- ab
                select substr('abcde',-1,2) from dual; -- e
                select substr('abcde',-2,2) from dual; -- de
                --替换字符串
                select replace('hello','l','o') from dual; --heooo 
                --查询员工表中姓名为SMITH
                select * from emp where ename=upper('smith');
                select * from emp where ename=upper('SMITH');
                select * from emp where ename=upper('SmiTH');
                /*
                  通用函数
                    nvl(v1,v2) 处理空值使用  v1为空返回v2
                                             不为空是v1本身
                    nvl2(v1,v2,v3) v1是被判断的数值 不为空v2是返回值 为空v3也是返回值
                    concat(v1,v2)  只能传两个参数 做拼接使用
                */
                select nvl2(null,2,3) from dual; 
                /*
                  转换函数
                    数值和字符的转换
                    日期和字符的转换
                    转换数值 to_number('123')
                    转换字符 to_char(v1,v2) v1是被转换的数据v2是转换后的格式
                    转换日期 to_date(v1,v2) v1是被转换的字符(日期格式的字符串) v2是转换的日期格式
                */
                select to_number('123') +1 from dual;--124
                select '123'+1 from dual; --to_number 有点鸡肋
                --查询员工的工资800 9000 将工资转换成货币格式
                select to_char(sal,'$9,999,999.00') from emp;
                ---日期和字符的互换
                --查询当前日期 转换字符
                select to_char(sysdate,'yyyy-mm-dd') from dual;
                select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;--oracle数据分钟使用mi
                select to_char(sysdate,'yyyy') from dual;
                select to_char(sysdate,'mm') from dual;
                select to_char(sysdate,'dd') from dual;
                select to_char(sysdate,'day') from dual;--获取星期
                ---字符串转日期
                select to_date('2017-09-13','yyyy-mm-dd') from dual;
                select to_date('2017-09-13 11:56:56','yyyy-mm-dd hh:mi:ss') from dual;
                select to_date('2017-09-13','yyyy-mm-dd hh:mi:ss') from dual;--如果是JSP页面取日期 00:00:00 
                select to_date('2017-09-13 23:56:56','yyyy-mm-dd hh24:mi:ss') from dual;--24表明24小时制
                /*
                  日期函数
                  获取系统时间 sysdate
                  给系统增加时间 add_months(v1,v2) v1是时间,v2是增加的月数
                  获取系统时间间隔的月数  months_between(v1,v2) 两个参数都是日期
                */
                --查询3个月之后的日期
                select add_months(sysdate,3) from dual;
                --获取间隔的月数  获取员工到目前为止入职多少个月
                select months_between(sysdate,hiredate) from emp;
                --获取间隔的天数 日期和日期做运算结果为天数
                select round(sysdate-hiredate) from emp;
                /*
                  多行函数 聚合函数
                      特点是 空值记录不参与运算  忽略空值的记录
                         count()  统计记录数
                         sum()    求和运算
                         avg()    求平均值
                         min()    求最小值
                         max()    求最大值
                */
                --统计员工表记录数如果表中存在索引 三种形式效率一致 
                --          如果没有索引 使用后两种
                select count(*) from emp;  ---公认没有索引效率最低
                select count(empno) from emp;
                select count(100) from emp;
                --使用奖金列作统计
                select count(comm) from emp;  --4
                select sum(comm) from emp;  --2200
                select avg(comm) from emp;  --550
                /*
                  聚合函数搭配分组使用
                     group by 分组的列
                       分组后过滤数据使用 having
                       分组之前使用where 
                    使用规则
                       如果使用group by做分组 那么 select 语句中只能查询分组使用的列
                                               和 聚合函数
                */
                --查询每个部门的平均工资
                select deptno,avg(sal) from emp group by deptno
                --多个列作分组
                select ename,deptno,avg(sal) from emp group by deptno,ename
                --将job和部门做分组
                select job,deptno,count(*) from emp group by deptno,job
                --查询部门平均工资>2000的部门编号
                select deptno,avg(sal) from emp group by deptno having  avg(sal) >2000
                --起别名做条件  oracle不可以 mySql可以
                select deptno,avg(sal) s from emp group by deptno having  s >2000
                --mySql 和oracle都不可以
                select sal s from emp where s>1500  --条件不识别别名
                --查询部门中员工的工资大于1500的部门平均工资
                select deptno,avg(sal) from emp where sal>1500 group by deptno;
                select deptno,avg(sal) from emp  group by deptno;
                /*
                  条件表达式  if.. 处理语句  else
                  是所有sql数据库都支持的  
                  case 判断列
                    when 列值 then
                      显示值
                    when 列值 then
                      显示值
                    else
                      默认值
                  end 
                */
                --查询员工的工作 使用汉字显示  MANAGER 经理  PRESIDENT 总裁
                select case job 
                   when 'MANAGER' then
                      '经理'
                    when 'PRESIDENT' then
                      '总裁'
                    else
                      '普通员工'
                    end
                    from emp;
                --默认值不写  匹配不上显示空
                select case job 
                   when 'MANAGER' then
                      '经理'
                   when 'PRESIDENT' then
                      '总裁'
                    end
                    from emp;
                ---数据库oracle  有个特有条件表达式 decode(v1,v2,v3) v1是被判断的列,v2是等于值,v3是显示值
                select decode(job,'MANAGER','经理','PRESIDENT','总裁','普通员工') from emp;

练习2 :
        1. 查询工资大于12000的员工姓名和工资

        2. 查询员工号为176的员工的姓名和部门号

        3. 选择工资不在5000到12000的员工的姓名和工资

        4. 选择雇用时间在1998-02-01到1998-05-01之间的员工姓名,job_id和雇用时间

        5. 选择在20或50号部门工作的员工姓名和部门号

        6. 选择在1994年雇用的员工的姓名和雇用时间

        7. 选择公司中没有管理者的员工姓名及job_id

        8. 选择公司中有奖金的员工姓名,工资和奖金级别

        9. 选择员工姓名的第三个字母是a的员工姓名

        10. 选择姓名中有字母a和e的员工姓名

        11. 显示系统时间

        12. 查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)

        13. 将员工的姓名按首字母排序,并写出姓名的长度(length)

        14. 查询各员工的姓名,并显示出各员工在公司工作的月份数

        15. 查询员工的姓名,以及在公司工作的月份数(worked_month),并按月份数降序排列

        select * from employees;
        select first_name,salary from employees where salary > 12000;
        select first_name,manager_id from employees where employee_id = 176;
        select first_name,salary from employees where salary < 5000 or salary > 12000;
        select first_name,job_id,hire_date from employees where hire_date > 1998-02-01 and hire_date < 1998-05-01;
        select FIRST_NAME "名字",employee_id "员工id",hire_date "入职时间" from EMPLOYEES where hire_date between '1-2月-1998' and '1-5月-1998';
        select first_name,department_id from employees where department_id = 20 or department_id = 50;
        select first_name,hire_date from employees where hire_date between '1-1月-1994' and '31-12月-1994';
        select first_name,salary,commission_pct from employees where commission_pct is not null and commission_pct != 0;
        select first_name from employees where first_name like '__a%';
        select first_name from employees where first_name like '%a%e%' or first_name like '%e%a%';
        select employees.*,1+1 from employees;
        select sysdate from dual;
        select employee_id,first_name,salary,salary*1.2 from employees;
        select first_name,length(first_name) from employees order by substr(first_name,0,1) desc;

        select first_name,months_between(sysdate,hire_date) from employees;
        select first_name,round(months_between(sysdate,hire_date)) from employees;
        select first_name,round(months_between(sysdate,hire_date)) from employees order by round(months_between(sysdate,hire_date)) desc;
        select first_name,job_id from employees where manager_id = 0 or manager_id is null;
原文地址:https://www.cnblogs.com/haizai/p/11611710.html