OracleSQL讲义(Student)

更新时间:2024-05-10 02:30:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

ORACEL SQL课程

一、 Where is Data stored?

File DataBase 目的引出: 格式 并发 表头

二、 DBMS: DataBase Management System

RDBMS:

三、 ORACLE的体系架构

A、

架构 Architecture

以上示意图清晰地表明了Oracle的体系结构,在这里加上自己的理解加以总结如下:

Oracle由实例(instance)和数据库(database)组成 --实例:内存(SGA)和后台进程的集合,内存提供了处理的场所,而后台进程相当于工具

--数据库:包含三大文件,数据文件、控制文件和联机日志文件。

实例的组成:

SGA通用的配置中包含:共享池(shared pool),数据库缓冲区(database buffer),日志缓冲区(log buffer)。而另一些配置模式下还可以包含:大池(large pool),JAVA池(java pool),流池(stream pool)。

共享池:由库缓存(library cache,用于缓存最近使用的SQL语句和PLSQL语句)和数据字典缓存(dictionary cache,用于缓存最近使用的数据字典信息,包括表信息,列信息,权限信息)。

数据库缓冲区:用于存放最近使用的数据,待处理的数据被存放在这里,通过调用后台进程(DBWR)将处理结果持久化到数据文件或者将数据展示给用户。

日志缓冲区:存放改变了的数据,当数据库执行DML、DDL、

DCL等改变数据的操作时,ORACLE将改变后的数据缓存在这里,并由LGWR将数据写入联机日志文件。

后台进程由必选后台进程

(DBWn,LGWR,SMON,PMON,CKPT)和特殊组件后台进程(ARCn,RECO,PSPn,CJQn等)

DBWn:将数据库缓冲区中的数据改变持久化到数据文件 LGWR:将数据库日志缓冲区中的数据持久化到联机日志文件中

PMON:监控程序,回收资源

SMON:实例恢复,回收临时段,合并空闲空间 CKPT:触发DBWR将数据写入数据文件,同时更新控制文件和数据文件头。此进程非常重要,是数据库同步的保障。

数据库的组成:

数据文件:用来存储实际的数据,包括数据字典数据、用户业务数据、临时表空间中的临时数据,回退段中的回退数据 控制文件:包含数据库的结构信息 联机日志文件:包含数据库改变了的数据 详细分析如下:

B、 物理结构:(由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成)

控制文件:包含维护和验证数据库完整性的必要信息、例如:控制文件用于识别数据文件

和重做日志文件,一个数据库至少需要一个控制文件。

数据文件:存储数据的文件。

重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用。

数据恢复:一个数据库至少需要两个重做日志文件。 参数文件:定义Oracle 例程的特性,例如它包含调整SGA 中一些内存结构大小的参数 ;

归档文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。

密码文件:认证哪些用户有权限启动和关闭Oracle例程 C、逻辑结构(表空间、段、区、块)

表空间:是数据库中的基本逻辑结构,一系列数据文件的集合。

段:是对象在数据库中占用的空间

区:是为数据一次性预留的一个较大的存储空间 块:ORACLE最基本的存储单位,在建立数据库的时候指定

D、内存分配(SGA和PGA)

SGA:是用于存储数据库信息的内存区,该信息为数据库

进程所共享。

它包含Oracle 服务器的数据和控制信息, 它是在Oracle 服务器所驻留的计算机的实际

内存中得以分配,如果实际内存不够再往虚拟内存中写。

PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正

相反; PGA 是只被一个进程使用的区域,PGA 在创建进程时分配, 在终止进程时回收;

E、后台进程(数据写进程、日志写进程、系统监控、进程监控、检查点进程、归档进程、服务

进程、用户进程)

数据写进程:负责将更改的数据从数据库缓冲区高速缓存写入数据文件

日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件

系统监控:检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复

进程监控:负责在一个Oracle 进程失败时清理资源 检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件

和数据文件中的数据库状态信息。

归档进程:在每次日志切换时把已满的日志组进行备份或归档

用户进程:在客户端负责将用户的SQL语句传递给服务进程,并从服务器段拿回查询数据。

服务进程:用户进程服务。 F、 oracle例程:

Oracle 例程由SGA 内存结构和用于管理数据库的后台进程组成。

例程一次只能打开和使用一个数据库。例程名SID G、schema

