前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySql[二]

MySql[二]

作者头像
Wyc
发布2018-09-11 11:28:53
4790
发布2018-09-11 11:28:53
举报
文章被收录于专栏:Python研发Python研发

视图

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

代码语言:javascript
复制
-- 临时表搜索

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

1丶创建视图  

代码语言:javascript
复制
 -- 格式: CREATE VIEW 视图名称 AS SQL语句

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

2丶删除视图  

代码语言:javascript
复制
-- 格式: DROP VIEW 视图名称

DROP VIEW v1;

3丶修改视图 

代码语言:javascript
复制
--  格式: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丶使用视图

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

代码语言:javascript
复制
select * from  v1;

触发器  

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

1丶创建基本语法

代码语言:javascript
复制
-- 插入前
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
代码语言:javascript
复制
-- 插入前触发器
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 ;
代码语言:javascript
复制
-- 插入后触发
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丶删除触发器 

代码语言:javascript
复制
DROP TRIGGER tri_after_insert_tb1;

3丶使用触发器  

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

代码语言:javascript
复制
insert into tb1(num) values(666);

存储过程  

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

1丶创建存储过程

代码语言:javascript
复制
-- 无参数存储过程

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




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

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

  · in     仅用于传入参数用

  · out     仅用于返回值用

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

代码语言:javascript
复制
-- 有参数存储过程

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丶删除存储过程

代码语言:javascript
复制
drop procedure proc_name;

3丶执行存储过程 

代码语言:javascript
复制
-- 无参数
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)
代码语言:javascript
复制
##    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丶普通索引

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

代码语言:javascript
复制
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 )
代码语言:javascript
复制
1 create_index index_name on table_name(column_name)
代码语言:javascript
复制
1 drop index_name on table_nme;
代码语言:javascript
复制
1 show index from table_name;

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

代码语言:javascript
复制
create index ix_extra on in1(extra(32));

2丶唯一索引

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

代码语言:javascript
复制
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 )
代码语言:javascript
复制
1 create unique index 索引名 on 表名(列名)
代码语言:javascript
复制
1 drop unique index 索引名 on 表名

3丶主键索引

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

代码语言:javascript
复制
 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 )
代码语言:javascript
复制
1 alter table 表名 add primary key(列名);
代码语言:javascript
复制
1 alter table 表名 add paimary key;
2 alter table 表名 modify 列名 int,drop primary key;

4丶组合索引

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

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

代码语言:javascript
复制
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 )
代码语言:javascript
复制
1 create index ix_name_email on in3(name,email);

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

  · name and email   -- 使用索引

  · name             -- 使用索引

  · email             -- 不使用索引

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

 其他

1、条件语句

代码语言:javascript
复制
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、循环语句 

代码语言:javascript
复制
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 ;
代码语言:javascript
复制
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 ;
代码语言:javascript
复制
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语句

代码语言:javascript
复制
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 ;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-08-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 视图
  • 触发器  
  • 存储过程  
  • 索引  
  •  其他
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档