Oracle-简单查询
Oracle的简单查询
- Oracle-简单查询
- 一、使用的表结构
- 二、使用管理员创建普通用户并授权
- 三、用创建好的普通执行表结构SQL语句
- 四、完成下面的查询语句
- 1、单表查询
- ①将所有员工的工资上浮10%.然后查询员工姓名、薪水、补助。(emp.sal为工资,emp.comm为补助)
- ②查看EMP表中部门号为10的员工的姓名,职位,参加工作时间,工资。
- ③查所有已有的职位,要求去除重复项。
- ④计算每个员工的年薪,并取列名为Salary of Year(emp.sal为员工的月薪),要求输出员工姓名,年薪。
- ⑤查询每个员工每个月拿到的总金额(emp.sal为工资,emp.comm为补助)。(提示:NVL(ex1,ex2)表示如果ex1为空则返回ex2)
- ⑥显示职位是主管(manager)的员工的姓名,工资。
- ⑦显示第3个字符为大写O的所有员工的姓名及工资。
- ⑧显示职位为销售员(SALESMAN)或主管(MANAGER)的员工的姓名,工资,职位。
- ⑨显示所有没有补助的员工的姓名。
- ⑩显示有补助的员工的姓名,工资,补助。
- ⑩①排序显示所有员工的姓名,工资(按工资降序方式)。
- ⑩②显示员工的最高工资和最低工资。
- ⑩③显示所有员工的平均工资和总计工资。
- 2、聚合查询
- 3、多表查询
- ①显示工资高于2500或岗位为MANAGER的所有员工的姓名,工资,职位,和部门号。
- ②排序显示所有员工的姓名,部门号,工资(以部门号升序,工资降序,雇用日期升序显示)。
- ③采用表连接显示部门名以及相应的员工姓名。
- ④查询SCOTT的上级领导的姓名。
- ⑤显示部门的部门名称,员工名即使部门没有员工也显示部门名称。
- 4、子查询
- ①显示所有员工的名称、工资以及工资级别。
- ②显示ACCOUNTING部门所有员工的名称,工资。
- ③显示职位属于10号部门所提供职位范围的员工的姓名,职位,工资,部门号。
- ④显示在所有员工中高于30号部门中任一个员工工资的员工的姓名,工资和部门号。
- ⑤查询比SCOTT员工的薪资高的所有雇员。
- ⑥查询和Scott在同一个部门的所有员工。
- ⑦查询薪资最低的员工的姓名。
- ⑧查询比Scott入职还要晚的员工薪资。
- 5、集合查询
一、使用的表结构
二、使用管理员创建普通用户并授权
用户名:zhangsan
密码:zhangsan
授权:connect,resource
三、用创建好的普通执行表结构SQL语句
-- 创建数据表
CREATE TABLE dept (
deptno NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
dname VARCHAR2(14) ,
loc VARCHAR2(13) ) ;
CREATE TABLE emp (
empno NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT );
CREATE TABLE bonus (
enamE VARCHAR2(10) ,
job VARCHAR2(9) ,
sal NUMBER,
comm NUMBER ) ;
CREATE TABLE salgrade (
grade NUMBER,
losal NUMBER,
hisal NUMBER );
-- 插入测试数据 —— dept
INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
INSERT INTO dept VALUES (30,'SALES','CHICAGO');
INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');
-- 插入测试数据 —— emp
INSERT INTO emp VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO emp VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO emp VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO emp VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO emp VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO emp VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO emp VALUES (7788,'SCOTT','ANALYST',7566,to_date('19-04-1987','dd-mm-yyyy')-85,3000,NULL,20);
INSERT INTO emp VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO emp VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO emp VALUES (7876,'ADAMS','CLERK',7788,to_date('23-05-1987','dd-mm-yyyy')-51,1100,NULL,20);
INSERT INTO emp VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO emp VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO emp VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
-- 插入测试数据 —— salgrade
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);
-- 事务提交
COMMIT;
四、完成下面的查询语句
1、单表查询
①将所有员工的工资上浮10%.然后查询员工姓名、薪水、补助。(emp.sal为工资,emp.comm为补助)
update emp set sal=sal*1.1;
select emp.ename 姓名,emp.sal 薪水,emp.comm 补助 from emp;
②查看EMP表中部门号为10的员工的姓名,职位,参加工作时间,工资。
select emp.ename 姓名,emp.job 职位,emp.hiredate 参加工作时间,emp.sal 工资 from emp where deptno=10;
③查所有已有的职位,要求去除重复项。
select distinct job 职位 from emp;
④计算每个员工的年薪,并取列名为Salary of Year(emp.sal为员工的月薪),要求输出员工姓名,年薪。
select emp.ename 姓名,emp.sal*12 SalaryofYear from emp;
⑤查询每个员工每个月拿到的总金额(emp.sal为工资,emp.comm为补助)。(提示:NVL(ex1,ex2)表示如果ex1为空则返回ex2)
select emp.ename 姓名,nvl(emp.sal+emp.comm,emp.sal) as 总金额 from emp;
⑥显示职位是主管(manager)的员工的姓名,工资。
select emp.ename 姓名,emp.sal 工资 from emp where emp.job='MANAGER';
⑦显示第3个字符为大写O的所有员工的姓名及工资。
select emp.ename 姓名,emp.sal 工资 from emp where emp.ename like '__O%';
扫描二维码关注公众号,回复:
10523668 查看本文章
⑧显示职位为销售员(SALESMAN)或主管(MANAGER)的员工的姓名,工资,职位。
select emp.ename 姓名,emp.sal 工资,emp.job 职位 from emp where emp.job='SALESMAN' or emp.job='MANAGER';
⑨显示所有没有补助的员工的姓名。
select emp.ename 姓名 from emp where emp.comm is null;
⑩显示有补助的员工的姓名,工资,补助。
select emp.ename 姓名,emp.sal 工资,emp.comm 补助 from emp where emp.comm is not null;
⑩①排序显示所有员工的姓名,工资(按工资降序方式)。
select emp.ename 姓名,emp.sal 工资 from emp order by emp.sal desc;
⑩②显示员工的最高工资和最低工资。
select max(sal) 最高工资,min(sal) 最低工资 from emp;
⑩③显示所有员工的平均工资和总计工资。
select avg(sal) 平均工资,sum(sal) 总计工资 from emp;
2、聚合查询
①显示每种职业的平均工资。
select job 职业,avg(sal) 平均工资 from emp group by job;
②显示每个部门每种岗位的平均工资和最高工资。
select emp.deptno 部门编号,emp.job 职位,avg(sal) 平均工资,max(sal) 最高工资 from emp group by emp.job,emp.deptno;
③显示平均工资低于2500的部门号,平均工资及最高工资。
select emp.deptno 部门编号,avg(sal) 平均工资,max(sal) 最高工资 from emp group by emp.deptno having avg(sal)<2500;
④上一条语句以平均工资升序排序。
select emp.deptno 部门编号,avg(sal) 平均工资,max(sal) 最高工资 from emp group by emp.deptno having avg(sal)<2500
order by 最高工资;
⑤18.查询总共有多少种工作。
select count(distinct job) from emp;
3、多表查询
①显示工资高于2500或岗位为MANAGER的所有员工的姓名,工资,职位,和部门号。
select emp.ename 姓名,emp.sal 工资,emp.job 职位,emp.deptno 部门编号 from emp where emp.sal>2500 or emp.job='MANAGER';
②排序显示所有员工的姓名,部门号,工资(以部门号升序,工资降序,雇用日期升序显示)。
select emp.ename 姓名,emp.sal 工资,emp.deptno 部门编号 from emp order by 部门编号,工资 desc, emp.hiredate;
③采用表连接显示部门名以及相应的员工姓名。
select dept.dname 部门名称,emp.ename 姓名 from emp inner join dept on emp.deptno=dept.deptno;
④查询SCOTT的上级领导的姓名。
select emp2.ename 姓名 from emp emp1 inner join emp emp2 on emp1.mgr=emp2.empno where emp1.ename='SCOTT';
⑤显示部门的部门名称,员工名即使部门没有员工也显示部门名称。
select dept.dname 部门名称,emp.ename 员工名 from emp inner join dept on emp.deptno=dept.deptno;
4、子查询
①显示所有员工的名称、工资以及工资级别。
select emp.ename 姓名,emp.sal 工资,salgrade.grade 工资级别 from emp inner join salgrade on emp.sal>=salgrade.losal
and emp.sal<=salgrade.hisal;
②显示ACCOUNTING部门所有员工的名称,工资。
select emp.ename 员工名称,emp.sal 工资 from emp inner join dept on emp.deptno=dept.deptno where dept.dname='ACCOUNTING';
③显示职位属于10号部门所提供职位范围的员工的姓名,职位,工资,部门号。
select emp.ename 姓名,emp.job 职位,emp.sal 工资,emp.deptno 部门号 from emp where job in
(select job from emp where deptno=10);
④显示在所有员工中高于30号部门中任一个员工工资的员工的姓名,工资和部门号。
select emp.ename 姓名,emp.sal 工资,emp.deptno 部门号 from emp where emp.sal>(select max(sal) from emp where deptno=30);
⑤查询比SCOTT员工的薪资高的所有雇员。
select * from emp where emp.sal>(select sal from emp where emp.ename='SCOTT');
⑥查询和Scott在同一个部门的所有员工。
select emp.ename 姓名 from emp where emp.deptno=(select dept.deptno from emp,dept where emp.deptno=dept.deptno and ename='SCOTT');
⑦查询薪资最低的员工的姓名。
select emp.ename 姓名 from emp where sal=(select min(sal) 最低工资 from emp) ;
⑧查询比Scott入职还要晚的员工薪资。
select emp.ename 姓名,emp.sal 薪资 from emp where emp.hiredate>(select emp.hiredate from emp where emp.ename='SCOTT');
5、集合查询
①显示工资高于2500或职位为MANAGER的员工的姓名,工资和职位(采用UNION语法实现)。
select ename,SAL,job from EMP where SAL>2500 union select ename,SAL,job from EMP where JOB='manager'
②显示工资高于2500且职位为MANAGER的员工的姓名,工资和职位(采用INTERSECT语法实现)。
select ename,SAL,job from EMP where SAL>2500 INTERSECT select ename,SAL,job from EMP where JOB='manager'