游标学习
写在前面前面对存储过程、函数和流程控制语句进行了学习,接下来再学习另一个知识点—游标。当我们需要对一个select语句的查询结果进行遍历时,就可以使用游标来进行遍历,之后就可以对每行数据进行处理。
本文的主要内容如下:(1)游标定义;(2)游标作用;(3)游标作用;(4)游标的使用语法;(5)单游标示例;(6)游标过程详解;(7)嵌套游标示例;(8)文章总结。
数据准备为了后续学习的必要,这里先准备了三张数据表envy1、envy2和envy3,相应的建表语句如下所示:
12345678910111213141516drop database if exists envythink;create database envythink;use envythink;drop table if exists envy1;create table envy1(a int,b int);insert into envy1 values(1,2),(3,4),(5,6);drop table if exists envy2;create table envy2(a int);insert into ...
流程控制语句
写在前面上一篇文章主要对存储过程和自定义函数进行了学习,可以发现这些逻辑都是较为简单的,但是在实际工作中的业务逻辑远比这复杂,因此需要使用到流程控制语句,那么本篇就来学习MySQL中流程控制语句相关内容。
本文的主要内容如下:(1)if函数;(2)if函数示例;(3)case结构;(4)case结构—类似于Java中的switch语句;(5)case结构—类似于Java中的多重if语句;(6)if结构;(7)if结构示例;(8)循环控制;(9)while循环;(10)repeat循环;(11)loop循环;(12)文章总结。
数据准备为了后续学习的必要,这里先准备了一张数据表t_user,相应的建表语句如下所示:
123456789101112use envythink;drop table if exists t_user;create table t_user( id int primary key comment '编号', sex tinyint not null default 1 comment '性别:1男,2女', name ...
存储过程和自定义函数
写在前面在前面学习变量的时候提到了存储过程,那么本篇就来学习MySQL中的存储过程。一般来说,当线上程序出现问题导致数据错误时,如果情况较为紧急,那么可以写一个存储来快速修复数据,然后再去修复程序,这在某些场景下还是有效的。但是对于Java开发人员来说,存储过程以及在程序中调用存储过程实现一些业务其实是不可取的操作。还有如果MySQL自带的函数无法满足我们日常的需求时,开发者可以自定义一些函数。
本文主要介绍MySQL中的存储过程以及自定义函数的使用。
数据准备为了后续学习的必要,这里先准备了一张数据表book2,相应的建表语句如下所示:
1234567use envythink;drop table if exists t_user;create table t_user( id int not null primary key comment '编号', age smallint unsigned not null comment '年龄', name varchar(16) not null comment '姓名' ...
变量学习
在MySQL使用过程中,我们经常会使用到一些变量,这些变量可能是系统变量或者用户自定义变量。如当查询或者修改系统配置的时候,可以查询和修改系统变量。当然在进行批处理脚本的时候,用户可以自定义变量,来实现数据的重复使用。
本文主要介绍系统变量和用户自定义变量的详细使用。需要说明的是,本篇文章代码中被[]包含的内容表示可选的,而被|分隔的内容表示可选其一。
系统变量前面也说了变量分为系统变量和用户自定义变量,那么接下来就分别介绍这两个变量。
系统变量是指系统定义的变量,它是mysql服务器层面的。
系统变量分类系统变量分为全局变量和会话变量。
(1)查看系统中所有变量的语法如下所示:
1shwo [global | session] variables;
(2)查看全局变量的语法如下所示:
1show global variables;
(3)查看会话变量的语法如下所示:
1show session variables;
(4)如果想查询满足指定条件的系统变量,可以使用like关键字来实现模糊匹配:
1shwo [global | session] like '%变量名% ...
视图学习
写在前面本篇来学习视图,对于开发人员来说这个在实际工作中用的不是很多,但是对于BI大数据人员来说,使用的频率还是较高的,因此本篇来学习一下MySQL中视图的相关内容。
本文的主要内容如下:(1)视图概念;(2)使用场景;(3)视图和表的区别;(4)视图好处;(5)创建视图;(6)修改视图;(7)删除视图;(8)查询视图结构;(9)更新视图;(10)文章总结。
需求说明假设你在一个电商公司任职,领导想知道当月订单总金额、订单数量、购买年龄层次、购买者男女比例等?对于领导来说,他只关心数据,并不关心你如何实现的?因此你不能将写好的SQL语句给它,但是你却需要显示结果?此时就可以使用本篇讲到的视图,使用视图可以隐藏SQL执行的细节,只展示最终的运行结果。
视图概念视图是MySQL5出现的一种虚拟表,行和列的数据来源于定义视图时使用的表,也就是说视图的数据是在使用视图时动态生成的,视图只保存了SQL的执行逻辑,不保存SQL的执行结果。
使用场景当多个地方需要使用到相同的查询结果时,且该查询结果较为复杂的时候,此时就可以使用视图来隐藏其复杂的具体实现细节。
视图和表的区别接下来聊一聊视图和表的区 ...
NULL使用记录
写在前面在前面学习的过程中,我们多次遇到由于数据值为NULL而导致的各种问题,那么本篇就来总结一下NULL使用过程中需要注意的点。
本文的主要内容如下:(1)在比较运算符中使用NULL;(2)IN和NULL比较;(3)NOT IN和NULL比较;(4)EXISTS、NOT EXISTS和NULL比较;(5)使用IS NULL、IS NOT NULL来判断NULL;(6)聚合函数中NULL的坑;(7)主键的值不允许为NULL;(8)文章总结。
在比较运算符中使用NULL仔细阅读下面SQL语句的执行结果:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879mysql> select 1 > NULL;+----------+| 1 > NULL |+----------+| NULL |+----------+1 row ...
数据查询语言(DQL)---子查询
写在前面前面学习了连接查询,这是SQL查询的重点也是难点内容,一定要灵活掌握。接下来学习另一个重点内容—子查询,这是衡量开发人员SQL水平的一个指标。
本文的主要内容如下:(1)子查询;(2)子查询分类;(3)子查询出现在select后面;(4)子查询出现在from后面;(5)子查询出现在where或者having后面;(6)子查询出现在where或者having后面—标量子查询;(7)子查询出现在where或者having后面—列子查询;(8)子查询出现在where或者having后面—行子查询;(9)子查询出现在exists后面(相关子查询);(10)文章总结。
子查询子查询是指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL4.1开始引入。说白了就是出现在select语句中的select语句,这就是子查询或者说是内查询,外部的select查询语句则称为主查询或者外查询。
子查询分类子查询按照结果集的行列数不同,可以分为4种:标量子查询、列子查询、行子查询和表子查询:(1)标量子查询,结果集中只有一行一列;(2)列子查询,结果集中只有一列多行;(3)行子查询,结果集 ...
数据查询语言(DQL)---连接查询
写在前面迄今为止我们都是在一张表内进行数据的增删改查操作,但是在实际工作中大部分都是涉及到同时操作多个表的情况,因此就需要使用到本篇学习的连接查询。
本文的主要内容如下:(1)笛卡尔乘积;(2)SQL中笛卡尔乘积语法;(3)内连接;(4)内连接—无连接条件;(5)内连接—有连接条件;(6)内连接—组合条件;(7)自连接;(8)外连接;(9)左连接(左外连接);(10)右连接(右外连接);(11);(12)全外连接(MySQL没有);(13)文章总结。
前期数据为了更好的学习连接查询,这里提前创建两张表和插入一些数据。
第一步,创建两张表:部门表(t_department)和员工表(t_employee),其中员工表内部有个department_id引用来自部门表的id,相应的SQL语句如下:
123456789101112131415161718mysql> drop table if exists t_department;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> create table t_depart ...
MySQL用户权限管理
写在前面在实际工作中可能会遇到当管理员创建了一个用户之后,但是该用户却无法登陆系统,没有对应的权限,通过本篇文章的学习,开发者就能解决这个问题。
本文的主要内容如下:(1)MySQL权限工作原理;(2)查看所有用户;(3)创建新用户;(4)修改用户密码;(5)给用户授权;(6)查看用户权限;(7)撤销用户权限;(8)授权原则介绍;(9)文章总结。
MySQL权限工作原理MySQL出于安全性考量,采用“主机名+用户名”这一双重验证机制来判断一个用户的身份。在互联网中,仅仅通过用户名来判断一个用户的身份,这是非常复杂的操作,但是开发者可以通过IP或者主机名来判断一台机器,且如果某位用户是通过这个机器访问的,那么就可以识别成功为一个用户。因此,当一个用户对MySQL发送指令的时候,MySQL就通过“主机名+用户名”这一机制来判断用户身份,进而验证用户权限。
MySQL权限验证分为两个阶段,第一个阶段:连接数据库,此时MySQL会根据用户名和用户来源(IP或者主机名)来判断用户是否有权限连接;第二阶段:对MySQL服务器发起请求操作,如create table、select、delete、up ...
数据查询语言(DQL)---group by和having分组查询
写在前面在学习了前面的order by和limit分页查询之后,接下来开始学习另一个较为高级的用法—分组查询,这个在实际工作中用到的频率也是较大的。
本篇是DQL的分组查询篇,主要学习的内容如下所示:(1)分组查询基本语法格式;(2)聚合函数;(3)单个字段分组;(4)多个字段分组;(5)分组前筛选数据;(6)分组后筛选数据;(7)where和having的区别;(8)分组后排序;(9)综合查询;(10)分组查询中的坑;(11)文章小结等。
需要说明的是,本篇文章代码中被[]包含的内容表示可选的,而被|分割的内容表示可选其一。
分组查询基本语法格式分组查询的基本语法格式如下所示:
1234select column,group_function,... from table[where condition]group by group_by_expression[having group_condition];
解释一下上述代码的含义,group_function是聚合函数,group_by_expression是分组表达式,如果存在多个,那么需要使用逗号进行隔开;group_cond ...
