Oracle---笔记(三)---SQL语句

子查询

如何查到所有比“CLARK”工资高的员工的信息
– 1.查询“CLARK”的工资
select sal from emp where ename=‘CLARK’;
– 2.查询员工信息,他的工资要比“CLARK”的工资高
select * from emp where sal>( select sal from emp where ename=‘CLARK’)
– select * from emp where ( select sal from emp where ename=‘CLARK’)<sal

单行子查询

 -- 1.查询工资最高的雇员名字和工资。
     -- 查询最高的工资
		 select max(sal) from emp
		 --  查询员工姓名,工资,他的工资等于上面查到的最高工资
		 select ename,sal from emp  where sal=(select max(sal) from emp)

-- 2.查询职务和SCOTT相同,雇佣日期比SCOTT早的雇员信息
   select *  from  emp   where  job=(select job  from emp where ename='SCOTT')  and 
	       hiredate<(select hiredate from emp where ename='SCOTT')
	  -- 多行子查询
		-- 查询工资低于任何一个“CLERK”的工资的雇员信息。
		select *  from emp where sal< ALL(select  sal from emp where job='CLERK');
		--  查询工资和和职位为“SALESMAN”相同的员工信息
		select *  from emp  where  sal in(select sal from emp where job='SALESMAN');
		 --  找出部门编号为20的所有员工中收入最高的职员
		--  方法1:
		 --  1.查询部门编号为20的所有员工的最高收入
		 select max(sal) from  emp where deptno=20
		 -- 2.查询所有员工,它的工资等于上面的最高收入
		 select * from emp where  sal=(select max(sal) from  emp where deptno=20)
		 
  --  方法2:
			-- 1.查询部门编号为20的所有员工的收入
			select sal from  emp where deptno=20
			-- 2.查询所有员工,它的工资要>=上面一组收入中的任意一个
			select * from emp where  sal>=ALL(select sal from  emp where deptno=20)	  
			 and deptno=20
			 




 --  查询工资和职位和 smith 相同的所有员工信息。
	   -- 子查询
		 select *  from emp  where (sal,job)=(select sal,job from emp where ENAME='SMITH') ;
		 -- 自连接查询(把t1表当成是存储要查询的员工信息,t2表当成存储SMITH信息的表)
		 select *  from emp t1 ,  emp t2   where    t1.sal=t2.sal and t1.job=t2.job  and t2.ename='SMITH';
		 --  rowid,rownum
		 --  rowid:保存记录在硬件上的物理地址(oracle服务器上的数据文件的存储地址)
		 --  rownum:记录在整个结果集中的位置,同一条记录随着查询条件的不同,rownum会变,但是rowid不变
		 select rowid,rownum, empno,ename from emp WHERE  DEPTNO=10  ORDER BY   empno desc;
		 		 select rowid,rownum, empno,ename from emp WHERE  DEPTNO=10  ORDER BY   empno;
	
			 
 select *  from   emp;
		

## oracle的分页查询

 -- 查询工资最高的前5个员工的记录--Top N查询
			--  1. 按照工资降序去查询员工
			select *  from emp ORDER BY  sal desc 
			-- 2.将上面的结果看成1张表,去查表中的前5个记录
			select rownum,t.*  from (select *  from emp ORDER BY  sal desc ) t  where rownum<=5
			--  分页查询员工信息,按工资降序,每页显示5条记录,查询第2页的记录
			--  1.按照工资降序去查询员工
				select *  from emp ORDER BY  sal desc 
			

-- 2.查出前10条记录
			select rownum,t.*  from (select *  from emp ORDER BY  sal desc ) t  where rownum<=10	
			-- 3.把上面结果看成一张表,从中获取rownum为[6,10]的记录
	-- 写法1
select empno,ename,job,sal from			(select rownum R,t.*  from (select *  from emp ORDER BY  sal desc ) t  where rownum<=10)  where R>=6

 -- 写法2
 select empno,ename,job,sal from			(select rownum R,t.*  from (select *  from emp ORDER BY  sal desc ) t)  where R>=6 and R<=10

  
 

### 分页模板:将分页的sql写成一种公式,变成通用分页sql

  

##### 分页模板1

