SELECT 1 2

-- 注释 
-- 查询公式: select *|字段名字1 别名,字段名字2 (as) 别名... from 表名;
-- 执行顺序:--from--select确定结果集
-- 查询dept表中的所有信息
SELECT * FROM DEPT;
select * from dept;

-- 查询雇员表中所有员工的员工编号,员工姓名,上级编号
-- 要查询的数据: empno,ename,mgr
-- 数据的来源:emp
-- 条件:
select empno,ename,mgr from emp;

-- 所有员工的部门标号
select deptno from dept;
select deptno from emp;

--去重 distinct
select distinct deptno from emp;
--完全相同的数据才能去重
select distinct deptno,ename from emp;

-- 表达式
select distinct 1+1 from dept;
-- 计算器
select empno,ename,123*456 from emp;

-- 别名  字段 (as) 别名  表名 别名
select empno as 员工编号,ename "员工 姓名",1+1 "getSum" from emp  e;
-- 原样输出  " "  小写别名,中文中带有空格...非标准写法

-- ' '字符串
select 'haha' "haha" from emp;
-- 字符串拼接   ||
select 'SXT'||ename from emp;

-- 伪列:表中不存在的列  :字符串,表达式...
-- 虚表:没有任何数据  dual
select distinct 456*789,sysdate from emp;
select sysdate from dual;

-- null 空值
-- 查询员工姓名,员工的薪资,员工的奖金
select ename ,sal , comm from emp;
-- null和数字运算,结果还是null
--null和字符串运算,结果是原串,null相当于空串
--给公司的每个员工+100鼓励金
select ename ,sal , comm "原奖金",comm||'100' "新奖金" from emp;
--处理nullnvl(参数1,参数2)  如果参数1null,函数的返回值结果为参数2,如果参数1不为null,函数的返回值结果为参数1
select ename ,sal , comm "原奖金",nvl(comm,0)+100 "新奖金" from emp;

--练习
--查询所有员工的名字, 工种, 年薪(不带奖金)
--查询所有员工的名字,工种,年薪(12月奖金的)
--查询所有员工的名字, 工种, 年薪(带一次奖金的)
--条件查询: select *|字段名字.. from 表名 where 行过滤条件;
--执行顺序: from--where--select
--查询30部门的员工
select * from emp where deptno=30;

-- 查询员工名字为'SMITH'的员工信息
select * from emp where ename='SMITH';

--比较条件  =><>=<=!=<>
--除了'SMITH'的所有员工的员工姓名和员工编号
select empno,ename from emp where ename!='SMITH';
select empno,ename from emp where ename<>'SMITH';
select empno,ename from emp where not ename='SMITH';

--查询呢薪资大于800的员工信息
select * from emp where sal>800;

--and且、 or或、 not非
--查询工种为CLERK,并且是30部门的员工信息
select * from emp where job='CLERK' and deptno=30;
--查询工种为CLERK,或者是30部门的员工信息
select * from emp where job='CLERK' or deptno=30;
--查询不是工种为CLERK,也不是30部门的员工信息
select * from emp where job!='CLERK' and deptno!=30;
select * from emp where not job='CLERK' and not deptno=30;
--select * from emp where not (job='CLERK' and  deptno=30);
select * from emp where not (job='CLERK' or  deptno=30);

--查询有奖金的人
select * from emp where comm is null;
--查询没有奖金的人
select * from emp where not comm is null;
select * from emp where comm is not null;
--select * from emp where comm not is null;


-- 查询工资在1500~2500之间的员工工种和姓名和工资
--查询的内容:ename,sal,job
--来源:emp
--条件:sal>1500 and sal<2500
select ename,sal,job from emp where sal>=1500 and sal<=2500;
select ename,sal,job from emp where sal between 1500 and 2500; --范围区间 从小到大

--子查询
-- 查询 销售部(SALES) 中 工资大于1500的员工信息
--查询销售部的部门编号
select deptno from dept where dname='SALES';
select * from emp where sal>1500 and deptno =30;
select * from emp where sal>1500 and deptno =(select deptno from dept where dname='SALES');

-- 查询工资比SMITH高的同一部门的员工信息
--查询的内容:* 
--来源:emp
--条件:sal>SMITH的工资 and deptno=SMITH的部门编号
select sal from emp where ename='SMITH'; --SMITH的薪资
select deptno from emp where ename='SMITH'; --SMITH的部门编号
select *
  from emp
 where sal > (select sal from emp where ename = 'SMITH')
   and deptno = (select deptno from emp where ename = 'SMITH');
   
select empno, ename, deptno, sal
  from (select *
          from emp
         where sal > (select sal from emp where ename = 'SMITH')
           and deptno = (select deptno from emp where ename = 'SMITH'));
   
--数据来源 也可以是一个结果集 ,可以是表.. 

--查询工资大于1500 或 含有佣金的人员姓名
select ename from emp where sal>1500 or comm is not null;
select ename from emp where sal>1500;  --薪资大于1500的员工姓名
select ename from emp where comm is not null; --有佣金的人员姓名

--对结果集求和|并集  相同的数据保留一个   Union
select ename from emp where sal>1500
Union
select ename from emp where comm is not null;

