韩顺平oracle视频笔记三

一、准备数据

创建账号huangbiao,并使用这个账号创建表

 

    conn system/admin as system;

    create user huangbiao identified by huangbiao;

 

    grant connect to huangbiao;

 

create table hb_user(
id int primary key,
name varchar2(20),
password varchar2(20),
deptid int 
);
 
insert into hb_user (id,name,password,deptid)values(1,'zhangsan','zs',1000);
insert into hb_user (id,name,password,deptid)values(2,'lisi','ls',2000);
insert into hb_user (id,name,password,deptid)values(3,'wangwu','ww',3000);
insert into hb_user (id,name,password,deptid)values(4,'zhaoliu','zl',4000);
insert into hb_user (id,name,password,deptid)values(5,'tianqi','tq',5000);
insert into hb_user (id,name,password,deptid)values(6,'liuba','lb',6000);
 
create table dept_info(
dept_id int,
dept_name varchar2(20),
dept_phone int
);
 
insert into dept_info (dept_id,dept_name,dept_phone) values(1000,'软件开发',110);
insert into dept_info (dept_id,dept_name,dept_phone) values(2000,'软件测试',120);
insert into dept_info (dept_id,dept_name,dept_phone) values(3000,'软件设计',130);
insert into dept_info (dept_id,dept_name,dept_phone) values(4000,'软件管理',140);
insert into dept_info (dept_id,dept_name,dept_phone) values(5000,'软件架构',150);
insert into dept_info (dept_id,dept_name,dept_phone) values(6000,'项目经理',160);

 

查看一个表的结构

desc scott.dept;

 

打开显示操作的开关,即相关操作显示多长时间

set timing on;

 

二、快速准备数据办法之一

 

create tables users(
userid varchar2(20),
username varchar2(20),
password varchar2(20)
);

insert into users(userid,username,password)select * from users; 

 

三、查询例子

1、SQL语句的where区分大小写

SQL> select deptno,job,sal from emp where ename='smith';

SQL> select deptno,job,sal from emp where ename='SMITH';

 

2、但是SQL语句的关键字——列名、表名、关键字都不区分大小写

select sal*13 as "年工资",ename from scott.emp;

注意:上面的重命名使用的是“双引号”

 

3、设置默认值nvl()函数

select sal*13+comm as "年工资",ename from scott.emp;

注意:上面的查询结果可以发现有些人的工资是没有的,因为oracle查询运算发现如果有一个值为空则值的结果就位空

 

select sal*13+nvl(comm,0) as "年工资",ename from scott.emp;

备注:nvl(comm,0),如果comm的值为空就变为0,如果不为空就是comm

 

4、如何根据时间条件查找?查找大于1982年入职的同时信息

select * from emp where emp.hiredate>'1-1月-1982';

 

5、查询工资大于2000小于2500的员工信息

select * from emp where sal between 2000 and 2500;

 

%表示0到多个字符

_表示任意单个字符

 

6、如何显示首字母为S的员工的姓名?

SQL> select * from emp where ename like 'S%';

 

7、如何显示第三个字符为大写O的所有员工的信息?

select * from emp where ename like '__O%';

 

8、尽量使用in这种方式,效率比or快多了

SELECT * FROM EMP WHERE EMPNO IN(7369,223,4,12,32,4,324);

 

9、显示没有“上级”领导的信息

select * from emp where mgr is null;

 

10查询工资大于500或者是职位为经理并且名字是已J开头的

select * from emp where (sal>500 or job='MANAGER')AND ENAME LIKE 'J%';

 

11、排序

select * from emp order by desc;//降序

select * from emp order by asc;//升序,默认的

 

12查询部门号降序,工资降序排列——先排列deptno降序,然后再在同deptno情况下对sal再次降序排列

select * from emp order by deptno desc ,sal desc;

select  ename,(sal*13+nvl(comm,0)) "年薪" from emp order by "年薪" desc;

 

四、查询统计

1、显示员工的最高和最低工资

select max(sal) as "最高工资",min(sal) as "最低工资" from emp;

 

2、显示最高薪水员工的信息

select * from emp where sal in(select max(sal) as "最高工资" from emp);

select * from emp where sal=(select max(sal) as "最高工资" from emp);

 

3、显示所有员工的平均工资和工资总和

SQL> select avg(sal) from emp ;

 

4、查询大于平均工资的员工信息

select * from emp where sal < (select avg(sal) from emp );

 

5、计算共有多少员工

select count(*)from emp;

 

五、分组统计

group by对查询结果分组统计

 

1、显示每个部门的平均工资和最高工资

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

 

2、显示每个部门的每种岗位的平均工资和最低工资

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

 

3、显示平均工资低于2000的部门号和他的平均工资

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

 

4、having子句用于限制分组显示结果

如果一个查询语句如果同时包含下面三个限制条件,顺序如下

group by --> having --> order by

 

六、 查询语句练习

1、自连接查询

查询某个员工的上级领导的姓名,比如是FORD

select boss.* from emp worker,emp boss where worker.ename='FORD' and worker.mgr=boss.empno;

2、嵌套查询

显示与SMITH同一部门的所有员工

select * from emp where deptno = (select deptno from emp where ename='SMITH');

select * from emp where deptno in (select deptno from emp where ename='SMITH');

备注:数据库的执行时“从左到右”

3、查询和部门10的工作相同的雇员的名字、岗位、工资、部门号

SQL> select * from emp where emp.job in  (select job from emp where emp.deptno=10);

关于多列嵌套查询

4、查询与SMITH部门和工作相同的人员信息;

select * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');

6、查询各个部门的平均工资和部门编号

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

7、把上面的查询看做是一张子表

select a1.*,a2.mysal from emp a1,(select deptno,avg(sal) as mysal from emp group by deptno) a2 where a1.sal > a2.mysal and a1.deptno = a2.deptno;

备注:(在这里针对ORACL)在给表取别名的时候不要用as,否则会报错,但是可以给列取别名用as

8、希望SCOTT的岗位、工资、补助和SMITH一样

update emp set(job,sal,comm)=(select job,sal,comm from emp where ename='SMITH') where ename='SCOTT';

当from子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫作内嵌视图,当在from子句中使用子查询时,必须给子查询指定别名

 

猜你喜欢

转载自hbiao68.iteye.com/blog/1471943
今日推荐