oracle入门之对表数据查询(二)
oracle表复杂查询
在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据,现在我们给大家介绍较为复杂的select语句
数据分组-max,min,avg,sum,count
如何显示所有员工中最高工资和最低工资
SQL>select max(sal) "最高工资",min(sal) "最低工资" from emp;
请查询最高年工资
SQL>select max(sal*13+nvl(comm,0)*13) "最高年工资",min(sal*13+nvl(comm,0)*13) "最低年工资" from emp;
显示所有员工的平均工资和工资总和
SQL>select avg(sal) "平均工资",sum(sal) "工资总和" from emp;
特别注意:avg(sal)不会把sal为null的行进行统计,因此我们要注意,如果,你希望为空值也考虑,则我们可以这样做
SQL>selec sum(sal)/count(*) from emp;
计算共有多少员工
SQL>select count(*) "共有员工" from emp;
扩展要求:
请显示工资最高的员工的名字,工作岗位
SQL>select ename,job from emp where sal=(select max(sal) from emp);
特别注意:select语句执行的顺序是从右向左执行,正好和书写的方式相反。
SQL>select ename,job from emp where sal=(select max(sal) from emp);
oracle会先执行select max(sal) from emp这个语句,得出最大工资后。再执行where条件前的语句。
请显示工资高于平均工资的员工信息
SQL>select * from emp where sal>(select avg(sal) from emp);
SQL>select * from emp where sal>(select sum(sal)/count(*) from emp);
oracle表复杂查询
group by和having子句
group by用于对查询的结果分组统计;
having子句用于限制(过滤)分组显示结果。
如何显示每个部门的平均工资和最高工资
SQL>select avg(sal) "平均工资",max(sal) "最高工资",deptno "部门编号" from emp group by deptno;
显示每个部门的每种岗位的平均工资和最低工资
SQL>select avg(sal) "平均工资",min(sal) "最低工资",job "职位",deptno "部门编号" from emp group by deptno,job order by deptno;
显示部门平均工资低于2000的部门号和它的平均工资
SQL>select avg(sal) "平均工资",deptno "部门编号" from emp group by deptno having avg(sal)<2000;
对数据分组的总结:
1、分组函数(avg...)只能出现在选择列表、having、order by子句中;
2、如果在select语句中同时包含有group by/having/order by那么他们的顺序是group by/having/order by;
3、在选择列中如果有列、表达式和分组函数,那么这些列和表达式必需有一个出现在group by子句中,否则会出错。
如select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000;
这里deptno就一定要出现在group by 中。
oracle表复杂查询--多表查询
说明:
多表查询是指基于两个和两个以上的表或是视图的查询,在实际应用中,查询单个表可能不能满足你的需求,(如显示sales部门位置和其员工的姓名),这种情况下需要使用到(dept表和emp表)
显示雇员名,雇员工资及所在的部门的名字[笛卡尔集]
规定:多表查询的条件是至少不能少于表的个数-1
注意:笛卡尔集,在多表查询的时候,如果不带任何条件,则会出现笛卡尔集,避免笛卡尔集多表查询的条件是,至少不能少于表的个数-1
SQL>select e.ename,e.sal,d.dname from emp e,dept d where d.deptno=e.deptno;
如何显示部门为10的部门名、员工名和工资
SQL>select d.dname,e.ename,e.sal,e.deptno from emp e,dept d where d.deptno=e.deptno and e.deptno=10;
显示各个员工的姓名、工资及其工资的级别
SQL>select e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;
注意:在多表查询时,不同的表中列名相同时要加表名,不同时可不加。(为增强可读性,建议都加表名或别名)
扩展要求:
显示雇员名,雇员工资及所在部门的名字,并按部门排序。
SQL>select e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno order by d.dname;
oracle表复杂查询--多表查询
自连接
自连接是指在同一张表的连接查询
显示员工的上级领导的姓名
SQL>select e2.ename from emp e1,emp e2 where e1.mgr=e2.empno;
比如显示'FORD'的上级
SQL>select e1.ename "员工姓名",e2.ename "领导姓名" from emp e1,emp e2 where e1.mgr=e2.empno and e1.ename='FORD';
扩展要求:
显示各员工的姓名和他的上级领导姓名
SQL>select e1.ename "员工姓名",e2.ename "领导姓名" from emp e1,emp e2 where e1.mgr=e2.empno;
疑惑:这里我们看到king没有显示,因为king没有上级。如果我们希望把没有上级的员工也显示出来,则需要使用到外连接。外连接包括左外连接和右外连接。此处提到外连接,后面会详细讲解。
左外连接:select 列名,.. from 表名1 left join 表名2 on 条件;
SQL>select e1.ename "员工姓名",e2.ename "直接上级领导" from emp e1 left join emp e2 on e1.mgr=e2.empno;
或者使用(+)在右边也可以实现左外连接。
SQL>select e1.ename "员工姓名",e2.ename "领导姓名" from emp e1,emp e2 where e1.mgr=e2.empno(+);
右外连接:select 列名,.. from 表名1 right join 表名2 on 条件;
SQL>select e1.ename "员工姓名",e2.ename "直接上级领导" from emp e2 right join emp e1 on e1.mgr=e2.empno;
或者使用(+)在左边也可以实现右外连接。
SQL>select e1.ename "员工姓名",e2.ename "领导姓名" from emp e1,emp e2 where e2.empno(+)=e1.mgr;
左外连接和右外连接在这里提到,后面会详细讲解。
oracle入门之对表数据查询(二)的更多相关文章
- oracle入门之对表数据查询(三)
oracle表复杂查询--子查询 什么是子查询? 子查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询. 单行子查询 单行子查询是指只返回一行数据的子查询语句. 请思考:如果显示与smit ...
- oracle入门之对表数据查询(一)
此文中用到的表是Scott用户中自带的三张表: 基本select语句 基本语法: select [distinct] *|{columnl,column2,column3..} from table ...
- oracle数据库使用之数据查询入门
1.在查询过程中使用算术表达式对数据进行运算 student表结构如下: 最后一项salary表示每个人的月薪,我现在想查询每个人的年薪: 2.使用nvl函数处理null值,向表中插入一条数据,该数据 ...
- visual studio 2013连接Oracle 11g并获取数据:(二:实现)
1.VS中新建一个winform窗体 (1)一个按钮 (2)一个数据表格视图(在里面显示得到的数据表) 2.双击按钮进入代码 (1)添加 using System.Data.OracleClient; ...
- Oracle入门之对表内容的dml操作
oracle表的管理--添加数据 使用insert语句向表中插入数据 插入数据基本语法: insert into table[(column [,column...])] values(value [ ...
- Oracle 数据库基础:数据查询与操作
SELECT uname FROM TUser WHERE uname=‘admin’ SELECT 字段名列表 FROM 表名 WHERE 条件; 在Oracle数据库中,对象是属于模式的,每个账户 ...
- oracle数据库之多表查询二
多表查询解题思路: 1.分析题目要查询的结果涉及到那几张表 2.将每张表建立关联条件,否则会产生笛卡尔积 3.分清楚查询的条件,然后使用and将条件链接 4.涉及到分组查询的需要使用聚合函数 5.分组 ...
- Git.Framework 框架随手记--ORM查询数据集合 二
一. 分组查询 在SQL中使用Group By 来对数据分组,在实际中分组中一般与聚合函数一并使用.在Git.Framework中提供了相应的分组方法 DataTable Group(T entit ...
- Windows 7下通过Excel2007连接Oracle数据库并对表查询
http://blog.csdn.net/pan_tian/article/details/8133668 1. 环境变量的设置 1.1 ORACLE_HOME环境变量的设置,我这里指向了我的Ora ...
随机推荐
- Pandas 基础(15) - date_range 和 asfreq
这一节是承接上一节的内容, 依然是基于时间的数据分析, 接下来带大家理解关于 date_range 的相关用法. 首先, 引入数据文件: import pandas as pd df = pd.rea ...
- spring cloud之Feign的使用
原始的调用客户端的方式是通过注入restTemplate的方式 restTemplate.getForObject("http://CLIENT/hello", String.cl ...
- Ubuntu 18.04.1安装IntelliJ IDEA
1.下载安装包 下载地址:https://www.jetbrains.com/idea/download/#section=linux 2.下载完成后,解压到/opt目录 .tar.gz -C /op ...
- Windows7下Jupyter Notebook使用入门
目录 一.Jupyter简介 二.Jupyter安装 2.1 python 3安装 2.2 Jupyter 安装 三.Jupyter使用示例 四.Jupyter常用命令 五.其他说明 一.Jupyte ...
- Eclipse下运行maven项目失败且Tomcat服务器也启动不了
今天遇到一个神奇的问题,在eclipse中创建一个maven项目后,Run on server 时说服务器启动失败.我以为是Eclipse配置tomcat的问题.找了一大堆没找到想要的答案!!! 我还 ...
- 如何在Ubuntu 18.04上安装Pip
一.简介: Pip是一个软件包管理系统,它简化了用Python编写的软件包(如Python包索引(PyPI)中的软件包)的安装和管理. 在Ubuntu 18.04上缺省没有安装Pip,但安装非常简单. ...
- Shovel Sale CodeForces - 899D (数位dp)
大意: n把铲子, 价格1,2,3,...n, 求有多少个二元组(x,y), 满足x+y末尾数字9的个数最多. 枚举最高位, 转化为从[1,n]中选出多少个二元组和为$x$, 枚举较小的数 若$n\g ...
- ch.ethz.ssh2.Session和com.jcraft.jsch.Session
通过Jsch连接step 1引入jar包<!-- jcraft包 --> <dependency> <groupId>com.j ...
- 【实战问题】【4】Vue写的页面在微信手机端和微信web开发者工具中都能正常显示,但是在微信pc端上显示空白
原因:pc端微信浏览器不支持es6,而代码中使用了 let . 解决:将 let 改为 var(若使用 es6 语法比较多,可以进行转换,将 es6 语法转为 es5) 参考博客: 1,h5微信页面在 ...
- Eggjs 设置跨域请求
1. 安装egg-cors npm install egg-cors --save 2.打开config/plugin.js exports.cors: { enable: true, package ...