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 条评论
登录 后参与评论

相关文章

来自专栏抠抠空间

MySql之数据操作

一、增 1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3...

2858
来自专栏互联网杂技

外键约束

外键约束 foreign key 外键约束的要求: 父表和字表必须使用相同的存储引擎,禁止使用临时表; 数据库引擎只能是InnoDB; 外键列和参照列必须具有...

3599
来自专栏开源优测

SQL常用的基础语法

SQL常用的语法 本文主要分享SQL日常使用过程中常用的语法样式。 在sql语句中,主要的关键词有SELECT、INSERT、UPDATE、DELETE、ALE...

3198
来自专栏java初学

数据库索引

43717
来自专栏www.96php.cn

mysql 快速生成百万条测试数据

1、生成思路 利用mysql内存表插入速度快的特点,先利用函数和存储过程在内存表中生成数据,然后再从内存表插入普通表中 2、创建内存表及普通表 CREATE T...

63612
来自专栏奇梦博客

Xiuno BBS 4.0 表结构 XiunoBBS

1061
来自专栏深度学习之tensorflow实战篇

SQl 语句(常见) 新建,删除,修改表,新增字段,修改默认值

SQl 语句(常见) 新建,删除,修改表结构 新建表: create table [表名] ( [自动编号字段] int IDENTITY (1,1) PRIM...

3109
来自专栏吴伟祥

建表模版SQL 原

822
来自专栏抠抠空间

MySQL 如何删除有外键约束的表数据

今天删除数据库中数据,提示因为设置了foreign key,无法修改删除 可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。

1473
来自专栏WebDeveloper

Mysql数据库应用(一)

2012

扫码关注云+社区

领取腾讯云代金券