参考:http://www.hechaku.com/Oracle/oracle_tables2.html

1、使用逻辑操作符号
问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J?

SQL> select * from emp where (sal>500 or job='manager') and ename like 'J%';

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7900 JAMES CLERK 7698 03-12月-81 950 30 已用时间: 00: 00: 00.02
SQL>

2、使用order by字句 默认asc 问题:如何按照工资从低到高的顺序显示雇员的信息?

SQL> select * from emp order by sal;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10 已选择14行。 已用时间: 00: 00: 00.07
SQL>
问题:按照部门号升序而雇员的工资降序排列
SQL> select * from emp order by deptno,sal desc;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7369 SMITH CLERK 7902 17-12月-80 800 20
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7900 JAMES CLERK 7698 03-12月-81 950 30 已选择14行。 已用时间: 00: 00: 00.10
SQL> select * from emp order by sal,deptno desc; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10 已选择14行。 已用时间: 00: 00: 00.08
SQL>

3、使用列的别名排序 问题:按年薪排序 select ename, (sal+nvl(comm,0))*12 "年薪" from emp order by "年薪" asc; 备注:别名需要使用“”号圈中,英文不需要“”号

SQL> select ename,(sal+nvl(comm,0))*12 "年薪" from emp order by "年薪" asc;

ENAME            年薪
---------- ----------
SMITH 9600
JAMES 11400
ADAMS 13200
MILLER 15600
TURNER 18000
WARD 21000
ALLEN 22800
CLARK 29400
MARTIN 31800
BLAKE 34200
JONES 35700
FORD 36000
SCOTT 36000
KING 60000 已选择14行。 已用时间: 00: 00: 00.06 SQL> select ename as "姓名",(sal+nvl(comm,0))*12 "年薪" from emp order by "年薪" desc; 姓名 年薪
---------- ----------
KING 60000
FORD 36000
SCOTT 36000
JONES 35700
BLAKE 34200
MARTIN 31800
CLARK 29400
ALLEN 22800
WARD 21000
TURNER 18000
MILLER 15600
ADAMS 13200
JAMES 11400
SMITH 9600 已选择14行。 已用时间: 00: 00: 00.06
SQL>

4、聚合函数用法:max,min,avg,sum,count 问题:如何显示所有员工中最高工资和最低工资?

select max(sal),min(sal) from emp e;
最高工资那个人是谁?

    错误写法:select ename, sal from emp where sal=max(sal);

    正确写法:select ename, sal from emp where sal=(select max(sal) from emp);

    注意:select ename, max(sal) from emp;这语句执行的时候会报错,说ora-00937:非单组分组函数。因为max是分组函数,而ename不是分组函数.......

    但是select min(sal), max(sal) from emp;这句是可以执行的。因为min和max都是分组函数,就是说:如果列里面有一个分组函数,其它的都必须是分组函数,否则就出错。这是语法规定的
SQL> select max(sal),min(sal) from emp;

  MAX(SAL)   MIN(SAL)
---------- ----------
5000 800 已用时间: 00: 00: 00.01
SQL> select ename,sal from emp where sal=(select max(sal) from emp); ENAME SAL
---------- ----------
KING 5000 已用时间: 00: 00: 00.04

5、问题:如何显示所有员工的平均工资和工资总和?

select sum(e.sal), avg(e.sal)  from emp e;
    查询最高工资员工的名字,工作岗位

    select ename, job, sal from emp e where sal = (select max(sal) from emp);

    显示工资高于平均工资的员工信息

    select * from emp e where sal > (select avg(sal) from emp);
SQL> select sum(sal), avg(sal) from emp;

  SUM(SAL)   AVG(SAL)
---------- ----------
29025 2073.21429 已用时间: 00: 00: 00.02 SQL> select ename,job from emp where sal=(select max(sal) from emp); ENAME JOB
---------- ---------
KING PRESIDENT 已用时间: 00: 00: 00.01
SQL> select * from emp where sal>avg(sal);
select * from emp where sal>avg(sal)
*
第 1 行出现错误:
ORA-00934: 此处不允许使用分组函数 已用时间: 00: 00: 00.01
SQL> select * from emp where sal>(select avg(sal) from emp); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7902 FORD ANALYST 7566 03-12月-81 3000 20 已选择6行。 已用时间: 00: 00: 00.03

6、group by 和 having 子句 group by 用于对查询的结果分组统计, having 子句用于限制分组显示结果。 问题:如何显示每个部门的平均工资和最高工资?

select avg(sal), max(sal), deptno from emp group by deptno;

    (注意:这里暗藏了一点,如果你要分组查询的话,分组的字段deptno一定要出现在查询的列表里面,否则会报错。因为分组的字段都不出现的话,就没办法分组了)

    问题:显示每个部门的每种岗位的平均工资和最低工资?

    select min(sal), avg(sal), deptno, job from emp group by deptno, job;

    问题:显示平均工资低于2000的部门号和它的平均工资?

    select avg(sal), max(sal), deptno from emp group by deptno having avg(sal)< 2000;
SQL> select avg(sal),deptno from emp group by deptno;

  AVG(SAL)     DEPTNO
