oracle查询

--所有记录 emp、dept
select * from emp;
select * from dept;

--指定列 select 列名 from 表名
--注意:指定列的效率高于查所有列,查询某个字段

select ename from emp;
select job from emp;

--去掉重复项 distinct
--select distinct(字段) from 表名

--查询一共有多少种Job
select distinct(job) from emp;

--注意:distinct用于多列时,
--必须保证每列都相同才会被当作重复数据过滤掉

-- select distinct 列名1,列名2 from 表名;
select distinct ename,job from emp;

--拼接出一个   XX '的薪水是' XX  || 字符串的拼接
select ename || '的薪水是' || sal as 薪资标准 from emp;

-- +加号   只做加法运算
--dual 虚拟表,本身不存在任何数据,也没有具体的字段,但是可以把任何查询结果显示在这张表上.
--查询档期时间 
--sysdate 系统时间
--systimestamp 系统时间,包含毫秒 

select sysdate from dual;

select * from dual;
select 1000+500 from dual;

select sysdate from tools;
select sysdate from emp;

--查询每个员工的工资加上奖金  注意奖金可以为空
--数字+null = null 没值 not value nvl(列名,值)

--nvl(comm,0)
--如果comm为空的时候,赋值0
select sal+comm from emp;
select sal+nvl(comm,100) from emp;
select * from emp;

--查询smith的信息,条件查询语句
select * from emp where ename='SMITH';

--查询员工信息   根据部门编号排序
--排序 order by 默认asc升序,降序desc
 select * from emp order by sal asc;

--查询各个部门的员工数
--分组 group by
select deptno,count(*) from emp group by deptno;

--查询20 或 30 号部门的员工数量
--分组和条件查询 having
--分组之后不能使用where加入条件

select deptno,count(*) from emp group by deptno having deptno in(20,30);

--查询20 或 30 号部门的员工数量 效果一样
--分组前条件查询 where

select deptno,count(*) from emp where deptno in(20,30) group by deptno; 

--姓名第三个字是M的员工信息
--_占位符,占一个字符的位置
--字符% 以字符开头的
--%字符 以字符结尾的
--第一个字是M

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

--第二个字是M
select * from emp where ename like '_M%';

--第三个字是M
select * from emp where ename like '__M%';

--包含M字符的
select * from emp where ename like '%M%';

--查询没有上级的员工信息 
--is null 空的
--is not null 不为空的 

select * from emp where mgr is null;

--薪水在2000-3000之间的员工 and
--条件判断

select * from emp where sal>=2000 and sal<=3000;

--使用between两者之间的 
--between ? and ? 

select * from emp where sal between 2000 and 3000;

--薪水高于2000 或者 岗位为CLERK 并且 姓名首字母为大写J的员工信息 
--and 并且    
--or 或者

select * from emp where (sal>=2000 or job='CLERK') and ename like 'J%';

--查询rowid字段,显示虚拟ID字段列
--伪列: 查询结果中可以看到的列,但是表中没有列.

select rowid,emp.* from emp;

--查询rownum字段,显示虚拟有序行号
--要查询rownum <= 5 的数据
--select top 5 from emp;
--获取前五条的方式和sqlserver不同

select rownum,emp.* from emp where rownum<=5;

--连接查询
--左连接 -- 以左表为主表
--表名1 left join 表名2 on 表名1.字段=表名2.字段

select * from emp;
select * from dept;

select * from emp left join dept on emp.deptno=dept.deptno;

--右连接 -- 以右表为主表
select * from emp right join dept on emp.deptno=dept.deptno;

--全连接 -- 所有全部拿来,没有主表
--表名1 full join 表名2 on 表名1.字段=表名2.字段
select * from emp full join dept on emp.deptno=dept.deptno;

--内连接 -- 两张表有交集的部分
--表名1 inner join 表名2 on 表名1.字段=表名2.字段
select * from emp inner join dept on emp.deptno=dept.deptno;

--查询工资最高的员工信息  假设最高工资只有一个人
--使用rownum
--1.先排序(sal工资降序)
--2.再编号
--3.筛选出第一个

select * from(
select rownum as rn,ep.* from (select * from emp order by sal desc) ep 
) em
where em.rn=1;

--子查询--查询工资最高的员工信息 有考虑到工资最高的人数不止一个
--max
select * from emp where sal = (
select max(sal) from emp);

--avg count sum max min聚合函数
--一旦使用了聚合函数,普通的列不能显示在查询结果中
--除非这个普通的列是分组的依据
--查询平均工资大于2000的 部门的编号 和 平均工资
--分组后需要条件查询请使用having

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

--查询与员工SMITH在同一部门的员工信息
select * from emp where deptno =(
select deptno from emp where ename='SMITH'
);

--查询与部门10 员工 工作岗位相同的员工信息
--deptno 部门 岗位 job 
--字段 in ( 值,值,值  )

select * from emp where job in (
select job from emp where deptno=10
)

--与SMITH部门和岗位都相同的员工信息
select * from emp where deptno =(select deptno from emp where ename='SMITH')
and job =(select job from emp where ename='SMITH');

--分页
--sql : select top 5 * from emp where not in(select top 5 * from emp)
--oracle中没有top关键字,只能使用伪列作为分页依据
select * from (select rownum as rn,emp.* from emp) ep
where ep.rn between 1 and 5;
--查询第一页 between 1 and 5  

select * from (select rownum as rn,emp.* from emp) ep
where ep.rn between 6 and 10;
--查询第二页 between 6 and 10

select * from (select rownum as rn,emp.* from emp) ep
where ep.rn between 11 and 15;
--查询第三页 between 11 and 15

--JDBC套公式即可

--查询薪水最低的5个员工的信息(先排序,再生成rownum,)

-- 合并结果集 (注意列的数量,列的数据类型,必须一致)
-- 使用dual表虚拟数据操作
-- union 不重复
-- union all 重复

select 1 as id,'jack' as name from dual
union all
select 1 as id,'jack' as name from dual;

select * from emp
union all
select * from emp
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值