在一个数据库中可以有多个应用的数据对象,这些不同应用的对象可以放在不同的schema

之中,同时,每一个schema对应一个用户,不同的应用 可以以不同的用户连接数据库,

这样,一个大数据库就可以根据应用把其数据对象分开来管理。

不同的schema之间它们没有直接的关系,不同的schema之间的表可以同名, 也可以互

相引用(但必须有权限),在没有操作别的schema的操作根权下,每个用户只能操作它自

己的schema下的所有的表。不同的schema下的同名的

表,可以存入不同的数据(即 schema用户自己的数据)。

H、 oracle客户端工具:toad,plsql,tora、sqlplus、sqldeveloper 四、 环境变量

三个环境变量: ORACLE_BASE ORACLE_HOME ORACLE_SID

两个路径:

DBMS DB 五、 准备环境

1、添加服务器的账户:

useradd -g javasq2 -d /home/jsq2zhangzhuo -s /bin/bash

-m jsq2zhangzhuo

passwd -d jsq2zhangzhuo 2、添加Oracle的账户:

create user javasq22 identified by javasq22 default tablespace users;

grant connect,resource to javasq2;

3、执行建表语句初始化数据库:

zhangsw>sqlplus javasq2/javasq2@orcl /home/zhangsw sql>@summit.sql

4、连接数据库: 1)、通过服务器连接: sqlplus javasq02/javasq02 sqlplus javasq02/javasq02@orcl

2)、通过window的终端(需要本地安装Oracle数据库): sqlplus javasq02/javasq02@172.19.200.101/orcl 3)、使用Oracle的客户端: Sqldeveloper

4)、通过Broswer来访问:

URL: http://192.168.0.206:7777/isqlplus 5)、Java ? JDBC ? DB IP:port:userName:password 六、 表结构:

s_emp 员工表 s_dept

部门表

s_region 区域表

s_ord 订单表 s_item

订单项表

s_customer 客户表 s_product

产品表

s_inventory 存货表[详细目录] s_warehouse 仓库表

使用两个最基本的命令帮我查看表结构: desc/describe table_name

七、 Seclet 语句的功能:

1) 选择操作 2) 投影操作

3) 连接操作(为什么一定要连接操作?) 八、 SQL分类:

数据定义语言(DDL):

create(创建)、alter(更改)、truncate(截断表)和drop(删除)命令。

数据操纵语言(DML):

select(选择)、insert(插入)、update(更新)和delete(删除) 命令。

事务控制语言(TCL):

commit(提交)、savepoint(保存点)和rollback(回滚)命令。

数据控制语言(DCL):

grant(授予)和revoke(回收)。 九、 select syntax: [语法]

--- SELECT [DISTINCT] {*, column [alias], ...} FROM

table_name;

例子1:查询当前Schema中有多少个表?

select table_name from tabs; select table_name from user_tables; tabs=user_tables

例子2:查询s_emp前三个列的内容

例子3:显示所有部门的内容? --- 使用 别名(双引号)

--- 在ORACLE当中,表示字符串用的是单引号 ''

--- 连接运算 ||

例子4:显示所有员工的全名? Select last_name,first_name from s_emp 例子5:显示所有地区的内容?

Select * from s_region;

--- 算术表达式(Arithmetic Expressions) 例子6:列出每个员工的年薪?

--- NULL值:算术表达式包含空值,则结果为空 --- NVL 用法:用来把一个NULL值转换成实际的值 Nvl(commission_pct,0) 让null变成实际的值

例子7:列出每个员工的总工资?

--- distinct的工作模式:从distinct之后到from之前全部唯一

例子8:列出各部门有什么不同的职位? Select distinct dept_id,title from s_emp

选择操作和投影操作已经完成。 十、 限定查询:

--- SELECT [DISTINCT] FROM table_name;

WHERE [Column name], [expression], [constant],

[Comparison operator]

{*, column [alias], ...}

[Literal]

例子9: 找出工资高于1500元的员工?

select id,first_name,salary from s_emp where salary > 1500;

例子10: 找出工资高于1500元的员工的年薪?

select id,first_name,salary*12 from s_emp where salary >=1500;

例子11: 找出年薪高于12000元的员工?

select id,first_name,salary*12 from s_emp where salary*12 >12000;

例子12: 找出42部门年薪高于12000元的员工? select dept_id,first_name,salary*12 from s_emp where salary*12 >12000 and dept_id = 42; 总结:

