select * from emp; --employee 员工表
select * from dept; --department 部门表
select * from salgrade;-- salary grade 工资等级表
---emp
empno 员工编号
ename 员工姓名
job 工作/工种
mgr manager上级编号
hiredate 入职日期
sal salary 工资
comm 奖金/津贴
deptno 部门编号
--dept
deptno 部门号
dname 部门名称
loc 所在地
--salgrade
grade 等级
losal lowest salary 最低工资
hisal high salary 最高工资
---------------------------
--数据查询语句
select
from
where
--查询emp表中,所有员工的姓名、工资、部门号
select ename,sal,deptno
from emp;
--查询emp表中,工资大于1500 的员工信息
select *
from emp
where sal > 1500;
--查询emp表中,上级是7698 的员工姓名和津贴
select ename,comm
from emp
where mgr = 7698;
---列的别名
select ename,sal,deptno from emp;
select ename 姓名,sal 工资,deptno 部门号 from emp;
select ename as 姓名,sal as 工资,deptno as 部门号 from emp;
select ename as e,sal as s,deptno as d from emp;
select ename as "Esc",sal as "alS",deptno as "dDD" from emp;
select ename as "e%",sal as "s#",deptno as "d()" from emp;
---算术运算 + - * / ()++++++++++++++++++++++++++++++++++++++++++++++++++
支持数值型和日期型(只能加减)数据
--查询每个员工的年薪
select ename,sal,sal*12
from emp;
--给20部门员工,涨薪300之后,工资是多少?
select ename,sal,sal+300
from emp
where deptno = 20;
--查询每名员工的 工资奖金和
select sal,comm,sal+comm from emp;
--运算中如果有空值,那么最后结果为空
--空值替换 nvl()
select sal,comm,nvl(comm,0),sal+nvl(comm,0) from emp;
select * from emp;
insert into emp(empno) values(1122);
delete from emp where empno = 1122;
select ename,nvl(ename,'未知') from emp;
---连接符
select ename,sal from emp;
select ename||'的工资是'||sal||',部门是'||deptno from emp;
---去重
--查询emp中,有多少个部门
select distinct deptno from emp;
--查询emp中,有多少种工作
select distinct job from emp;
---where
--比较运算符
--一般的比较运算符 > >= <= < = != <>
--特殊的比较运算符
between……and……
in(……)
like …… 像 模糊查询
is null 空值
select * from emp
where comm is null;
select * from emp
where comm is not null;
--查询工资在1500 到 3000 的员工信息
select *
from emp
where sal between 1500 and 3000; --闭区间
下限 上限
select *
from emp
where sal >= 1500 and sal <= 3000;
--查询从事CLERK或SALESMAN 的员工信息
1)字符串
2)关于大小写
select * from emp
where job in('CLERK','SALESMAN');
select * from emp
where job = 'CLERK' or job = 'SALESMAN' ;
select * from emp where sal in(1500,3000);
select * from emp
where sal = 1500
or sal = 3000;
--like
select * from emp
where ename like 'S%';
-- %
--sql里的% 等同于linux的* ,代表零个或多个任意字符
-- _ 代表一个任意字符
select * from emp
where ename like 'S_';
select t.*,t.rowid from emp t;
select emp.*,rowid from emp;
---查询以S%开头的员工信息
select * from emp
where ename like 'S\%%' escape '\';
select * from emp
where ename like 'S|%%' escape '|';
select * from emp
where ename like 'S%\%' escape '\';
--逻辑运算符 and or not ()
运算优先级:not > and > or ,()优先级最高
--查询,20 部门中,从事CLERK 工作的员工
select * from emp
where deptno = 20 and job = 'CLERK';
--查询,30 部门中,奖金为空的员工信息
select * from emp
where deptno = 30 and comm is null;
--查询,除10 部门之外,工资大于1500 的员工信息
select * from emp
where deptno != 10 and sal > 1500;
--查询,工作是SALESMAN ,或工资不小于3000 的员工
select * from emp
where job = 'SALESMAN' or sal >= 3000;
--查询,工作不是SALESMAN ,也不是CLERK 的员工
select * from emp where job != 'SALESMAN' and job != 'CLERK';
select * from emp where job in('SALESMAN','CLERK');
select * from emp where job not in('SALESMAN','CLERK');
--查询,工作是SALESMAN,
或,工作是PRESIDENT并且工资大于1500的员工信息
select * from emp
where job = 'SALESMAN'
or job = 'PRESIDENT'
and sal > 1500;
--查询,工作是SALESMAN或PRESIDNET,并且工资大于1500 的员工信息
select * from emp
where (job = 'SALESMAN'
or job = 'PRESIDENT')
and sal > 1500;
select * from emp
where job in('SALESMAN','PRESIDENT')
and sal > 1500;
---order by 排序
select
from
where
order by 列名|别名|算术表达式|函数
order by 列1,别名,函数
order by 列1,列2 desc;
--order by的位置:在整个查询语句的最后
--多次排序
select * from emp order by sal; --升序
select * from emp order by sal asc; --升序
select * from emp order by sal desc; --降序
select ename 姓名,job 工作
from emp
where deptno = 20
order by 姓名 desc;
---查询员工信息,结果按照工资奖金和 升序排序
select emp.*,sal+nvl(comm,0) from emp
order by sal+nvl(comm,0);
--查询员工信息,结果按照部门号排序
如果部门号相同,按照工资降序排序
select * from emp
order by deptno,sal desc;
---函数
单组函数 一个值对应一个结果
分组函数/聚合函数 多个值对应一个结果 avg() sum()
--单组函数
--字符函数
UPPER() LOWER() INITCAP() ---字母大小写
大写 小写 首字母大写
replace() substr() concat() nvl() nvl2()
替换 截取 连接
select ename,lower(ename),initcap(ename) from emp;
select t.*,t.rowid from emp t;
select * from emp where lower(job) = 'clerk';
select ename,replace(ename,'S','s') from emp;
select ename,substr(ename,2,3) from emp;
起始位,长度
--查询工作名称以SALES 开头的员工信息
select * from emp where job like 'SALES%';
select * from emp where substr(job,1,5) = 'SALES';
select ename||'的工资是'||sal||deptno from emp;
select concat(ename,sal) from emp;
select concat(concat(ename,'的工资是'),sal) from emp;
---函数是可以嵌套的
select substr(concat(ename,'的工资是'),5,5) from emp;
select comm,nvl(comm,0),nvl2(comm,1000,0) from emp;
非空替换,空值替换
--数值函数
round(x[,y]) 取整或保留指定小数位,规则:四舍五入
trunc(x[,y]) 取整或保留指定小数位,规则:截断
mod(x,y) 取模/取余
round(5.72) = 6
round(5.718,2) = 5.72
round(04.718,-1) = 0
trunc(5.72) = 5
trunc(5.718,2) = 5.71
trunc(05.718,-1) = 0
select round(5.72), round(5.718,2),round(5.718,-1) from dual;
select trunc(5.718,2),mod(8,4),mod(10,3) from dual;
--dual表
作用:语句补全
select * from dual;
select sysdate from dual;
select 12*15,round(1000/23,2) from dual;
select Sys_Context('userenv','db_name') from dual;--查看当前数据库 名
select Dbms_Random.random from dual;--获得一个随机数
select Dbms_Random.value(10,20) from dual;--获得一个随机数
--日期函数
--使用insert,新增一条记录:
员工编号:1122
员工工作:SALESMAN
入职日期:2018年7月1号
insert into 表名(列名) values(列对应的值);
insert into emp(empno,job,hiredate)
values(1122,'SALESMAN','01-7月-18');
insert into emp(empno,job,hiredate)
values(1122,'SALESMAN','2018-7-1');
select * from emp;
--1)默认日期格式
select * from nls_session_parameters;
alter session set NLS_DATE_FORMAT='YYYY-MM-DD';
alter session set NLS_DATE_FORMAT='DD-MON-RR';
--2) 日期函数 to_date(日期,格式)
insert into emp(empno,job,hiredate)
values(1123,'SALESMAN',to_date('10-1-2018','MM-DD-YYYY'));
--查询入职日期早于1981年9 月30 号的员工信息
select
from
where hiredate < to_date()
---多表联合查询/多表连接
内连接(等值连接、不等值连接)
外连接(左外、右外、全外)
自连接
--等值连接
--查询员工姓名和员工所在部门的部门名称
select *
from emp,dept
where emp.deptno = dept.deptno; ---连接条件
select ename,dname
from emp,dept
where emp.deptno = dept.deptno;
--查询员工编号、入职日期、部门名称
select emp.empno,emp.hiredate,dept.dname
from emp,dept
where emp.deptno = dept.deptno;
select e.empno,e.hiredate,d.dname
from emp e,dept d
where e.deptno = d.deptno;
--查询 SALES 部门(SALES 是部门名称) 的员工信息
select e.*
from emp e,dept d
where e.deptno = d.deptno
and d.dname = 'SALES';
--查询工作类别是ANALYST 的员工的工资、部门号和部门所在地
select e.sal,d.deptno,d.loc
from emp e,dept d
where e.deptno = d.deptno
and e.job = 'ANALYST';
--不等值连接
--查询每个员工的工资等级
select * from emp;
select * from salgrade;
select *
from emp e,salgrade s
where e.sal between s.losal and s.hisal;
--查询工资等级为4级的员工工资、等级、等级区间
--三表连接,需要两个连接条件
--查询员工姓名、部门名称和工资等级
select *
from emp e,dept d,salgrade s
where e.deptno = d.deptno;
and e.sal between s.losal and s.hisal;
select * from student;
select * from class;
select * from score;
--查询 蔡成功同学的四大神术的成绩
select
from student s,class c,score sc
where s.ano = sc.ano
and c.bno = sc.bno
---------------------------
--外连接
作用:查询不满足连接条件的数据
select * from emp e,dept d
where e.deptno = d.deptno;
select * from dept;
select * from emp e,dept d
where e.deptno(+) = d.deptno; ---右外
insert into emp(empno) values(1122);
select * from emp e,dept d
where e.deptno = d.deptno(+); ---左外
select * from emp e,dept d
where e.deptno(+) = d.deptno(+); ---不存在这种写法
----外连接的另外一种写法:
select *
from emp e left outer join dept d
on e.deptno = d.deptno; ---left 显示左边表不满足条件的数据
---outer 可以省略
---on 只能写连接条件,其他条件 写到where里
select *
from emp e right outer join dept d
on e.deptno = d.deptno; ---右外
select *
from emp e full outer join dept d
on e.deptno = d.deptno; ---全外
select *
from emp e right outer join dept d
on e.deptno = d.deptno;
select *
from dept d left outer join emp e
on e.deptno = d.deptno;
---查询出没有员工的部门信息
select d.*
from emp e right outer join dept d
on e.deptno = d.deptno
where e.empno is null;
---自连接
---查询员工姓名和他的上级姓名
select * from emp;
员工的mgr = 上级的empno
select *
from emp worker,emp manager
where worker.mgr = manager.empno;
select * from emp worker;
select * from emp manager;
--查询出入职比上级早的员工
select *
from emp worker,emp manager
where worker.mgr = manager.empno
and worker.hiredate < manager.hiredate;
---分组查询
select
from
where 分组前的条件(不允许出现分组函数)
group by 列1,列2,……
having 分组后的条件(关于分组函数的条件)
order by
--分组函数
avg() sum() max() min() count() wm_concat()
平均数 求和 最大 最小 统计 列转行
select avg(sal),sum(sal),max(sal),min(sal),count(sal) from emp;
select avg(comm),sum(comm),count(comm) from emp;
---分组函数不计算空值
--查询每个部门的平均工资
select avg(sal) from emp;
select deptno,avg(sal)
from emp
group by deptno;
--查询每种工作的最高工资
select job,max(sal)
from emp
group by job;
--查询每个部门中每种工作的平均工资
select deptno,job,avg(sal)
from emp
group by deptno,job
order by deptno;
--出现在select中的列,必须出现在group by语句里
select集合包含于group by集合
--查询平均工资大于2000 的部门
select deptno,avg(sal)
from emp
group by deptno
having avg(sal) > 2000;
--查询平均工资大于2000 的部门信息(号、名称、所在地)
select d.*,avg(sal)
from emp e,dept d
where e.deptno = d.deptno
group by d.deptno,d.dname,d.loc
having avg(sal) > 2000
order by d.deptno;
select deptno,wm_concat(ename),count(ename)
from emp
group by deptno;
---子查询
单行子查询 多行子查询 多列子查询
--查询与SCOTT同部门的员工信息
1)select deptno from emp where ename = 'SCOTT';
2)select * from emp where deptno = 20;
select * from emp
where deptno = (select deptno from emp where ename = 'SCOTT');
--查询与JONES 同上级的员工
select * from emp
where mgr = (select mgr from emp where ename = 'JONES');
--查询工资比MILLER 低,奖金比ALLEN 高的员工信息
select *
from emp
where sal < (select sal from emp where ename = 'MILLER')
and comm > (select comm frpm emp where ename = 'ALLEN');
--查询与MARTIN 同工作,并且在1981年5 月之前入职的员工
select *
from emp
where job = (select job from emp where ename = 'MARTIN')
and hiredate < to_date('1981-5-1','YYYY-MM-DD');
--查询 上级是JONES 的员工信息
select * from emp
where mgr = (select empno from emp where ename = 'JONES');
--查询工资比平均工资高的员工
select * from emp
where sal > (select avg(sal) from emp);
--查询工资比10 部门平均工资高的员工
select * from emp
where sal > (select avg(sal) from emp where deptno = 10);
--使用子查询,查询SALES 部门的员工信息
select *
from emp e,dept d
where e.deptno = d.deptno
and d.dname = 'SALES';
select * from emp
where deptno = (select deptno from dept where dname = 'SALES');
--使用子查询,查询出蔡成功同学 四大神术的成绩
select * from score
where ano = (select ano from student where aname='蔡成功')
and bno = (select bno from class where bname = '四大神术');
---多行子查询 >all <all >any <any =any in()
---查询工资比30 部门所有员工工资都要高的员工信息
select * from emp
where sal >all (select sal from emp where deptno = 30);
select * from emp
where sal > (select max(sal) from emp where deptno = 30);
>all 大于最大
<all 小于最小
>any 大于最小
<any 小于最大
=any
in()
select * from emp where sal in(select sal from emp where deptno = 30);
select * from emp where sal in(1600,1250,2850,1500,950)
--查询哪个部门没有员工
存在于dept表,但是不存在于emp表
select * from dept
where deptno not in(select distinct deptno from emp);
select * from emp; --deptno 不能有空值
--
select * from emp
where (sal,job) = (select sal,job from emp where ename = 'SCOTT' );
---查询每个部门的部门信息和部门人数(考虑40 部门)
P237-238 rownum
---不使用组函数,查询最高工资
---查询工资第二高到第八高的员工信息
---DML 数据操作语句:insert update delete
--新增
insert into 表名 values();
insert into 表名(列) 子查询;
insert into emp94(eid,ename) select 1122,'abc' from dual
union
select 1123,'abd' from dual
union
select 1124,'acd' from dual;
create table emp94(eid integer,
ename varchar(10),
birth date,
classno number(2));
select * from emp94;
insert into emp94(eid,classno) values(1234,11);
insert into emp94(eid,classno) select empno,deptno from emp;
--更改 update
update 表名 set 列名=值;
update 表名 set 列名=值 where ……;
update 表名 set 列1=值1,列2=值2,…… where ……;
update 表名 set 列=子查询 where ……;
update 表名 set 列1=子查询,列2=子查询,…… where ……;
update emp set sal = 9000,deptno=40 where job = 'CLERK';
---更改,把emp中,员工的工资翻倍 奖金在原奖金基础上+500
update emp set sal=sal*2,comm=nvl(comm,0)+500;
---更改,把SMITH 的工资改成与KING 一样
update emp set sal = (select sal from emp where ename = 'KING')
where ename = 'SMITH';
---更改,把ALLEN 改成 与CLARK同部门
update emp set deptno = (select deptno from emp where ename='CLARK')
where ename = 'ALLEN';
---更改,把与BLAKE 同工作的员工的上级,改成SCOTT
update emp set mgr = SCOTT的empno
where job = BLAKE的job;
---更改,把处于平均工资以下的员工,都调到BOSTON (部门的loc)
update emp set deptno = (select deptno from dept where loc='BOSTON')
where sal < 平均工资;
---更改,把WARD 的职位与工资,都调到与KING 相同
update emp set (job,sal) = KING的job和sal
where ename = 'WARD';
update emp set mgr = (select empno from emp where ename = 'SCOTT' )
where empno in ( select distinct empno from emp where job = (select job from emp where ename = 'BLAKE') );
select * from emp where sal < (select avg(sal) from emp);
select dept.deptno from dept where dept.loc = 'BOSTON';
update emp set emp.deptno = (select dept.deptno from dept where dept.loc = 'BOSTON')
where sal in ( select sal from emp where sal < (select avg(sal) from emp));
oracle——笔记——1-3内容
最新推荐文章于 2024-09-14 19:55:29 发布