---------- ----------
1566.66667 30
2175 20
2916.66667 10 已用时间: 00: 00: 00.02 SQL> select min(sal),avg(sal), deptno from emp group by deptno,job; MIN(SAL) AVG(SAL) DEPTNO
---------- ---------- ----------
800 950 20
1250 1400 30
2975 2975 20
950 950 30
5000 5000 10
2850 2850 30
1300 1300 10
2450 2450 10
3000 3000 20 已选择9行。 已用时间: 00: 00: 00.04
SQL> select deptno,avg(sal) from emp group by deptno having avg(sal) < 2000; DEPTNO AVG(SAL)
---------- ----------
30 1566.66667 已用时间: 00: 00: 00.01

7、对数据分组的总结 1 分组函数只能出现在选择列表、having、order by子句中(不能出现在where中) 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中

8、多表查询 多表查询是指基于两个和两个以上的表或是视图的查询。在实际应用中,查询单个表可能不能满足你的需求,如显示sales部门位置和其员工的姓名,这种情况下需要使用到dept表和emp表。 1)、问题:显示雇员名,雇员工资及所在部门的名字【笛卡尔集】? SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno; 规定:多表查询的条件是至少不能少于表的个数N-1才能排除笛卡尔集(如果有N张表联合查询,必须得有N-1个条件,才能避免笛卡尔集合)

(六)Oracle 的 oracle表查询关键字的更多相关文章

  1. Oracle笔记 多表查询

    Oracle笔记  多表查询   本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查 ...

  2. Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询

    Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...

  3. oracle SQL多表查询

    SQL多表查询 1.集合理论 1.1 什么是集合 具有某种特定性质的事物的总体. 集合的特性:无序性.互异性.确定性. 一个集合可以小到从一个表中取出一行中的一列.              1 ro ...

  4. Oracle的多表查询

    多表查询概念: 所谓多表查询,又称表联合查询,即一条语句涉及到的表有多张,数据通过特定的连接进行联合显示. 基本语法: select column_name,.... from table1,tabl ...

  5. Oracle之多表查询

    -多表查询 1.交叉连接 select * from t_class for update; select * from t_student for update; select for update ...

  6. oracle数据库单表查询

    今天给大家分享的是关于数据库的单表查询,像单表查询/多表查询/分组查询/子查询,这些方法的使用在实际项目过程中会经常用到,作为一名合格的测试人员如果不会数据库那肯定是不行的,行走江湖可能随时会面临被侮 ...

  7. Oracle查询优化-多表查询

    --合并结果集 --1.union all UNION ALL--单纯合并 ; --2.union UNION --将重复结果集合并 ; --------------使用命令窗口执行,查看union与 ...

  8. oracle习题-emp表查询练习

    emp表查询练习 1 查询emp表的全部记录 Select * from emp; 2 查询出每个雇员的编号.姓名.基本工资 Select empno,ename,sal from emp; 3 查询 ...

  9. 9.oracle表查询关键字

    1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J? select * from emp where (sal > 500 or ...

随机推荐

  1. Python 基础知识----流程控制

    判断语句 循环语句 嵌套

  2. 一个实际的案例介绍Spring Boot + Vue 前后端分离

    介绍 最近在工作中做个新项目,后端选用Spring Boot,前端选用Vue技术.众所周知现在开发都是前后端分离,本文就将介绍一种前后端分离方式. 常规的开发方式 采用Spring Boot 开发项目 ...

  3. jmeter元素

    1 test plan functional test mode 选择项:如果勾选 jmeter 会记录从服务器返回的响应数据,如果监视器-选择了文件-则会保存到对应文件 测试jmeter是否配置正确 ...

  4. vue計算屬性

    計算屬性:computed 和method的差別:computed是基於它的依賴緩存,只有它的相關依賴發生改變時才會重新獲取值. method是在重新渲染時,函數總會重新調用. comuputed:默 ...

  5. orecal基本连接数据库简介

    整理自互联网 一. jdbc:oracle:thin:@192.168.3.98:1521:orcljdbc:表示采用jdbc方式连接数据库oracle:表示连接的是oracle数据库thin:表示连 ...

  6. Linux下 rewrite_mod 的配置

    以下使用最新的 Ubuntu 16.04 测试; 安装好apache后先确认有没有rewrite模块,大多数情况下是有的:ls /etc/apache2/mods-available |grep re ...

  7. Qt 使用openGL 渲染YUV420P格式的视频

    代码如下 YUV420P_Render.h #ifndef YUV420P_RENDER_H #define YUV420P_RENDER_H #include <QObject> #in ...

  8. 使用Java泛型返回动态类型

    返回一个指定类型的集合,并且clazz必须继承IGeoLog对象或者是其本身 <T extends IGeoLog> List<T> getLogListSql(Class&l ...

  9. kubernetes 编排详解 挂载

    ##kube挂载本地磁盘apiVersion: v1 kind: Pod metadata: name: redis spec: containers: - name: redis image: re ...

  10. POJ 3621-Sightseeing Cows-最优比率环|SPFA+二分

    最优比率环问题.二分答案,对于每一个mid,把节点的happy值归类到边上. 对于每条边,用mid×weight减去happy值,如果不存在负环,说明还可以更大. /*---------------- ...