Oracle基础快速入门 (3)

约束概念:约束是用来束缚表中数据的,提高表中数据的完整性。为表提供的约束有主键约束、非空约束、唯一约束、检查约束、外键约束。

 

1主键约束:每个表中只能有一个,但是可以由多个列构成一个主键约束,作用是标识记录的唯一性。主键约束值的列不能为空,oracle会为主键约束列生成索引。当这些列作为条件查询时,会提高查询速度。

添加主见约束:

列级添加法:(只能为一个列设置主键约束)

CREATE TABLE table_name(

              列名1 数据类型 [CONSTRAINT 约束名] PRIMARY KEY,

              列名2 数据类型,

              ……

);

表级添加法:(能为多个列设置主键约束)

CREATE TABLE table_name(

       列名1 数据类型,

       列名2 数据类型,

……

[CONSTRAINT 约束名] PRIMARY KEY(列名1,列名2,  …)

);

主键约束名通常以pk开头,比如给id列设置主键约束,就可以命名为pk_id

修改表时添加主键约束:

ALTER TABLE table_name

ADD CONSTRAINT 约束名 PRIMARY KEY(列名1,列名2, …);

删除主键约束:

ALTER TABLE table_name

DROP CONSTRAINT 约束名;

ALTER TABLE table_name

DROP PRIMARY KEY;

 

2非空约束

在表中,有些列的值是必须要添加才有是有意义的。为了避免无效的表记录,可为表中必要添加值的列设置非空约束。

添加非空约束:(不能再表级设置非空约束)

CREATE TABLE table_name(

列名1 数据类型 NOT NULL,

列名2 数据类型 NOT NULL,

……

[CONSTRAINT]

)[TABLESPACE tablespace_name]

修改表时设置非空约束:(每次只能为一列设置非空约束)

ALTER TABLE table_name

MODIFY 列名 NOT NULL;

去除非空约束:(不需要删除,直接改成NULL)

ALTER TABLE table_name

MODIFY 列名 NULL;

 

3唯一约束:

用UNIQUE关键字表示,确保该列的值唯一。

与主键约束的相同点:两者都能能够保证列值的唯一性;

                     不同点:唯一约束允许列中有一个值是空值。

添加唯一约束:

①  列级添加法:

CREATE TABLE table_name(

列名1 数据类型[CONSTRAINT 约束名] UNIQUE,

列名2 数据类型[CONSTRAINT 约束名] UNIQUE,

……

[CONSTRAINT]

)[TABLESPACE tablespace_name]

表级添加法:

CREATE TABLE table_name(

列名1 数据类型,

列名2 数据类型,

……

[CONSTRAINT 约束名]UNIQUE(列名1),

[CONSTRAINT 约束名]UNIQUE(列名2),

……

)[TABLESPACE tablespace_name]

UNIQUE前的[CONSTRAINT 约束名]可以省略,这样不用给约束命名。命名通常以uq开头。

在修改表时添加唯一约束:

ALTER TABLE table_name

ADD CONSTRAINT 约束名 UNIQUE(列名);

删除唯一约束:

ALTER TABLE table_name

DROP CONSTRAINT 约束名;

 

4检查约束:

用CHECK关键字表示,作用是检查每一列输入的值是否能满足标的需求。比如输入用户评分时,要求只输入1-5分。

 

 

添加检查约束:

列级添加法

CREATE TABLE table_name(

列名1 数据类型[CONSTRAINT 约束名] CHECK(表达式),

列名2 数据类型[CONSTRAINT 约束名] CHECK(表达式),

……

);

“表达式”的结果是布尔型的。比如rating>0,其中rating是列名。

②  表级添加法:

CREATE TABLE table_name(

列名1 数据类型,

列名2 数据类型,

……

[CONSTRAINT 约束名]CHECK(表达式),

[CONSTRAINT 约束名]CHECK(表达式),

……

);

检查约束名一般以CHK开头,如果省略命名,系统会自动生成。

修改表时添加检查约束:

ALTER TABLE table_name

ADD CONSTRAINT 约束名 CHECK(表达式) ;

删除检查约束:

ALTER TABLE table_name

DROP CONSTRAINT 约束名;

 

5外键约束

外键约束是唯一一个设计两张表之间关系的约束。作用是保证数据的一致性。

创建外键约束:

①  建表时创建外键约束:

CREATE TABLE 表1(

列名1 数据类型[CONSTRAINT 约束名] REFERENCES 表2(列名),

列名2 数据类型,

……

);

这里表2是主表,列名是表2的主键。

表级创建法:(一般使用表级创建)

CREATE TABLE 表1(

列名1 数据类型,

列名2 数据类型,

……

[CONSTRAINT 约束名]FOREIGN KEY(列名1)

REFERENCES 表2(列名)[ON DELETE CASCADE]

);

