49.数据库之视图,触发器,函数,存储过程,事务

1.视图

  一个虚拟表,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用

  数据库视图允许简化复杂查询

  由于存放于数据库中,从数据库视图查询数据可能会很慢,一般不推荐使用

1.1创建视图

  语法

CREATE VIEW 视图名称 AS  SQL语句

2.触发器

  使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询

3.函数  

  官方文档猛戳这里

  mysql中自带的内置函数:

一、数学函数
    ROUND(x,y)
        返回参数x的四舍五入的有y位小数的值

    RAND()
        返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。

二、聚合函数(常用于GROUP BY从句的SELECT查询中)
    AVG(col)返回指定列的平均值
    COUNT(col)返回指定列中非NULL值的个数
    MIN(col)返回指定列的最小值
    MAX(col)返回指定列的最大值
    SUM(col)返回指定列的所有值之和
    GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果    

三、字符串函数

    CHAR_LENGTH(str)
        返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
    CONCAT(str1,str2,...)
        字符串拼接
        如有任何一个参数为NULL ,则返回值为 NULL。
    CONCAT_WS(separator,str1,str2,...)
        字符串拼接(自定义连接符)
        CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。

    CONV(N,from_base,to_base)
        进制转换
        例如:
            SELECT CONV(‘a‘,16,2); 表示将 a 由16进制转换为2进制字符串表示

    FORMAT(X,D)
        将数字X 的格式写为‘#,###,###.##‘,以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若  D 为 0, 则返回结果不带有小数点,或不含小数部分。
        例如:
            SELECT FORMAT(12332.1,4); 结果为: ‘12,332.1000‘
    INSERT(str,pos,len,newstr)
        在str的指定位置插入字符串
            pos:要替换位置其实位置
            len:替换的长度
            newstr:新字符串
        特别的:
            如果pos超过原字符串长度,则返回原字符串
            如果len超过原字符串长度,则由新字符串完全替换
    INSTR(str,substr)
        返回字符串 str 中子字符串的第一个出现位置。

    LEFT(str,len)
        返回字符串str 从开始的len位置的子序列字符。

    LOWER(str)
        变小写

    UPPER(str)
        变大写

    REVERSE(str)
        返回字符串 str ,顺序和字符顺序相反。

    SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
        不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。

        mysql> SELECT SUBSTRING(‘Quadratically‘,5);
            -> ‘ratically‘

        mysql> SELECT SUBSTRING(‘foobarbar‘ FROM 4);
            -> ‘barbar‘

        mysql> SELECT SUBSTRING(‘Quadratically‘,5,6);
            -> ‘ratica‘

        mysql> SELECT SUBSTRING(‘Sakila‘, -3);
            -> ‘ila‘

        mysql> SELECT SUBSTRING(‘Sakila‘, -5, 3);
            -> ‘aki‘

        mysql> SELECT SUBSTRING(‘Sakila‘ FROM -4 FOR 2);
            -> ‘ki‘

四、日期和时间函数
    CURDATE()或CURRENT_DATE() 返回当前的日期
    CURTIME()或CURRENT_TIME() 返回当前的时间
    DAYOFWEEK(date)   返回date所代表的一星期中的第几天(1~7)
    DAYOFMONTH(date)  返回date是一个月的第几天(1~31)
    DAYOFYEAR(date)   返回date是一年的第几天(1~366)
    DAYNAME(date)   返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
    FROM_UNIXTIME(ts,fmt)  根据指定的fmt格式,格式化UNIX时间戳ts
    HOUR(time)   返回time的小时值(0~23)
    MINUTE(time)   返回time的分钟值(0~59)
    MONTH(date)   返回date的月份值(1~12)
    MONTHNAME(date)   返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
    NOW()    返回当前的日期和时间
    QUARTER(date)   返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
    WEEK(date)   返回日期date为一年中第几周(0~53)
    YEAR(date)   返回日期date的年份(1000~9999)

    重点:
    DATE_FORMAT(date,format) 根据format字符串格式化date值

       mysql> SELECT DATE_FORMAT(‘2009-10-04 22:23:00‘, ‘%W %M %Y‘);
        -> ‘Sunday October 2009‘
       mysql> SELECT DATE_FORMAT(‘2007-10-04 22:23:00‘, ‘%H:%i:%s‘);
        -> ‘22:23:00‘
       mysql> SELECT DATE_FORMAT(‘1900-10-04 22:23:00‘,
        ->                 ‘%D %y %a %d %m %b %j‘);
        -> ‘4th 00 Thu 04 10 Oct 277‘
       mysql> SELECT DATE_FORMAT(‘1997-10-04 22:23:00‘,
        ->                 ‘%H %k %I %r %T %S %w‘);
        -> ‘22 22 10 10:23:00 PM 22:23:00 00 6‘
       mysql> SELECT DATE_FORMAT(‘1999-01-01‘, ‘%X %V‘);
        -> ‘1998 52‘
       mysql> SELECT DATE_FORMAT(‘2006-06-00‘, ‘%d‘);
        -> ‘00‘