1、where尽量不使用表达式; 2、where中不能使用别名;

例子13: 找出‘Carmen’每个月的工资? select id,first_name,salary from s_emp where first_name='Carmen'或like

例子14: 把所有职位为stack clerk的员工列出? --- 逻辑比较运算符 >= = <=

--- SQL比较运算符

--- between and : 包括边界值

例子15: 找出工资在1500-2000之间的员工? Select id,first_name,salary From s_emp

Where salary >= 1500 and salary <= 2000

或where between 1500 and 2000

--- 逻辑运算符(Logical operators) and、or、not、 in、any

例子16: 找出31, 42, 43 部门的员工的工资? select id,first_name,salary from s_emp

where dept_id = 31 or dept_id = 42 or dept_id = 43

或where dept_id = any(31,42,43) 或where dept_id in (31,42,43) 如果不在的话用not in(31,42,43) 或 <>all(31,42,43) --- Like '%' '_'

例子17:找出first_name第二个字母是 e 的员工信息? select

id,first_name,salary

from

s_emp

where

first_name like '_e%';

--- 转义符 escape的使用

例子18:列出当前用户下所有以‘S_’开头的表?(escape) Escape ‘#’ ‘#’后面被转译

select table_name from tabs

where table_name like 'S#_%' escape '#'

例子19:找出入职时间是 90年的所有员工信息?

select id,first_name,start_date from s_emp

where start_date like '?'

--- 否定表达式(Negating Expressions) Logical Operators

!= <> ^= SQL Operators NOT BETWEEN NOT IN NOT LIKE IS NOT NULL

例子20:列出哪些员工没有提成?

select id,first_name,salary from s_emp where commission_pct is null

例子21:列出不在31, 42, 43 部门的员工的工资?

Select id,first_name,salary from s_emp Where dept_id not in(31,43,43)

或where dept_id ^=31 and dept_id!=43 and dept_id <>42

例子22:列出 42, 43 部门工资大于1000元的员工信息?

select id,first_name,dept_id,salary from s_emp where dept_id in(42,43) and salary > 1000 或where salary > 1000 and (dept_id =42 or Dept_id =43) 十一、

The ORDER BY Clause:(排序)

--- ASC – 升序ascending order, (default). DESC 降序– descending order.

ORDER BY clause is last in SELECT command. 例子23: 按工资降序显示员工的信息? Select id,first_name,salary from s_emp Order by salary desc 降序 一般默认是升序

例子24: 按提成升序显示员工的信息? Select id,first_name,salary from s_emp Order by commission_pct asc

注意:null(排序做无穷大处理)

例子25: 先工资降序,再按提成升序显示员工?

Select id,first_name,salary ,commission_pct from s_emp

Order by salary desc , 4 asc

例子26: 按年薪降序显示员工?

Select id,first_name,salary*12 from s_emp Order by salary*12 desc

注意: order by 后可以使用字段名、表达式、位置、别名

十二、

SQL函数

单值函数 --- 单值函数 字符相关函数: lower 转成小写 upper 转成大写

多值 函数 initcap 首字母大写,其它小写 concat 字符串拼接 substr 求子串

length 返回字符串的长度 from dual

select substr(‘hello world!’, -2,3 )from dual 例子24:列出每个员工名字的最后两个字符?

Select id,last_name ,substr(last_name,-2,2) from

s_emp

Select id,first_name,to_char(salary,’99,999,999.99’) from s_emp

数值类型函数

ROUND 四舍五入 round TRUNC 截取 trunc

例子25:

ROUND (45.923, 2) → 45.92 ROUND (45.923, 0) → 46 ROUND (45.923, -1) → 50 TRUNC (45.923, 2) → 45.92 TRUNC (45.923) → 45 TRUNC (45.923, -1) → 40 日期类型函数

--- Oracle默认的两种日期格式:'DD-MON-YY' 和 'DD-MON-RR'

--- 日期是格式敏感的。 --- 命令:

alter

session

set

nls_date_format='yyyy-mm-dd hh24:mi:ss'; 例子26:

insert into test values('23-AUG-10');

insert into test values(to_date('2010 08 23 10:10:10',

'yyyy mm dd hh24:mi:ss'));

insert into test values('2010-08-23');

