MySql[二]

视图

视图就是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需要使用[名称]即可获取结果集并可以将其当做代表来使用·

-- 临时表搜索

SELECT
         *
FROM
       (
          SELECT
                nid,
                name
          FROM
                tb1
          WHERE
                nid > 2
       )  AS   A
WHERE
      A.name > 'Wyc';

1丶创建视图  

 -- 格式: CREATE VIEW 视图名称 AS SQL语句

CREATE VIEW v1 AS
SELECT nid,
          name
FROM
      A
WHERE
        nid > 4;

2丶删除视图  

-- 格式: DROP VIEW 视图名称

DROP VIEW v1;

3丶修改视图 

--  格式:ALTER VIEW 视图名称 AS SQL语句

ALTER VIEW v1 AS
SELTER A.nid,
           B.name
FROM
      A
LETE JOIN B ON A.id = B.nid
LETE JOIN C ON A.id = C.nid
WHERE
       A.id > 2
AND C.nid < 5;

4丶使用视图

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

select * from  v1;

触发器  

对某个表进行[增/删/改]操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行,进行[增/删/改]前后的行为·

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_updata_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW BEGIN
                          ....
END

-- 更新后
CREATE TRIGGER tri_after_update_tb1 AFTER UPDATA ON FOR EACH ROW BEGIN
           ....
END
-- 插入前触发器
delimiter //
CREATE TRIGEER tri_before_insert_tb1 BEFOR INSERT ON tb1 FOR EACH ROW BEGIN

IF NEW.NAME == 'Wyc' THEN
     INSERT INTO tb2 (NAME)
VALUES
        ('aa')
END
END//
delimiter ;
-- 插入后触发
delimiter //
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW BEGIN
                IF NEW.nue = 666 THEN
                         INSERT INTO tb2(NAME)
                         VALUES
                                ('666'),
                                ('666');
               ELSEIF NEW.num = 555 THEN
                         INSERT INTO tb2(NAME)
                         VALUES
                                   ('555'),
                                   ('555');
               END IF;
END // 
delimiter;

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

2丶删除触发器 

DROP TRIGGER tri_after_insert_tb1;

3丶使用触发器  

触发器无法由用户直接调用,而只由于对表的[增/删/改]操作被动引发的·

insert into tb1(num) values(666);

存储过程  

存储过程是一个SQL语句集合,当主动去调用存储过程时,其内部的SQL语句会按照逻辑执行·

1丶创建存储过程

-- 无参数存储过程

delimiter//
create procedure p1()
BEGIN
       select * from t1;
END//
delimiter;




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

 对于存储过程,可以接收参数,其参数有三类:

  · in     仅用于传入参数用

  · out     仅用于返回值用

  · inout   既可以传入有可以当做返回值

-- 有参数存储过程

delimiter \\ 
create procedure p1(
          in i1 int,
          in i2 int,
          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;
DECLARE @t2 INT;
CALL p1 (1,2,@t1,@t2);
SELECT @t1,@t2;

2丶删除存储过程

drop procedure proc_name;

3丶执行存储过程 

-- 无参数
call proc_name()


-- 有参数,全in
call proc_name(1,2)

-- 有参数,有in,out,inout
DECLARE @t1 INT;
DECLARE @t2 INT default 3;
call proc_name(1,2,@t1,@t2)
##    pymysql执行存储过程


import pymysql

conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwod='123',db='t1')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

#执行存储过程
cursor.callproc('p1',args=(1,2,3,4))
#获取执行完存储的参数
cursor.execute('select @_p1_0,@_p1_1,@_p1_2,@_p1_3')
result = cursor.fetchall()

conn.commit()   -- 提交
cursor.close()
conn.close()


#execute   :创建游标

索引  

索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构,类似于字典中的目录查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可·

MySQL中常见索引有:

  ·普通索引

  ·唯一索引

  ·主键索引

  ·组合索引

1丶普通索引

普通索引仅有一个功能:加速查询

1 create table in1(
2        nid int not null auto_increment primary key,
3        name varchar(32) not null,
4        email varchar(64) not null,
5        extra text,
6        index ix_name(name)   
7 )
1 create_index index_name on table_name(column_name)
1 drop index_name on table_nme;
1 show index from table_name;

注意:对于创建索引时如果是BLOB和TEXT类型,必须制定length·

create index ix_extra on in1(extra(32));

2丶唯一索引

唯一索引有两个功能:加速查询和唯一约束(可含null)

