------------------------day 1------------------------------------

1 数据库与数据库管理系统

1.1什么是数据库?

就是一个保存数据用的一个仓库!

物理表现上就是文件。所有的数据都保存文件中。内容有格式规范。

1.2什么是数据库系统?

是一个软件,是一个系统;管理数据库的软件

2关系型数据库

     以表为结构来存放数据:

     行:一条记录、一个实体

     列:字段、域,描述的是实体的某个属性

2.1 常见的主流关系型数据库:

     Oracle、MySQL、SQL Server、DB2……

2.2 常见的非关系型数据库:

     NoSQL:MongoDB、Redis……

     NewSQL: Google F1、Spanner……

2.3 区别

     关系型数据库:结构严谨、符合关系理论,可以储存结构化数据。支持比较复杂的数据关系关联查询;支持事务,可以保障数据安全,支持SQL语言操作。

     NoSQL:结构简单,键值对关系,而且大多数都是直接存内存的。

     NewSQL:是一类现代关系数据库。旨在为在线事务处理工作负载提供与NoSQL系统相同的可扩展性,同时仍然使用SQL并维护传统数据库的ACID保证。

3.Oracle中的基本概念

3.1 SCOTT账号

一个Oracle数据库自带的账号,有4张用例表

我们后面的练习以这个账号为基础

scott/tiger

3.2 数据库的物理组成

数据文件 + 日志文件 + 控制文件 + 配置文件

Oracle当中提出的表空间这个概念

表空间:是数据库的逻辑划分。一个表空间只属于一个数据库。通常,建议每一个用户使用自己的表空间。

3.3 数据库实例

实例是一个在Oracle管理系统中表示数据库的对象

实例名(SID):

简化版  :  XE

企业版  : ORCL

3.4 两个重要的账号

SYS      System

4 数据库与账号的使用规范

在Oracle数据库食用时,基本就只使用一个数据库

当有一个新的软件需求时,为这个新的软件需求创建新的账号,分配相应的权限。

5 连接数据库的操作

--查询管理员名下的表格文档;
select * from user_tablespaces;--创建一个名字为“scott”,大小为“512M”的表空间;
create tablespace scott_tablespace
datafile 'E:\oracle\scott_tablespace.dbf'
size 512M
autoextend on next 32M maxsize unlimited logging
extent management local
segment space management auto;--把scott的表空间的密码设为“tiger”;
create user scott identified by "tiger" default tablespace scott_tablespace;--查询所有的用户;
select * from all_users;--把所有的权限赋予scott;
grant all privileges to scott;
--创建名字为“test”大小为32M,
create tablespace test_tablespace
datafile 'E:\oracle\tese_tablespace.dbf'
size 512M
autoextend on next 32M maxsize unlimited logging
extent management local
segment space management auto;--test表空间的密码为“123456”;
create user test identified by "123456"
default tablespace test_tablespace;--把连接权限,和建表权限赋予test;
grant connect , resource to test;--在scott表空间里建立一个名字为“dept”的表格
create table dept(deptno number(2) constraint pk_ primary key,loc varchar2(60)
);--在scott表空间中建立一个名字为"salgarde"的表格;
create table salgrade(grade number,losal number,hisal number
);
--查看test中所有的表格;
select * from user_tables;--创建表格t1;
create table t1(t_1 char,t_2 nchar
);
--在表格的t_1,t_2行分别增添数据‘a’‘b’;
insert into t1(t_1, t_2)  values('a', 'b');
select * from tt;
--查看t_1,t_2的大小;
select t_1, length(t_1), t_2, length(t_2) from t1;

今天还行吧,讲了讲安装注意事项和oracle简单的基本操作,觉得简单没怎么听进去;T^T明天继续

--------------------day 2-------------------------------

6 数据类型

数据类型是在设计表结构中需要定义的,选择适当的数据类型可以节省存储空间,提高运算效率

6. 1 Oracle数据类型主要包括

6.1.1  字符型

适合保存字符串类型的数据,如:姓名、地址、简介等

char(2000), nchar(2000), varchar(4000), nvarchar2(4000)

6.1.2  数值型

适合保存数值类型的数据,如:年龄,成绩,薪水

Int(Integer),float,number(p,s)

6. 1. 3 日期/时间型

Date可以包含 yyyy-mm-dd hh24:mi:ss  -- 建议

TimeStamp:时间戳(精确到毫秒)

6.1.4 大对象(LOB)类型

Raw:固定长度的二进制数据,可以存放多媒体对象

CLOB:保存字符数据,最大4G

BLOB: 保存二进制数据,最大4G

BFile:保存指向外部文件的二进制数据

6. 2  char与nchar

都可以用来存放字符,如果不指定大小,默认大小为1

char 等价于 char(1), 意思是可以存放一个字节

nchar 等价于 nchar(1), 意思是可以存放本地字符集中的一个字符

6.3  char与varchar

char是定长,varchar是变长

char的效率比varchar要高

6. 4  varchar与varchar2

--char的大小不会变化,ncahr也不会变化,汉字的大小为2~之间;
create table tt(w1 char(4),w2 nchar(6)
);
insert into tt(w1, w2)  values('中','guo');
insert into tt(w1, w2)  values('中','国');
insert into tt(w1, w2)  values('国','guo');select * from tt;
select w1, length(w1), w2, length(w2) from tt;--char不能改变大小,length()一直都是定义的大小.   varchar可以改变大小,其所存储的大小要根据当地编码决定
create table tu(g1 char(10),g2 varchar(12)
);
insert into tu(g1, g2) values('11', '55');
select g1, length(g1), g2, length(g2) from tu;select * from tu;
--查看表格结构的类型;
describe tt;
--更新tu表的内容
updata tu(g1, g2) valuas('q', 'r');

工业标准的varchar类型可以存储空字符串。Oracle自己开发了一个varchar2,它不是一个标准的varchar,它在数据库中将varchar可以存储空字符串的特性改为可以存储null。Oracle建议使用varchar2而不是varchar,以得到向后兼容能力。

7 SQL(Structured Query Lauguage)语句类型

数据定义语言:DDL(Data Defination Language)

7.1 用于创建对象

如:create table, alter table, drop table, create view…

7.2 数据操纵语言:DML(Data Manipulation Language)

用于操作数据  CRUD

如:insert into, update, delete, select

7.3  数据控制语言:DCL(Data Control Language)

GRANT(授予权限)、 REVOCK(撤销权限)、 DENY(拒绝权限)

7.4  事务控制语言:TCL(Transaction Control Language)

SAVEPOINT、 COMMIT、  ROLLBACK

DDL:数据定义语言

CREATE   DROP   ALTER   ADD   MODIFY   RENAME

8  创建表及命名规则

8.1.1 表名和列名

必须以字母开头

必须在1-30个字符之间

必须只能包含A-Z,a-z,0-9,_,$,#

必须不能和用户定义的其他对象重名

必须不能是Oracle的保留字

Oracle默认都是存储为大写

8.1.2必须具备

create table 权限

存储空间

8.1.3 必须指定

         表名

         列名、 数据类型、 数据类型的大小

8. 2 建表语法

CREATE [GLOBAL TEMPORARY] TABLE table_name(

    column_name type [CONSTRAINT constraint_def]

    [,同上一行]

)

[ON COMMIT {DELETE | PRESERVE} ROWS]

[TABLESPACE tab_space]

;

说明:中括号里面的内容可以不写。

GLOBAL TEMPORARY:表示表中的数据是临时的,表中的数据保存到什么时候,需要参考ON COMMIT 选项

table_name:指定的表名

column_name:列名

type: 列的类型

constraint_def:列的约束定义

ON COMMIT:控制临时表中数据行保存的时间。DELETE表示事务结束则表中数据就被删除,PRESERVE表示表中的数据一直保存到用户会话结束。如果省略ON COMMIT后面的参数,则默认为DELETE。

tab_space: 指表对象存放的空间。如果没有指定,放在当前用户默认的空间

