数据库高级对象

1.函数

函数能够传参,也能够有返回值。可是函数只能有一个返回值
函数能够包含0-多个参数

声明不带参数的函数(如下都以MySql数据库为例)
 CREATE FUNCTION 函数名() RETURNS 返回值类型
RETURN 返回结果;
若是函数体中有多行语句,须要使用begin end 包裹sql

CREATE FUNCTION f1() RETURNS VARCHAR(255)
BEGIN
DELETE  FROM tb1 WHERE id=1;
RETURN "hahahahah"; 
END
SELECT f1(); -- 调用函数
DROP FUNCTION f1;-- 销毁函数
-- 建立带参数的函数
CREATE FUNCTION f2(username VARCHAR(255),age INT,sex enum("男","女")) RETURNS VARCHAR(255)
BEGIN
INSERT INTO tb VALUES(NULL,username,age,sex);
RETURN "hahahahah"; 
END
SELECT f2("真实姓名",55,"男");

 

2.存储过程

存储过程
是一组预先存储好的SQL语句和控制语句的预编译集合。用一个名字来存储一组代码,做为一个完整的单元进行操做
优势:数据库

①加强的sql语句的功能和灵活性;网络

②执行速度更快 存储过程当中的SQL语句都是在声明过程时预先编译好的,只会在声明时编译一次后续执行无需再编译函数

③减小网络请求/流量  后台只需向数据库提交存储过程名便可,无需提交大段SQL语句
建立无参存储过程spa

CREATE PROCEDURE p1()
SELECT * FROM tb;
-- 删除存储过程
DROP PROCEDURE p1;
-- 使用call 调用存储过程,若是没有参数,则小括号能够省
CALL p1;

存储过程的参数与返回值
 在存储过程当中,参数分为三种状况
1. in:相似于函数中的参数,须要在调用存储过程时传入
2. out:相似函数中的返回值,存储过程返回值不用return 而是将结果赋给out类型的参数
3. INOUT:调用存储过程时能够传入参数,同时又容许存储过程执行时修改其值,并返回code

DROP PROCEDURE p2;
CREATE PROCEDURE p2(in iusername VARCHAR(255),in iage int,in isex enum("男","女"),OUT lastId INT,out total INT)
BEGIN
INSERT INTO tb VALUES (NULL,iusername,iage,isex);
SELECT LAST_INSERT_ID() INTO lastId;-- 使用into将查询出的最后id赋给lastId
SELECT COUNT(*) FROM tb INTO total;
END
SET @age=22;
CALL p2("xiaowu",@age,"男",@lastId,@total);-- 调用存储过程out类型的参数,必须传入一个变量接收
-- in类型的参数可使变量也能够是字面量
SELECT @lastId;-- 调用完成后,返回的结果被存储在@lastId变量中,直接select输出便可

3.事务

事务的四大属性(ACID属性)
 一、原子性 Atomicity
 事务是不可再拆分的最小单元。 事务中的全部操做,要么都执行、要么都不执行;
 eg:转帐功能, A减小1000元,B必须增长1000元。而不能出现A减小,B不增长的状况;
 二、一致性 Consistency
 事务在开始前和结束后的数据必需要保持一致。
 eg:转帐功能,AB的总金额在转帐前和转帐后必须相同。其中短暂的不一样只能出如今事务未结束时。
 三、隔离性 Isolation
 当事务开始执行后,会隔离其余事务对数据进行读写与修改。
 eg: 转帐功能,A给B转帐的过程当中,若是C也给B转帐,就会致使A给B转帐的这个事务,
     在结束时的总金额与开始前不一致,也就是说没法知足事物的一致性。
 四、持久性 Durability
 事务执行完成后,数据的修改是永久的。
blog

 

4.游标

游标 用于处理从数据库中返回的多行记录,能够逐行遍历数据。排序

DROP PROCEDURE youbiao;
CREATE PROCEDURE youbiao(OUT params VARCHAR(255))
BEGIN
    DECLARE cs CURSOR FOR SELECT username FROM tb;-- 为一个结果集声明游标
    OPEN cs;-- 打开游标
    FETCH cs INTO params;-- 取出游标放到变量中
    INSERT INTO tb2 VALUES(null,params);
    CLOSE cs;-- 关闭游标
END;
CALL youbiao(@params);
SELECT @params;

5.视图

视图的特色
 是一个数据库中虚拟的表
 通过查询操做造成的结果
 具备普通表的结构
 不能实现数据的存储.数据依然存在实际的数据表中
 对视图的修改将会影响实际的数据表,可是在视图新增数据时,必须保证原有数据表的视图不可见不能为非空索引

CREATE OR REPLACE VIEW username AS SELECT username,sex FROM tb;
SELECT * FROM username;
DELETE FROM username WHERE username="wuli";
INSERT username VALUES("wuli","男");
DROP VIEW username;

6.索引

索引特色:创建索引能大大提升查询速度,但会影响下降插入、修改的速度
 适合创建索引的列:须要频繁查询的字段,须要常常排序的字段,常常出如今where子句里的字段;
 不适合创建索引的列:不多使用查询的字段,数据量不多的字段,修改插入操做远大于查询操做的字段
 避免限制索引的方式“(可以使用索引的操做)
 避免使用不等操做符(<> 、!=)
 避免使用is null or is not null
 避免在where子句中使用函数
 避免在比较时使用不匹配的数据类型。
 
 注:MySQL只对如下操做符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)事务

CREATE INDEX index1 on tb(username);-- 建立索引

-- 修改表结构方式建立索引
ALTER TABLE tb ADD INDEX index1(username);
CREATE TABLE tt(
    -- 建立表时创建索引
    id INT PRIMARY KEY,
    username VARCHAR(255),
    INDEX index1(username)

);
CREATE UNIQUE INDEX index1 ON tb(username);-- 惟一索引 与普通索引基本相同,只是值必须惟一不能重复,能够为空,只能有一个空值
-- 全文索引
-- 只能建立在char\varchar \text等字符串字段上,用于索引大量内容,但生成全文索引很是消耗时间和磁盘空间
ALTER TABLE tb ADD FULLTEXT index1(username);

-- 删除索引
DROP INDEX index1 ON tb;