Oracle笔记2
24.复杂查询的三道题
# 案例一:列出与SCOTT从事相同工作的所有员工及部门名称、人数、平均工资
GROUP BY使用限制:
查询语句中没有GROUP BY,则SELECT子句中只能出现统计函数;
查询语句中有GROUP BY,则SELECT子句中能出现统计函数和分组字段;
统计函数允许嵌套,嵌套之后的SELECT子句不允许出现任何字段,包括分组字段
SELECT e.empno,e.ename,e.job,d.dname,temp.count,temp.avg
FROM emp e,dept d , (
SELECT deptno dno,COUNT(empno) count,AVG(sal) avg
FROM emp
GROUP BY deptno) temp
WHERE e.job=(
SELECT job FROM emp WHERE ename='SCOTT')
AND e.ename<>'SCOTT'
AND e.deptno=d.deptno
AND e.deptno=temp.dno; # 案例二:列出薪金高于在部门30工作的所有员工的薪金以及
高于公司平均工资的员工姓名和薪金、部门名称、部门平均工资、个人工资等级
确定要使用的数据表:
emp表:员工姓名和薪金、部门平均工资
dept:部门名称
salgrade:工资等级 # 案列三:查询出所有雇员编号、姓名、职位、薪金、此职位的人数、
领导姓名、领导职位、领导所在部门的人数、雇员部门、雇员部门人数
领导部门、领导所在部门人数、雇员工资等级以及此等级的平均工资
25.数据更新操作
复制emp表到myemp
CREATE TABLE myemp AS SELECT * FROM emp ;
向已有的数据表中进行数据的增加
[推荐]完整的语法格式:
INSERT INTO 表名称(列名称,列名称,...) VALUES (内容1,内容2,...) ;
UPDATE 表名称 SET 字段1=内容1,字段2=内容2, ... [WHERE 更新条件(s)] ;
DELETE FROM 表名称 [WHERE 删除条件(s)] ;
实际项目中的删除操作,数据的删除分为两种:
物理删除:直接使用DELETE语句彻底删除;
逻辑删除:在表中设置一个逻辑位(设计的时候准备一个flag字段),逻辑位的内容如下:
flag=1(非0表示true):表示该数据的内容已经被删除了;
flag=0(0表示false):表示该数据的内容未被删除
26.事务
session(会话):在Oracle数据库之中,同一个数据库可以连接多次
事务处理的两个命令:
commit:所有的操作进行提交;
rollback:数据操作产生问题时需要进行回滚处理,
每个session都有一个更新缓冲区
a.定义两个session分别连接到数据库;
b.[Session-A]现在发出一个更新指,更新一条数据:
UPDATE emp SET sal=9999 WHERE empno=7369 ;
c.Session-B]由于第一个Session并没有提交或回滚事务,
所以这个时候第二个session是无法更新7369这行数据的:
d.[Session-A]执行rollback或commit表示释放掉当前锁住的数据行:rollback;
e.在进行锁定的时候除了更新之外也可以采用查询模式:
SELECT * FROM emp WHERE empno=7369 FOR UPDATE ;
当前事务释放之前,数据不允许修改
27.伪列
伪列就是不存在于表中的列,但是该列又可以直接使用,
三个常用伪列:SYSDATE、ROWNUM、ROWID
a.ROWNUM会自动做一个数据增长列,作用:
查询第一行记录; 查询前N行记录
数据分页显示处理:让表中的数据按照部分的模式来完成
SELECT *
FROM (
SELECT 查询字段,查询字段,..,ROWNUM rn FROM 表名
WHHERE ROWNUM<=currentPage * lineSize) temp
WHERE temp.rn>(currentPage-1)*lineSize ;
案例:取11-15行数据
SELECT * FROM (
SELECT empno,ename,job,ROWNUM rn
FROM emp
WHERE ROWNUM<=15) temp
WHERE temp.rn>10 ; b.ROWID,每行数据都有一个唯一的ROWID
案例:现有一张表,但该表设计初期没有设计好,有大量完全重复数据,要求删除重复数据
重复的内容保留一条,保留最初增加的一条
DELETE FROM mydept
WHERE ROWID NOT IN (
SELECT MIN(ROWID)
FROM mydept
GROUP BY deptno,dname,loc) ;
28.数据表的创建与管理
常见的数据类型:
VARCHAR2(n):一般200个字以内都用它
NUMBER:直接编写表示的就是数字,NUMBER(n):表示最多n位整数
NUMBER(n,m):表示m个小数位,n-m位整数
DATE:描述日期时间,包含时间数据
CLOB:描述大文本数据(4G) BLOB:描述二进制数据
一般是通过程序确定"数据默认值"
CREATE TABLE 表名称 (
列名称 数据类型 [DEFAULT 默认值] ,
列名称 数据类型 [DEFAULT 默认值] ,
...
列名称 数据类型 [DEFAULT 默认值]
) ; b.复制某表的数据和表结构,出现的几率不高
CREATE TABLE 表名称 AS 子查询 ;
CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno=20 ;
只复制表结构
CREATE TABLE empnull AS SELECT * FROM emp WHERE 1=2 ; c.修改表名称
查看数据表保存的字典信息
SELECT * FROM user_tables ;
RENAME member TO person ; d.表截断
所有资源将彻底释放,并且无法进行事务的回滚操作,一般不进行此操作
TRUNCATE TABLE person ; e.删除表
DROP 对象类型 对象名称
DROP TABLE emp20; f.闪回flashback
查看用户回收站
COL object_name FOR A30 ;
COL original_name FOR A30 ;
COL droptime FOR A30 ;
SELECT object_name,original_name,droptime FROM user_recyclebin ;
闪回某张表
FLASHBACK TABLE emp20 TO BEFORE DROP ;
不经过回收站,直接删除某张表
DROP TABLE emp20 PURGE ;
删除回收站的一张表
PURGE TABLE empnull ;
清空回收站
PURGE RECYCLEBIN ; g.修改表结构,不要去修改,了解即可
一般是删了重新建
CREATE TABLE member(
mid NUMBER ,
name VARCHAR2(20)
) ;
创建完成后,发现少了一个字段,现在需要新增一个字段
ALTER TABLE 表名称 ADD (列名称 数据类型 [DEFAULT 默认值],...)
没有设置默认值,则该字段为null
ALTER TABLE member ADD (age NUMBER(3)) ;
设置了默认值之后,所有数据的该字段都被设置为默认值
ALTER TABLE member ADD (sex VARCHAR2(10) DEFAULT '男') ;
不建议在增加字段时设置默认值 将NAME的长度改为50
ALTER TABLE 表名称 MODIFY (列名称 数据类型 [DEFAULT 默认值],...)
ALTER TABLE member MODIFY(name VARCHAR2(50)) ; 删除数据列
ALTER TABLE 表名称 DROP COLUMN 字段名称 ;
ALTER TABLE member DROP COLUMN age ;
29.约束的创建与管理
约束是保证数据完整性的一种手段,一类是[类型为NUMBER,就不能存放字符串]
除了这类约束之外还有五种
非空约束(NOT NULL、NK):某个字段不能为空
唯一约束(UNIQUE、UK):该列上的数据不允许出现重复
主键约束(PRIMARY KET、PK):非空约束+唯一约束
检查约束(CHECK、CK):设置一些判断条件,满足一些条件就允许修改
外键约束(FOREIGN KEY、FK):设置父子表之间的约束关系
表约束越多,数据库性能就越差,如果要保证高性能,唯一可以使用的是主键约束
null不在唯一约束的限定范畴之内
CREATE TABLE member(
mid VARCHAR2(50) ,
name VARCHAR2(50) NOT NULL ,
email VARCHAR2(50) ,
CONSTRAINT uk_email UNIQUE(email)
) ;
这样设置表的好处:插数据时,如果违反了唯一约束,会自动抛出uk_email的约束名称
c.主键约束
情况一:追加的逐渐内容为null
情况二:设置的主键重复
某个字段显示时太长,则col 字段 for a20; d.外键约束
一般是先删子表,再删父表,有一种删除叫不管不顾式:
DROP TABLE member CASCADE CONSTRAINT ;
在外键设置中,可以设置级联操作:
级联删除:可以直接删除父表中数据,子表数据随之被删除
CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE CASCADE
级联更新:父表中数据被删除了,子表中对应的外键字段设置为null
CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE SET NULL e.修改约束
DROP TABLE member PURGE ;
CREATE TABLE member(
mid VARCHAR2(50) ,
name VARCHAR2(50)
) ;
ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型;
如果表中的数据有违反主键的情况出现,则该约束无法添加
ADD CONSTRAINT只能追加非空以外的约束,想要追加非空约束,得用MODIFY
ALTER TABLE member MODIFY(name VARCHAR2(50) NOT NULL) ;
表和约束要"同生共死",不能有表没约束,不能删约束不删表
ALTER TABLE member DROP CONSTRAINT pk_mid ;
30.数据表操作
多行单列用where子句
31.Oracle序列
Oracle 12C开始才真正追加了自动增长列的配置
CREATE SEQUENCE 序列名称 默认值:
起始值为1 步长为1 最大值:NOMAXVALUE 最小值为0
非循环序列:NOCYCLE 缓冲个数为20个:CACHE
序列名称nextval:获取下一个增长值
序列名称curval:获取序列当前内容
一定要先调用nextval才可以执行curval
32.同义词
为什么scott访问dual表的时候没有设置用户名.dual?
因为dual属于sys.dual的同义词,同义词的主要作用是方便不同用户的数据表访问,
想要创建同义词往往需要具备管理员的权限
示例:将scott.emp的数据表创建为emp的同义词
CREATE SYNONYM emp FOR scott.emp ;
33.视图
视图的主要作用是:封装复杂的查询语句,利用视图就可以实现复杂查询
范例:创建一个不允许修改创建字段的视图
CREATE OR REPLACE VIEW myview
AS
SELECT * FROM emp WHERE deptno=20
WITH CHECK OPTION ;
此时发现其他字段仍可以更改,但是视图之中并不是真实的数据,建议追加
"WITH ONLY"的选项
34.索引
在数据库中创建索引有两种方式:
a.当数据列上使用了主键约束或唯一约束的时候自动创建索引
b.手动创建索引
CREATE INDEX scott.emp_sal_ind ON scott.emp(sal) ;
35.用户管理
oracle里提供了两个角色,每一个角色包含多个权限
授权完成之后如果想要使用,则要重新登录.
CREATE USER dog IDENTIFIED BY wangwang ;
GRANT connect,resource TO dog ;
不同用户之间要进行访问,就必须拥有其他用户的对象权限
GRANT SELECT,INSERT ON scott.emp TO dog ;
回收权限
REVOKE SELECT,INSERT ON scott.emp FROM dog ;
REVOKE connect,resource FROM dog ;
REVOKE CREATE SESSION FROM dog ;
DROP USER dog CASCADE ;
36.数据库冷备份
备份控制文件,控制整个Oracle的服务信息
SELECT * FROM v$controlfile ;
备份重做日志文件,通过"v$logfile"数据字典获得
SELECT * FROM v$logfile ;
数据文件:保存真实的数据信息,通过"v$datafile"数据字典获得
SELECT * FROM v$datafile ;
核心配置文件(pfile):整个Oracle核心参数
show parameter pfile
将之前记录好的路径文件都拷贝到其它的磁盘上
这种备份方式的前提是:允许你关闭服务
37.数据库设计范式
第一设计范式--设计要求:数据库中的每个字段不可再分,单表设计原则
第二设计范式:多对多关系
第三设计范式:一对多关系
Oracle笔记2的更多相关文章
- Oracle笔记 目录索引
Oracle笔记 一.oracle的安装.sqlplus的使用 Oracle笔记 二.常用dba命令行 Oracle笔记 三.function .select Oracle笔记 四.增删改.事务 Or ...
- Oracle笔记(1) 简单查询、限定查询、数据的排序
Oracle笔记(四) 简单查询.限定查询.数据的排序 一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及 ...
- 韩顺平Oracle笔记
韩顺平Oracle笔记 分类: DataBase2011-09-07 10:24 3009人阅读 评论(0) 收藏 举报 oracle数据库sqljdbcsystemstring 目录(?)[-] ...
- Oracle笔记 多表查询
Oracle笔记 多表查询 本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查 ...
- 转:oracle笔记
oracle笔记1 卸载oracle developer server的方法: 1-1 oracle卸载工具中卸载对应的oracleds项目:在注册表中搜索ORACLEDS HOME对应的别名,删除对 ...
- Oracle笔记(六) 多表查询
最近看了李兴华的oracle视频,这是网上别人做的笔记非常细致,分享给大家,第六篇 原创地址:http://www.cnblogs.com/mchina/archive/2012/09/07/2651 ...
- Oracle笔记二
一.数据库语言分类 二.DML之数据插入 把一个表中的数据查询出来插入另外一个表中. create table student(id number,name varchar2(20),age num ...
- oracle笔记一
一.Oracle简介 1.Oracle属于关系型数据库,是一款可以在Client/Server模式下运行的RDBMS产品.2009年,Oracle公司收购SUN. 2.Oracle是对象关系型数据库管 ...
- oracle笔记
一.sql*plus常用命令 (1)connect 用法:conn 用户名/密码@网络服务名[as sysdba/sysoper] 当特权用户连接时,必须带上as sysdba或是as sysoper ...
- Oracle笔记3-高级查询
高级查询 1.关联查询 作用:可以跨多表查询 --查询出员工的名字和他所在部门的名字 //错误//select first_name,name from s_emp,s_dept; //错误原因:产生 ...
随机推荐
- 拆分项目搞成framework 实例
目前工作中遇到的问题,是讲项目三大模块拆分, 将Discover.Shop和Events的源代码拆分到独立的项目中 拆分是个麻烦事,里面相互依赖很多 ,打包编译也异常复杂,各种报错 编译Event 遇 ...
- Unknown system variable 'query_cache_size'
java连接mysql 报错 java.sql.SQLException: Unknown system variable 'query_cache_size'at com.mysql.cj.jdbc ...
- SQL-W3School-高级:SQL UNION 和 UNION ALL 操作符
ylbtech-SQL-W3School-高级:SQL UNION 和 UNION ALL 操作符 1.返回顶部 1. SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT ...
- Swift 析构过程
在一个类的实例被释放之前,析构函数被立即调用.用关键字deinit来标示析构函数,类似于初始化函数用init来标示.析构函数只适用于类类型. 析构过程原理 Swift 会自动释放不再需要的实例以释放资 ...
- kotlin之高阶函数
高阶函数是一种特殊的函数,它接受函数作为参数,或者返回一个函数 import java.awt.geom.Area fun main(arg: Array<String>) { val m ...
- Python3 继承
继承的好处:子类实现父类的全部功能 1.单继承 若父类和子类有共同的方法或属性,则子类对父类方法或属性进行覆盖 class ClassA: def __init__(self): self.a = ' ...
- CDH集群部署hive建表中文乱码
背景:部署CDH集群的 hive 服务,选用 mysql 作为 hive 元数据的存储数据库,通过 hive cli 建表时发现中文注释均乱码. 现象:hive端建表中文注释乱码. 定位: 已经确认过 ...
- Windows下Tesseract-OCR的安装
可以去Github查看tesseract-ocr的信息:https://github.com/tesseract-ocr/tesseract 在写这篇随笔的时候(2018年8月21日)最新版本是3.0 ...
- sed例子
以care.log这个log文件为例, care.log: 05:44:31,816 DEBUG RawAggregationWorker:70 - LTS is working on Raw Dat ...
- 怎么理解linux作业(job),与进程(process)的关系
1.相关概念: shell :命令解释器,其实就是一个脚本语言解释器,有很多种(bash,ash,tcsh等),最常用的是bash. job(作业): 是相对shell 来说的,在shell中执行一条 ...