子查询
如何查到所有比“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