--创建临时表
create global temporary table ttt(y1 int constraint pk_y1 primary key,y2 varchar2(30),y3 date default sysdate  --日期型
)
on commit preserve rows;--临时表能不能存数据呢
insert into ttt(y1,y2) values(1,'中国');
select * from ttt;
commit;  --  preserve型的要在断开用户断开连接以后才会消失;
--创建临时表“oo”;
create global temporary table oo(u1 int,u2 int
)
on commit delete rows;
insert into oo(u1, u2) values('1', '2');
select * from oo;
describe oo;
commit;

8.3  获取表的相关信息

使用describe(desc)命令来查看某张表的信息

如:desc 表名;

describe tt;

查询USER_TABLES视图获取表的相关信息。

Select * from user_tables;

--从USER_TABLES视图中获取信息;
select table_name, tablespace_name, temporary from user_tables;--从用户中查询表的名称,存放表空间的用户名称,和是否是临时表;

8.4  获取表中列的信息

通过视图USER_TAB_COLUMNS来查看表中列的信息

Select * from user_tab_columns;

--从UESR_TAB_COLUMNS视图中获取列的信息;
select table_name, column_name, data_type, data_length
from user_tab_columns
where table_name='TTT';

8.5  重新给表命名

RENAME old_tab_name TO new_tab_name;

ALTER TABLE old_tab_name RENAME TO new_tab_name;

-------重命名-----------
create table yu(tr int
);
--想要将表重命名"yu"便为“yy”;
rename yu to yy;
alter table yy rename to yu;
drop table yu;

不建议修改表名操作。

8.6  给表添加备注----COMMENT

给表或列添加备注。可以帮助用户理解表或列。

8.6.1  给表添加备注

COMMENT ON TABLE table_name IS ‘描述信息’;


--给tu表添加上备注;
comment on table tu is '这里是描述';

8.6.2   查看表备注信息

通过视图USER_TAB_COMMENTS获取表备注信息

select * from user_tab_comments where table_name = ‘表名’;

--通过视图USER_tab_COMMENT视图获取表的备注
select * from user_tab_comments where table_name = 'TU';

8.6.3  给表的字段添加备注

COMMENT ON COLUMN table_name.column_name IS ‘备注信息’;

--给表yi添加g3字段和内容;
alter table yiadd g3 varchar(10);

8.6.4  查看表的列的备注信息

通过视图USER_COL_COMMENTS获取表字段的备注信息

select * from user_col_comments where table_name = ‘表命’;

select * from user_col_comments where table_name = 'T998';

8.7  从已有数据创建数据表

CREATE TABLE table_name AS SELECT * FROM 某表;

--参考yi创建t995,只复制g1, g3列;
create table t995
AS
select * from yi
;

思考:

① 如果只复制部分数据呢?

② 如果只复制表结构而不要数据呢?

--参考yi创建t995,只复制g1, g3列;
create table t995
AS
select g1,g3 from yi
;
--参考yi创建t996, 只要结构,不要数据;
create table  t996 AS select * from yi where  1 = 0;
select * from t995;
SELECT * FROM yi;
desc yi

8.8  删除表

DROP TABLE table_name; -- 删除表对象

DROP TABLE table_name purge;  --直接删除表对象,不进回收站。

PURGE RECYCLEBIN;  -- 清空回收站

SHOW RECYCLEBIN;  -- 查看回收站

恢复被删除表(闪回):  FLASHBACK TABLE table_name TO BEFORE DROP;

8.9  修改表

8.9.1  增加列

ALTER TABLE tab_name ADD col_name data_type;

8.9.2  增加虚拟列

Oracle 11g允许添加虚拟列,虚拟列可以引用表中已存在的列

虚拟列不能添加在临时表上

--创建一个测试用表
create table sa(great int,low number(7,2),high number(7,2)
);
--为测试用表增加数据;
insert into sa values(1, 100, 200);
insert into sa values(2, 300, 400);
insert into sa values(1, 500, 600);
select * from sa;--看看数据是否增加成功;
--在表sa中增加一个虚拟列“ave”,内容为(low+ high)/ 2;
alter table saadd( ave as ((low + high) / 2));

8.9.5  修改列

可以修改列的大小,精度,数据类型,默认值

ALTER TABLE tab_name MODIFY col_name data_type;

--修改表列t4.t4的默认值------------------------------------------------
alter table t4 modify t3 default sysdate -1;

第二天基本操作教的有点多有点复杂,需要下去多练练;T^T 明天见

-------------------day 3-----------------------------------------

我快死了这一天的学习下来T……T

可以修改列的大小,精度,数据类型,默认值

ALTER TABLE tab_name MODIFY col_name data_type;

--给表yi添加一列g4,是daete是类型,默认为系统时间前十天;
alter table yi
add g1 date default sysdate -10;

给列重命名

ALTER TABLE table_name

RENAME COLUMN old_col_name to new_col_name;

删除列

ALTER TABLE tab_name DROP COLUMN col_name;


--删除表yi的列g1;
alter table yi
drop column g1;

9   数据完整性

数据完整性(DataIntegrity)是指数据的精确型(Accuracy)和可靠性(Reliability),

它是防止数据库中存在不符合语法规定的数据,和防止因错误信息的输入输出造成的无效操作或错误信息而提出的。

    如:

数据类型

         年龄使用什么类型

        

         格式是否正确

         身份证号

         范围

         性别 可选’男’、’女’、’未知’

         是否允许重复

         银行卡号不允许重复

         特定的业务需求

         银行贷款

9.1  实体完整性

实体完整性要求每一个表中的主键字段都不为空,且不能重复

实现方法: 主键约束、 唯一约束

9/2  域完整性

域完整性指列的值域的完整性,如数据类型、格式、值域范围、是否允许空值等

实现方法:限制数据类型、外键约束、默认值、非空约束

9.3   引用完整性

也称之为参照完整性。当更新、删除、插入一个表中的数据时,通过参照引用相互关联的另一个表中的数据,来检查对表的操作是否正确

引用完整性要求关系中不允许引用不存在的实体

引用完整性与实体完整性是关系模型必须满足的完整性约束条件

实现方法:外键约束

9.4  自定义完整性

自定义完整性指针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义

实现方法:存储过程、触发器

10  表约束

表约束的作用是什么:确保表中数据的完整性

常见的约束类型:

    主键约束: PRIMARY KEY

    唯一性约束: UNIQUE

    非空约束: NOT NULL

    默认约束: DEFAULT

    检查约束: CHECK

    外键约束:FOREIGN KEY

10.1 主键约束

要求主键列唯一,并且不允许为空

添加主键的4种方式:

① 第一种,直接在需要设置为主键列的后面添加 primary key

--创建一个学生表存储学生信息;
create table stu(id int primary key,  --指定主键列,第一种创建主键约束的方式name varchar2(201) not null,--指定姓名列sex char(1),--性别birthday date--生日
);
--cha看stu数据结构
desc stu;
--向表中插入数据测试主键的特征:唯一性,非空性;
insert into stu values(1, '小雨洁' ,'F', to_date('20-10月-99'));
insert into stu values(2, 'JXF' ,'F', to_date('01-1月-00'));
--查看表数据
select * from stu;
drop table stu;

②第二种

--测试主键的第二种方式
--创建班级表cls
create table cls(id int constraint pk_cls_id primary key,--主键NumderOfPeo int --r人数
);

③第三种

--测试主键的第三种方式
create table tea(id int,name varchar2(30),sex char,age int,constraint pk_tea_id primary key(id)  --指定字段id列为主键;
)

④第四种\

--测试主键的第四种方式
create table course(id varchar2(21),name varchar2(120) not null,--课程名称不为空;code varchar2(15),property varchar2(30)
);
--使用alter来为表的某个列设定主键;
alter table course add constraint pk_course_id primary key(id);

选择主键的原则:

   最少性:尽量选择单个键做为主键,必须保证唯一

   稳定性:尽量选择数值更新少的列做为表的主键。一般选择没有实际意义,用户不关心,但对程序员很重要的列作为主键。

10.2   唯一约束  UNIQUE

唯一约束也可称为候选键。

要求该列唯一,但是允许为空。