例子27:按照'yyyy mm dd hh24:mi:ss'的格式,输出42部门员工的入职时间? ---处理字符串的函数:

fm: 去掉空格和前导0。 rtrim(); ltrim(); trim();

例子28:列出5月份入职的员工(first_name,start_date)?

注意:请使用多种实现方式。 --- 两位年和四位年的标识法的区别

--- 日期运算:(单位:天)

Select sysdate-1, sysdate, sysdate+1 from dual;

例子29:求10分钟之后的日期时间?

1天=24小时 1小时= 1/24天 1小时=60分钟 10分钟=1/6小时 10分钟 :1/24 * 1/6 天

select sysdate+ 1/144 from dual; --- 日期函数: ROUND TRUNC

MONTHS_BETWEEN ADD_MONTHS NEXT_DAY LAST_DAY 例子31: Select

sysdate,sysdate+1,sysdate+1/(24*60),sysdate+1/(24*60*60) select

add_months(trunc(sysdate,'year'),12)-trunc(sysdate,'year') from dual计算一年的天数 今天是一年的第几天

Select to_char(sysdate,’DDD’) from dual;

求今年的第Sysdate = '25-MAY-95' 几天 ROUND(sysdate,'MONTH') ROUND(sysdate,'YEAR') TRUNC(sysdate,'MONTH') TRUNC(sysdate,'YEAR')

01-JUN-95 01-JAN-95

01-MAY-95

01-JAN-95

Sysdate = '2010 08 23 06:30:34'

TRUNC(sysdate,‘DAY') 2010 08 22 00:00:00 TRUNC(sysdate,‘DD') 2010 08 23 00:00:00 MONTHS_BETWEEN(‘01-SEP-95’,‘11-JAN-94’) 19.774194

ADD_MONTHS('11-JAN-94',6) NEXT_DAY('01-SEP-95','FRIDAY')

'11-JUL-94' '08-SEP-95'

LAST_DAY('01-SEP-95') '30-SEP-95' ※ ※

求五月份入职的员工名单

select id,first_name,start_date from s_emp

where start_date like '%MAY%' 或

select

id,first_name,

start_date,to_char(start_date,’mm’) from s_emp Where to_char(start_date, ‘mm’)=05 例子31:求出下个月的1号?

select trunc(add_months(sysdate,1),'mm') from dual

例子32:找出90年上半年入职的员工信息?

select id,first_name,start_date from s_emp 2 where round(start_date,'year') like '?' and start_date like '?';

例子33:找出四月份入职的员工;[请使用单行函数来做] --- 转换函数:

to_date('str', 'fmt'): 将字符串转成指定格式的日期 to_date('2010 08 23 10:10:10','yyyy mm dd hh24:mi:ss')

to_char(date|number, 'fmt'):将日期转字符和将数字

转字符

1) 将日期转字符

日期格式要用有效格式,格式大小写敏感: 'yyyy mm dd hh24:mi:ss'(标准日期格式) 'year'(年的全拼)

'month'(月的全拼) 'mm'(2位数字表示的月) 'day'(星期的全拼) 'dd'(2位的天)

'dy'(3位字母表示的星期) 'ddspth' (日期的序数词) 2) 将数字转字符

NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'

AMERICAN_AMERICA.US7ASCII select to_char(salary,'$99,999.99') from s_emp; select to_char(salary,'$00,000.00') from s_emp; select to_char(salary,'L00,000.00') from s_emp;

to_number():

1) 将字符串转换为数字数据类型

select to_number('123456') from dual;

select trunc(to_number('123.123'),2) from dual;

2) 十六进制进制转化为十进制的数 select to_number('ab','xx') from dual; 3) 十进制转化为十六进制的数 select to_char(32,'xxxx') from dual;

--- 嵌套单行函数:由内到外依次执行。 F3(F2(F1(column,arg1),arg2),arg3); 单行函数的总结:

a) 单行函数可以任意的嵌套

b) 可以在数字,日期,字符之间互相转换。 使用:to_char,to_date,to_number

c) dual 是一张系统提供的哑表, sysdate 表示当前的系统时间, 是一个伪列。

例子34:找出15号后入职的员工信息? 十三、

Join(连接操作)

等值连接、非等值连接、自连接、内连接、外连接(左外连接和右外连接)

内连接:核心是一定要匹配(精确匹配)上。 外连接:核心是一个都不能少。 --- 等值连接:

例子35:列出员工名字和部门名字?

Select d.id ,d.name, e.id,e.first_name from s_emp e, s_dept d where e.dept_id = d.id 注意:

一定要指定表之间的关联条件;

where 对于单表时对记录过滤; 对于多表时对笛卡尔积过滤;

例子36:列出部门号、部门名称、地区名称?

select d.id, d.name, r.name from s_dept d, s_region r

where d.region_id = r.id

例子37:列出亚洲地区有多少个部门?

select d.id, d.name from s_dept d, s_region r where d.region_id = r.id and r.name = 'Asia' 例子38:列出‘Carmen’在哪个地区上班? Select e.first_name, d.name, r.name From s_emp e, s_dept d, s_region r Where e.first_name = ‘Carmen’ And e.dept_id = d.id And d.region_id = r.id

例子39:列出亚洲地区有多少员工?

select e.id, e.first_name, e.salary, r.name from s_emp e, s_region r, s_dept d where r.name = 'Asia' and e.dept_id = d.id and d.region_id = r.id

例子40:列出亚洲地区营销部门有那些员工?

select e.id,e.first_name,e.salary,r.name from

s_emp e,s_region r,s_dept d where r.name = 'Asia'and e.dept_id=d.id

and d.region_id =r.id and d.name='Sales' --- 非等值连接:

例子41:找出营销部门工资在1500-2000之间的员工?

select e.id,e.first_name,d.name, e.salary from s_emp e, s_dept d

where e.salary > 1500 and e.salary < 2000 and d.name = 'Sales' and e.dept_id = d.id

--- 自连接:

例子42:列出员工名称和领导名称的对应关系? e.manager_id = m.id

例子43:‘Mark’的领导是谁?

Select e.first_name,m.first_name, e.manager_id,m.id from s_emp e, s_emp m

WHERE e.first_name = 'Mark' and e.manager_id = m.id

例子44:‘Carmen’是谁的领导?

select e.first_name,m.first_name, e.manager_id,m.id from s_emp e, s_emp m

where m.first_name = 'Carmen' and e.manager_id = m.id

例子45:请问哪些员工是领导? --- 外连接:

分析外连接的含义: from t1,t2

where t1.c1 = t2.c2; (inner join)

from t1,t2

where t1.c1 = t2.c2(+);(outer join)

把t1表中的匹配不到的记录重新找回来。(一个都不能少)

在t2表中虚拟一条空记录,所有的字段都为null。 结果集:outer join = inner join + 不匹配记录 外连接的思路:(+)放在什么位置上?

(+)在哪边 哪边就是虚拟一个空记录

指导思想就是确定哪个表的全部记录要找出来? 例子46:列出员工和领导的对应关系,包含‘Carmen’?

select e.first_name employee,

nvl(m.first_name,'Boss') manager

from s_emp e, s_emp m where e.manager_id(+) = m.id; 结果集:41 = 24 +(25 - 8)

41 = 24 +17

例子47:列出哪些人是员工?(或者)哪些员工不是领导?、 Select

e.id,e.first_name,m.id,m.first_name

from

s_emp e,s_emp m

Where m.id=e.manager_id(+) And e.first_name is null

--- 左、右、全外连接:自然连接:id=id 就是同名字段的进行连接natural join

交叉连接就是 cross join 就是 s_emp,s_dept 会形成笛卡尔积

※From s_emp,s_dept d where dept_id = d.id 和from s_emp inner join s_dept on detp_id = d.id

分析左、右、全外连接的另外一种实现方式: from t1,t2

where t1 left outer join t2 on t1.c1 = t2.c2 ;(left outer join)

和t1.c1 = t2.c2(+)一样

