MYSQL系列之(二)

上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql

视图view

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据。

1、创建视图

--格式:CREATE VIEW 视图名称 AS  SQL语句
CREATE VIEW v1 AS SELET nid, name FROM tab1 WHERE nid > 4

2、删除视图

--格式:DROP VIEW 视图名称
DROP VIEW v1

3、修改视图

-- 格式:ALTER VIEW 视图名称 AS SQL语句
ALTER VIEW v1 AS
SELET A.nid,B. NAME FROM tab1
LEFT JOIN B ON A.id = B.nid
LEFT JOIN C ON A.id = C.nid
WHERE tab1.id > 2

也就只是改了把create改成alter,中间的语句更换了。

4、使用视图

使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建、更新和删除操作,仅能做查询用。

select * from v1

存储过程procedure

1、我们为什么要用存储过程呢 ?

我们都知道应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交互来完成数据的存取工作。假设现在有一种应用程序包含了这两 种,现在要修改其中的一个查询sql语句,那么我们可能要同时修改他们中对应的查询sql语句,当我们的应用程序很庞大很复杂的时候问题就出现这,不易维 护!另外把sql查询语句放在我们的web程序或桌面中很容易遭到sql注入的破坏。而存储例程正好可以帮我们解决这些问题。

2、创建存储过程

创建存储过程这块主要有两种,一种是带参数的,一种是不带参数的,先讲不带参数的再说不带参数的

不带参数案例:

-- 创建存储过程
delimiter //        --自定义语句结尾符号,因为这里要执行好多句sql语句,所以就得自定义,以防止出错
create procedure p1()
BEGIN
    select * from tab1;
END//
delimiter ;         --自定义局域结尾符号结束

-- 执行存储过程
call p1()

带参数案例这块主要有三个类

  • in          仅用于传入参数用
  • out        仅用于返回值用
  • inout     既可以传入又可以当作返回值

-- 创建存储过程
delimiter \create procedure p1(
    in i1 int,                        -- 传入参数i1
    in i2 int,                        -- 传入参数i2
    inout i3 int,                     -- 即传入又能得到返回值
    out r1 int                        -- 得到返回值
)
BEGIN
    DECLARE temp1 int;
    DECLARE temp2 int default 0;
    set temp1 = 1;
    set r1 = i1 + i2 + temp1 + temp2;
    set i3 = i3 + 100;
end\delimiter ;

-- 执行存储过程
DECLARE @t1 INT default 3;           --  设置变量默认值为3
DECLARE @t2 INT;                     --  设置变量
CALL p1 (1, 2 ,@t1, @t2);            --  执行存储过程,并传入参数,t2自动取消
SELECT @t1,@t2;                      --  查看存储过程输出结果

2、删除存储过程

drop procedure p1;

3、python用pymysql模块调用存储过程,因为我们学习这些就是为了语言调用

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql

conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘‘, db=‘day39b_‘)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行存储过程
row = cursor.callproc(‘p1‘,(1,2,3))
# 存储过程的查询结果
selc = cursor.fetchall()
print(selc)
# 获取存储过程返回
effect_row = cursor.execute(‘select @_p1_0,@_p1_1,@_p1_2‘)
# 曲存储过程的返回值
ret = cursor.fetchone()
print(ret)
# 提交,不然无法保存新建或者修改的数据
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()

函数function

在mysql中有很多内置函数,比如我们经常用的求平均值,求和,个数,各式各样,先给大家来一部门内置函数,然后再说说自定义函数吧,函数也可以传参数,也可以接收返回值,但是函数没办法得到执行语句得到的结果,存储过程可以。

