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;