热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mysql基础运用(试图,变量,存储,流程控制)

前要:结尾彩蛋目录一.视图1.视图概述2.创建视图1)语法格式2)视图示例3.修改视图1)语法格式4.查看视图5.删除视图二.变量1.变量分类1)局部变量2)用户变量3)会话变量4

前要:结尾彩蛋

目录

一.视图

1.视图概述

2.创建视图

1)语法格式

2)视图示例

3.修改视图

1)语法格式

4.查看视图

5.删除视图

二.变量

1.变量分类

1)局部变量

2)用户变量

3)会话变量

4)全局变量

2.使用系统变量

1)查看变量

2)变量赋值

3.使用用户变量

4.使用局部变量

三.存储过程

1.存储过程的概述

2.使用存储过程

1)创建存储过程

2)调用存储过程

3.查看存储过程

4.删除存储过程

四.流程控制结构

1.分支结构

1)if语句

2)case语句

2.循环结构

1)while循环

2)loop循环

3)repeat循环




一.视图

1.视图概述

视图是由数据库中的一个表或多个表导出的虚拟表,是一种虚拟存在的表,方便用户对数据的操作。

视图是一个虚拟表,是从数据库中一个或多个表中导出来的表,其内容由查询定义。

同真实表一样,视图包含一系列带有名称的列和行数据

数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。

使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。

一旦表中的数据发生改变,显示在视图中的数据也会发生改变。


使用视图的原因


安全原因,视图可以隐藏一些数据,例如,员工信息表,可以用视图只显示姓名、工龄、地址,而不显示社会保险号和工资数等

另一个原因是可使复杂的查询易于理解和使用。



2.创建视图



1)语法格式

CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 视图名[(属性清单)]
AS SELECT语句
[WITH [CASCADED|LOCAL] CHECK OPTION];

REPLACE:替换现有视图

ALGORITHM:可选项,表示视图选择的算法。

属性清单:可选项,指定视图中各个属性的名词,默认情况下与SELECT语句中的查询的属性相同。

SELECT语句:表示一个完整的查询语句,将查询记录导入视图中。

WITH CHECK OPTION:可选项,表示更新视图时要保证在该视图的权限范围之内。




2)视图示例

mysql> create view emp_sal_view
-> as
-> select name, date, basic+bonus as total
-> from employees as e
-> inner join salary as s
-> on e.employee_id=s.employee_id;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from emp_sal_view where year(date)=2020 and month(date)=12;

创建包含员工名、email和部门名的视图

mysql> use nsd2021;
mysql> create view emp_view
-> as
-> select name, email, dept_name
-> from employees as e
-> inner join departments as d
-> on e.dept_id=d.dept_id;
Query OK, 0 rows affected (0.01 sec)


# 查询视图中数据
mysql> select * from emp_view;
mysql> select * from emp_view where dept_name='运维部';
+-----------+--------------------+-----------+
| name | email | dept_name |
+-----------+--------------------+-----------+
| 廖娜 | liaona@tarena.com | 运维部 |
| 窦红梅 | douhongmei@tedu.cn | 运维部 |
| 聂想 | niexiang@tedu.cn | 运维部 |
| 陈阳 | chenyang@tedu.cn | 运维部 |
| 戴璐 | dailu@tedu.cn | 运维部 |
| 陈斌 | chenbin@tarena.com | 运维部 |
+-----------+--------------------+-----------+
6 rows in set (0.00 sec)


3.修改视图


1)语法格式


方式一:

mysql> alter view emp_sal_view
-> as
-> select name, date, basic, bonus, basic+bonus as total
-> from employees as e
-> inner join salary as s
-> on e.employee_id=s.employee_id;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from emp_sal_view where year(date)=2020 and month(date)=12;

与创建视图完全一样

CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 视图名[(属性清单)]
AS SELECT语句
[WITH [CASCADED|LOCAL] CHECK OPTION];

示例:

mysql> create or replace view emp_view
-> as
-> select name, email, d.dept_id, dept_name
-> from employees as e
-> inner join departments as d
-> on e.dept_id=d.dept_id;

mysql> select * from emp_view;

方式二

ALTER VIEW 视图名 AS 查询语句


