存储过程和自定义函数
写在前面在前面学习变量的时候提到了存储过程,那么本篇就来学习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 ...
数据查询语言(DQL)---order by和limit排序查询
写在前面在实际工作中经常会有一些特殊需求,如在开发一个电商系统时,如果我们想查看今天所有成交的订单,并按照交易额由高到低进行排序展示,那么就需要用到本篇学习的排序查询了。
本篇是DQL的排序查询篇,主要学习的内容如下所示:(1)排序查询基本语法格式;(2)单字段排序;(3)多字段排序;(4)按别名排序;(5)按函数排序;(6)where之后排序;(7)截取查询基本语法格式;(8)获取前n行记录;(9)获取最大的一条记录;(10)获取排名第n到m的记录;(11)分页查询;(12)limit中不能使用表达式;(13)limit后面2个参数不能为负数;(14)排序分页存在的坑;(15)文章小结等。
需要说明的是,本篇文章代码中被[]包含的内容表示可选的,而被|分割的内容表示可选其一。
排序查询所谓的排序查询就是将查询得到的结果进行排序后进行展示。
基本语法格式排序查询的基本语法格式如下所示:
1select 字段名 from 表名 order by 字段1 [asc|desc],字段2 [asc|desc],...;
在上述语句中,需要排序的字段必须跟在order by后面,[asc|des ...
数据查询语言(DQL)---where条件查询
写在前面在实际工作中经常会有一些特殊需求,如在开发一个电商系统时,如果我们想查看某个用户的所有订单,或者查看某个用户在某个时间段内所有的订单,此时就需要对订单表中的数据进行筛选,然后按照用户和时间进行过滤,最后得到期望的结果,这是再简单不过的需求了。
但是基于之前学过的知识,我们是无法完成这个需要,此时就需要使用条件查询来对指定表进行操作,那么本篇就来学习SQL中常用的条件查询语句。
本篇是DQL的条件查询篇,主要学习的内容如下所示:(1)条件查询基本语法格式;(2)等于(=);(3)不等于(<>或者!=);(4)大于(>);(5)逻辑查询运算符;(6)并且(AND);(7)或者(OR);(8)模糊查询(like);(9)区间查询(between…and);(10)IN查询;(11)NOT IN查询;(12)NULL的注意事项;(13)IS NULL查询;(14)IS NOT NULL查询;(15)安全等于(<=>);(16)经典面试题;(17)文章小结等。
条件查询在MySQL中,条件语句就是使用关键字where,后面跟上一个或多个条件,这些条件用于对前 ...