Unique创建的约束列上,不可以存在相同的值,但是可以有多个null。

如:t_a varchar2(10) UNIQUE

 --验证唯一性约束 unique——————
create table t5(id int primary key,aa varchar2(10) unique,bb varchar2(15) not null,cc date default sysdate
);
--插入数据验证唯一性约束
--insert into t5 values(1,'1');
--insert into t5 values(2, '2');
--insert into t5 values(3,null);
--insert into t5 values(4,null);
--insert into t5(id) values(5);
insert into t5(id, bb) values(1,'a');
insert into t5 values(2,'2','b',to_date('1000-12-12','yyyy-mm-dd'));
select * from t5;
drop table t5;

10.3  非空约束  NOT NULL

当数据表上的某个字段上的内容不希望为空的时候,可以使用NOT NULL 指定

如:t_b varchar2(15) NOT NULL

10.4   默认值约束 DEFAULT

指用户没有指定此列的值时,使用默认值;如果指定了值,就使用指定的值

如: t_c date DEFAULT sysdate

10.4   检查约束 CHECK

指定表中一列或多列可以接受的数据值格式

比如:限制表中sex取值

练习:限定年龄在12到80之间

练习:限定名字以M开头

--check约束
create TABLE  t6(t_id int constraint pk_t6_t_id primary key,sex char constraint chk_t6_sex check(sex in('0','1','2'))
);
comment on column t6.sex is '0男,1女,2,未知';
select * from user_col_comments where table_name = 'T6';
desc t6;
select * from user_constraints where table_name = 'T6';
insert into t6 values(13,'2');
select * from t6;--练习限定年龄在12-80之间
drop table yy;
create table yy(age int constraint chk_yy_age check (age between 12 and 80),name varchar2(120) constraint chk_yy_name check(name like 'M%') --限制名字以M开头   --"%M"表示只要名字里带有M就行;
);
insert into yy values (13, 'Mk');
insert into yy values (11, 'Mk');-- 不能插入
select * from yy;

外键约束

用于建立和加强两个表数据之间的一列或多列。通过将表中的主键列添加到另外

    一个表中。可以创建两个表之间的连接。这个主键的列就称之为第二个表的外键列。外    键约束可以确保添加到外键表中的任何行都在主表中存在相应的行。

10.7   查看约束信息

USER_CONSTRINTS      

USER_CONS_COLUMNS  

        

11   主外键约束

主键与外键是维护多表关系的有效字段

注意事项:

    当主表没有对应的记录时,不能将记录添加到子表

    不能更改主表中的值而导致子表中的记录孤立

    子表存在与主表对应的记录,不能从主表删除该纪录

    删除主表前,先删子表

--先创建person表,再创建car表
create table person(  --创建一个表,名字见person(主表);id int constraint pk_per_id primary key, --指定id为person表的主键列name varchar2(30) not null
);
create table car(id int, name varchar2(30) not null,pid int,constraint pk_car_id primary key(id),constraint fk_car_pid foreign key(pid) references person(id)
);
--试一试能不能删掉person表
-- 不能直接删除被子表外键关联的主表
--如果删除,需要先删除子表再删除主表
drop table car;
drop table person;
--插入数据来试一试
insert into person values (1, '雷倩');
insert into person values (2, '赵任');
insert into car values(1, 'BMW', 1);--update person set id = 2 where id = 1;
update person set name = 'zzhangsan' where id = 2;
delete from person where id = 2;
select * from person ;
select * from car;

12   三大范式

数据冗余:存在大量重复数据

在创建表时就要规范,尽量减少数据冗余

有什么标准验证表是否规范: 范式

12.1  第一范式: 保存域的原子性

保存列不可再分割

表中有这样的字段:姓名,地址

12.2   第二范式

满足第一范式

每条记录都有主键

保证表中的所有字段与主键有关

第二范式:取消部分依赖

其中员工姓名与员工职务依赖于员工编号,但是项目名称和项目介绍不依赖与员工编号

方案: 拆分成员工表 与  项目表

12.3  第三范式

满足第二范式

保证表中所有字段与主键直接有关

第三范式:取消依赖传递

其中学员班级依赖学员编号,班级教员依赖于学员班级,So,班级教员与学员编号之间是传递依赖的关系

方案: 拆分成班级表 与 学员表

13   范式练习

按照三大范式的要求拆分下表:

  1. 扩展:创建表之前的分析与设计

    1. 软件开发的基本流程

提出需求>>>需求分析>>>概要设计>>>详细设计

>>>编码>>>测试>>>交付>>>培训

提出需求:用户说明想要一个什么样的软件

概要设计:框架结构,静态模型,用例说明文档,数据库设计

详细设计:编写工具类,框架使用的类,类设计,接口设计,方法名…

编码:编写代码

测试:看编写的东西有没有BUG

交付:给用户使用

  1. 数据库在哪个阶段

在概要设计阶段,在开发过程中,越在前面阶段出现问题,影响越大。

14.3 数据库设计时模型   ----  ER图

         需求 》》》ER图 》》》数据表

         ER:  实体关系图     Entities    Relation

         ER图的组成就三个图形 + 映射基数

14.3.1 实体 》》》表

         实体:要保存数据的对象

         实体:矩形

        

14.3.2 属性 》》》字段

         属性:要描述的实体的属性

         属性:圆角矩形

        

14.3.3 关系 》》》 表与表之间的关联

         关系:两个实体之间的关系

         关系:菱形

        

14.3.4 映射基数

         映射基数:表示二个实体之间的关系的基数

         1对1、1对多、多对多

        

  1. ER图的应用

15.1 需求

有商品,商品有编号,名称,价格,数量

有类型,类型有编号,有名称

有订单,订单有编号,时间,地址

订购时产生订购数量,订购价格

15.2 ER图

    从需求转成模型

    第一步:找实体

         有商品实体、有订单实体、有类型

    第二步:找属性

         商品有编号、名称、价格、数量

         类型有编号、名称

         订单有编号、时间、地址

    第三步:找关系

         商品与类型之间是属于

         商品与订单之间是订购

         找关系属性

    第四步:映射基数

         商品与类型的映射基数: 多对一

         1个商品属于几个类型: 1个

         1个类型可以有几个商品:多个

         当二个实体之间关系是“多对一”映射时,关系字段直接放在多的一方

         商品与订单之间的映射基数: 多对多

         1个商品可以被几个订单订购:多个

         1个订单可以订购几个商品:多个

         当二个实体之间的关系是“多对多”映射时,必须创建第三张关系表

        

15.3 创建表

    一 类型表 Type

         编号(id)         名称(name)

        1               数码产品

         2               体育用品

    二 商品表 Goods

         编号(id)     名称(name)    价格(price)    数量(num)    商品类型(gType)

         1            OPPO A57     1288          200           1

         2           佳能单反       12345         99           1

         3           篮球           321           999           2

    三 订单表 Orders

         编号(id)     时间(time)     地址(add)         总价(totalPrice)

         A101       XXXX         西南民族大学     20000

         A102        XXXX        同上              5400

    四 订单明细表  OrderDetails

         编号(id)     订编(o_id)    商编(g_id)    订购价格(price)   订购数量(num)

         1            A101         2              12000           1

         2            A101         1             1000            8

         1            A102         1              1200            2

         2            A102         3              300             10

已卒。。。。。。。。。。。。。。。。。。。。。。。。。。

------------------day 4------------------------------------------------------------

16 DML:数据操纵语言

16.1 INSERT语句

         可以使用INSERT语句将数据插入到表中,需要指定以下信息

              ① 插入到哪张表

              ② 插入哪些列

            ③ 指定列清单对应的一系列值

    

         当插入数据时,需要给主键以及非空约束的列指定值

         如果为表所有列都指定值,可以忽略列清单,值的顺序要与列的顺序一致

         可以使用NULL值为某些列指定空值

         列值中可以包含单、双引号

         将行从一个表复制到另一个表,可以使用INSERT语句