4.查看视图


 语法:

SHOW TABLES
DESC 视图


5.删除视图


语法

DROP VIEW 视图1, 视图2, ...

 示例:

mysql> drop view emp_view, emp_sal_view;
Query OK, 0 rows affected (0.00 sec)


二.变量

1.变量分类


 mysql变量可分为两大类:

        系统变量:由系统提供,不是由用户定义的。包括全局变量、会话变量

        用户自定义变量:用 户定义的变量。包括用户变量、局部变量




1)局部变量

只能用在begin/end语句块中,比如存储过程中的begin/end语句块。


2)用户变量

用户变量不用提前声明,在用的时候直接用“@变量名”使用就可以了。


3)会话变量

服务器为每个连接的客户端维护一系列会话变量

其作用域仅限于当前连接,即每个连接中的会话变量是独立的


4)全局变量

影响服务器整体操作,作用于所有会话

当服务启动时,它将所有全局变量初始化为默认值

更改全局变量,必须具有super权限

其作用域为server的整个生命周期,服务重启消失



2.使用系统变量



1)查看变量

查看所有系统变量

mysql> show global variables; # 查看所有全局变量
mysql> show session variables; # 查看当前会话变量

查看满足条件的部分变量

mysql> show global variables like '%char%'; # 不指定global的话,默认为会话变量

查看某个系统变量

# 变量结构为@@变量名、@@global.变量名、@@session.变量名
mysql> select @@tx_isolation; # 默认为会话变量
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
mysql> select @@global.character_set_system;
+-------------------------------+
| @@global.character_set_system |
+-------------------------------+
| utf8 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| REPEATABLE-READ |
+------------------------+
1 row in set (0.00 sec)



2)变量赋值

为系统变量赋值

set global|session 系统变量名=值

set @@global|session.系统变量名=值

示例:

mysql> set @@global.autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@global.autocommit;
+---------------------+
| @@global.autocommit |
+---------------------+
| 0 |
+---------------------+
1 row in set (0.00 sec)


3.使用用户变量


作用域

        仅对当前会话有效,同于会话变量作用域

使用步骤

        声明并初始化

SET @用户变量=值

SET @用户变量:=值

SELECT @用户变量:=值

赋值

SET @用户变量=值

SET @用户变量:=值

SELECT @用户变量:=值

SELECT 字段 INTO @用户变量 FROM 表

使用

SELECT @变量

示例:

mysql> set @user='tom';
Query OK, 0 rows affected (0.00 sec)
mysql> select count(*) from employees into @count;
Query OK, 1 row affected (0.00 sec)
mysql> select @user;
+-------+
| @user |
+-------+
| tom |
+-------+
1 row in set (0.00 sec)
mysql> select @count;
+--------+
| @count |
+--------+
| 133 |
+--------+
1 row in set (0.00 sec)


4.使用局部变量


作用域

        仅在定义它的BEGIN/END中有效

使用步骤

        声明

DECLARE 变量 类型
DECLARE 变量 类型 DEFAULT 值

赋值

SET 局部变量=值

SET 局部变量:=值

SELECT 局部变量:=值

SELECT 字段 INTO 局部变量 FROM 表

使用

SELECT 局部变量


三.存储过程

1.存储过程的概述


存储过程是可编程的函数,在数据库中创建并保存,可以由一组SQL语句和控制结构组成。

提高了代码的重用性

减少了编译次数并减少了和数据库的连接次数,提高了效率



2.使用存储过程



1)创建存储过程

语法:

CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
一组合法的sql语句;
END

 存储过程前后最好使用DELIMITER //

参数列表包含三部分:

参数模式

        IN:需要调用者传值,与Python函数的参数作用类似

        OUT:该参数可以作为输入。与Python函数的返回值类似

        INOUT:既可以作为输入又可以作为输出

参数名

参数类型



分隔符

MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错

所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个"//"之间的内容当做存储过程的代码,不会执行这些代码

通过“DELIMITER ;”把分隔符还原。




2)调用存储过程

语法

CALL 存储过程(实参列表)

存储过程示例

空参列表

