MySql[二]

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 视图 视图就是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需要使用[名称]即可获取结果集并可以将其当做代表来使用·   -- 临时表搜索 SELECT * FROM ( SE...

视图

视图就是一个虚拟表(非真实存在),其本质是[根据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 ;
while循环
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 ;
repeat循环
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 ;
loop

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 ;
动态执行SQL

 

 

 

  

 

 

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
关系型数据库 MySQL
mysql报Toomanyconnection的问题
mysql报Toomanyconnection的问题
16 0
|
5天前
|
关系型数据库 MySQL C++
VS 2015 使用 MySQL
VS 2015 使用 MySQL
29 0
|
10月前
|
SQL 安全 关系型数据库
|
10月前
|
SQL 关系型数据库 MySQL
2.初识MySQL
2.初识MySQL
57 0
|
关系型数据库 MySQL
MySql 时间查询
MySql 时间查询
|
关系型数据库 MySQL 数据库
MySQL(九)
MySQL(九),一起来学习吧。
|
存储 关系型数据库 MySQL
MySQL练习(二)
MySQL存储过程运用
60 0
MySQL练习(二)
|
SQL Oracle 关系型数据库
Mysql(二)
Mysql(二)
136 0
Mysql(二)
|
SQL 关系型数据库 数据库
mysql必知必会2
2018年7月10日笔记 1.创建数据表和插入数据 创建表commodityType create table commodityType( id int primary key, name varchar(50) ) 表commodityType插...
1393 0
|
存储 关系型数据库 MySQL
初步认识MySQL
初步认识MySQL 1.1 基础认识 MySQL由瑞典MySQL AB开发,目前由Oracle公司收购。开源的关系型数据库管理系统,分为社区版和企业版,没有太大的差异,社区版可以满足绝大多数需求。 1.2 安装MySQL MSI安装(Windows)或ZIP,从官网下载。
1401 0