--练习建两个表a, 表b,a表中有一条记录;需求将a表中的一条记录存入b表
create table a(id number(7, 3)
);
create table b(id number(7, 3)
);
insert into a values (1);
insert into b select 10 from a where id = 1;
select * from b;

16.2 UPDATE语句

         可以使用UPDATE语句修改表中的行。使用UPDATE时,需要指定

              ① 表名

              ② 需要修改的列,要用where子句指定条件

              ③ 列名的清单及新值

         一个UPDATE语句可以修改多列

         语法:

              UPDATE tab_name

              SET col1_name = newVal1 [,col2_name=newVal2……]

              WHERE conditions;

--update 语句,务必指定条件
select * from cur;
update cur set phone = '123';

16.3 DELETE语句

可以使用DELETE语句从表中删除行。需要使用WHERE子句指定要删除的行。否则会删除表中所有数据。

语法:DELETE FROM tab_name WHERE conditions

--delete 语句,务必指定条件;
delete from cur where id = 4;  --将id= 4 的记录删除;
rollback; --恢复数据;

16.4 TRUNCATE TABLE

截断表时使用TRUNCATE语句,这个操作会从表中删除所有的行。重置表的存储区域

-创建一个c表,演示truncate 的用途;
create table c(id int primary key,name varchar2(10)
);
insert into c values (1, 'a');
insert into c values (2, 'c');
insert into c values (3, 'c');
select * from c;
desc c;
--使用truncate删除表中的数据
truncate table c;

16.5 DELETE、 TRUNCATE、 DROP区别

         1 delete: 是DML,删出表中的数据,绝大多数情况要指定where子句,需要提

     交(commit)才生效,可以回滚(rollback)

2 truncate: 是DDL,不能回滚。删除表中的所有记录,执行速度比delete要快。对于外键约束引用的表,不能使用truncate,要用不带where条件的delete语句。

3 drop: 是DDL,不能回滚。删除结构及所有数据,释放空间。

从速度上来说:  DROP  >  TRUNCATE  >  DELETE

NOTICE!

     操作删除时请务必小心!

17 基础查询----SELECT语句

17.1 SELECT语句的基本语法

      SELECT 子句

      FROM 子句

      [WHERE 子句];

     SELECT子句: 指定查询结果集的列的组成,列表中的列来自一个或多个表或视图。

     FROM子句:指定要查询的一个或多个表或视图

     WHERE子句:指定查询条件,限制查询记录。

17.2 一些概念介绍

17.2.1 关键字

         指单个的SQL元素

         例如: SELECT、  FROM

17.2.2 子句

         是SQL语句的一部分

         如: select empno, ename …… 就是一个子句

17.2.3 语句

         是两个或更多个子句的组合。

         如: select empno, ename from emp where deptno = 20;

17.3 选择所有列及特定列

         选择所有列: 在select后面加上星号(*),或者列出所有列

     投影:在select子句中指定列名,用逗号(,)隔开,这样可以显示某些列,也可以调整列的展示顺序

17.4 列的别名

通常情况,当数据从表中查询出来时,Oracle会将列名转换为大写,显示在数据上方。

可以为查询列指定别名,别名可以使用双引号,也可以在别名前加上AS关键字

17.5 编写SQL语句规范

         为了构建易读易懂易编的有效语句,其规则和准则如下:

              ① SQL语句是不区分大小写的

              ② SQL语句可以是一行,也可以是多行

              ③ 关键字不能放在两行之间一分为二或缩写

              ④ 子句通常放在单独的航中,可以增强可读性并易于编辑

              ⑤ 使用缩进是为了增强可读性

              ⑥ 关键字通常使用大写字母输入,所有其他文字使用小写

18 运算符

18.1 算数运算符

     使用算数运算符,可以创建数字和日期数据表达式。

     算数表达式可以包含列名、常数值和算数运算符

     包含 +  -  *  /

    

18.2 连接运算符

     连接运算符具有以下特点和功能

         将列和字符串连接到其他列

         由两条竖线(||)或concat(arg1,arg2)表示

         创建一个合成列,它是字符串表达式

-- 算术运算符
select ename "员工", sal "工资", sal+200 "涨钱后的工资" from emp;
select ename, sal*12, (nvl(comm,0)+1000)/10 from emp;

18.3 文字字符串

     文字指包含在select列表中的字符,数字或日期

     日期和字符文字必须包含在一对儿单引号中

     在输出结果中,每个返回的行都会将每个字符显示一次。


-- 文字字符串
select '名字是:' || ename "员工名称" from emp;

18.4 限制选定的行

     使用WHERE子句限制返回的行

     WHERE子句在FROM子句之后,将查询条件限制在满足一定条件的记录

     条件由列名、表达式、常数和比较运算符构成

     Exp: SELECT * FROM emp WHERE empno = 7499;

-- where 子句
select ename,job,sal
from emp
where 1=1
and deptno = 30
and sal > 1500;select * from emp where ename = 'SMiTH';

18.5 字符串和日期

     字符串和日期要包含在单引号中,但是数字常数不用

     字符值是区分大小的

     默认的日期格式是 DD – MON – RR

     Oracle数据库以内部数字格式存储日期,包括世纪、年、月、日、时、分、秒

18.6 DUAL表

     DUAL长用在没有查询目标的select语句块中,它只包含一行数据


-- dual表
desc dual;
select * from dual;
select 'haha' from dual;

18.7 日期计算

     可以在日期上使用加法或减法运算符。加减操作的数字表示天数。

18.8 比较运算符

     >  <  >=  <=  =  <>(!=)  any  all

-- 比较运算符
select * from emp
where empno <> 7700;-- 查询empno > 7369, 7521 ,7499
select * from emp
where empno > ALL(7369,7521,7499);
-- empno<7369 and empno<7521 and empno<7499

      

     关于ANY与ALL,自己试验并总结。

18.9 SQL运算符

     SQL运算符可以进行指定匹配,像字符串、列表值、NULL值。

         LIKE:      匹配字符串

         IN:          匹配列表值

         BETWEEN: 匹配范围值

         IS NULL:   匹配空值

         IS NAN:   匹配非数字值

     同样,可以在上述运算符前加 NOT取反

18.9.1 LIKE运算符

         可以在WHERE子句中使用LIKE运算符进行字符串匹配

         可以使用普通字符及通配符进行组合,通配符如下:

              ① 下划线_:表示匹配某个位置的字符

              ② 百分号%: 表示在某个位置的任意个字符

-- LIKE 运算符
select * from emp
where ename like '_L_R%;

18.9.2 IN运算符

         在WHERE子句中用IN筛选某列的值是否在列表内

-- LIKE 运算符
select * from emp
where ename like '_L_R%'
;

18.9.3 BETWEEN…AND

         在WHERE子句中用BETWEEN检查某列的值是否在一个指定的范围内。

         Oracle中,BETWEEN…AND包含区间两端的值

-- BETWEEN运算符
select * from emp
where sal BETWEEN 1100 AND 1600
;

18.10 逻辑运算符

     逻辑运算符允许根据逻辑条件限制行

         x AND y  :     x和y都为真时,返回真

         x OR y  :       x 或 y为真时,返回真

         NOT x  :       x为假时,返回真

19 Order by

     可以使用Order by对查询的结果进行排序,可以对一列或多列进行排序。

     Order by 子句 在 SQL 语句的最后

     默认情况。Order by 是按照升序(ASC)进行排序的,也可以使用降序(DESC)指定为降序排序。

     同样我们可以使用列的位置编号,指定哪列需要进行排序

-- ISNULL 和 ISNAN
select * from emp
where comm IS NOT NAN
;
-- 逻辑运算符  and  or  not
-- 查询入职日期在1982年元旦后,且薪资大于1200的员工信息
select * from emp
where hiredate > to_date('1-1月-82')
and sal > 1200
;
-- 查询部门在10,20内的员工或者职位是经理的员工
select * from emp
where deptno in (10, 20)
or job = 'MANAGER'
;

20 DISTINCT

     在SELECT语句中,可以使用DISTINCT关键字去除重复的行。

-- DISTINCT
select distinct job from emp

-------------------------------------------------------------------day  5------------------------------------------------------

