Oracle数据库基础学习DAY1

时间:2022-02-11 15:04:01
1.数据字典(data dictionary)是数据库中所有对象及其关系的信息集合。
·系统空间信息
·数据库中对象信息
·性能以及统计信息
·Oracle用户信息
·用户访问、操作信息
·用户角色等权限信息
·列的相关信息
2.数据文件包括了全部数据库数据
·一个数据库可以有多个数据文件
·一个数据文件只能对应一个数据库
·可以对数据文件进行设置
·一个表空间可以由一个或多个数据文件组成
·数据文件是物理结构
3.控制文件
·控制文件是一个很小的二进制文件,
它维护着数据库的全局物理结构,
用以支持数据库的启动和运行
·创建数据库时同时就创建了与之对应的控制文件,
在数据库使用过程中,Oracle不断的更新控制文件,
所以只要数据库是打开的,控制文件就处于可写状态。
·它是二进制文件
4.表空间
·表空间是Oracle数据库恢复的最小单元,
容纳着许多数据库实体,如表、视图、
索引、聚簇、回退段和临时段等。
·是逻辑结构
5.日志文件
·日志文件也叫做重做日志文件,
用于记录对数据库的所有操作信息。
·日志文件是保证数据库安全和数据库备份与恢复的文件
·在一个Oracle数据库中,至少有两个日志文件组,
每组有一个或多个日志成员。
6.账户
 用户名/密码 登陆身份 说明
 sys/change_on_install SYSDBA或SYSOPER 不能以normal登陆,默认管理员
 system/manager SYSDBA或NORMAL 不能以SYSOPER登陆,默认管理员
 scott/tiger NORMAL 普通用户


7.创建表空间
create tablespace XXX datafile '/u01/app/test.dbf' size 500m next 50m maxsize 1g autoextend on;


8.创建和删除用户
create user pacey identified by 123456; //创建用户pacey
grant connect,resource,sysoper to pacey;//授予连接,资源,sysoper权限
conn pacey/123456 //登陆pacey用户
conn / as sysdba //登陆管理员
drop user pacey cascade; //删除用户pacey


9.oracle权限
grant connect,resource to pacey with admin option; //授予权限并可以转交权限给他人
 权限类型
·会话权限 
create session //创建会话,登陆,连接数据库
alter session  //更改会话
·表权限
create table //创建、更改和删除表
·表空间权限
create tablespace //创建表空间
alter tablespace //更改表空间
drop tablespace //删除表空间
·对象权限
Oracle数据库的方案对象主要指:表、索引、视图、
序列、同义词、过程、函数、包、触发器。
创建对象的用户拥有该对象的所有权限,不需要授予。
·系统权限
Oracle数据库的系统权限首先授予sys,system。
使用grant语句可以授权给指定的用户,角色等;
语法为:
grant ____ to _____ ;
例如:
grant create table to user1 with admin option;
·查询系统权限
select * from system_privilege_map;
·查询当前会话可以使用的系统权限
select * from session_privs;
select * from user_sys_privs;
·回收系统权限
revoke ____ from ____;
例如:
revoke create table from user1;
·授予对象权限
grant alter on tablename1 to user1;


10.SQL语言
·综合统一
·高度非过程化
·面向集合的操作方式
·同一种语法结构提供两种使用方式
·语言简单、易学易用
 SQL的功能 所使用的动词(关键字)
 数据定义(DDL) create drop alter
 数据查询(DQL) select
 数据操作(DML) insert update delete
 数据控制(DCL) commit rollback grant revoke(收回权限)


11.示例数据库
·默认用户--scott
·默认密码--tiger
·scott所属4个表:dept、emp、bonus、salgrade


12.数据类型
 类型 含义 存储描述
 CHAR 固定长度字符串 最大长度2000bytes
 VARCHAR2 可变长度的字符串 最大长度4000bytes
 DATE 日期(日-月-年) DD--MM-YY(HH-MI-SS)
 NUMBER(P,S) 数字类型 P为整数位数,S为小数位数


13.键
·主键约束:一个表只能有一个主键约束。主键可以是单个字段,
也可以是多个字段,其所有字段都是NOT NULL。
·Unique约束:一个表可以有多个Unique约束,unique的字段可以为NULL。
·主键与Unique:不同点在于一个表只能有一个主键约束,但是可以有多个
Unique约束;主键所有字段都是not null,unique可以是null共同点是都能保证唯一性
·主键、Unique与索引:主键约束与Unique约束默认会成为索引。
当主键和Unique有多个字段时,有索引前缀性问题,
即where语句汇中的条件必须有主键或者unique的第一个字段,
否则不会使用索引
·外键与主键、Unique:外键必须为另外一张表(父表)的主键或唯一索引。
如果添加记录,而父表中没有则报错。反之,如果要删除父表中的记录,
而子表中有记录,也会报错。但是如果在创建外键约束时,
如果使用on delete cascade,则删除父表中数据时,不报错而直接把子表关联的数据删除。
如果要删除父表,则需要加上cascade constraints,
此时子表的foreign key被去除,表中记录保持不变。


14.查询数据
·基本查询:针对一个表的查询,他是相对于多表查询而言的。
SELECT [ALL|DISTINCT|DISTINCTROW] {*|table.*|[table.]field1[AS alias1]}
FROM tableexpression[,...][IN externaldatabase]
[WHERE...]
[GROUP BY...]
[HAVING...]
[ORDER BY...]
[WITH OWNERACCESS OPTION]
例如:
select * from dept;
select dname from dept;
select dname as new_name from dept;
select distinct dname from dept;
·通配符
% :表示任意个或多个字符,可匹配任意类型和长度的字符
_ :表示任意单个字符。匹配单个任意字符,
    它常用来限制表达式的字符长度语句(可以表示一个中文字符)