//内置函数

 CHAR_LENGTH(str)
        返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
        对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。

    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)
        变大写

    LTRIM(str)
        返回字符串 str ,其引导空格字符被删除。
    RTRIM(str)
        返回字符串 str ,结尾空格字符被删去。
    SUBSTRING(str,pos,len)
        获取字符串子序列

    LOCATE(substr,str,pos)
        获取子序列索引位置

    REPEAT(str,count)
        返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。
        若 count <= 0,则返回一个空字符串。
        若str 或 count 为 NULL,则返回 NULL 。
    REPLACE(str,from_str,to_str)
        返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
    REVERSE(str)
        返回字符串 str ,顺序和字符顺序相反。
    RIGHT(str,len)
        从字符串str 开始,返回从后边开始len个字符组成的子序列

    SPACE(N)
        返回一个由N空格组成的字符串。

    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‘

    TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
        返回字符串 str , 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTH、LEADIN或TRAILING中没有一个是给定的,则假设为BOTH 。 remstr 为可选项,在未指定情况下,可删除空格。

        mysql> SELECT TRIM(‘  bar   ‘);
                -> ‘bar‘

        mysql> SELECT TRIM(LEADING ‘x‘ FROM ‘xxxbarxxx‘);
                -> ‘barxxx‘

        mysql> SELECT TRIM(BOTH ‘x‘ FROM ‘xxxbarxxx‘);
                -> ‘bar‘

        mysql> SELECT TRIM(TRAILING ‘xyz‘ FROM ‘barxxyz‘);
                -> ‘barx‘

更多参考请参考中文文档http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#encryption-functions

1、自定义创建函数

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

2、删除函数

drop function f1;

3、执行函数

# 获取返回值
declare @i VARCHAR(32);
select UPPER(‘alex‘) into @i;
SELECT @i;

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

事务

事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。例如:当两张银行卡之间进行转账,甲方钱转出去了,突然光缆坏了,乙方还没收到钱,钱跑哪里去了,就为了防止这种情况,事务就出来了,事务可以防止这种事情发生。

应用事务实例:

delimiter \create PROCEDURE p1(
    OUT p_return_code tinyint
)
BEGIN
  DECLARE exit handler for sqlexception
  BEGIN
    -- ERROR
    set p_return_code = 1;
    rollback;
  END; 

  DECLARE exit handler for sqlwarning
  BEGIN
    -- WARNING
    set p_return_code = 2;
    rollback;
  END; 

  START TRANSACTION;
    DELETE from tb1;                   -- sql语句都放在这个里面
    insert into tb2(name)values(‘seven‘);
  COMMIT; 

  -- SUCCESS
  set p_return_code = 0; 

  END\delimiter ;

执行存储过程:

DECLARE @i TINYINT;
call p1(@i);
select @i;

触发器TRIGGER

触发器,简单来说就是当你在执行这条语句之前或者之后触发一次增删改查,触发器用于定制用户对表的行进行【增/删/改】前后的行为。

1、基本语法

# 插入前
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 插入后
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 删除前
CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 删除后
CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 更新前
CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 更新后
CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
BEGIN
    ...
END

事例一插入前:

-- 在往tab1插入数据之前往tab2中插入一条name = 张岩林,当然是在判断往tab1中插入的名字是不是等于aylin
delimiter //
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN

IF NEW. NAME == ‘aylin‘ THEN
    INSERT INTO tb2 (NAME)
VALUES
    (‘张岩林‘)
END
END//
delimiter ;

事例二插入后:

delimiter //
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
    IF NEW. num = 666 THEN
        INSERT INTO tb2 (NAME)
        VALUES
            (‘张岩林‘),
            (‘很帅‘) ;
    ELSEIF NEW. num = 555 THEN
        INSERT INTO tb2 (NAME)
        VALUES
            (‘aylin‘),
            (‘非常帅‘) ;
    END IF;
END//
delimiter ;

同样的删,改,查都是同样的道理

特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据行。

2、删除触发器

DROP TRIGGER tri_after_insert_tb1;

3、使用触发器

触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。

insert into tb1(name) values(‘张岩林’)

下章给大家更新数据库索引,这方面东西比较多,所以楼主决定把他从新写一篇博客,看完的记得点赞哟!!

时间: 2024-10-06 10:21:44

MYSQL系列之(二)的相关文章

MySQL系列(二)