:最里面的第1层查询是查询所有记录(带排序),第2层查询是筛选出行号<=要查询页号的最大行号的记录,第3层查询是进一步筛选,行号>=要查询页的最小行号
	  -- 假设要查询的页号是pageNum,每页显示pageSize条记录
		select  字段列表 from(select rownum R,t.*  from (
		select *  from 表名 ORDER BY  字段 desc|asc ) t  where rownum<=(pageNum*pageSize))
		 where R>=(pageNum-1)*pageSize+1

##### 分页模板2

:第1,第2层查询都是查询所有的记录,只不过多加了一个行号rownum,再在最外层的查询
--  中去用行号来过滤,刷选出要查询的那页的记录

select  字段列表 from(select rownum R,t.*  from (
		select *  from 表名 ORDER BY  字段 desc|asc ) t )
		 where R>=(pageNum-1)*pageSize+1 and R<=(pageNum*pageSize);
		 
 --  查询员工表的第3页信息,每页显示6条,要显示的字段:工号,姓名,职位,工资
 select empno,ename,job,sal from (select rownum R,t.empno,t.ename,t.job,t.sal from
  (select *  from emp ORDER BY  sal desc) t  where rownum<= 18)  where R>=13






-- 1.列出至少有三个员工的所有部门的部门编号,名称及员工人数。
select  d.deptno,dname,count(e.empno)   from dept d join emp e   on d.deptno=e.DEPTNO
 GROUP BY d.deptno,dname  having count(e.DEPTNO) >=3

-- select  d.deptno,dname,count(e.empno)   from dept d, emp e   where  d.deptno=e.DEPTNO
-- GROUP BY d.deptno,dname  having count(e.DEPTNO) >=3
   
-- 2.列出职位为“CLERK”的员工姓名和其所在部门名称,部门人数:
   --  先查出每个部门号及其员工人数
	  select ename,dname, t.total from  emp e, dept d, 
	        (select deptno,count(empno) total from  emp GROUP BY   deptno) t
			 where e.deptno=d.DEPTNO  and e.deptno=t.deptno  and e.job='CLERK';

  --  测试查询部门名,部门名的字节长度,字符长度
	select dname, lengthb(dname) 字节数,length(dname) 字符数 from dept;
	<font color=red>-- 创建学生表,字段:学号、姓名、性别,年龄、email、班级编号等信息
	create table  student(
	     sno  number(6)  primary key, --添加主键约束
			 sname varchar2(20)  UNIQUE,  --在sname字段上加了唯一约束
			 sex char(2)  check(sex='男' or sex='女')  not null,
			 age number(2)   check(age>=18 and age<=25)  not null,  -- 添加check约束
			 email varchar2(30) not null,
			 clazzid number(4)
			 -- 加唯一约束
			 --  constraint  UK_student UNIQUE(sname)
			 -- 加主键约束
			--   constraint  PK_student primary key(sno)
	);</font>
	-- 删除主键约束
	alter table student  drop constraint     PK_student;
  -- 插入语句
	insert into student  values(111,'张三丰','男',26,'[email protected]',10);
		-- 添加新的列到student表中
	alter table student  add  address  varchar2(20);
	-- 删除列address
	alter table  student drop  column  address;
	-- 修改字段的数据类型
	alter table student MODIFY(age number(3));
	
--  修改字段名
		alter table student   rename COLUMN sname to stuname;
		 --   desc 表名:查看表结构,只能在命令窗口中运行(sqlplus)
		-- desc student;
		---  删除主表dept表中部门号为10的部门信息
			--  创建城市表city
		--  drop  table city;
		create table city(
		  cid  NUMBER(1)  primary  key,
			 cname  varchar2(10)
		)
		insert into   city  values(1,'武汉');
		insert into   city values(2,'青岛');
	
		
--  创建部门表department
  create table  department(
	     id  number(1)  primary key,
			 name  varchar2(20) not null,
			 c_id  NUMBER(1)   references  city(cid)   on delete cascade   -- 城市编号,外键,删除策略默认就是RESTRICT
	)
		insert into   department  values(1,'研发部',1);
		insert into   department values(2,'市场部',1);
				insert into   department values(3,'销售部',2);
		select *  from city;
		select *  from department;
		-- 删除1号城市
		delete from city where cid=1

猜你喜欢

转载自blog.csdn.net/qq_41532872/article/details/86616863
今日推荐