五、加密函数
    MD5()
        计算字符串str的MD5校验和
    PASSWORD(str)
        返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。

六、控制流函数
    CASE WHEN[test1] THEN [result1]...ELSE [default] END
        如果testN是真,则返回resultN,否则返回default
    CASE [test] WHEN[val1] THEN [result]...ELSE [default]END
        如果test和valN相等,则返回resultN,否则返回default

    IF(test,t,f)
        如果test是真,返回t;否则返回f

    IFNULL(arg1,arg2)
        如果arg1不是空,返回arg1,否则返回arg2

    NULLIF(arg1,arg2)
        如果arg1=arg2返回NULL;否则返回arg1  

3.1关于DATA_FORMAT()的用法

官网示例

mysql> SELECT DATE_FORMAT(‘2009-10-04 22:23:00‘, ‘%W %M %Y‘);
        -> ‘Sunday October 2009‘
mysql> SELECT DATE_FORMAT(‘2007-10-04 22:23:00‘, ‘%H:%i:%s‘);
        -> ‘22:23:00‘
mysql> SELECT DATE_FORMAT(‘1900-10-04 22:23:00‘,
    ->                 ‘%D %y %a %d %m %b %j‘);
        -> ‘4th 00 Thu 04 10 Oct 277‘
mysql> SELECT DATE_FORMAT(‘1997-10-04 22:23:00‘,
    ->                 ‘%H %k %I %r %T %S %w‘);
        -> ‘22 22 10 10:23:00 PM 22:23:00 00 6‘
mysql> SELECT DATE_FORMAT(‘1999-01-01‘, ‘%X %V‘);
        -> ‘1998 52‘
mysql> SELECT DATE_FORMAT(‘2006-06-00‘, ‘%d‘);
        -> ‘00‘

博客园时间处理

create table blog(
        id int not null unique auto_increment,
        name varchar(20),
        sub_time datetime
        );

insert into blog(name,sub_time) values
    (‘第1篇‘,‘2015-03-01 11:31:21‘),
        (‘第2篇‘,‘2015-03-11 16:31:21‘),
        (‘第3篇‘,‘2016-07-01 10:21:31‘),
        (‘第4篇‘,‘2016-07-22 09:23:21‘),
        (‘第5篇‘,‘2016-07-23 10:11:11‘),
        (‘第6篇‘,‘2016-07-25 11:21:31‘),
        (‘第7篇‘,‘2017-03-01 15:33:21‘),
        (‘第8篇‘,‘2017-03-01 17:32:21‘),
        (‘第9篇‘,‘2017-03-01 18:31:21‘);

select date_format(sub_time,‘%y-%m‘) as y_m,count(1) as num from blog group by
date_format(sub_time,‘%Y-%m‘);

效果

自定义函数

delimiter //
create function f1(
    i1 int,
    i2 int)
returns int
BEGIN
    declare num int;
    set num = i1 + i2;
    return(num);
END //
delimiter ;

delimiter //
create function f5(
    i int
)
returns int
begin
    declare res int default 0;
    if i = 10 then
        set res=100;
    elseif i = 20 then
        set res=200;
    elseif i = 30 then
        set res=300;
    else
        set res=400;
    end if;
    return res;
end //
delimiter ;

删除函数

drop function func_name;

执行

# 获取返回值
select UPPER(‘egon‘) into @res;
SELECT @res;

# 在查询中使用
select f1(11,nid) ,name from tb2;

4.存储过程

  存储过程包含一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql

  优势:可用于替代程序写的SQL语句,实现程序与SQL解耦

     存储的程序对任何应用程序都是可重用的和透明的

     只用发送存储过程的名称和参数,因此传输占用的数据量小

  劣势:

    开发和维护存储过程并不容易

    因为存储过程的构造使得它本身的可扩展性差

    如果是大量存储,如果存储过程中使用大量逻辑操作,则CPU的使用率会增加

存储示例  delimiter,分隔符

delimiter //
 create procedure b1()
   begin
   select *  from blog;
   end //
delimiter ;

1.第一个命令delimiter //

2.create procedure语句创建一个新的存储过程,b1代表存储过程名称

3.begin和end之间的部分称为存储过程的主体,将声明性SQL语句放在主体中以处理业务逻辑

# mysql中调用存储过程
call b1()

#在python中基于pymysql调用
cursor.callproc(‘b1‘)
print(cursor.fetchall())

声明变量(declare)