--Union All,全集(不去重)
select ename from emp where sal>1500
Union All
select ename from emp where comm is not null;

--查询显示不存在雇员的所有部门号
--查询所有部门编号
select deptno from dept;
--查询有员工存在的部门编号
select distinct deptno from emp;
--差集  Minus,差集( 减去重复 )
select deptno from dept
Minus
select distinct deptno from emp;

--查询工资大于1500 且 含有佣金的人员姓名
select ename from emp where sal>1500 and comm is not null;
--Intersect,交集(找出重复)
select ename from emp where sal>1500
Intersect
select ename from emp where comm is not null;

--模糊查询|匹配 like %任意个任意字符  _一个任意字符
--查询姓名以'A'开头的员工信息
select * from emp where ename like 'A%';
-- 查询姓名里边有‘A’的员工信息
select * from emp where ename like '%A%';
-- 查询名称中第二个字母为‘A’的员工信息
select * from emp where ename like '_A%';
-- 查询名称以'H'结尾的员工信息
select * from emp where ename like '%H';

insert into emp(empno,ename,sal) values(1000,'t_%test',8989);
insert into emp(empno,ename,sal) values(1200,'t_tes%t',8000);
--查询姓名中含有%的员工信息
select * from emp where ename like '%A%%' escape('A'); --A为转义字符,转义A后面的字符

--事务 在对一个表中的数据做增加,删除,修改的时候,会自动开启事务
commit;
rollback;

-- 查询工资为 1500200025005000的员工的信息
select * from emp where sal=1500 or sal=2000 or sal=2500 or sal=5000;
--多个定值之间满足任意一个就可以   
select * from emp where sal in (1500,2000,2500,5000);
--部门名称为 SALESACCOUNTING 的雇员信息
--数据: * 
--来源:emp
--条件:员工的部门名称为 SALESACCOUNTING
--查询SALESACCOUNTING的部门编号
select deptno from dept where dname in ('SALES','ACCOUNTING');
--查询10,30部门的员工信息
select * from emp where deptno in(10,30);

select *
  from emp
 where deptno in
       (select deptno from dept where dname in ('SALES', 'ACCOUNTING'));
-- 查询工资等级为 2的员工信息
--数据: * 
--来源:emp
--条件:sal>2等级的最低薪资  and sal<2等级的最高薪资
--2等级的最低薪资 
select losal from salgrade where grade=2;
select hisal from salgrade where grade=2;
select *
  from emp
 where sal >= (select losal from salgrade where grade = 2)
   and sal <= (select hisal from salgrade where grade = 2);

select *
  from emp
 where sal between (select losal from salgrade where grade = 2) and
       (select hisal from salgrade where grade = 2);



--exists 存在即保留存在即合法
select *
  from emp
 where exists (select deptno from dept where dname = 'SALES');

--查询'SALES', 'ACCOUNTING'部门的员工信息
select *
  from emp
 where exists (select deptno
          from dept
         where dname in ('SALES', 'ACCOUNTING')
           and emp.deptno = dept.deptno);

--查询除了'SALES', 'ACCOUNTING'部门的员工信息

select *--所有数据都能保留
  from emp
 where exists (select deptno
          from dept
         where dname in ('SALES', 'ACCOUNTING')
           and emp.deptno != dept.deptno);

select *
  from emp
 where not exists (select deptno
          from dept
         where dname in ('SALES', 'ACCOUNTING')
           and emp.deptno = dept.deptno);
           
--表别名
select *
  from emp e
 where not exists (select deptno
          from dept d
         where dname in ('SALES', 'ACCOUNTING')
           and e.deptno = d.deptno); 
           
delete from emp where empno in(1200,1000);

--所有有奖金的员工信息
select empno, ename, sal,comm
  from emp e1
 where exists (select empno, ename, sal, comm
          from emp e2
         where comm is not null
           and e1.empno = e2.empno);
--有奖金的员工所在的部门中的所有员工的信息  
select empno, ename, sal, comm ,deptno
  from emp e1
 where exists (select empno, ename, sal, comm,deptno
          from emp e2
         where comm is not null
           and e1.deptno = e2.deptno);

--获取所有的航纪录
select * from emp;
select * from emp where 1=1; --java中常使用,比较灵活不需要判断,也不影响结果
select * from emp where ename like '%';

select * from emp where ename like 'SMITH';

--排序 order by 字段 desc(降序)|asc(升序),字段 排序方式  默认升序  nulls last(所有的null值在最后显示)|fist
select * from emp order by empno desc;

--查询30部门的所有员工,根据薪资升序排序  默认升序
select * from emp where deptno=30 order by sal desc;  

select * from emp where deptno=30 order by comm nulls last;  

---查询10,30部门的所有员工,根据薪资降序排序,如果薪资相同根据员工编号降序排序
select * from emp where deptno=30 or deptno=10 order by sal desc,empno desc; 

--select *|字段1.. from|结果集 where 行记录条件 order by 排序字段 排序方式,...;
--执行顺序: from--where--select--order by

你可能感兴趣的:(ORACLE数据库)