终于 到了第5天,今天讲的内容也不是很难 就是有点杂;需要记忆的语句有点多,到时候又msc可也用不用自己写语句的没事 不要慌;T_T

20 DISTINCT

    在SELECT语句中,可以使用DISTINCT关键字去除重复的行。

21 单行函数

    单行函数只处理单个行,并为每一行都返回一个结果。单行函数分为以下几种

         字符函数  :  处理字符串

         数字函数  :  处理数学计算

         转换函数  :  数据类型转换

         日期函数  :  处理日期和时间

         正则表达式函数 :  使用正则表达式搜索数据

21.1 CONCAT()函数

         语法: CONCAT(x, y):将x和y拼起来,返回新的字符串

        

21.2 INITCAP()函数

         语法:INITCAP(x):将字符串首字母大写,其它字母小写

        

21.3 INSTR()

         语法: INSTR(x,find_string [,start] [,occurrence])

         返回指定字符串find_string在x中的数字位置。可以指定开始的搜索位置start,

    并提供该字符串出现的次数occurrence.start与occurrence默认为1,表示从字符

    串开始的位置搜索,并返回第一次出现的位置

   

21.4 LENGTH()函数

         语法:LENGTH(x): 返回表达式中的字符数

         同样可以计算数字、日期的长度

     

21.5 LOWER()函数与UPPER()函数

    语法:LOWER(x) 将字母字符值转为全小写

          UPPER (x) 将字母字符值转为全大写

21.6 LPAD() 和 RPAD()

    语法:LPAD(x, width [,pad_string])

          在x左侧填充pad_string,使其总宽度为width

         RPAD(x, width [,pad_string])

         在x右侧填充pad_string,使其总宽度为width

21.7 LTRIM() 、  RTRIM() 、  TRIM()

         语法:LTRIM(x [,trim_string])

从x字符串左侧去除所有的trim_string字符串,如果没有指定trim_string,默认去除左侧空白字符

             RTRIM(x [,trim_string])

从x字符串右侧去除所有的trim_string字符串,如果没有指定trim_string,默认去除右侧空白字符

TRIM(trim_string from x)

去除x两端的trim_string字符串

21.8 NVL(), NVL2()

         语法:NVL(x, value): 用于将一个NULL值转换为另一个值。如果x是NULL,

    就返回value,否则返回x本身

             NVL2(x, val1, val2):如果x不为NULL,返回val1;否则返回val2.

 

21.9 REPLACE()

         语法:REPLACE(x, search_string, replace_string)

             从字符串中搜索search_string,并使用replace_string字符串替换。

        

21.10 SUBSTR()函数

         语法:SUBSTR(x, start [,length])

    返回字符串中的指定子字符串。这些字符从字符串的start位置开始,长度为length个字符。如果,start是负数,就从x串的末尾开始算。如果length省略,就从start开始,截取完。

   

21.11 SOUNDEX()

语法:SOUNDEX(x):返回与x发音相同的列值,可用于查找一些语音向同但拼写不同的单词

21.12 数字函数

         数字函数接受数字输入,并以数字形式返回处理结果

21.13 转换函数

         将值从一种类型转换为另一种类型,或者从一种格式转换为另一种格式

         主要介绍以下几种:

         TO_CHAR()     TO_NUMBER()         TO_DATE()         CAST()

21.13.1 TO_CHAR()

         语法: TO_CHAR(x [,format])

             将x转化为字符串,format指转换的格式,可以将数字格式或日期格式转换

         为字符串格式

          

         转换时常用的数字格式元素见下图

21.13.2 TO_NUMBER()

    语法:TO_NUMBER(x [,format])

         将可以转换成数字的x转换为数字,可以指定format格式

 

21.13.3 TO_DATE()

         语法:TO_DATE(符合日期格式的串)

   

21.13.4 CAST()函数

         语法:CAST(x as Type)

         将x转换为指定的兼容的数据库类型

22 聚合函数

         聚合函数又称为聚集函数、分组函数。聚合函数可以对行集进行操作,并且为每组

    给出一个结果。

         聚合函数可以使用任何有效的表达式

         NULL值在聚合函数中被忽略

         可以在聚合函数中使用DISTINCT关键字,排除重复值.

         聚合函数的类型:常用的几种有:

         avg(x):      返回x的平均值

         count(x): 返回统计的行数

         max(x):     返回x的最大值

         min(x):      返回x的最小值

         sum(x):     返回x的总计值

22.1 AVG()函数

         语法:AVG(x) : 获取x的平均值

         如: 统计emp表中员工的平均工资

        

22.2 COUNT()函数

         语法:COUNT(x)  : 统计查询返回的行数

         如: 统计emp表的行数

         Select count(*) from emp;

         注意:在统计时避免使用COUNT(*),否则会使用更长的统计时间返回统计结果

         可以使用COUNT(某列)来带替*符号。

        

22.3 MAX() 和 MIN()函数

         语法:MAX(x) ,MIN(x)  :分别统计x的最大值和最小值

         如: 统计emp表中,sal列的最大值和最小值

        

         MAX()和MIN()函数,也可以用来统计字符串和日期

         如果是用来统计字符串,那么将会对字母进行排序,最大值在最后底部,最小值在

    前面第一个。比如: ALBERT 就会在 ZEB 前

         如果是日期,最大值会是最近的时间,最小值会是最早的时间

22.4 SUM()函数

         语法:SUM(x)  :  统计x的总和

         如:查看emp表中所有员工的薪资总和

         Select sum(sal) from emp;

23 分组

    有时需要对表中的行进行分组,然后统计每组的信息

    例如: 统计emp表中所在部门,使用GROUP BY进行分组

   

   

    可以使用GROUP BY对多个列进行分组

    如:对emp表中的员工按照部门、职位来分组

   

23.1 对分组行使用聚合函数

    可以对分组后的行使用聚合函数,聚集函数会统计每组中的值。对于每组分别统计后返回一个值。

    比如: 按部门编号进行分组,求出每组的人数,平均工资

   

    比如: 按照职位进行分组,求出每个职位最高和最低工资

   

23.2 注意事项

         如果查询中使用了聚合函数,被查询的列未使用聚合函数函数处理,那么这些列

    必须出现在group by 子句后,否则会提示 ORA – 00937 错误

         不能使用聚合函数做为WEHER子句的筛选条件,否则,会提示ORA-00934错    误。如: select deptno from emp where avg(sal) > 1000 group by deptno;

23.3 使用HAVING子句过滤分组后的行

         语法: SELECT…FROM…WHERE…

               GROUP BY…

               HAVING…

               ORDER BY…;

         注意:GROUP BY子句使用时可以不使用HAVING,但是使用HAVING时必须有

              GROUP BY

         比如: 查看emp表中,部门的平均工资超过900的部门

首先,使用group by对部门进行分组,然后,在统计处每个部门的平均工资后再对其进行筛选

SELECT deptno, avg(sal)

FROM emp

GROUP BY deptno

HAVING avg(sal) > 900;

23.4 同时使用WHERE与GROUP BY和HAVING

         首先,执行WHERE筛选掉不符合的条件

         然后,将符合条件的行使用GROUP进行分组

         最后,使用HAVING对分组统计的结果进行再次筛选

         如:统计不是10号部门,平均工资大于900的部门

        

23.5 select语句完整的执行顺序

                                            执行上

    编写上: SELECT ……                   6. 查询

             FROM……                     1. 组装来自不同数据源的数据

             WHERE……                   2. 基于指定的条件对记录进行筛选

             GROUP BY……                 3. 将数据划分为多个分组

             HAVING……                  4. 筛选分组信息

                                            5. 计算所有的表达式

             ORDER BY…….;              7. 对结果进行排序  

明天见,最近一直不想写代码,不知acm'怎么样了,最近上课上得很累很累T~T........................................

see you  tomorrow;

--------------------------------------  day 6-------------------------------------------------------

