默认端口:1521
默认服务名:orcl
--创建表空间
create tablespace testdb
datafile 'D:\app\oracleData\testdb.dbf'
size 100m
autoextend on
next 10m;
--删除表空间
drop tablespace testdb
--创建用户
create user chenping
identified by 123456
default tablespace testdb
--给用户授权
--oracle数据库中常用角色
connect--连接角色,基本角色
resource--开发者角色
dba--超级管理员角色
--给chenping用户授予dbs角色
grant dba to chenping;
--创建表
create table Person(
pid number(20),
pname varchar2(10)
);
--修改表
alter table person add (nickname varchar2(20),address varchar2(20));
--修改列类型
alter table person modify nickname char(1)
--修改列名
alter table person rename column nickname to sex
--删除一列
alter table person drop column address
--查
select * from person
--增
insert into person (pid, pname) values (1, 'tom');
commit;
--改
update person set pname = 'jack' where pid = 2;
commit;
----三个删除
--删除表中全部记录
delete from person;
--删除表结构
drop table person;
--先删除表,再创建表。效果等同于删除表中全部记录
--在数据量大的情况下该操作效率高(先删索引)
truncate table person;
commit;
--序列:默认从1开始,依次递增,主要用来给主键赋值
--虚表,只是为了补全语法,无意义
create sequence s_person;
select s_person.nextval from dual
--添加一条记录
insert into person (pid, pname) values (s_person.nextval, 'tom');
commit;
-----------------------------------------------------------------------------------------------------------------------
--system、sys、scott,当中system和sys的差别在与是否能创建数据库,sys用户登录才能够创建数据库,而scott是给刚开始学习的人学习的用户。
--学习者能够用Scott登录系统,注意scott用户登录后,就能够使用Oracle提供的数据库和数据表,这些都是oracle提供的。学习者不须要自己创建数据
--库和数据表,直接使用这些数据库和数据表练习SQL
----解锁scott用户
alter user scott account unlock
----解锁scott用户的密码(也可用此来重置)
alter user scott identified by tiger
SELECT * from dual
--单行函数:作用于一行,返回一个值
---字符函数
select UPPER('yes') from dual;
select LOWER('YES') from dual;
---数值函数
SELECT round(26.18, 1) from dual; --四舍五入,后面的参数表示保留几位
SELECT trunc(26.18, 1) 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;
--查出emp表中所有员工入职距离现在几年
SELECT MONTHS_BETWEEN(SYSDATE, e.HIREDATE)/12 from emp e;
--查出emp表中所有员工入职距离现在几周
SELECT round((SYSDATE - e.HIREDATE)/7) from emp e;
---转换函数
--日期转字符串
SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh:mi:ss') from dual
--日期转字符串(去零)
SELECT TO_CHAR(SYSDATE,'fm yyyy-mm-dd hh:mi:ss') from dual
--日期转字符串(24h制)
SELECT TO_CHAR(SYSDATE,'fm yyyy-mm-dd hh24:mi:ss') from dual
--字符串转日期
SELECT TO_DATE(' 2020-8-2 10:54:40','fm yyyy-mm-dd hh24:mi:ss') from dual
---通用函数
--算出emp表中所有员工年薪
--奖金里有null值,如果null值和任意数字做算数运算,结果都是null
SELECT e.sal * 12 + NVL(e.COMM, 0) FROM emp e
--条件表达式
-------条件表达式的通用写法,oracle和mysql通用
--给emp表中的员工起中文名称
SELECT e.ename,
case e.ename
when 'SMITH' then '史密斯'
when 'ALLEN' then '艾伦'
when 'WARD' then '沃尔德'
else '无名'
end
from emp e;
--判断emp员工表中员工工资,如果高于3000显示高收入,如果高于1500低于3000显示中等收入,否则为低收入
SELECT e.sal,
case
when e.sal > 3000 then '高收入'
when e.sal > 1500 then '中等收入'
else '低收入'
end
from emp e;
-------orcale专用条件表达式
---orcale中除了起别名都用单引号
SELECT e.ename,
DECODE(e.ename,
'SMITH' , '史密斯',
'ALLEN' , '艾伦',
'WARD' , '沃尔德',
'无名') 中文名
from emp e;
-----多行函数【聚合函数】:作用于多行,返回一个值
SELECT count(1) from emp;--查询总数量
SELECT SUM(sal) from emp;--工资总和
SELECT max(sal) from emp;--最大工资
SELECT avg(sal) from emp;--平均工资
----分组查询
---聚合函数:作用于多列,返回一个值
--查询出每个部门的平均工资
SELECT e.deptno, avg(e.sal)
from emp e
GROUP BY e.deptno
--查询平工资高于2000的部门信息
--所有条件不能使用别名
SELECT e.deptno, avg(e.sal)
from emp e
GROUP BY e.deptno
HAVING avg(e.sal) > 2000
--查询出每个部门中工资高于800的员工的平均工资
SELECT avg(e.sal)
from emp e
where e.sal > 800
GROUP BY e.deptno
---多表查询
---笛卡尔积
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
--orcal中专有的外连接(右连接)
select *
from emp e, dept d
where e.deptno(+) = d.deptno;
--查询出员工姓名,员工领导姓名
SELECT e.ename, m.ename
from emp e,emp m
where e.mgr = m.empno
---子查询
---子查询返回一个值
---查询出工资和scott一样的员工信息
SELECT * from emp where sal in
(select sal from emp where ename = 'SMITH')
---子查询返回一个集合
---查询出工资和10号部门任意员工一样的员工信息
SELECT * from emp where sal in
(select sal from emp where deptno = 10)
---子查询返回一张表
---查询出每个部门最低工资,和最低工资员工姓名,和该员工所在部门名称信息
select t.deptno, e.sal, e.ename, d.dname
from emp e,dept d,(SELECT MIN(sal) sal, deptno from emp GROUP BY deptno) t
where e.deptno = d.deptno and e.sal = t.sal
---orcal中的分页
--rownum行号
--每查一行记录,就会在该行上加上行号
--行号从1开始,依次递增,不能跳着走
----emp表工资倒叙排列后,每页五条记录,查询第二页。
select * from
select ROWNUM,t.* from (
SELECT * from emp e ORDER BY e.sal DESC) t
where ROWNUM < 11
---视图
---提供一个查询的窗口,里面没有数据
create table emp as SELECT * from scott.emp
---创建视图,必须有dba权限
create view v_emp as select ename, job from emp
---查询视图
select * from v_emp
---修改视图(不推荐)
update v_emp set job = 'clerk' where ename = 'ALLEN'
---创建只读视图
CREATE view v_emp1 as select ename, job from emp with read only
commit;
---视图的作用
--一:屏蔽敏感字段
--二:保证总部和分部数据及时统一
索引可以增加查询效率,但是会影响增加删除修改的效率
---创建单列索引
create index idx_name on emp(ename)
---单列索引触发规则,条件必须是索引列中的原始值
---复合索引
create index idx_name on emp(ename, job)