oracle数据库

文章目录

    • 对数据库的基本操作
    • 对表的基本操作
    • 基本的增删改查语句
    • 使用scott用户
    • 单行函数
    • 多行函数【聚合函数】
    • 多表查询
    • 子查询
    • 分页查询
    • 视图
    • 索引

默认端口: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;

使用scott用户

-----------------------------------------------------------------------------------------------------------------------
--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)

你可能感兴趣的:(oracle数据库)