mysql> drop database if exists mydb;
mysql> create database if not exists mydb default charset utf8mb4;
mysql> use mydb;
mysql> create table departments like nsd2021.departments;
mysql> create procedure dep_pro()
-> begin
-> insert into departments values
-> (1, '人事部'), (2, '财务部');
-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> call dep_pro() //
Query OK, 2 rows affected (0.00 sec)
mysql> select * from departments //
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
| 1 | 人事部 |
| 2 | 财务部 |
+---------+-----------+
2 rows in set (0.00 sec)
mysql> delimiter ;
mysql> select * from departments;

使用IN参数

mysql> use nsd2021;
mysql> delimiter //
mysql> create procedure empcount_pro(IN dept_no int)
-> begin
-> select dept_id, count(*) from employees
-> where dept_id=dept_no
-> group by dept_id;
-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> call empcount_pro(1)//
+---------+----------+
| dept_id | count(*) |
+---------+----------+
| 1 | 8 |
+---------+----------+
1 row in set (0.00 sec)
mysql> delimiter ;

使用OUT参数

mysql> use nsd2021;
mysql> delimiter //
mysql> create procedure empemail_pro(IN emp_name varchar(10), OUT mail varchar(25))
-> begin
-> select email into mail
-> from employees
-> where name=emp_name;
-> end//
Query OK, 0 rows affected (0.00 sec)
mysql> call empemail_pro('刘倩', @m)//
Query OK, 1 row affected (0.00 sec)
mysql> select @m//
+--------------------+
| @m |
+--------------------+
| liuqian@tarena.com |
+--------------------+
1 row in set (0.00 sec)
mysql> delimiter ;

使用INOUT参数

mysql> delimiter //
mysql> create procedure myadd(INOUT i int)
-> begin
-> set i=i+100;
-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> set @n=8;
Query OK, 0 rows affected (0.00 sec)
mysql> call myadd(@n);
Query OK, 0 rows affected (0.00 sec)
mysql> select @n;
+------+
| @n |
+------+
| 108 |
+------+
1 row in set (0.00 sec)


3.查看存储过程


mysql> select name from mysql.proc where db='nsd2021';
+--------------+
| name |
+--------------+
| empcount_pro |
| empemail_pro |
| myadd |
+--------------+
3 rows in set (0.00 sec)
mysql> show create procedure empemail_pro \G


4.删除存储过程


mysql> drop procedure myadd;
Query OK, 0 rows affected (0.00 sec)


四.流程控制结构

顺序结构:自上向下执行

分支结构:从多条路径中选择一条路径执行

循环结构:满足某种条件,反复执行一段代码



1.分支结构



1)if语句

语法:

IF 条件 THEN
语句;
END IF;
IF 条件 THEN
语句1;
ELSE
语句2;
END IF;
IF 条件1 THEN
语句1;
ELSEIF 条件2 THEN
语句2;
ELSE
语句3;
END IF;

示例: 

mysql> use nsd2021;
mysql> delimiter //
mysql> create procedure deptype_pro(IN no int, OUT dept_type varchar(5))
-> begin
-> declare name varchar(5);
-> select dept_name into name from departments
-> where dept_id=no;
-> if name='运维部' then
-> set dept_type='技术部';
-> elseif name='开发部' then
-> set dept_type='技术部';
-> elseif name='测试部' then
-> set dept_type='技术部';
-> else
-> set dept_type='非技术部';
-> end if;
-> end//
Query OK, 0 rows affected (0.00 sec)

mysql> call deptype_pro(1, @t)//
Query OK, 1 row affected (0.00 sec)
mysql> select @t//
+--------------+
| @t |
+--------------+
| 非技术部 |
+--------------+
1 row in set (0.00 sec)
mysql> call deptype_pro(3, @t1)//
Query OK, 1 row affected (0.00 sec)
mysql> select @t1//
+-----------+
| @t1 |
+-----------+
| 技术部 |
+-----------+
1 row in set (0.00 sec)
mysql> delimiter ;



2)case语句

语法:

CASE 变量|表达式|字段
WHEN 判断的值1 THEN 返回值1;
WHEN 判断的值2 THEN 返回值2;
... ...
ELSE 返回值n;
END CASE;

示例