MySql 事务 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 MySQL系列(三):索引 什么是事务(transaction) 保证成批操作要么完全执行,要么完全不执行,维护数据的完整性.也就是要么成功要么失败. 事务可以是n条sql语句(n>=0) 不是所有数据库引擎支持事务,InnoDB引擎支持事务处理 事务四大特性 原子性(Atomic):事务的所有所有操作要么全部执行,要么全部不执行.如果中途出现错误不会停止,而是回滚到事务前的状态 一致性(Cons

MySQL 系列(二)Jdbc

MySQL 系列(二)Jdbc 一.Jdbc 基本操作 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.Test; public class TestJdbc { @Test public void run1() throws Exception{ //1.注册驱动 Cl

Linux命令:Mysql系列之二cmake编译安装使用mysqladmin管理工具

MySQL相关概念:MySQL是单进程多线程接收应用的请求. SQL/MySQL 1.事务,隔离,并发控制,锁 2.用户和权限 3.监控 STATUS 4.索引类型:查询 VARIABLES 5.备份和恢复 6.复制功能 7.集群 DML:数据操作语言 INSERT:插入 DELETE:删除 SELECT:挑选,选择,查询 UPDATE:更新,修改 DDL:数据定义语言 CREATE:创建 DROP:删除 ALTER:修改 DCL:数据控制语言 GRANT:授权 REVOKE:取消权限 MySQ

MySQL 系列(二) 你不知道的数据库操作

本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网远程连接法 查看\创建\使用\删除\清空\修改 数据库表(是否可空,默认值,主键,自增,外键) 表内容的增删改查 where条件.通配符_%.限制limit.排序desc\asc.连表join.组合union 查看建表语句.查看表结构.查看是否走索引 数据类型 索引! 一.数据库操作 1.查看数据库 SHOW DATABASES; # 默认数据库: mysql - 用户权限相关数据 test - 用于用户测试数据 inform

mysql系列之二数据类型和运算符

数据库表由多列字段构成,每一个字段指定了不同的数据类型.指定字段得数据类型之后,也就决定了向字段插入的数据内容,例如,当要插入数值的时候,可以将他们存储为整数类型,也可以将它们存储为字符串类型:不同的数据类型也决定了mysql在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符号进行运算. 1.MySQL数据类型介绍 MySQL支持多种数据类型,主要有数值类型.日期/时间类型和字符串类型. (1)数值数据类型:包括整数类型TINYINT.SMALLINT.MEDIUMINT.INT.B

mysql系列之二关系型数据库基础理论

SQL查询语句: sequel-->SQL SQL-86 SQl-89 SQL-92 SQL-99 SQL-03 SQL-08 SQL语言的组成部分: DDL DML 完整性定义语言:DDL的一部分功能 视图定义 事物控制: 嵌入式SQL和动态SQL: 授权:DCL 使用程序设计语言如何跟RDBMS交互: 嵌入式SQL:与动态SQL类似,但其语句必须在程序编译时完全确定下来. ODBC 动态SQL:程序设计语言使用函数与数据库服务器建立连接并进行交互 JDBC MySQL插件式存储引擎(默认)

MySQL系列之二四种隔离级别及加锁

事务 1.定义:所有操作必须成功完成,否则在每个操作中所作的所有更改都会备撤销. 2.事务的ACID 原子性atomicity   一致性consistency   隔离性isolation   持续性durability 2-1.原子性: 事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 2-2.一致性: 事务执行的结果必须是数据库从一个一致性状态变到另一个一致性状态.因此当数据库只包含成功事务提交的结果时, 就说明数据库处于一致性状态. 2-3.隔离性: 一个事务的执行不能

多实例:MySQL系列之二

MySQL的多实例配置 ? 在一台物理机中需要多个测试环境,那么就需要用到了搭建数据库的多个实例,多个实例的意思就是运行多份程序,实例与实例之间没有影响.要注意监听的端口需要不同. 环境:CentOS7.5,编译安装MariaDB-10.2.15版本,软件安装目录:/app/mysql/ ? 1)创建运行的目录环境 [[email protected] ~]# mkdir -p /mysqldb/{3306,3307,3308}/{etc,socket,pid,log,data,bin} [[e

MySQL系列(一)

MySQL系列(一)---基础知识大总结 前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里作简单概括性的介绍,具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续会慢慢补充完善. 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 MySQL系列(三):索引 数据库和数据库软件 数据库是保存有组织数据的容器 DBMS是为管理数据库而设计的软件管理系统,MYSQL.ORACLE 等是数据库管理系统 MYSQL MYSQL是一种数据库管