数据库
实现数据的存储
数据的表现形态
1.瞬时态的数据
内存
2.持久态的数据
文件,数据库软件
数据库产品
Oracle sybase DB2
SQLServer MySql
Access
Oracle
Oracle软件公司创始人 Larry Ellison
中文翻译甲骨文
Oracle 圣喻神喻
Oracle产品
Oracle8
Oracle8i,Internet
Oracle9
Oracle9i
Oracle10g,Grid
Oracle11g
DBA:数据库管理员
DBMS:数据库管理系统
关系型数据库(Relationship DataBase)
1.安装Oracle
SID:数据库实例,一个数据库只有一个不能更改
提供一个学习账户scott/tiger
system/sys拥有DBA权限
2.连接使用Oracle
a.启动Oracle数据库的服务
OracleService实例名称 服务器 启动
OraclexxxxListener 监听器 启动
b.连接数据库
1.开始--—->找到Oracle程序--->SQLPLUS
打开窗口
conn userName/password 实现数据库连接
2.开始--->运行 cmd --->sqlplus
输入用户名密码
3.通过第三方软件(PlSqlDev)
输入用户名密码登录
c.与数据库交互
SQL(Structure Query Language,结构化查询语言)
分类:根据语句实现的功能不同
DQL语言:Data Query Language,数据查询语言
select 关键字
DDL语言:Data Difinition Language,数据定义语言
create/drop/alter/truncate
DML语言:Data Manipulation Language,数据操作语言
insert/delete/update
TCL语言:Transaction Control Language,事务控制语言
commit/rollback/savepoint
DCL语言:Data Control Language,数据控制语言
grant/revoke
SQL语句
1.数据在Oracle等数据库中的存在形式
以二维表的形式存储
行/记录(row,record)
列/字段(column,field)
常用命令
sqlplus清屏:host cls;
设置屏幕宽度:set linesize 200;
设置字段显示的长度:column 字段名称 format a9;
2.Oracle数据库中用来测试学习的表
emp 员工表
dept 部门表
salgrade 工资等级表
3.查询语句
查询:查询出行数据
投影:查询数据库表中的字段(列)
连接:查询出多张不同表的字段
解除scott账户的锁定
以DBA system/xxxx
alter user scott account unlock;
语法:
select [distinct] (*|字段名称,字段名称) from 表名
关键字大小写不区分
表名,字段名称大小写不区分
表中的数据是区分大小写的
1.取别名
select 字段名称 [as] 别名 from 表名
sql>select ename as name from emp;
sql>select ename name from emp;
取中文别名,以及别名中含有空格,特殊符号等
那么别名必须采用双引号
sql>select ename "姓名" from emp;
2.字符串连接
字符串拼接 采用||,oracle中用单引号来标识字符串
sql>select ename||job from emp;
3.对查询结果进行
算数运算
+-*/
sql>select sal*12 from emp;
条件查询
语法:
select [distinct] (*|字段名称,字段名称) from 表名 where 过滤条件
a.比较运算条件查询
> < = != <> 不等于
查询出名称为SMITH的员工信息
sql>select * from emp where ename = 'SMITH';
b.逻辑运算符
and or not
查询出职位是经理并且工资大于2500的员工的所有信息
sql>select * from emp where job='MANAGER' and sal>2500;
查询出职位是经理或者工资大于3000的员工的信息
sql>select * from emp where job='MANAGER' OR sal>3000;
c.between进行条件过滤
between...and..... 包括边界
between后面跟的数必须比and后面的数小
查询出工资大于等于2450并且小于等于3000的所有员工的信息
sql>select * from emp where sal between 2450 and 3000;
d.in进行条件查询
查询出职位是经理或者总裁的员工的信息
sql>select * from emp where job in('MANAGER','PRESIDENT');
e.空(is null /is not null)
查询出奖金不为空的所有人的信息
sql>select * from emp where comm is not null;
null 与任何数据做算术运算结果为null
f.like进行模糊查询
通过百分号(%)进行任意个字符的匹配
通过下划线(_)匹配一个字符
查询出所有名称中以A开始的所有人的信息
sql>select * from emp where ename like 'A%';
查询出名称中第二个字母为A的所有人的信息
sql>select * from emp where ename like '_A%';
通过转义字符来实现
查询出emp表名字中第二个字符为_的所有员工的信息
SQL> select * from emp where ename like '_\_%' escape '\';
SQL> select * from emp where ename like '_a_%' escape 'a';
escape 关键字表示字符为转义字符,
那么转义字符之后的字符原意输出
g.distinct 关键字用来去重复
distinct 关键字必须出现在select关键字之后
SQL> select distinct ename,job from emp;
h.查询结果排序
select............ order by 字段名称 asc/desc
order by 子句只能出现在select语句的最后
默认是升序排序
SQL> select * from emp where
job='MANAGER' order by sal desc;
i.绑定值
通过&变量名称
SQL> select * from emp where ename=&name;
函数
虚表 dual表:一行一列
单行函数
1.字符串函数
a.函数upper,使查询出的字符串大写显示
SQL> select upper('hello') from dual;
b.函数lower,字符串小写显示
SQL> select lower(ename) from emp;
c.函数length,获得字符串长度
SQL> select length('hello') from dual;
d.函数initcap,让单词首字符大写
SQL> select initcap('helloworld') from dual;
e.函数concat,连接两个字符串
SQL> select concat(concat('hello','world'),'hello') from dual;
f.函数s
ubstr(目标字符串,起始位置,子串长度),截取子串
SQL> select substr('hello',1,2) from dual;
注意:包括起始位置
下标从1开始
2.数字函数
a.函数floor,向下取整
SQL> select floor(3.94) from dual;
b.函数ceil,向上取整
SQL> select ceil(3.14) from dual;
c.函数round,四舍五入
SQL> select round(3.14) from dual;
d.函数trunc,截取数字
SQL> select trunc(123.456,-1) from dual;
SQL> select trunc(3.1415926,4) from dual;
3.日期函数
a.获取当前系统时间
SQL> select sysdate from dual;
b.日期+数字=日期
SQL> select sysdate+1 from dual;
在天数上进行添加,满足月份和年份自动递增
c.日期-数字=日期
SQL> select sysdate-1 from dual;
d.日期-日期=天数
SQL> select sysdate-to_date('2014-2-5','yyyy-MM-dd') from dual;
日期不能加日期
e.函数next_day(日期,星期数)
获取接下来的(即将到来的)此星期数的日期
中文环境的Oracle可以使用中文
SQL> select next_day(sysdate,'星期日') from dual;
英文环境可以用英文的星期数
如果不确定字符集环境,可以使用数字,(1-7)表示星期(日-六)
SQL> select next_day(sysdate,1) from dual;
f.函数add_months(日期,数字)
在月份上添加
SQL> select add_months(sysdate,2) from dual;
查找之前的月份
SQL> select add_months(sysdate,-2) from dual;
g.函数last_day(日期)
当前日期所在月份的最后一天日期时间
SQL> select last_day(sysdate) from dual;
h.函数months_between(日期,日期)
两个日期间隔的月份数
SQL> select months_between(sysdate,hiredate) from emp;
4.转换函数
a.函数to_date(字符串,日期显示的格式字符串),
将字符串按照某种格式转换成日期
SQL> select * from emp where hiredate = to_date('1980-12-17','yyyy-mm-dd');
SQL> select to_date('2013-01-04 1:14:59','yyyy-mm-dd hh:mi:ss') from dual;
SQL> select to_date('2013-01-04 13:14:59','yyyy-mm-dd hh24:mi:ss') from dual;
SQL> select to_date('04/03/13 13:14:59','dd/mm/yy hh24:mi:ss') from dual;
b.函数to_char(其他数据,格式字符串),
将日期转换成字符串
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
SQL> select to_char(sysdate,'dd/mm/yyyy hh24:mi:ss') from dual;
将数字转换成字符串
SQL> select to_char(1234.0,'9999.9') from dual;
c.函数to_number(字符串,数字转换的格式)
SQL> select to_number('123.4','999.9') from dual;
SQL> select to_number('¥123.4','L999.9') from dual;
SQL> select to_number('$123.4','$999.9') from dual;
5.通用函数
a.函数nvl(字段,默认值)
处理字段中的空值,字段值为空函数返回默认值
SQL> select sal+nvl(comm,0) from emp;
b.函数decode
实现分支结构
SQL
> select decode(2,1,'是1',2,'是2',3,'是3') from dual;
表的连接查询
1.内连接
特点:将两个表中有与之对应记录的数据显示
select 字段。。。 from 表1 [inner] join 表2 on 连接条件;
a.等值连接
查询出员工的名称以及所在的部门的部门名称,没有则不显示
SQL> select emp.ename,dept.dname from emp inner join dept on emp.deptno = dept.deptno;
b.非等值连接
查询出员工名称以及所对应的工资的工资等级
SQL> select emp.ename,salgrade.grade from emp join salgrade
on emp.sal between salgrade.losal and salgrade.hisal;
查询出工资等级为4的员工的姓名以及工资
select e.ename,s.grade from emp e join salgrade s
on e.sal between s.losal and s.hisal
where s.grade = 4;
c.自连接
一个表与表自身进行连接操作,字段之间有关系
查询出员工的编号以及姓名以及对应的直接领导的姓名
SQL> select e.empno,e.ename,m.ename from emp e join emp m
on e.mgr = m.empno;
2.外连接
特点:会将表中没有与之对应记录的显示
a.左外连接 left join
会将left join 左边的表(主表)中的所有记录显示,
右边的表(从表)有与左边表(主表)对应记录的显示,
没有对应匹配记录的不显示
select e.ename,d.dname from emp e left join dept d on e.deptno=d.deptno;
SQL> select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno(+);
加号对应字段的表是作为从表
b.右外连接 right join
会将right join 右边的表(主表)中的所有记录显示,
左边的表(从表)有与右边表(主表)对应记录的显示,
没有对应匹配记录的不显示
SQL> select e.ename,d.dname from emp e right join dept d on e.deptno=d.deptno;
SQL> select d.dname,e.ename from emp e join dept d on e.deptno(+)=d.deptno;
加好对应字段的表是作为从表
c.全外连接
会将所有表的所有记录都显示
SQL> select e.ename,d.dname from emp e full join dept d on d.deptno=e.deptno;
3.自然连接
natural join
连接的条件由数据库管理系统来决定
SQL> select * from emp natural join dept;
4.笛卡尔集
获得笛卡尔集
将表中的每条记录与另一个表中的所有记录进行一一匹配
笛卡尔集的总记录数:表1记录总数*表2的总记录数
SQL> select * from emp cross join dept;
组函数
求出最大值
max() 可以对所有类型数据操作
求出最小值
min() 可以对所有类型数据操作
平均值
avg() 只能对number类型数据操作
求和
sum() 只能对number类型数据操作
求记录数
count()
所有的组函数都会自动过
滤null数据
分组统计查询
group by 分组的字段
SQL> select max(sal) from emp group by deptno;
注意:
1.分组查询,查询的字段除开分组函数以外的其他字段
必须出现在group by之后作为分组条件
2.分组查询可以只查询组函数字段,建议查询字段与分组字段一致。
关于having子句
对分组查询进行条件过滤
查询出部门最高工资大于5000的部门编号以及最高工资
SQL> select deptno,max(sal) from emp
group by deptno having max(sal)>5000;
注意:
where 之后不能直接使用分组函数
having子句必须出现在group by之后,不能单独使用
子查询
查询中含有查询,将一个查询的结果作为另一个查询的条件
1.非关联子查询
a.单列子查询(子查询的结果是一行一列)
SQL> select * from emp where sal
> (select sal from emp where ename = 'SMITH');
SQL> select * from emp where job
= (select job from emp where ename='SMITH');
可以使用< > = <= >= !=
b.子查询返回多条记录
in not in
select * from emp where sal
in (select max(sal) from emp group by deptno);
注意:
使用not in 对一个查询结果包含有null值的子查询进行操作,
将会查不到任何数据
--empno 为7839的人没有 领导(mgr字段为null)
SQL> select * from emp where empno not in(select mgr from emp);
查询出所有不是领导的人
SQL> select * from emp where empno
not in(select mgr from emp where mgr is not null);
注意:
子查询返回多条记录时
可以使用
in ,
=any,与in的效果类似,会对返回结果进行一一匹配
子查询返回有空值需要处理
c.子查询返回多个字段多条记录
SQL> select * from emp where (deptno,sal)
in (select deptno,min(sal) from emp group by deptno);
2.关联子查询
涉及到主查询与子查询进行数据交换
查询出工资比本部门平均工资高的人
SQL> select * from emp out where
sal> (select avg(sal) from emp
where emp.deptno = out.deptno
group by deptno);
集合
并集,交集,差集
union all 并集
union 并集 公共数据只显示一次
intersect 交集
minus 差集 将集合中与另一个集合的交集去除
求并集(不去重复)
select job from emp where deptno=10
union all select job from emp where deptno =20;
求并集(去重复)
select job from emp where deptno=10
union select job from emp where deptno =20;
求交集
SQL> select job from emp where deptno=10
intersect
select job from emp where deptno =20;
求差集
SQL> select job from emp where deptno=20
minus select job from emp where deptno =10;
注意:集合关键字两边的select语句必须是同构的
select同构:查询的数据的种类和个数相同
4.DDL(数据定义语言)
create/drop/alter/truncate
create 创建
1.表中的数据类型
desc 查询表的结构
SQL> desc emp;
Oracle数据库中常用的数据类型
number(长度) 数字类型
number(4),number(长度,小数位数),number(7,2)
varchar2(长度) 可变长字符串
char(长度) 定长字符串
date 日期类型
blob 字节型大数据类型
clob 字符型大数据类型
2.创建表
create table 表名(
字段名称 数据类型(长度) 约束,
字段名称 数据类型(长度) 约束,
);
--创建名称为t_emp的表
SQL> create table t_emp(
id number(5) ,
name varchar2(20),
age number(3),
sex varchar2(1)
);
复制表的结构和数据
create table 表名 as select*********
--创建名称为t_emp1的表
SQL> create table t_emp1 as select empno,ename from emp;
复制表结构不复制数据
SQL> create table t_emp1 as select * from emp where 1=2;
drop删除表
drop table 表名称;
sql>drop table t_emp;
truncate 截断表
删除表中的数据,保留表结构
truncate table 表名称;
SQL> truncate table t_emp1;
alter 修改表结构
1.重命名表
sql>rename 被重命名的表 to 新名称
SQL> rename t_emp1 to tt_emp1;
2.重命名字段
alter table 表名 rename column 旧字段名 to 新名称
SQL> alter table t_emp rename column name to sname;
3.修改字段数据类型以及长度
alter table 表名 modify(字段名称 数据类型(长度));
SQL> alter table t_emp modify(sex number(2));
注意:修改数据类型与长度时
字段不能含有数据
4.添加字段
alter table 表名 add(字段名称 字段类型(长度));
SQL> alter table t_emp add(address char(20));
5.删除字段
alter table 表名 drop (字段名称)
SQL> alter table t_emp drop (age);
alter table 表名 drop column 字段名称;
SQL> alter table t_emp drop column sex;
5.DML(数据操作语言)
insert,update,delete
1.insert向表中插入数据
insert into 表名称 values(对应的所有字段的值)
SQL> insert into t_emp values(1,'xiaohei','keda');
insert into 表名称(要插入数据的字段,字段名) values(匹配的字段值);
SQL> insert into t_emp(id,sname) values(2,'xiaobai');
一次插入多条记录
SQL> insert into t_emp(id,sname) select empno,ename from emp;
2.update,修改数据
update 表名 set 字段名称=新值 where 条件限定
SQL> update t_emp set sname='aaa';
SQL> update t_emp set sname='hello' where id=1;
SQL> update t_emp set sname='www',address='keda' where
id=7369;
3.delete,删除记录
delete from 表名称 where 条件限定
sql>delete from t_emp where id = 1;
SQL>delete from t_emp where id=1 or id=3 or id=4;
注意:DML语句一定要做事务处理
6.TCL(事务控制语言)
commit 提交事务,
rollback 回滚事务 ,
savepoint 保存事务点
1.什么是事务(Transaction):
事务是数据库中操作数据的最小逻辑单元
2.四大特性 :ACID
1.原子性:
事务不可再分,要么同成功,要么同失败
2.隔离性:
会话之间在事务提交前完全隔离
3.一致性:
事务提交所有会话查询得到的是一个结果
4.持久性:
事务提交,永久生效
3.事务什么时候开始,结束
一个DML语句开始执行,事务开始
事务被提交或者回滚,事务结束
DDL语句默认自动提交事务
4.操作事务
commit 确认提交事务,当前事务中的操作应用到数据库中
rollback 回滚事务,当前事务中的操作回滚到上一次事务结束时的状态
savepoint 设置事务点
savepoint 标志
rollback to 对应标志
SQL> insert into t_emp(id,sname,address) values(3,'hello','keda');
1 row inserted
SQL> savepoint A;
Savepoint created
SQL> update t_emp set address='huoxin' where sname='a';
1 row updated
SQL> savepoint B;
Savepoint created
SQL> delete from t_emp where sname='xx';
1 row deleted
--将事务回滚到事务点A,
--事务点A之后的DML操作在当前事务提交时不会应用
SQL> rollback to A;
Rollback complete
SQL> commit;
Commit complete
一个事务结束必须提交
事务不及时提交的后果
1.事务没及时提交可以回滚
2.事务提交,事务回滚段的内容会被清空
3.事务不及时提交,
其他会话查询不到当前会话所做的操作
4.事务不提交,当前事务所持有的资源不释放
5.事务不提交,数据库中的锁(行级别/表级别)不释放
7.约束(CONSTRAINT)
约束:数据库中的一种数据检测机制
1.主键约束
保证数据库表中记录不重复,不为空
主键约束的字段不能重复,不能为空
1).列级别的主键约束
create table 表名(
字段名称 字段类型(长度) primary key,
);
--列级别的主键约束
SQL> create table t_xxx(
id number(4) primary key,
name varchar2(20)
);
2).表级别的主键约束
create table 表名(
字段名称 字段类型(长度),
字段名称 字段类型(长度),
constraints 约束名称 primary key (主键字段)
);
--表级别的主键约束
SQL> create table t_emp(
id number(4),
name varchar2(10),
constraints id_pk primary key(id)
);
违反主键约束会抛出错误
ORA-00001: 违反
唯一约束条件 (HELLO.ID_PK)
ORA-01400: 无法将 NULL 插入 ("HELLO"."T_EMP"."ID")
3).联合主键
主键约束由多个字段共同承担
create table 表名(
字段名称 字段类型(长度),
字段名称 字段类型(长度),
constraints 约束名称 primary key (主键字段,主键字段...)
);
--创建由id,name组成的联合主键
SQL> create table t_emp(
id number(4),
name char(10),
address char(20),
constraints dbl_pk primary key(id,name)
);
2.非空约束 not null
约束字段值不能为空
只有列级别的非空
create table 表名(
字段名 字段类型(长度) not null,
)
--建立非空约束
create table t_emp(
id number(4) primary key,
name char(10) not null,
address varchar2(20)
)
3.唯一约束(unique)
字段中的值唯一不能重复
1)列级别的唯一约束
create table 表名(
字段名 字段类型(长度) unique,
);
--name字段不可重复
SQL> create table t_emp (
id number(4) primary key,
name char(10) unique
);
2).表级别的唯一约束
create table 表名(
字段名 字段类型(长度),
字段名 字段类型(长度),
constraints 约束名称 unique (字段)
)
--name字段表级别约束
SQL> create table t_emp(
id number(4),
name char(10),
constraints u_k unique (name)
);
4.检查约束 check
检查输入的字段值是否符合实际客观需求
1).列级别的检查约束
create table 表名(
字段名 字段类型(长度) check (字段 值的约束),
);
SQL> create table t_emp (
id number(4),
name char(10),
age number(3) check (age between 0 and 120)
);
--设置性别的缺省并且检查约束
SQL> create table t_emp(
id number(4),
sex char(1) default 'm' check (sex in('f','m'))
);
2).表级别的检查约束
create table 表名(
字段名 字段类型(长度),
字段名 字段类型(长度),
constraints 约束名称 check (约束范围)
)
--sal字段值大于5000
SQL>create table t_emp(
id number(4),
sal number(8,2),
constraints 约束名称 check (sal >5000)
);
5.外键约束 foreign key
来体现表与表之间一对多的关系
1)列级别的外键约束
create table 表名(
外键字段名 字段类型(长度) references 被引用的表(被引用字段),
);
--建立外键字段引用另一个表的主键/唯一键
SQL> create table t_student(
id number(4) primary key,
sname char(10),
classno references t_class(cid));
2).表级别外键约束
create table 表名(
字段名 字段类型(长度),
字段名 字段类型(长度),
foreign key (字段名) references 被引用表(被引用字段)
);
--表级别外键
SQL> create table t_student(
id number(4),
cno varchar2(255),
foreign key(cno) references t_class(cid)
);
外键
字段可以表示当前表中与当前表的主键或者唯一键建立外键关联,
也可以表示与其他表的主键或者唯一键建立外键关联。
一般约束在创建表的同时创建对应约束。
在含有外键字段的表中做删除操作
删除被引用的记录
ORA-02292: 违反完整约束条件 (HELLO.SYS_C006864) - 已找到子记录
解决方式:
1.如果确认需要删除被引用的记录,
则必须先将引用该记录的所有子记录先全部删除,然后再删除父记录
2.设置外键字段级联删除
SQL> create table t_student(
id number(4) primary key ,
name char(10) ,
cno varchar2(255),
foreign key(cno) references t_class(cid)
--设置级联删除
on delete cascade);
级联删除在删除父项时会默认将对应父项的所有子记录全部删除。
3.级联置空
SQL> create table t_student(
id number(4) primary key ,
name char(10) ,
cno varchar2(255),
foreign key(cno) references t_class(cid)
--设置级联置空
on delete set null);
day1作业
查询职员表中工资大于1600的员工姓名和工资
查询职员表中员工号为7369的员工的姓名和部门号码
选择职员表中工资不在4000到5000的员工的姓名和工资
选择职员表中在20和30号部门工作的员工姓名和部门号
选择职员表中没有管理者的员工姓名及职位, 按职位排序
选择职员表中有奖金的员工姓名,工资和奖金,按工资倒序排列
选择职员表中员工姓名的第三个字母是A的员工姓名
列出部门表中的部门名字和所在城市;
显示出职员表中的不重复的岗位job
连接职员表中的职员名字、职位、薪水,列之间用逗号连接,列头显示成OUT_PUT(提示:使用连接符||、别名)
查询职员表emp中员工号、姓名、工资,以及工资提高百分之20%后的结果
查询员工的姓名和工资数,条件限定为工资数必须大于1200,并对查询结果按入职时间进行排列,早入职排在前面,晚入职排在后面。
列出部门表中除了ACCOUNT部门还有哪些部门。
day2
1.将员工的姓名按首字母排序,并列出姓名的长度(length)
2.做查询显示下面形式的结果
例如:
Dream Salary
King earns $5000 monthly but wants $15000
3.查找员工姓名的长度是5个字符的员工信息。
day3
1.使用decode函数,按照下面的条件:
JOB GRADE
PRESIDENT A
MANAGER B
ANALYST C
SALESMAN D
CLERK E
产生类似下面形式的结果
ENAME JOB GRADE
SMITH CLERK E
2.显示所有员工的姓名ename,部门号deptno和部门名称dname。
3.选择在DALLAS工作的员工的员工姓名、职位、部门编码、部门名字
4.选择所有员工的姓名ename,员工号empno,以及他的管理者mgr的姓名ename和员工号mgr,结果类似于下面的格式
employees Emp# manager Mgr#
SMITH 7369 FORD 7902
5.查询各部门员工姓名和他们所在位置,结果类似于下面的格式
Deptno Ename Loc
20 SMITH DALLAS
day4
1.查询出至少有一个员工的所有部门
2.查询出部门名称和这些部门的员工信息,同时查询出没有员工的部门
3.查询所有“CLERK"(办事员) 的姓名和部门名称,以及部门人数
4.查询出所有员工的姓名和直接上级的姓名
5.查询各job的员工工资的最大值,最小值,平均值,总和
6.选择统计各个job的员工人数(提示:对job进行分组)
7.查询员工最高工资和最低工资的差距,列名为DIFFERENCE;
8.查询各个管理者属下员工的最低工资,其中最低工资不能低于800,没有管理者的员工不计算在内
9.查询所有部门的部门名字dname,所在位置loc,员工数量和工资平均值;
10.查询和scott相同部门的员工姓名ename和雇用日期hiredate
11.查询工资比公司平均工资高的所有员工的员工号empno,姓名ename和工资sal。
12.查询和姓名中包含字母u的员工在相同部门的员工的员工号empno和姓名ename
13.查询在部门的loc为newYork的部门工作的员工的员工姓名ename,部门名称dname和岗位名称job
14.查询管理者是king的员工姓名ename和工资sal
15.显示Operations部门有哪些职位
16.各个部门中工资大于1500的员工人数
17.哪些员工的工资,高于整个公司的平均工资,列出员工的名字和工资(降序)
18.所在部门平均工资高于1500的员工名字
19.列出各个部门中工资最高的员工的信息:名字、部门号、工资
20.哪个部门的平均工资是最高的,列出部门号、平均工资