DEPT表结构:
EMP表结构:
--创建表空间
create tablespace itheima
--指定数据文件位置
datafile 'C:\itheima.dbf'
--指定大小
size 100m
autoextend on
next 10m;
--删除表空间
--drop tablespace itheima
--创建用户
create user itheima
identified by itheima
default tablespace itheima;
drop user itheime;
--给用户授权
--oracle数据库中的常用角色
connect--链接角色
resource--开发者角色(我们的)
dba--超级管理员角色
--给itheima授权dba角色
grant dba to itheima;
--切换到itheima用户
--创建person表
create table person(
pid number(20),
pname varchar2(10)
);
--修改列的名称
alter table person rename column gender to sex;
alter table person drop column sex;
--修改表结构
--添加一列
alter table person add gender number(1);
--修类列类型
alter table person modify gender char(1);
--添加一条记录,必须要手动提交
insert into person(pid,pname) values (1,'小明');
commit;
--查询表中记录
select * from person;
--修改一条数据
update person set pname = '小马' where pid = 1;
--三个删除
--删除表中全部数据
delecte from person;
--删除表结构
drop table person;
--先删除表,再次创建表,效果等同删除表中的全部数据
--在数据量大的情况下,尤其带有索引的情况下,该操作效率高
--索引可以提供查询效率,但是会影响增删改的效率
truncate table person;
--序列不真的属于任何一张表,但可以逻辑和表绑定
--序列:默认从1开始,依次递增,主要给逐渐递增使用
--dual :虚表,只是为了补全语法
create sequence s_person;
select s_person.currval from dual;
--添加一条记录
insert into person(pid,pname) values (S_person.nextval,'黄晓明');
commit;
select * from person;
--scott用户,密码tiger
--解锁scott用户
alter user scott account unlock;
--解锁scott用户的密码
alter user scott identified by tiger;
--切换到scott用户
--学习查询
-- 函数
--单行函数:作用于一行,返回一个值
--字符函数
select Upper('yes') from dual;
select lower('YES') from dual;
--数值函数
select round(26.18,1) from dual;--四舍五入函数,后面参数表示保留
select trunc(56.16,1) from dual;--直接截取,不再四舍五入
select mod(10,3) from dual;
--日期函数
--查询出emp表中,所有员工入职距离现在的时间
select sysdate-e.hiredate from emp e;
--算出明天此刻
select sysdate+1 from dual;
--多行函数:作用于多行,返回一个值
--转换函数
--日期转字符串
select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;
--字符串转日期
select to_date('2018-6-7 16:39:50','fm yyyy-mm-dd hh24:mi:ss') from dual;
----通用函数
--算出emp表中所有员工的年薪
select e.sal*12 from emp e;
--条件表达式
--给emp表中的员工起中文名
select e.ename,
case e.ename
when 'SMITH' then '校长'
when 'ALLEN' then '爱陆虎'
when 'WARD' then '我的'
when 'JONES' then '琼斯'
else '傻逼'
end
from emp e;
--判断员工工资,如果高于3000显示高收入,低于小时
select e.sal,
case
when e.sal>3000 then '高收入'
when e.sal>1500 then '中等收入'
else '低收入'
end
from emp e;
--oracle专用条件表达式
--oracle除了起别名,都用单引号 尽量选择通用表达式
select e.ename,
decode( e.ename,
'SMITH' ,'校长' ,
'ALLEN', '爱陆虎',
'WARD' , '我的' ,
'JONES', '琼斯' ,
'实例'
)
from emp e;
--多行函数【聚合函数】,作用于多行,返回一个值
select count(1) from emp;--数量
select sum(sal) from emp;--工资集合
select max(sal) from emp;--最大工资
select min(sal) from emp;--最低工资
select avg(sal) from emp;--平均工资
--分组查询
--查询出每个部门的平均工资
--分组查询中出现在group by后面的原始列才能出现在select后面
--没有出现在group by 后面的列,想在select后面,必须家伙在那个聚合函数
--聚合函数可以把多行记录变成一个值
select e.deptno,avg(e.sal),
from emp e group by e.deptno;
--查询出平均工资高于2000的部门信息
select e.deptno,avg(e.sal) asal
from emp e
group by e.deptno
having avg(e.sal)>2000;
--所有条件不能使用别名来判断
--先读条件,往上读取 所以不知道别名
--查询每个部门员工工资大于800的平均
select emp.deptno,avg(emp.sal)
from emp where emp.sal>800
group by emp.deptno;
--where 和having有哪些差别
--where过滤分组前的 必须在group by 前面
--having在过滤之后,必须在group by之后
--多表查询中的概念
--笛卡尔积
select *
from emp e ,dept d;--大部分值没意义
--等值连接
select * from emp e ,dept d
where e.deptno=d.deptno;
--内连接
select *
from emp e inner join dept d
on e.deptno = d.deptno;
--查询出所有部门以及部门下员工信息【外链接】
select *
from emp e right join dept d
on e.deptno = d.deptno;
--左外外连接
select *
from emp e left join dept d
on e.deptno = d.deptno;
--test
select *
from dept;
--oracle中专用外连接写法 尽量选择通用的 以防换数据库
select *
from emp e,dept d
where e.deptno(+) = d.deptno;
--自链接,其实就是站在不同的角度把一张表看成多张表
--查询员工姓名,员工领导姓名
select e1.ename ,e2.ename
from emp e1 ,emp e2
where e1.mgr = e2.empno
--查询出员工姓名,员工部门命名称,员工领导姓名,员工领导部门名称
select e1.ename ,d1.dname,e2.ename ,d2.dname
from emp e1 ,emp e2 ,dept d1, dept d2
where e1.mgr = e2.empno
and e1.deptno = d1.deptno
and e2.deptno = d2.deptno;
--子查询
--子查询返回一个值
--查询工资和scott一样的员工信息
select ename,sal from emp where sal=(
select sal from emp where ename = 'SCOTT'
)
--子查询返回一个集合
--查询出工资和10号部门任意员工一样的员工信息
select * from emp where sal in (select sal from emp where deptno = 10);
--子查询返回一张表
--查询出每个部门最低工资,和最低工资员工姓名,和该员工所在门门的名称
--先查询出每个部门最低工资
select e.deptno,t.msal.e.ename,d.dname
from (
select deptno,min(sal) msal
from emp
group by deptno;
) t,emp e,dept d
where t.deptno = e.deptno
and t.msal = e.sal
and e.d