Oracle学习DayThree
一、视图
1.定义:
视图是一种虚表,是从表中抽出的逻辑上相关的数据集合。
视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句。
视图向用户提供基表数据的另一种表现形式。
2.作用:
控制数据访问
简化查询
避免重复访问相同的数据
对视图的数据进行修改,基表的数据也会产生相应的修改。
3.简单视图和复杂视图的区别:
简单 复杂
表的数量:一个 一个或多个
函数: 没有 有
分组: 没有 有
DML操作:可以 有时可以
4.视图的创建
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
特点:
create or replace:加上or replace的create语句可以覆盖相同名字的视图,达到修改视图的目的。
with read only:将视图改为只读视图,屏蔽对视图的DML操作,无法修改视图。
实例:
使用employees表创建只读视图employees_v,其中包括姓名(name),员工编号(id),部门号(dept_id),数据限定在80号部门的范围内。
create or replace view employee_v
as
select last_name name,employee_id id,department_id dept_id
from employees
where department_id = 80
with read only;
5.复杂视图
特点:使用分组函数。
实例:
create view dept_salary_v
as
select department_name name,avg(salary) avg_sal
from employees e,departments d
where e.department_id = d.department_id
group by department_name;
6.视图中使用DML的规定
可以在简单视图中执行 DML 操作。
当视图定义中包含以下元素之一时不能使用delete:组函数、GROUP BY 子句、DISTINCT 关键字、ROWNUM 伪列
当视图定义中包含以下元素之一时不能使用update:组函数、GROUP BY子句、DISTINCT 关键字、ROWNUM 伪列、列的定义为表达式
当视图定义中包含以下元素之一时不能使用insert:组函数、GROUP BY子句、 ROWNUM 伪列、表中非空的列在视图定义中未包括
7.Top-N分析、
定义:
Top-N 分析查询一个列中最大或最小的 n 个值:
例如:销售量最高的十种产品是什么?
销售量最差的十种产品是什么?
格式:
SELECT [column_list], ROWNUM
FROM (SELECT [column_list]
FROM table
ORDER BY Top-N_column)
WHERE ROWNUM <= N;
错误的格式:
SELECT [column_list], ROWNUM
FROM table
WHERE ROWNUM <= N
ORDER BY Top-N_column;
错误原因:这种查询会先执行ROWNUM <= N,截取原始的前N条数据,而不是排序后的前N条数据。
注意:
ROWNUM是一个伪列,按行数据的先后顺序从1开始递增。
对 ROWNUM 只能使用 < 或 <=, 而用 =, >, >= 都将不能返回任何数据。可以通过对伪列rownum起别名来使其成为真实的列,再通过select该列就可以使用 =, >, >=。
实例:
按员工工资降序排列员工表的视图,包括员工编号,工资,姓名,要求只显示第40到第50条数据。
select *
from(
select rownum rn,employee_id,salary
from(
select employee_id,salary,last_name
from employees
order by salary desc
)
)where rn <=50 and rn >40
二、控制用户权限
1.创建用户
CREATE USER user
IDENTIFIED BY password;
用户创建之后, DBA 会赋予用户一些系统权限
GRANT privilege [, privilege...]
TO user [, user| role, PUBLIC...];
以应用程序开发者为例, 一般具有下列系统权限:
CREATE SESSION(创建会话)
CREATE TABLE(创建表)
CREATE SEQUENCE(创建序列)
CREATE VIEW(创建视图)
CREATE PROCEDURE(创建过程)
实例:
GRANT create session, create table,
create sequence, create view
TO scott;
创建用户表空间:
用户拥有create table权限之外,还需要分配相应的表空间才可开辟存储空间用于创建的表
ALTER USER scott QUOTA UNLIMITED
ON users
修改密码:
DBA 可以创建用户和修改密码
用户本人可以使用 ALTER USER 语句修改密码
ALTER USER scott
IDENTIFIED BY lion;
2.角色:给创建的角色分配一个或多个权限,再把角色分配给用户。
创建角色:
create role manager;
为角色赋予权限:
grant create table, create view
to manager;
将角色赋予用户:
grant manager to scott;
3.对象权限
不同的对象具有不同的对象权限
对象的拥有者拥有所有权限
对象的拥有者可以向外分配权限
分配对象权限:
GRANT object_priv [(columns)]
ON object
TO {user|role|PUBLIC}
[WITH GRANT OPTION];
with grant option:使用户同样具有分配权限的权利
public:向数据库中所有用户分配权限
收回对象权限:
使用 REVOKE 语句收回权限
使用 WITH GRANT OPTION 子句所分配的权限同样被收回
REVOKE {privilege [, privilege...]|ALL}
ON object
FROM {user[, user...]|role|PUBLIC}
[CASCADE CONSTRAINTS];
三、set操作符
将多个查询用 SET 操作符连接组成一个新的查询
1.UNION操作符
UNION 操作符返回两个查询的结果集的并集
2.UNION ALL操作符
UNION ALL 操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。
3.INTERSECT操作符
INTERSECT 操作符返回两个结果集的交集
4.MINUS操作符
MINUS操作符:返回两个结果集的差集
5.注意事项:
在SELECT 列表中的列名和表达式在数量和数据类型上要相对应
括号可以改变执行的顺序
ORDER BY 子句:只能在语句的最后出现;可以使用第一个查询中的列名, 别名或相对位置
除 UNION ALL之外,系统会自动将重复的记录删除
系统将第一个查询的列名显示在输出中
除 UNION ALL之外,系统自动按照第一个查询中的第一个列的升序排列
6.实例
各个select语句的列的数量和数据类型要匹配:
SELECT department_id, TO_NUMBER(null) location, hire_date
FROM employees
UNION
SELECT department_id, location_id, TO_DATE(null)
FROM departments;
使用相对位置排序:
COLUMN a_dummy NOPRINT
SELECT 'sing' AS "My dream", 3 a_dummy
FROM dual
UNION
SELECT 'I`d like to teach', 1
FROM dual
UNION
SELECT 'the world to', 2
FROM dual
ORDER BY 2;
注:第一行语句使a_dummy这个列不打印出来。
最后一行语句使表按第二列排序
Oracle学习DayThree的更多相关文章
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- Oracle学习线路
出自huyangg的博客,地址是:oracle学习路线图 1.sql.pl/sql(网上有很多的视频,可以做一个简单的入手,然后看几本书,多做实验) 作为oracle的基本功,需要大家对sql和 ...
- Oracle学习指南
Oracle学习指南 你走的那天,我决定不落泪,迎着风撑着眼帘用力不眨眼 创建数据库.创建用户.创建表空间.创建表.插入数据..... 1.用系统用户登录,任选系统用户 代码: >>sql ...
- Oracle学习系列1-7
Oracle学习系列1 两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 3 ...
- Oracle学习系列7
Oracle学习系列7 ************************************************************************************ 关联表 ...
- Oracle学习系列6
Oracle学习系列6 ************************************************************************************ 删除约 ...
- Oracle学习系列5
Oracle学习系列5 ************************************************************************************ ,掌握 ...
- Oracle学习系列4
Oracle学习系列4 ************************************************************************************ 数据库 ...
- Oracle学习系列3
Oracle学习系列3 ************************************************************************************ 多表查 ...
随机推荐
- 怎么样启用红米手机5的ROOT权限
红米手机5能如何拥有了root超级权限?各位清楚,android机器有root超级权限,一旦手机拥有了root相关权限,就能够实现更强的功能,举个栗子各位公司的营销部门的妹纸,使用较多营销工具都需要在 ...
- 亚马逊促销活动Promotion②:Money Off(满减折扣)的设置教程
满减.折扣是放之四海皆有效的促销手段,虽然亚马逊对卖家有诸多限制,但这个促销方式却是允许的,对亚马逊的卖家而言,这对提升商品销量.打造爆款都是极好的.今天小编来讲讲亚马逊的Money Off要怎么设置 ...
- Inquirer.js
一个使用界面进行交互的命令行集合 4.0以上的版本只支持node 6以上的,node4请使用3.x 目标和理念(hilosophy) 努力去做一个容易的 嵌入式的(embeddable) 和优美的命令 ...
- Django的admin相关
自定义admin展示的内容 根据之前已经创建好了的models from django.db import models class Person(models.Model): name = mode ...
- 分别用Excel和python进行日期格式转换成时间戳格式
最近在处理一份驾驶行为方面的数据,其中要用到时间戳,因此就在此与大家一同分享学习一下. 1.什么是时间戳? 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01 ...
- VSCode 启动 Vue 项目 npm install 报错
1. 报错后,查看了版本. 查看node版本:node -v 查看npm版本:npm -v 查看Augular版本:ng --version 2. 感觉 Augular CLI版本太低,使用以下方 ...
- 【Linux】gdb调试
g++ -g ... gdb l 列出代码,回车键继续 break main / 行号 加断点 n 单步运行 s 单步运行(可进入函数) p 输出变量 p *array@len ...
- 语音识别ASR - HTK(HResults)计算字错率WER、句错率SER
HResults计算字错率(WER).句错率(SER) 前言 好久没发文,看到仍有这么多关注的小伙伴,觉得不发篇文对不住.确实好久没有输出经验总结相关的文档,抽了个时间,整理了下笔记,发一篇关于ASR ...
- Python logging系统
我们都知道python在2.x之后自带了一个模块import logging. 但是每次都要写log很麻烦,同时我想把info,debug之类的指令通过颜色分离开来. 于是写了一个简单的类似glog的 ...
- laravel5.5首次使用php artisan migrate注意问题:
1.在app/Providers/AppServiceProvider.php中设置字符串默认长度:(不进行这一步,执行php artisan migrate会报错,同时创建的表会有所缺失) use ...