where t1 right outer join t2 on t1.c1 = t2.c2 ;(right outer join

和(+)t1.c1 = t2.c2一样

全连接:inner join + 左右各不匹配的 24+1+17

列出员工和领导的对应关系,包含‘Carmen’? select

e.first_name

employee,

nvl(m.first_name,'Boss') manager

from s_emp e left outer join s_emp m on e.manager_id = m.id;

列出哪些人是员工? select

e.first_name

employee,

nvl(m.first_name,'Boss') manager

from s_emp e right outer join s_emp m on e.manager_id = m.id where e.first_name is null; select

e.first_name

employee,

nvl(m.first_name,'Boss') manager

from s_emp e full outer join s_emp m on e.manager_id = m.id;

十四、 组函数

//求平均数

//求总记录数

AVG (DISTINCT|ALL|n)

COUNT (DISTINCT|ALL|expr|*) 默认对null忽略

MAX (DISTINCT|ALL|expr) MIN (DISTINCT|ALL|expr) 例子48:列出提成的平均值? 例子49:列出提成的最大值?

//求最大数 //求最小数

select max (commission_pct) from s_emp

注意:所有组函数会忽略null值,只对非空值进行处理。 例子50:求出有提成的员工个数?

select count(commission_pct) from s_emp或 select count(*) from s_emp where commission_pct is not null

例子51:求出各部门的平均工资?

Select dept_id,avg(salary) from s_emp Group by dept_id

Select first_name,max(commission_pct) From s_emp

Group by first_name或

Select dept_id,d.name,avg(salary) From s_emp,s_dept d Where dept_id = d.id Group by dept_id,d.name 部门的平均工资同时显示部门名称 例子52: 求出各职位的平均工资?

select title, avg(salary) from s_emp group by title order by 2 desc

例子53: 求出各部门不同职位的平均工资?

select d.id,title,d.name,avg(salary) from s_emp e,

s_dept d

where e.dept_id = d.id group by title,d.id,d.name order by 1 desc

例子54: 求出42部门的平均工资?(只显示平均工资) 例子55:求出42部门的平均工资?(显示部门号、平均 工资)

select dept_id,avg(salary) from s_emp where dept_id =42 GROUP by dept_id

如果select后有组函数,则select后只能出现group by后的字段

或者组函数。

例子56: 求出各部门的平均工资?

(要求显示:部门编号、部门名称(地区名称+部门名称)、平均工资) select d.id,r.name,d.name,avg(salary) from s_emp e, s_dept d,s_region r

where e.dept_id = d.id and d.region_id = r.id group by d.id,r.name,d.name

例子57: 求出平均工资高于2000的员工?

Select first_name,avg(salary) From s_emp

Group by first_name Having avg(salary) >= 2000 十五、

例子58:求出谁的工资最低?

Select first_name,salary from s_emp Where salary=(select min(salary) from S_emp)

子查询:1、放在括号里面的查询

2、先执行子查询,再执行主查询。 例子59: 求出谁的工资是750? 例子60: 谁和'Smith'做同一个职位? select first_name,title from s_emp

where title = (select title from s_emp where last_name = 'Smith')

例子61: 哪些人是员工?(子查询) 子查询

Select id,first_name From s_emp

Where id not in(select manager_id from s_emp Where manager_id is not null) Select m.id,m.first_name

From s_emp e right outer join s_emp m on e.manager_id = m.id where e.first_name is null 或select m.id,m.first_name from s_emp e,s_emp m Where e.first_name is null and e.manager_id(+) =m.id

外连接: 子查询:

--- 多列子查询:

例子62:哪些员工的工资和本部门的平均工资一致? Select dept_id,first_name,salary from s_emp Where (dept_id,salary) in (select dept_id,avg(salary) From s_emp group by dept_id )

例子63:哪些部门的平均工资比32部门的平均工资高?

select dept_id, avg(salary)from s_emp group by dept_id

having avg(salary) > (select avg(salary) from s_emp where dept_id = 32 group by dept_id)

例子64:查询和42部门员工职位相同的所有员工的姓名?

select title,first_name from s_emp where title in (select title from s_emp where dept_id=42)

例子65:找出与Carmen同部门的员工信息

select id,first_name,salary,dept_id from s_emp where dept_id=(select dept_id from s_emp where first_name='Carmen') 例子66:

找出比ben早入职的员工

select first_name,start_date from s_emp

where start_date < (select start_date from s_emp where first_name='Ben')

使用子查询:找出哪些员工在亚洲工作,并打印出全名,部门名,薪资

Select r.name,d.name,e.first_name,

※TopN 查询 1. 工资前五名的员工

Select first_name,salary from (select *from s_emp Order by salary desc)

Where rownum (把符合条件的数据重新编号)<=5 分页 Select

first_name,salary

from

(select

rownum

mynu,first_name,salay from s_emp order by salary desc) Where mynu between 5 and 10

本文来源:https://www.bwwdw.com/article/mcrg.html

Top