–创建表空间
create tablespace itheima;
DATAFILE ‘heima.dbf’
size 100m
autoextend on
next 10m;
–删除表空间
drop tablespace itheima;
–创建用户
create USEr itheima
IDENTIFIED by itheima
default tablespace itheima;
–给用户授权
–pracle数据库中常用角色
connect --连接角色,基本角色
RESOURCE --开发者角色
dba --超级管理员角色
–给 itheima 用户授予dba角色
grant dba to itheima;
– 创建表
create TABLE person(
pid number(3);
panme CHAR(3);
)
----- 修改表结构
–添加一列
alter table person add(gender number(1));
–修改列类型
alter table person modifygender char(1);
–修改列名称
alter table person rename column gender to sex;
–删除一列
alter table persom drop column sex;
–查询表中记录
select * from person;
–添加一条记录
insert into person (pid ,pname) values(1,‘小明’);
commit;
–修改一条记录
update person set pname=‘小马’ where pid = 1 ;
commit;
----- 三个删除
–删除表中全部记录
delete from person;
–删除表结构
drop table person;
–先删除表,再次创建空白表.效果等同于删除表中全部记录
–在数据量大的情况下,尤其在表中带有索引的情况下,该操作效率高.
–索引可以提高查询效率,但是会影响增删改的效率.
truncate table person
----- 序列不真的属于任何一张表,但是可以逻辑和表做绑定.
----- 序列: 默认从1开始,依次递增,主要用来给主键赋值使用.
----- dual: 虚表,姿势为了补全语法,没有任何意义.
----- 必须先执行nextval才有currval
create sequence s_person;
drop sequence s_person;
select s_person.currval from dual;
select s_person.nextval from dual;
insert into person (pid ,pname) values(s_person.nextval,‘小明’);
create user scott IDENTIFIED by tiger;
grant dba to scott;
----- 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.16,1) from dual; --四舍五入,后面的参数表示保留的位数
select trunc(26.16,1) from dual; --直接截取,不考虑后面的数字
select mod(10,3) from dual; --求余数
–日期函数
–查询出emp表中所有员工入住距离现在几天
select sysdate-e.hiredate from emp e;
–算出明天此刻
select sysdate+1 from dual;
–查询出emp表中所有员工入职距离现在几月
select MONTHS_BETWEEN(sysdate, e.hiredate) from emp e;
select ROUND(sysdate-e.hiredate)/7 from emp e;
select MONTHS_BETWEEN(sysdate, e.hiredate)/12 from emp e;
–转换函数
–日期转字符串
select TO_CHAR(sysdate,‘fm yyyy-mm–dd hh24:mi:ss’) from dual
–字符串转日期
select to_Date(‘2018-11–11 14:35:48’,‘fm yyyy-mm–dd hh24:mi:ss’) from dual
–通用函数
–算出emp表中所有员工的年薪
select e.sal*12+nvl(e.com,0) from emp e;
----- 条件表达式,mysql和oracle通用
–给emp表中员工起中文名
select e.eNAME,
case e.ename
when ‘smith’ then ‘曹贼’
WHEN ‘allen’ then ‘大耳贼’
when ‘ward’ then ‘诸葛小儿’
else ‘无名’
END
from emp e;
—判断emp表中员工工资,如果高于300显示高收入,如果高于1500低于300显示中等收入,其余显示低收入
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’ , ‘诸葛小儿’,
else ‘无名’) “中文名”
from emp e;
---- 多行函数: 作用于多行,返回一个值
select count(1) from emp;
select max(sal) from emp;
select sum(sal) from emp;
select min(sal) from emp;
select avg(sal) from emp;
------ oracle查询
— 分组查询
– 分组查询中,出现在 group by 后面的原始列,才能出现在 select 后面
–查询出每个部门的平均工资
select e.deptno,avg(e.sal).
from emp e
group by e.deptno;
–查询出平均工资高于200的部门信息
–所有条件都不能使用别名来判断
select e.deptno,avg(e.sal)
from emp e
group by e.deptno
having avg(e.sal)>2000;
—查询出每个部门工资高于800的员工的平均工资
select e.deptno,avg(e.sal).
from emp e
where e.sal > 800
group by e.deptno;
— where 所过滤分组前的数据,having是过滤分组后的数据.
----- 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
----- 子查询
— 子查询返回一个值
– 查询出工资和scoot一样的员工信息
SELECT * from emp where sal in (select sal from emp where ename = ‘scott’);
— 子查询返回一个集合
SELECT * from emp where sal in (select sal from emp where deptno = 10);
— 子查询返回一张表
–查询出每个部门最低工资,和最低工资员工姓名,以及该员工所在部门名称
select t.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.deptno = d.deptno;
----- 分页查询
— rownum 行号 : 当我们做select操作的时候,每页查询出一行记录,
–就会在改行上加上一个行号,行号从1开始,依次递增,不能跳着走,不能使用 表名.rownum 这个写法调用
– emp表工资倒叙排列后,每页无条记录,查询第二页.
SELECT * from(
SELECT rownum rn,e.* from
( SELECT * from emp order by sal desc)
e where ROWNUM < 11
) where rn > 5;