mysql> delimiter //
mysql> create procedure deptype_pro2(IN no int, OUT dept_type varchar(5))
-> begin
-> declare name varchar(5);
-> select dept_name into name from departments
-> where dept_id=no;
-> case name
-> when '运维部' then set dept_type='技术部';
-> when '开发部' then set dept_type='技术部';
-> when '测试部' then set dept_type='技术部';
-> else set dept_type='非技术部';
-> end case;
-> end//
mysql> call deptype_pro2(1, @tt)//
Query OK, 1 row affected (0.00 sec)
mysql> select @tt//
+--------------+
| @tt |
+--------------+
| 非技术部 |
+--------------+
1 row in set (0.00 sec)
mysql> call deptype_pro2(3, @tt2)//
Query OK, 1 row affected (0.00 sec)
mysql> select @tt2//
+-----------+
| @tt2 |
+-----------+
| 技术部 |
+-----------+
1 row in set (0.00 sec)
mysql> delimiter ;


2.循环结构



1)while循环

可能一次不执行

语法:

[标签:]WHILE 循环条件 DO
循环体;
END WHILE [标签];

示例:

mysql> use nsd2021;
mysql> delimiter //
mysql> create procedure while_pro(IN i int)
-> begin
-> declare j int default 1;
-> while j -> insert into departments(dept_name) values('hr');
-> set j=j+1;
-> end while;
-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> call while_pro(3)//
Query OK, 1 row affected (0.00 sec)
mysql> delimiter ;

使用LEAVE结束循环。此处LEAVE相当于其他语言的break

mysql> delimiter //
mysql> create procedure while_pro2(IN i int)
-> begin
-> declare j int default 1;
-> a:while j -> insert into departments(dept_name) values('hr');
-> if j>=2 then
-> leave a;
-> end if;
-> set j=j+1;
-> end while a;
-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> call while_pro2(10)//
Query OK, 1 row affected (0.00 sec)
mysql> delimiter ;


使用ITERATE跳过本次循环。此处的ITERATE相当于其他整语言的continue

mysql> delimiter //
mysql> create procedure while_pro3(IN i int)
-> begin
-> declare j int default 0;
-> a:while j -> set j=j+1;
-> if mod(j, 2)=0 then
-> iterate a;
-> end if;
-> insert into departments(dept_name) values(concat('hr', j));
-> end while a;
-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> call while_pro3(10)//
Query OK, 1 row affected (0.00 sec)
mysql> delimiter ;



2)loop循环

没有条件的死循环

语法:

[标签:]LOOP
循环体;
END LOOP [标签]

示例:

mysql> delimiter //
mysql> create procedure loop_pro()
-> begin
-> declare i int default 0;
-> a:loop
-> set i=i+1;
-> if i>5 then leave a;
-> end if;
-> insert into departments(dept_name) values(concat('hr1', i));
-> end loop a;
-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> call loop_pro()//
Query OK, 1 row affected (0.00 sec)
mysql> delimiter ;



3)repeat循环

至少循环一次

语法:

[标签:]REPEAT
循环体;
UNTIL 循环结束条件
END REPEAT [标签]

示例:

mysql> delimiter //
mysql> create procedure repeat_pro(IN i int)
-> begin
-> declare j int default 1;
-> a:repeat
-> set j=j+1;
-> insert into departments(dept_name) values('sales');
-> until j>i
-> end repeat a;
-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> call repeat_pro(1)//
Query OK, 1 row affected (0.00 sec)
mysql> delimiter ;


附:通过python3的pymysql模块操作数据库

import pymysql
cOnn= pymysql.connect(
host='192.168.1.11',
user='root',
password='NSD2021@tedu.cn',
db='mydb',
charset='utf8mb4'
)
cur = conn.cursor()
insert1 = 'insert into departments(dept_name) values(%s)'
for dep in ('da', 'db', 'dc', 'dd'):
cur.execute(insert1, (dep,))
conn.commit()
cur.close()
conn.close()



推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文讨论了在使用sp_msforeachdb执行动态SQL命令时,当发生错误时如何捕获数据库名称。提供了两种解决方案,并介绍了如何正确使用'?'来显示数据库名称。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
author-avatar
越野瘾君子_939
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有