外键名称以FK开头。如果省略命名,系统会自动生成外键约束名。

[ON DELETE CASCADE]作用是表2中数据删除后,也会将表1联系的数据一并删除。

修改表时添加外键约束

ALTER TABLE 表1

ADD CONSTRAINT 约束名 FOREIGN KEY(列名1)

REFERENCES 表2(列名)

[ON DELETE CASCADE];

删除外键约束:

ALTER TABLE 表1

DROP CONSTRAINT 约束名;

 

修改约束:

除了非空约束,主键约束、唯一约束、外键约束、检查约束这4种约束在ORACLE中可以修改。

修改约束名称:

ALTER TABLE table_name

RENAME CONSTRAINT 旧名 TO 新名;

修改约束状态:

ALTER TBALE table_name

DISABLE|ENABLE CONSTRAINT 约束名;

 

事务

事务具有确保数据库中数据一致性和完整性的作用。

 

事务的特性:

①原子性:一个语句执行错误,那么全部语句都不执行。保证数据准确性。

②  一致性:只有数据提交后才能被查看。保证数据完整性。

③  隔离性:事务之间不会出现互相干扰。避免“脏读”发生。

④  持久性:一旦事务提交完成,将是对数据永久的修改。

 

事务的应用:

 

游标

1定义游标

Declare

Cursor 游标名 IS SELECT 字段1,字段2,…FROM 表名 WHERE 条件;

定义对应字段;

2打开游标

Begin

Open 游标名;

3读取数据

Fetch 游标名 INTO 定义的字段;

操作语句;(必要时应该给游标定义对象,对象可以直接引用字段);

4关闭游标

Close 游标名;

连接查询、子查询的概念及使用

内连接

使用比较运算符根据每个表共有的列的值匹配两个表中的行。

包括等值连接(=)和非等值连接(<、>、<=、>=、!=、<>等)。

语法:

SELECT 表1名.列名,表2名.列名

FROM 表1 INNER JOIN 表2

ON 表1.同名列=表2.同名列;

--INNER可以忽略。

 

外连接

能查询出除了满足条件以外的数据。

包括左外连接、右外连接、全外连接。

语法:

SELECT 表1.列名,表2.列名

FROM 表1 RIGHT(LEFT/FULL) OUTER JOIN 表2

ON 表1.同名列=表2.同名列;

 

交叉连接查询

会产生笛卡尔积,产生“相乘”结果集的效果,同样也是不指定个条件。

语法:

SELECT * FROM 表1 CROSS JOIN 表2;

 

子查询

子查询就是嵌套查询,或说是在一个查询中包含另一个查询。

WHERE子句中的子查询:

例如:查询courses中price大于courses表中平均price的coursename和price。

SELECT coursename,price FROM courses WHERE price>(SELECT AVG(price) FROM courses);

Where可以使用的运算符:ANY(符合的其中一个数据)  SOME(同左)  ALL(满足的所有结果)  IN(表示范围)

FROM子句中的子查询:

将FROM后面的查询作为结果集来查询。

例如:查询比AVG(price)高的coursename和price(其中a和b分别为表的别名)。

SELECT coursename,price FROM courses a,(SELECT typeid,AVG(price) AS avgprice FROM courses GROUP BY typeid) b WHERE a.typeid=b.typeid AND a.price>avgprice;

GROUP BY

将查询结果根据某列分组

例子:统计同名课程的数量

SELECT courseanme,COUNT(*) FROM courses

GROUP BY coursename;

带条件分组查询:(HAVING)

如果对分组的查询还要添加限制条件的话,用HAVING接条件

例子:统计每类课程的平均价格,并且要求显示平均价格大于200的类型及价格

SELECT typeid,AVG(price) FROM courses

GROUP BY typeid

HAVING AVG(price)>200;

排序

对有数值的列可以在查询后进行排序

例子:统计每类课程的平均价格,并按照平均价格降序排序。

SELECT typeid,AVG(price) FROM courses

GROUP BY typeid

ORDER BY AVG(price) DESC;

子查询大作业例子:

查询与自己同一工资级别的员工信息

select e.empno,e.deptno,e.ename,e.sal,s.grade from

emp e join salgrade s on

s.grade=(select s.grade from

emp e join salgrade s on

s.sal=(select sal from emp where

ename=’WUSIYUE’) and

e.sal between s.losal and s.hisal)and

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

 

索引

类型:B树索引、位图索引、基于函数的索引、分区索引、域索引

B树索引:默认索引类型,是平衡树。用来存放物理地址ROWID。

位图索引:由二进制位组成,为每一个索引列值存储一个位图。不适于用对表数据频繁地增删改操作。

创建索引:(B树索引)

Create index 索引名

On 表名(列名);--非唯一索引

Create unique index 索引名