. :匹配任何单个的字符。(单字节字符)
* :匹配零个或多个在它前面的东西。
    例如,"x*"匹配任何数量的"x"字符,"[0-9]*"匹配任何数量的数字,
    而".*"匹配任何数量的任何东西。
^ :例子:select * from emp where regexp_like(ename,'^A') //查询A开头的 
$ :例子:select * from emp where regexp_like(ename,'A$') //查询A结尾的
{n} :例子:select * from emp where regexp_like(ename,'A{3}$') //查询AAA结尾的
例子:
--regexp_like  
--查询value中以1开头60结束的记录并且长度是7位  
select * from fzq where value like '1____60';  
select * from fzq where regexp_like(value,'1....60');  
--查询value中以1开头60结束的记录并且长度是7位并且全部是数字的记录。  
--使用like就不是很好实现了。  
select * from fzq where regexp_like(value,'1[0-9]{4}60');  
-- 也可以这样实现,使用字符集。  
select * from fzq where regexp_like(value,'1[[:digit:]]{4}60');  
-- 查询value中不是纯数字的记录  
select * from fzq where not regexp_like(value,'^[[:digit:]]+$');  
-- 查询value中不包含任何数字的记录。  
select * from fzq where regexp_like(value,'^[^[:digit:]]+$');  
--查询以12或者1b开头的记录.不区分大小写。  
select * from fzq where regexp_like(value,'^1[2b]','i');  
--查询以12或者1b开头的记录.区分大小写。  
select * from fzq where regexp_like(value,'^1[2B]');  
-- 查询数据中包含空白的记录。  
select * from fzq where regexp_like(value,'[[:space:]]');  
--查询所有包含小写字母或者数字的记录。  
select * from fzq where regexp_like(value,'^([a-z]+|[0-9]+)$');  
--查询任何包含标点符号的记录。  
select * from fzq where regexp_like(value,'[[:punct:]]');
·运算符
运算符 含义
= 等于
<>,!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
BETWEEN...AND 在两值之间
IN 在一组值得范围内
LIKE 与字符串匹配
IS NULL 为空值
·具体数据条数
MySQL中是limit关键字
MSSQL中的top关键字
Oracle中则是rownum
例子:
select * from emp where rownum<=5;
·表达式
可以在查询的列中使用表达式来进行算数运算(+-*/)
连接字符串(||)、使用系统函数等。
例子:
select empno,ename,sal+300 from where rownum<=5;

select ename || '是一位'||job as 工作,
to_char(hiredate,'YYYY_MM_DD') as 入职时间,
sal*12 as 年薪 from scott.emp;

select 姓名,avg(数学) as 数学平均分,avg(语文)  
as 语文平均分,avg(政治) as 政治平均分,
avg(数学)+avg(语文)+avg(政治) as 总分平均分 
from 表名;
·分组查询
数据分组是通过在select语句中添加group by字句完成的。可使用分组函数
(又称聚合函数)来对每个组中的数据进行汇总、统计。
可以使用having字句来筛选查询的结果。
例如:
select deptno,avg(sal), max(sal) from emp group by deptno;




#############################练习#######################################
1、查询姓名首字母为"A"或第二个字符为"A"的所有员工信息
select * from emp where ename like 'A%' or ename like '_A%';
select * from emp where regexp_like(ename,'^A') or regexp_like(ename,'^.A');
select * from emp where substr(ename,1,1)='A' or substr(ename,2,1)='A';
注:substr(str1,pos,[len]) //可用于匹配字符串


2、查询部门20和30中的、岗位不是"CLERK"或"SALESMAN"的所有员工信息
select * from emp where deptno in(20,30) and job not in('CLERK','SALESMAN');


3、查询出工资在2500-3500之间,1981年入职的,没有奖金的所有员工信息
select * from emp where to_char(hiredate,'yyyy-mm-dd') like '1981%' 
and sal between 2500 and 3500 and comm is null;

select * from  
(select * from emp where sal between 2500 and 3500 and comm is null) 
where extract(year from hiredate) = 1981;
注:extract可用于提取date中的年月日数据


select * from emp where sal between 2500 and 3500 
and hiredate between to_date(19810101,'yyyymmdd')
and to_date(19811231,'yyyymmdd') and comm is null;


4、查询比平均员工工资高的员工信息。
select * from emp where sal > (select avg(sal) from emp);


5、查询平均工资高于2000的部门信息
select * from dept where deptno 
in(select deptno from emp group by deptno having avg(sal) > 2000);


6、查询出WARD的工作所在地。
select LOC from dept where deptno 
=(select deptno from emp where ename = 'WARD');


select emp.name,dept.loc from dept,emp where dept.deptno=emp.deptno and emp.ename='WARD';


7、查询出工资比ADAMS高的所有人姓名、部门、所在地
select emp.ename,dept.dname,dept.loc from dept,emp 
where dept.deptno = emp.deptno 
and emp.sal > (select sal from emp where ename = 'ADAMS');


8、查询工资排名第7的员工信息。
select *
  from emp
where sal = (select min(sal)
from (select * from emp order by sal desc)
       where rownum <= 7);


select *
  from (select * from emp order by sal desc)
where rownum <= 7
minus
select * from (select * from emp order by sal desc) where rownum <= 6;


select empno, ename, job, mgr, hiredate, sal, comm, deptno
  from (select row_number() over(order by emp.sal desc) as rn, emp.*
  from emp)
where rn = 7;