约束概念:约束是用来束缚表中数据的,提高表中数据的完整性。为表提供的约束有主键约束、非空约束、唯一约束、检查约束、外键约束。
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说明