On 表名(列名);--唯一索引

(位图索引)

Create bitmap index 索引名

On 表名(列名);

不能为同一列设置多次索引。

Plsql编程、函数、   存储过程、触发器的概念及其使用

PL/SQL是oracle中用于编写语句块以实现复杂功能的语句。

PL/SQL中,数据类型包括系统预定义类型和用户自定义类型两种。

PL/SQL的语句的基本框架:

DECLARE

--变量和常量的定义部分

BEGIN

--具体操作部分

END;

 

流程控制语句

1.IF语句

IF … THEN …;

END IF;

2.CASE语句

CASE …

WHEN …. THEN ….;

WHEN … THEN…;

ELSE …;

END CASE;

3.循环语句

LOOP-EXIT-END

LOOP …;

IF… THEN…;

EXIT;

END IF;

END LOOP;

✖LOOP结束后一定要有EXIT不然会死循环。

②LOOP-EXIT-WHEN-ENP LOOP

LOOP

…;

EXIT WHEN

…;

END LOOP;

③WHILE-LOOP-END LOOP

WHILE …

LOOP

…;

END LOOP;

④FOR-IN-LOOP-END LOOP

FOR 变量 IN 开始数…结尾数

LOOP

…;

END LOOP;

 

函数

数值函数

1绝对值

ABS(数)     ABS(-122)  返回122

2取余函数                                   

MOD(被除数,除数)   MOD(5,3)  返回2

3取整函数

CEIL(数)    返回大于等于输入参数的最小整数   CEIL(5.22)   返回6

FLOOR(数)  返回小于等于输入参数的最大整数   FLOOR(5.22) 返回5

4四舍五入函数

ROUND(数,保留位数)   ROUND(45.987,2)    返回45.99

5幂函数

POWER(数,次方)   POWER(-3,3)    返回-27

6平方根函数

SQRT(数)    SQRT(100)   返回10

7三角函数

SIN(数)   SIN(30)   返回1/2

COS(数)  COS(60)   返回1/2

TAN(数)  TAN(45)   返回1

…..

 

字符函数

1字符长度函数

LENGTH(‘字符’)    LENGTH(‘ABCD’)  返回4

                          LENGTH(132.45)  返回6

                             LENGTH(‘AA C D’)  返回6

2截取字符串函数

SUBSTR(字符串,开始位置,结束位置);

SUBSTR(‘123ABCabc’,1,3)    返回123

SUBSTR(‘123ABCabc’,4,3)    返回ABC

3字符大小写转换函数

LOWER(字符)   大写转小写    LOWER(‘A’)   返回a

UPPER(字符)    小写转大写   UPPER(‘a’)    返回A

4首字母大写转换函数

INITCAP(字符)    INITCAP(‘anny’)   返回 Anny

 

日期函数

1获取系统时间

Select sysdate from 表;   返回格式为 DD-MON-RR  日-月-年

转换函数

聚合函数

1平均数

AVG(列名)

2最大值最小值

MAX(列名) MIN(列名)

 

存储过程

特点:一次编译多次使用,减少了语句的运行时间。

无参的存储过程

CREATE [OR REPLACE] PROCEDURE 存储过程名

{IS|AS}

BEGIN

…..;

END;

IS和AS在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别,在视图(VIEW)中只能用AS不能用IS,在游标(CURSOR)中只能用IS不能用AS。

例子:创建存储过程读取用户信息表(userinfo)中全部数据。

CREATE PROCEDURE pro_test1

AS

CURSOR cursor_test

IS SELECT * FROM userininfo;

cur_record userinfo%ROWTYPE;

BEGIN

OPEN cursor_test;

LOOP

FETCH cursor_test INTO cur_record;

EXIT WHEN cursor_test%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(‘用户编号:’||cur_record.userid);

DBMS_OUTPUT.PUT_LINE(‘用户名:’||cur_record.username);

DBMS_OUTPUT.PUT_LINE(‘密码:’||cur_record.userpwd);

END LOOP;

CLOSE cursor_test;

END;

/

带参存储过程

CREATE [OR REPLACE] PROCEDURE 存储过程名(变量名1 IN|OUT 数据类型,变量名2 IN|OUT数据类型,…)

{IS|AS}

BEGIN

…..;

END;

例子:创建存储过程,根据输入的用户名输出密码。

CREATE PROCEDURE pro_test2(p_name IN VARCHAR2)

AS

CURSOR cursor_test

IS SELECT * FROM userinfo WHERE username=p_name;

cur_record userinfo%ROWTYPE;

BEGIN

OPEN cursor_test;

LOOP

FETCH cursor_test INTO cur_record;

EXIT WHEN cursor_test%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(‘密码:’||cur_record.userpwd);

END LOOP;

CLOSE cursor_test;

END;

/

 %TYPE说明

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyzsf.html