24 多表查询

     不同的数据存放在不同的表中,通常,要查询多张表才能找到需要的数据。

     语法: SELECT ……

           FROM 表1 [别名] [,表2 别名…]

           WHERE …;

     连接两张表的查询可以在FROM后面加两张表,然后再指定表的关联关系。

         ① 首先,指定查询的两张表 EMP, DEPT

                   FROM EMP, DEPT

         ② 通过WHERE条件指定两张表的关系

                   WHERE EMP.DEPTNO = DEPT.DEPTNO

     例:查询公号为7369的员工的详细信息及部门详细信息

    

24.1 表的别名

EMP表和DEPT表相关字段会用在SELECT子句及WHERE子句上。可以给表起别名,提高代码可读性,降低书写难度

24.2 笛卡尔乘积

     如果查询两张表,并且没有定义连接条件,那么查询的结果集是两表相乘的结果,这样的情况称之为笛卡尔乘积。

    

    

     结果变成了 14 * 4, 错误!

24.3 练习

     要求查询出每一个雇员的编号,姓名,工资,部门名称,工资等级

     第一步:确定所需要的数据表

              Emp表:          编号, 姓名, 工资

              Dept表:        部门名称

              Salgrade表:   工资等级

         From emp e, dept d, salgrade s

     第二步:确定关联条件

         Emp表与dept表:            e.deptno = d.deptno

         Emp表与salgrade表:         e.sal between s.losal and s.hisal;

     第三步:查询出每一个雇员的编号、姓名、工资

         Select e.empno, e.ename, e.sal from emp e;

     第四步:引入部门表,同时增加一个消除笛卡尔积的条件

         Select e.empno, e.ename, e.sal, d.dname

         From emp e, dept d

         Where e.deptno = d.deptno;

     第五步:引入工资等级表,继续增加消除笛卡尔积的条件

         Select e.empno, e.ename, e.sal, d.dname, s.grade

         From emp e, dept d, salgrade s

         Where e.deptno = d.deptno

         And e.sal between s.losal and s.hisal;

25 连接条件和连接类型

25.1 常见的两种链接条件

         ① 等值连接      通常使用(=)操作符

         ② 非等值连接   除了=操作符的其他的运算符,一般使用 <> > < >= <= Like In Between…AND… 等运算符

25.2 常见的三种连接类型

① 内连接 : 内连接返回的行只有满足连接条件才会返回。如果连接的列中有NULL值,那么该行不会返回。

[INNER] JOIN

②外连接: 外连接返回的行满足连接条件,也包含再连接条件的列包含NULL值的行

{LEFT|RIGHT|FULL} [OUTER] JOIN

③自连接:连接的表为同一张

26 SQL/92语法

     SQL/92语法是使用INNER JOIN 和 ON来完成内链接的

     如:之前的emp与dept关联改用SQL/92语法实现:

    

如:之前的三表关联改用SQL/92语法实现

27 子查询

     子查询是嵌入到另一个SELECT语句当中的SELECT语句。通过子查询,可以使用简单的语句组成强大的语句。

     当需要从表中选择行,而选择条件却取决于该表自身的数据时,子查询非常有用

    

     子查询主要分为以下两种基本类型

         单行子查询

         多行自查询

     另外,还有3种类型

         多列子查询

         关联子查询

         嵌套子查询

27.1 单行子查询

     内部SELECT语句给外部的SELECT语句返回0行或1行。可以在SELECT语句后面的WHERE、HAVING、FROM后面放置单行子查询

27.1.1 在WHERE子句中使用子查询

     将另一个查询做为WHERE子句的子查询

     在单行子查询中还可以使用其他比较运算符,比如<> > < >= <=

     如:查询工资比平均工资高的员工信息

    

27.1.2 在HAVING子句中使用子查询

     HAVING是在分组统计后用于过滤行,同样在HAVING子句后面可以跟子查询。

     如:统计平均工资高于公司平均工资的部门

    

27.1.3 在FROM子句中的子查询

     将子查询放在FROM子句后为其提供数据

    

     使用单行子查询有时会出现一些错误:

     如:如果子查询返回的结果是多行,而其使用的是比较运算符,将会出现错误

     使用子查询时还需注意:子查询中不能使用ORDER BY子句进行排序

27.2 多行子查询

     内部SELECT语句给外部的SELECT语句返回1行或多行

     在父查询中,可以使用IN、 ANY、 WHERE操作

     Select * from emp

     Where deptno in (select deptno from dept);

     同样也可以使用NOT IN检查一个值是否不在指定的列表中

     例: 使用 ANY 查询任意满足工资低于平均档的员工信息

     Select empno, ename sal from emp

     Where sal < any(select avg(sal) from emp group by deptno);

27.3 多列子查询

     子查询还可以包含多列

     如:查询出每个部门的最低工资,再查出满足这些条件的员工信息

    

27.4 关联子查询

     子查询引用与父查询相关的一列或多列

         子查询需要借助父查询,而父查询也要借助子查询,

     子查询要为父查询的每一行运行一次

    

如:要查出每个部门中,高出本部门平均工资的员工编号和姓名

     首先:查出每个部门的平均工资

    

     替代解法:

    

27.5 嵌套子查询

     SQL提供嵌套子查询机制,即:在一个查询中嵌套另一个SELECT…FROM…HWERE查询语句

     子查询中嵌套子查询,最多可嵌套255层

     如:查询工资高于‘SMITH’工资的员工信息

27.6 在UPDATE语句中使用子查询

     如:将empno为7900的员工工资更新为工资等级表中的最高平均工资。

    

27.7 在DELETE语句中使用子查询

     例:删除工资高于平均工资的员工

    

28 行的标识符 ROWID

     在Oracle中,每一行都有一个唯一的行标识符,它用于Oracle数据库内部存储的物理位置。

     Select rowid,empno from emp;

     rowID并不在表定义中。

29 ROWNUM

     ROWNUM可以返回结果集的行号。查询返回的第一行编号为1,第二行编号为2,以此类推。

     ROWNUM并不是永久固定的,是每次重新动态声称的。此时,如果想查询6-10条记录,有between…and…的方式是没有数据的。

     这个时候想要真正实现这种查询。思路:先查前10条,之后在显示后5条,要依靠子查询。

     Select rownum, empno, ename,job, hiredate ,sal from emp

     Where rownum<10

30 分业查询

     承接29分业思路

    

今天的只是有点难度 ,需要多理解,特别是子查询这一块,有点烧脑,可能是我比较笨吧,,努力努力继续努力T_T   ,明天见

---------------------------------------------day 7----------------------------------------------------------------

31 序列

     序列是一个数据库对象,用于生成一系列的整数。

31.1 可以使用CREATE SEQUENCE语句来创建序列,语法如下:

     CREATE SEQUENCE seq_name

     [START WITH start_num]

     [INCREMENT BY increment_num]

     [{MAXVALUE max_num | NOMAXVALUE}]

     [{MINVALUE min_num | NOMINVALUE}]

     [{CYCLE | NOCYCLE}]

     [{CACHE | NOCACHE}]

     [{ORDER | NOORDER}]

;

    

说明:

     seq_name: 序列的名称

     start_num: 序列开始的第一个数,默认从1开始

     increment_num: 每次增长的数值

     max_num: 序列能够达到的最大的值

     NOMAXVALUE:不指定最大值,则升序最大是1027,降序最大是-1

     min_num: 序列中的最小值,该值必须比max_num要小,也要小于start_num

     NOMINVALUE: 不指定最小值,则升序最小是1,降序最小是-1026

CYCLE:循环,升序达到了最大值,下一个是最小值;降序达到了最小值,下一个是最大值

NOCYCLE: 当序列的值达到最大或最小值时,序列不再产生任何数值,默认是NOCYCLE

chche_num: 保存在内存中缓存整数的数量,默认缓存的数量是20.

NOCACHE:表示不缓存数字

ORDER:保证整数的请求顺序是按照生成顺序得到的

NOORDER:不保证整数的请求顺序是按照生成顺序得到的

例: 使用默认选项创建序列:

     CREATE SEQUENCE seq1;

查看序列信息:

     SELECT * FROM USER_SEQUENCES;