delimiter //
 create procedure b2()
   begin
   DECLARE n int DEFAULT 1;
   set n  = 5;
   select *  from blog where id = n;
   end //
delimiter;

# mysql中调用存储过程
call b2();

5.事务

  事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。

基本语法:

  • 开启事务管理:开启之后,下面的sql语句并不会马上执行并把结果写到表中,而是会写到事务日志中。

    • start transaction;
  • 回退操作:回退会清掉开始事务管理之后写到事务日志中的内容,即恢复到开启事务管理之前。
    • 语法:rollback;
    • 注意:回退操作只是回退"写"的内容,对于普通的读表select语句不能回退。
  • 事务提交:将sql语句的结果写到数据表中。
    • 语法:commit:

案例

create table account(id int primary key auto_increment,name varchar(15),money int);
insert into account(name,money) values("Jobs",2000);
insert into account(name,money) values("Bill",3000);

创建后rollback操作

# 原子操作
start transaction;
update account set money=6666 where name=‘Bill‘;
rollback; # 放弃此次事务操作

效果

创建后commit操作

# 原子操作
start transaction;
update account set money=6666 where name=‘Bill‘;
commit; # 执行此次事务操作

效果

原文地址:https://www.cnblogs.com/LearningOnline/p/9188955.html

时间: 2024-10-21 21:31:37

49.数据库之视图,触发器,函数,存储过程,事务的相关文章

mysql 查询表,视图,触发器,函数,存储过程

1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TABLE_TYPE ='BASE TABLE' mysql查询建表语句: show create table `表名` 2.mysql查询所有视图: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名'

SQL Service 数据库 基本操作 视图 触发器 游标 存储过程

use NewTest1 ---声明视图--- create view NewViewte as select StudentInfo.name as 姓名,StudentInfo.sex as 性别,course.name as 课程 from StudentInfo join Course on StudentInfo.Cid= Course.id ---调用视图 select * from NewViewte --- 声明触发器--- create trigger NewTri on Cl

触发器 函数 存储过程

触发器 函数 存储过程 Table of Contents 触发器 函数 控制语句 使用局部变量 存储过程 游标 触发器 before update after update before delete after delete before insert after insert drop table if exists test; create table test( id int ); insert into test(id) values(1), (2); create table te

数据库 --- 40 视图 触发器 存储过程 事务 函数

一.视图  (view) 视图是一种虚拟表,可以把查询出来的临时表保存下来 1.创建视图 2.删除视图 3.修改视图,(原始表的记录也跟着修改) 4.查看视图 二.  触发器(trigger)可进行  增删改  操作 1.创建触发器 2.删除触发器 实例: 三.存储过程  1. 优点: 缺点: 2.程序与数据库结合使用的三种方式 3.创建简单存储过程(无参) 4.创建存储过程(有参) ① in  传入参数 ② out  返回值 #查看存储过程的一些信息:show create procedure

Mysql视图触发器函数事务

1. 视图 100个SQL: 88: v1 select .. from v1 select asd from v1 某个查询语句设置别名,日后方便使用 - 创建 create view 视图名称 as SQL PS: 虚拟 - 修改 alter view 视图名称 as SQL - 删除 drop view 视图名称; 2. 触发器 当对某张表做:增删改操作时,可以使用触发器自定义关联行为 insert into tb (....) -- delimiter // -- create trig

数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件

浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据. 2.视图特点 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系 视图是由基本表(实表)产生的表(虚表) 视图的建立和删除不影响基本表 对视图内容的更新(添加.删除和修改)直接影响基本表 当视图来自多个基本表时,不允许添加,修改和删除数据 3.视图的本质 视图是根据SQL语句获取动态的数据集,并为其命

Mysql之视图 触发器 事务 存储过程 函数

视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用 #两张有关系的表 mysql> se

MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁

浏览目录: 1.视图 2.触发器 3.存储过程 4.函数 5.事物 6.数据库锁 7.数据库备份 1.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视图有如下特点; 1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系. 2. 视图是由基本表(实表)产生的表(虚表). 3. 视图的建立和删除不影响基本表. 4. 对视图内容的更新(添加.删除和修改)直接影响基本表. 5. 当视图来自多个基本表时,不允许添加,修改和删除数据. 1.创建

Mysql 之 视图,触发器,存储过程,函数,事物,数据库锁,数据库备份

Mysql 之 视图,触发器,存储过程,函数,事物,数据库锁,数据库备份 阅读目录 一:视图 二:触发器 三:存储过程 四:函数 五:事物 六:数据库锁 七:数据库备份 一:视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视图有如下特点; 1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系. 2. 视图是由基本表(实表)产生的表(虚表). 3. 视图的建立和删除不影响基本表. 4. 对视图内容的更新(添加.删除和修改)直接影响基本表