-- 注释
-- 查询公式: 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;
--处理null值 nvl(参数1,参数2) 如果参数1为null,函数的返回值结果为参数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;
-- 查询工资为 1500, 2000, 2500, 5000的员工的信息
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);
--部门名称为 SALES 或 ACCOUNTING 的雇员信息
--数据: *
--来源:emp
--条件:员工的部门名称为 SALES 或 ACCOUNTING
--查询SALES 或 ACCOUNTING的部门编号
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