创建序列之后,序列可以产生一系列的数值,可以通过currval和nextval来访问他们以获取当前值和下一个值。

     使用序列填充主键

         

     注意: 当使用序列填充主键列是,通常应使用NOCACHE避免序列产生的值发生遗漏,然而使用NOCACHE会降低性能。不过,如果不介意主键遗漏,可以再考虑使用CACHE.(数据遗漏通常是因为缓存数值时,数据库被关闭)

31.2 修改和删除序列

     修改: ALTER SEQUENCE

         其他语句…;

    

     修改序列有一些限制:

         初始值不能改

         序列的最小值不能大于当前序列的值

         序列的最大值不能小于当前序列的值

     删除: DROP SEQUENCE seq_name;

32 索引

32.1 创建索引

     CREATE [UNIQUE] INDEX index_name

     ON table_name(column_name [,column_name])

     TABLESPACE tab_space;

     说明:

         UNIQUE : 意味着索引中的值必须是唯一的

         index_name : 索引名称

         table_name : 需要加索引的表名

         column_name : 需要加索引的列。可以在多列上加索引(这样的索引,称之为复合索引)

        

32.2 修改和删除索引

     同31.2

32.3 索引的一些相关内容

     索引是与表关联的可选结构。可以创建索引以加快对表执行SQL语句的速度。就像书的索引可以帮助我们更快速的查找信息一样,Oracle中的索引也提供了一种更快地访问表数据的途径。

   应该建索引列的特点:

1)在经常需要搜索的列上,可以加快搜索的速度;

2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;

3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;

4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

    不应该建索引列的特点:

第一,对于那些在查询中很少使用或者参考的列不应该创建索引。

第二,对于那些只有很少数据值的列也不应该增加索引。

第三,对于那些定义为blob数据类型的列不应该增加索引。

第四,当修改性能远远大于检索性能时,不应该创建索引。

    索引的特点

优点:

第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 

第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    什么情况下要创建索引

在以下情况,应该考虑创建索引:

列包含较大范围的值

列包含大量空值

在WHERE子句或连接条件中频繁使用一个或多个列

表相当大,但是预计的多数查询检索的行占总行数比例较小,如百分之十以下

 

    什么情况下不创建索引

在以下情况,应该考虑创建索引:

列包含较大范围的值

列包含大量空值

在WHERE子句或连接条件中频繁使用一个或多个列

表相当大,但是预计的多数查询检索的行占总行数比例较小,如百分之十以下

33 视图

     视图是基于已知的一张或多张表的查询

查询视图与查询普通表的查询方式是一样的

一些视图是可以对其进行DML操作,从而影响其基表的操作

视图实际并不存储数据,数据存储实际是存储在表中

之前已经使用过很多视图查看信息。

比如:user_tables,user_sequences 以及user_indexes都是视图

33.1 为什么要创建视图

     将复杂的查询用视图来实现,然后给用户授权访问,这样可以隐藏复杂的业务逻辑

可以禁止用户直接访问基表,授予用户访问视图的权限

可以允许视图来访问基表中的某些行

可以对最终用户隐藏某些行

33.2 创建与使用视图

     CREATE VIEW view_name

     AS

     SELECT 表当中的某些字段 FROM table_name;

     SELECT * FROM view_name;

    

33.3 视图的分类

     简单视图: 查询只基于一张表

     复杂视图:

         一般查询涉及到多张表

         使用到GROUP BY子句,或DISTINCT关键字

         包括函数的使用

     例子: 创建视图emp_dept_view1,用于查找部门编号低于20的员工

        

     例子: 创建视图emp_view1,查找emp表中除了sal字段的所有信息(自己完成)

33.4 可以使用DML语句对视图进行操作

     注意 : 只用于简单视图

    

33.5 其他

     查看视图定义:    desc view_name

     查看视图信息:    select * from user_views;

     修改视图:        create or replace view view_name as …;

    

     删除视图:       DROP VIEW view_name;

34 同义词 SYNONYM

     使用同义词访问相同的对象

         方便访问其他用户的对象

         缩短对象名字的长度

     语法: CREATE SYNONYM synonym_name

           FOR object;

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》PL/SQL》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

1 PL/SQL简介

     PL/SQL(Procedure Language/SQL):过程语言/SQL

     它是结合Oracle过程语言和结构化查询语言的一种扩展语言

     PL/SQL支持多种数据类型,可以使用条件语句和循环语句等控制结构

     PL/SQL可用于创建存储过程、触发器等,也可以处理业务规则,数据库事件或给SQL命令的执行添加程序逻辑。

2 PL/SQL的基本结构

     PL/SQL语言是程序化程序设计语言

         块(BLOCK)是PL/SQL程序中最基本的结构,所有PL/SQL程序都由块组成

     PL/SQL的块由变量声明、程序代码和异常处理代码三部分组成

         DECLARE

              标记声明部分。变量、常量的声明,必须要在begin前面。

              声明一些变量、常量、用户定义的数据类型及游标

              name varchar2(30);   -- 声明时不设置值。

              varName varchar2(30) := ‘jackl’;  -- 声明带有默认值

         BEGIN

              标记主程序体部分开始

              主程序体,在这里可以加入各种合法语句

         EXCEPTION

              标记异常处理部分开始

              异常处理程序,当程序出现错误时执行这部分

         END   -- 标记程序结束

  1. PL/SQL 字符集

3.1 PL/SQL语言有效字符包括以下三类

         所有大写和小写英文字母

         0-9的阿拉伯数字

         操作符: + - * / > < ……

3.2 PL/SQL 标识符

         标识符的最大长度为30个字符,不区分大小写

         建议在标识符当中适当使用大小写,增强可读性。

4 PL/SQL 变量和常量

         在PL/SQL程序运行是,需要定义一些变量来存放数据

         变量在使用前必须声明,可以在DECLARE块中来声明

         语法如下:

         DECLARE

              变量名 变量类型 := 默认值;

在DECLARE块中可以同时声明多个常量和变量。声明普通常量或变量时要说明以下信息

     常量或变量的名称

     常量或变量的类型。

4.1 变量说明

     说明变量,以下是例子:

     var char(15);  说明变量名,数据类型和长度后用分号(;)结束

     married boolean := true;

     psal number(7,2);

     my_name  emp.ename%type;  引用型变量:my_name的类型与emp表中ename列的类型一致。

     emp_rec  emp%rowtype; 

     记录变量分量的引用: emp_rec.ename := ‘ADAMS’;

     说明常量:

     语法:

         常量名 CONSTANT常量类型 := 值;

         说明: 

              :=  为赋值语句

关键字constant表示声明的是常量。常量一旦定义,在以后的使用中,其值不再改变。

例:PassScore constant NUMBER(3,1) := 60;

4.2 PL/SQL案例:

    

① 输出HELLOWORLD

         ② 仿照①,声明两个变量,给他们赋值,然后输出

              自己设计

5 PL/SQL程序的执行部分

PL/SQL程序的执行部分包括:

   赋值语句

   流程控制语句

   SQL语句

   游标

5.1 接收用户的输入赋值

     在DECLARE之前,可以通过:

ACCEPT someVar PROMPT ‘提示信息’; 要求用户输入

     在后面的代码中,可以通过地址引用&someVar接收这个值。

     如果不输入,也可以直接引用,只是一个提示而已。

        

5.2 从查询结果中赋值

     用INTO关键字可以将查询结果的值,设置给变量;

        

5.3 流程控制语句

     流程控制语句是所有过程型程序语言的关键

     PL/SQL的主要控制语句如下:

         IF…THEN  ELSIF…THEN  ELSE   END IF;

         走正确的分支,最后以ENDIF结束

         CASE var WHEN…THEN  WHEN…THEN  END;

         有逻辑的从数值中做出选择

    

         LOOP  EXIT  END LOOP;

         循环控制,用判断来执行EXIT

         LOOT  EXIT WHEN…   END LOOP;

         同上,当WHEN为真时执行EXIT

         WHILE…LOOP    END LOOP;

         当WHILE为真时,循环

         FOR… IN..LOOP  END LOOP;

         已知循环次数的循环