1 create table in1(
2     nid int not null auti_increment primary key,
3     name varchar(32) not null,
4     email barchar(64) not null,
5     extra text,
6     unique ix_name (name)
7 )
1 create unique index 索引名 on 表名(列名)
1 drop unique index 索引名 on 表名

3丶主键索引

主键有两个功能:加速查询和唯一约束(不可含null)

 1 create table in1(
 2     nid int not null auto_increment primary key,
 3     name varchar(32) not null,
 4     email varchar(64) not null,
 5     extra text,
 6     index ix_name(name)
 7 )
 8 
 9 OR
10 
11 create table in1(
12     nid int not null auto_increment,
13     name varchar(32) not null,
14     email varchar(64) not null,
15     extra text,
16     primary key(ni1),
17     index ix_name(name)
18 )
1 alter table 表名 add primary key(列名);
1 alter table 表名 add paimary key;
2 alter table 表名 modify 列名 int,drop primary key;

4丶组合索引

组合索引时将n个列组合成一个索引

其应用场景为:频繁的同事使用n列来进行查询,如:where n1 = 'Wyc' and n2 =666·

1 create table in3(
2      nid int not null auto_increment primary key,
3      name varchar(32) not null,
4      email varchar(64) not null,
5      extra text   
6 )
1 create index ix_name_email on in3(name,email);

如上创建组合索引之后,查询:

  · name and email   -- 使用索引

  · name             -- 使用索引

  · email             -- 不使用索引

注意:对于同时搜索n个条件时,组合索引的性能好于多个单一索引合并·

 其他

1、条件语句

delimiter \\
CREATE PROCEDURE proc_if ()
BEGIN
    
    declare i int default 0;
    if i = 1 THEN
        SELECT 1;
    ELSEIF i = 2 THEN
        SELECT 2;
    ELSE
        SELECT 7;
    END IF;

END\\
delimiter ;

2、循环语句 

delimiter \\
CREATE PROCEDURE proc_while ()
BEGIN

    DECLARE num INT ;
    SET num = 0 ;
    WHILE num < 10 DO
        SELECT
            num ;
        SET num = num + 1 ;
    END WHILE ;

END\\
delimiter ;
delimiter \\
CREATE PROCEDURE proc_repeat ()
BEGIN

    DECLARE i INT ;
    SET i = 0 ;
    repeat
        select i;
        set i = i + 1;
        until i >= 5
    end repeat;

END\\
delimiter ;
delimiter \\
CREATE PROCEDURE proc_loop ()
BEGIN
    
    declare i int default 0;
    loop_label: loop
        select i;
        set i=i+1;
        if i>=5 then
            leave loop_label;
            end if;
    end loop;

END\\
delimiter ;

3、动态执行SQL语句

delimiter \\
DROP PROCEDURE IF EXISTS proc_sql \\
CREATE PROCEDURE proc_sql ()
BEGIN
    declare p1 int;
    set p1 = 11;
    set @p1 = p1;

    PREPARE prod FROM 'select * from tb2 where nid > ?';
    EXECUTE prod USING @p1;
    DEALLOCATE prepare prod; 

END\\
delimiter ;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Memcached·Redis缓存的基本操作

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、...

    Wyc
  • 个人博客添加运行时间

    Wyc
  • 数据基本类型操作

    Wyc
  • java之struts2之数据检验

    1.使用struts2时,有时候需要对数据进行相关的验证。如果对数据的要求比较严格,或对安全性要求比较高时,前端 js 验证还不够,

    Vincent-yuan
  • mysql 查询用法

    #去重复查询DISTINCT mysql> select * from student; +------+------+------+ | uid | nam...

    零月
  • 一步步完成jsRender + Spring MVC + Nginx前后端分离示例

    本篇博文的目标是使用前端页面渲染插件jsRender做前后端分离,后端采用Spring MVC给出REST API,并结合Nginx完成配置。

    孟君
  • 创建 Java 对象有几种写法?

    KIWI
  • 重温java代理模式

    我是攻城师
  • __name__ 到底是个什么玩意?

    大家应该已经在很多 Python 脚本里见到过 __name__ 变量了吧?它经常是以类似这样的方式出现在我们的程序里:

    Python进击者
  • Spring框架系列(二)之Bean的注解管理

    微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1、Spring中的两种容器 在系列(一)中我们已经知道...

    compassblog

扫码关注云+社区

领取腾讯云代金券