5.3.1 if…then elsif…then else end if;

     例子: 猜大小:内置一个数sysNum,值为5。让用户输入数字,告知结果。

    

5.3.2 CASE WHEN

        

     例子: 在查询中使用case语句

    

5.3.3 LOOP … EXIT … END

     重复执行循环体中的程序块,直到执行EXIT语句,退出循环

     例子: 计算1~4累加

    

早上起来更新的  吃饭吃饭吧   饿了

-----------------------------------------------day 8---------------------------------------------------

上完课后忘了更新实在抱歉啊,好久好久了,今天记得更新了最后一节课的知识

5.3.4 EXIT   WHEN

    次循环的功能时重复执行循环体中的程序块,直到满足EXIT WHEN后面的判断语句,就退出循环。

    再次实现1~4累加:

   

5.3.5 WHILE … LOOP … END LOOP

         此语句的功能时WHILE后面的语句条件成立时,重复执行循环体中的程序块

        

5.3.6 FOR … IN .. LOOP … END LOOP

    此寓居定义一个循环变量,并指定变量的初始值和终止值。每循环一次变量递增

    语法如下:

         FOR 循环变量 IN 初始值 .. 终止值 LOOP

             程序块

         END LOOP;

        

    练习: 1、打印4*3矩形

           2、打印九九乘法表

           3、打印三角形:正直角、倒直角、正等腰、倒等腰、菱形、空心菱形

6 异常处理

    PL/SQL程序在运行过程中,可能会出现错误或异常现象,这时,可使用EXCEPTION块,WHEN语句来处理异常.语法如下:

    EXCEPTION

         WHEN 异常情况名 THEN

             异常处理代码

        ……

         WHEN OTHERS THEN

             异常处理带吗

6.1 预定义异常种类

 

6.2 异常处理案例

    如: 向一个NUMBER类型的变量赋值字符串时,导致异常发生

   

   例2: 使用SQLCODE,SQLERRM输出错误信息

7 存储过程

    指存储在数据库中供所有用户程序调用的子程序称为存储过程

    创建存储过程的语法:

         用CREATE PROCEDURE 命令建立存储过程

         CREATE [OR REPLACE] PROCEDURE 过程名(参数列表)

         {AS | IS}

         PL/SQL子程序体.

    存储过程中可以接受的参数类型:

         in 类型  表示输入类型的参数

         out类型  表示输出类型的参数

7.1 存储过程的调用

    方式一:

         begin

             过程名();

         end;

    方式二:

         exec 过程名;

8 存储函数

    存储函数(FUNCTION)是一种命名的存储程序,可带参数,并返回一个计算值。

    函数和过程的结构类似,但必须有一个RETURN子句,用于返回数据

    函数说明要指定函数名,结果值的类型,以及参数类型等.

    建立存储函数的语法如下:

         CREATE [OR REPLACE] FUNCTION 函数名(参数列表)

         RETURN 函数值类型

         AS

         PL/SQL子程序

        

         示例:依据员工编号查询员工工资

        

9 触发器

    数据库触发器是一个与表相关联的,存储的PL/SQL结构

    每当一个特定的数据库操作语句(insert、update、delete)在指定的表发出时,Oracle自动地执行触发器中定义好的语句序列

    触发器的类型

         语句级触发器

             在指定的操作语句操作之前或之后执行一次,不管该语句影响多少行

         行级触发器

触发语句作用的每一条记录都被出发。在行级触发器中可以使用:old和:new伪记录变量,识别值的状态

9.1 创建触发器语法

    CREATE [OR REPLACE] TRIGGER 触发器名

    {BEFORE | AFTER}

    {DELETE | INSERT | UPDATE[OF 列名]}

    ON 表名

    [FOR EACH ROW [WHEN(条件)]]

    PL/SQL块。

9.2 触发语句与伪记录变量的值

    触发语句        :old                           :new

    Insert                                         将要插入的数据

    Update          更新以前该行的值             改之后的值

    Delete           删除以前该行的值

   

    示例: 限制写入以’J’开头的串

   

    示例: 使用触发器:限制修改的年龄越来越小

   

oracle大数据应用基础3;相关推荐

  1. JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  2. 使用JDBC处理Oracle大数据

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  3. Hadoop大数据零基础高端实战培训

    Hadoop大数据零基础高端实战培训系列配文本挖掘项目(七大亮点.十大目标) 课程讲师:迪伦 课程分类:大数据 适合人群:初级 课时数量:330课时 用到技术:部署Hadoop集群 涉及项目:京东商城 ...

  4. Hadoop大数据零基础高端实战培训系列配文本挖掘项目

    <Hadoop大数据零基础高端实战培训系列配文本挖掘项目(七大亮点.十大目标)> 课程讲师:迪伦 课程分类:大数据 适合人群:初级 课时数量:230课时 用到技术:部署Hadoop集群 涉 ...

  5. Oracle 大数据集成实施

    Oracle 大数据实施架构 Oracle为广大客户提供了一个预装的用于测试和学习目的的免费大数据环境.你可以在这个环境中对Oracle大数据一体机(Big Data Appliance)上的可选软件 ...

  6. 大数据入门基础系列之初步认识大数据生态系统圈(博主推荐)

    不多说,直接上干货! 之前在微信公众平台里写过 大数据入门基础系列之初步认识hadoop生态系统圈 http://mp.weixin.qq.com/s/KE09U5AbFnEdwht44FGrOA 大 ...

  7. python大数据零基础_零基础学习大数据人工智能,学习路线篇!

    大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后. Python:Python 的排名从去年开始就借助人工智能持续上升,现在它 ...

  8. 大数据技术基础实验十三:Kafka实验——订阅推送示例

    大数据技术基础实验十三:Kafka实验--订阅推送示例 文章目录 大数据技术基础实验十三:Kafka实验--订阅推送示例 一.前言 二.实验目的 三.实验要求 四.实验原理 1.Kafka简介 2.K ...

  9. 哈工大《大数据计算基础》期末考试2021

    哈工大<大数据计算基础>期末考试2021 去年学长的链接2020年大数据基础 判断 10道,基本都比较简单 比如: 大数据就是1T以上的数据 大数据技术框架是否都是并行计算的 简答:4 x ...

最新文章

  1. 肤色检测算法 - 基于不同颜色空间简单区域划分的皮肤检测算法
  2. 费用保险单,如何失焦时自动补零
  3. SpringMVC @RequestBody 接收Json数组对象
  4. HelloX项目github协同开发指南
  5. 5、【设计模式】单列模式
  6. 在.NET Core中使用Exceptionless分布式日志收集框架
  7. linux文件权限umask,linux系统中UMASK权限的用法讲解
  8. css动画-模拟正余弦曲线
  9. system var mysql_MySQL 系统变量(system variables)
  10. jQuery框架学习第六天:jQuery中的Ajax应用
  11. es6 Promise 的应用
  12. qstore 的 chunk重构小记
  13. ubuntu php 上传大文件失败
  14. C# 视频监控系列(12):H264播放器——播放录像文件
  15. java中的radix_int radix()
  16. 华为交换机关机方法_华为路由器交换机基本操作
  17. selenium操作无界面chrome浏览器
  18. pdf怎么压缩到又小又清晰?
  19. 【PCIe 6.0】讨论:为什么每 Half-Flit 中的 TLP 数目不能超过 8 个?
  20. 摆平中文搜索引擎的分词错误(转)

热门文章

  1. java 怎样创建字符串数组_Java 创建并声明字符串数组
  2. 看《霍乱时期的爱情》有感
  3. python 词表里的词不符合_教你背单词 | 利用python分析考研英语阅读并生成词频降序表...
  4. IDEA设置鼠标悬浮提示时间
  5. u-boot-2009.08移植笔记一,平台TQ2440
  6. CString中调用GetBuffer后为什么还要调用ReleaseBuffer
  7. 乾坤-vue应用实例
  8. 整理:一些主流的编程竞赛网站对比
  9. 遥望南方的童年-观后感
  10. PHP开发的二级域名分发系统源码