MySql教程

MySQL高级SQL语句

本文主要是介绍MySQL高级SQL语句,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

引言

一、MySQL进阶查询

1、按照关键字排序

2、查询不重复记录(distinct)

3、对结果进行查询

4、限制结果条目(limit)

5、设置别名(alias)

6、通配符

7、子查询

8、视图

9、NULL值

二、正则表达式

1、regexp匹配参数含义

2、查询匹配开始字符的数据

3、查询匹配结束字符的数据

4、查询匹配任何字符串

5、查询匹配任何单个字符

6、查询匹配字符串1或字符串2

7、查询匹配零个或多个在它前面的字符

8、查询匹配前面的字符1次或多次

9、查询匹配字符集合中的任意一个字符

10、匹配不在括号中的任何字符

三、运算符

1、算术运算符

2、比较运算符

3、逻辑运算符(布尔值)

4、位运算符

四、连接查询

1、内连接

2、左连接

3、右连接

五、数据库函数

1、数学函数

2、聚合函数

3、字符串函数

4、日期时间函数

六、存储过程

1、概述

2、简介

3、存储过程的优点

4、语法

 5、创建存储过程

6、调用存储过程

7、查看存储过程

8、查看指定存储过程信息

9、存储过程的参数

10、修改存储过程

11、删除存储过程

总结


引言

在对 MySQL 数据库的增、删、改、查操作有一定了解之后,就可以学习一些 SQL 语句的高级使用方法。SQL语句的熟练使用,在平时的运维工作中可以提供不小的帮助,尤其是在一些规模较小的公司,运维身兼数职,可能会有不少数据库的相关工作。

一、MySQL进阶查询

1、按照关键字排序

使用order by语句来实现排序,排序可针对一个或多个地段,order by的语法结构:select column1, column2, ... from table_name order by column1, column2, ... asc|desc;

注:asc是按照升序进行排序的,是默认的排序方式,即asc可以省略。select 语句中如果没有指定具体的排序方式,则默认按asc方式进行排序。desc是按降序方式进行排列,当然order by前面也可以使用where子句对查询结果进一步过滤。

(1)单字段排序

①按照分数排序,默认不指定时升序排列(asc)

②按照分数降序排列,使用desc

(2)条件查询

order by还可以结合where进行条件过滤,筛选地址是南京的学生按分数降序排列

(3)多字段排序

order by之后的参数,使用“,”分割,优先级是按先后顺序而定

(4)区间判断及查询不重复记录(and/or:且/或)

①查询分数在70到90之间所有的学生

②查询分数在70分以下,90分以上的学生

③查询分数在60到70之间,95分以上的学生

2、查询不重复记录(distinct)

格式:select distinct 字段 from 表名;

(1)distinct必须放在最开头;

(2)distinct只能使用需要去重的字段进行操作;

(3)distinct去重多个字段时(几个字段同事重复才会被过滤)。

3、对结果进行查询

通过SQL查询出来的结果,还可以对其进行分组,使用group by语句来实现 ,group by通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),group by分组的时候可以按一个或多个字段对结果进行分组处理。

格式:select 字段,聚合函数from表名,(where字段名(匹配)数值)group by字段名;

select column_name,aggregate_function(column_name)from table_name where column_name operator value group by column_name;

对info进行分组,筛选范围/条件时score大于等于80的“name,score”相同的会默认分在一个组。

(1)分组排序

①对info表中兴hobby相同的id进行数量统计,并按照相同hobby进行分组

②基于上一条操作,结合order by把统计的id数量进行按降序序排列

(2)分组条件

结合where语句,筛选分数大于等于80的分组,计算学生个数按升序排列

4、限制结果条目(limit)

limit限制输出的结果记录,在使用MySQL select语句进行查询时,结果集返回的是所有匹配的记录(行)。有时候仅 需要返回第一行或者前几行,这时候就需要用到limit子句。

格式:select column1, column2, ... from table_name limit [offset,] number

limit的第一个参数是位置偏移量(可选参数),是设置MySQL从哪一行开始显示。 如果不设定第一个参数,将会从表中的第一条记录开始显示。需要注意的是,第一条记录的位置偏移量是0,第二条是1,以此类推。第二个参数是设置返回记录行的最大数目。

(1)查询所有信息显示前4行记录

(2)从第5行开始,往后显示3行内容

(3)结合order by语句,按id的大小升序排列显示前三行

(4)结合order by语句,按id的大小升序排列显示最后三行

5、设置别名(alias)

在MySQL查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者 多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性。

对于列的别名格式:select column_name as alias_name from table_name;

对于表的别名格式:select column_name(s) from table_name as alias_name;

在使用as后,可以用alias_name代替 table_name,其中as语句是可选的。as之后的别名,主要是为表内的列或者表提供临时的名称,在查询过程中使用,库内实际的表名或字段名是不会被改变的。

(1)列别名设置

(2)如果表的长度比较长,可以使用as给表设置别名,在查询的过程中直接使用别名(临时设置info的别名为i)

(3)查询info表的字段数量,以number显示

(4)不用as也可以,一样显示

使用场景:对复杂的表进行查询的时候,别名可以缩短查询语句的长度;多表相连查询的时候(通俗易懂、减短sql语句)。

(5)AS 还可以作为连接语句的操作符。创建t1表,将info表的查询记录全部插入t1表。

此处as起到的作用:创建了一个新表t1并定义表结构,插入表数据(与info表相同),但是“约束”没有被完全“复制”过来。如果原表设置了主键,那么附表的:default字段会默认设置一个0

(6)使用where语句判断

在为表设置别名时,要保证别名不能与数据库中的其他表的名称冲突。列的别名是在结果中有显示的,而表的别名在结果中没有显示,只在执行查询时使用。

6、通配符

通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。通常通配符都是跟like(模糊查询)一起使用的,并协同where子句共同来完成查询任务。常用的通配符有两个,分别是:%(百分号表示零个、一个或多个字符);_(下划线表示单个字符)

(1)查询名字是l开头的记录

(2)查询名字里是c和i中间有一个字符的记录

(3)查询名字中间有g的记录

(4)查询hanmei后面3个字符的名字记录

(5)通配符“和“%”_”不仅可以单独使用,也可以组合使用

7、子查询

子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤。子语句可以与主语句所查询的表相同,也可以是不同表。

其中:主语句(select name,score from info where id);子语句(select id from info where score >80)。

子语句中的sql语句是为了,最后过滤出一个结果集,用于主语句的判断条件。 in是将主表和子表关联/连接的语法。

子查询不仅可以在select语句中使用,在insert、update、delete中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。子查询还可以用在insert 语句中。子查询的结果集可以通过insert语句插入到其他的表中。

update语句也可以使用子查询。update内的子查询,在set更新内容时,可以是单独的一列,也可以是多列。

(1)多表查询

(2)info表的记录插入到t1表里面

(3)将caicai的分数改为50

(4)删除分数大于80的记录

(5)删除分数不是大于等于80的记录

在 IN 前面还可以添加 NOT,其作用与 IN 相反,表示否定(即不在子查询的结果集里面)

(6)exists

exists这个关键字在子查询时,主要用于判断exists之后的条件是否成立,如果成立,则正常执行主语句的匹配,如不成立,则不会执行主语句查询,如子查询结果集不成立的话,输出为null。

①查询如果存在分数等于80的记录则计算info的字段数

②查询如果存在分数小于50的记录则计算info的字段数,info表没有小于50的,所以返回0

(7)别名as

8、视图

视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据。数据库种只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了映射,镜花水月/倒影,动态保存结果集(数据)。

(1)、视图的作用

①使操作简单化,可以对经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件。

②增加数据的安全性,通过视图,用户只能查询和修改指定的数据。

③提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响。

使用视图的大部分情况是为了保障数据安全性,提高查询效率。

(2)创建视图

 (3)查看视图

 (4)修改原表数据

注:修改原表会改变视图中的数据

(5)修改视图数据

注:修改视图不会改变原表的数据

9、NULL值

在SQL语句使用过程中,经常会碰到null这几个字符。通常使用null来表示缺失的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用not null关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有not null并且没有值,这时候新记录的该字段将被保存为null。需要注意 的是,null值与数字0或者空白(spaces)的字段是不同的,值为null的字段是没有值的。在SQL语句中,使用is null可以判断表内的某个字段是不是null值,相反的用is not null可以判断不是null值。

null值与空值的区别(空气与真空);空值长度为0时不占空间,null值的长度为null时占用空间;is null无法判断空值;空值使用”=”或者”<>"来处理(!=);count()计算时null会忽略,空值会加入计算。

(1)查询info表结构,id和name字段是不允许空值的

(2)插入一条记录,分数字段输入null,显示出来就是null

(3)检测null是否会加入统计中

(4)将info表中其中一条数据修改为空值

(5)查询null值和不是null值

二、正则表达式

MySQL正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。MySQL的正则表达式使用regexp这个关键字来指定正则表达式的匹配模式,regexp操作符所支持的匹配模式如表所示。

1、regexp匹配参数含义

序号

匹配的参数

含义

1

^

匹配文本的开始字符

2

$

匹配文本的结束字符

3

.

匹配任何单个字符

4

*

匹配零个或多个在它前面的字符

5

+

匹配前面的字符 1 次或多次

6

字符串

匹配包含指定的字符串

7

字符串1|字符串2

匹配字符串1或字符串2

8

[...]

匹配字符集合中的任意一个字符

9

[^...]

匹配不在括号中的任何字符

10

{n}

匹配前面的字符串n次

11

{n,m}

匹配前面的字符串至少n次,至多m次

2、查询匹配开始字符的数据

3、查询匹配结束字符的数据

4、查询匹配任何字符串

5、查询匹配任何单个字符

6、查询匹配字符串1或字符串2

7、查询匹配零个或多个在它前面的字符

8、查询匹配前面的字符1次或多次

9、查询匹配字符集合中的任意一个字符

10、匹配不在括号中的任何字符

三、运算符

MySQL的运算符用于对记录中的字段值进行运算。MySQL的运算符共有四种,分别是:算术运算符、比较运算符、逻辑运算符和位运算符。

1、算术运算符

以select命令来实现最基础的加减乘除运算,MySQL支持使用的算术运算符,如表所示:

序号

运算符

含义

1

+

加法

2

-

减法

3

*

乘法

4

/

除法

5

%

取余

在除法运算和求余数运算中,除数不能为0,若除数是0,返回的结果则为 null。需要注意的是,如果有多个运算符,按照先乘除后加减的优先级进行运算,相同优先级的运算符没有先后顺序。

2、比较运算符

比较运算符是查询数据记录时经常使用的一类运算符。通过使用比较运算符可以判断出表中有哪些记录是符合条件的,如果比较的结果(以布尔值的方式进行返回判断)为真则返回1,如果为假则返回0,比较的结果如果不确定则返回null。其中字符串在进行比较的时候默认是不区分大小写的,如果要区分大小写可以通过binary关键字来实现。

序号

运算符

含义

1

=

等于

2

>

大于

3

<

小于

4

>=

大于等于

5

<=

小于等于

6

!=或<>

不等于

7

is null

判断一直是否为null

8

is not null

判断一个值是否不为null

9

between and

两者之间

10

in

在集合中

11

like

通配符配置

12

greatest

两个或多个参数时返回最大值

13

least

两个或多个参数时返回最小值

14

regexp

正则表达式

(1)等号(=)

等号是用来判断数字、字符串和表达式是否相等的,如果相等则返回1(true),如果不相等则返回0(flase)。如果比较的两者有一个值是null,则比较的结果就是null。其中字符的比较是根据 ASCII 码来判断的,如果ASCII码相等,则表示两个字符相同;如果ASCII码不相等,则表示两个字符不相同,例如字符串(字母)比较:('a'>'b')其实比较的就是底层的ASCII码,需要关注的是ascii码有:a、A、0(97、65、48)。那么,如果比较的是多字符串,如:'abc'='acb',如何比较(字符个数、字符顺序),如果比较的是多字符,如:'abc' <'baa' 如何比较,与linux返回值表达相反,linux 中运行正常返回值是0,运行异常返回值是非0。

①如果两者都是整数,则按照整数值进行比较。

②如果一个整数一个字符串,则会自动将字符串转换为数字,再进行比较。(在程序中,一般是不会吧这两者进行相比较的)

③如果两者都是字符串,则按照字符串进行比较。

④如果两者中至少有一个值是NULL,则比较的结果是NULL。

(2)不等于(<>,!=)

不等于号有两种写法,分别是<>或者!=,用于针对数字、字符串和表达式不相等的比较。如果不相等则返回1,如果相等则返回0,这点正好跟等于的返回值相反。需要注意的是不等于运算符不能用于判断NULL。

①大于(>)运算符用来判断左侧的操作数是否大于右侧的操作数,若大于返回1,否则返回0,同样不能用于判断NULL。

②小于(<)运算符用来判断左侧的操作数是否小于右侧的操作数,若小于返回1,否则返回0,同样不能用于判断NULL。

③大于等于(>=)判断左侧的操作数是否大于等于右侧的操作数,若大于等于返回1,否则返回0,不能用于判断NULL。

④小于等于(<=)判断左侧的操作数是否小于等于右侧的操作数,若小于等于返回1,否则返回0,不能用于判断NULL。

(3)判断一个值为/不为null(is null、is not null)

①is null判断一个值是否为null,如果为null返回1,否则返回0。

②is not null判断一个值是否不为null,如果不为null返回1,否则返回 0。

(4)between and

比较运算通常用于判断一个值是否落在某两个值之间。例如,判断某数字是否在另外两个数字之间,也可以判断某英文字母是否在另外两个字母之间,具体操作,条件符合返回1,否则返回0

Between and覆盖的范围是>=和<=关系。

(5)least和greatest(取最小值、取最大值)

①least:当有两个或者多个参数时,返回其中的最小值。如果其中一个值为null,则返回结果就为null。

②greatest:当有两个或者多个参数时,返回其中的最大值。如果其中一个值为null, 则返回结果就为null。

③若要判断一组数字或字母中哪个最小、哪个最大,可以通过使用least和 greatest来实现

(6)in和not in

①in判断一个值是否在对应的列表中,如果是返回1,否则返回0。

②not in判断一个值是否不在对应的列表中,如果不是返回1,否则返回0。

(7)like

用来匹配字符串,如果匹配成功则返回1,反之返回0;like支持两种通配符:’%’ 用于匹配任意数目的字符(*匹配的是前面一个字符);而’_’只能匹配一个字符。

not like正好跟like相反,如果没有匹配成功则返回1,反之返回0。

3、逻辑运算符(布尔值)

逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假,如果为真返回1,否则返回0,真和假也可以用true和false表示。MySQL中支持使用的逻辑运算符有四种,具体如表所示。

序号

运算符

含义

1

not或!

逻辑非

2

and或&&

逻辑与

3

or

逻辑域

4

xor

逻辑异域

(1)逻辑非

逻辑运算符中最简单的运算符就是逻辑非,逻辑非使用not或!表示。逻辑非将跟在它后面的逻辑测试取反,把真变为假,把假变为真。如果not后面的操作数为0时,所得值为1;如果操作数为非0时,所得值为0;如果操作数为null时,所得值为null。

(2)逻辑与(and)

当所有的操作数都为非0值且不为null时,返回值为1,否则为0(null与0比较特殊),逻辑与使用and或者&&表示。

由结果可看出:

①and和&&的作用相同

②1 and -1没有0或null,所以返回值为1

③1 and 0中由有0,所以返回值为0

④1 and null有null,所以返回值为null

⑤null and 0返回值为0

(3)逻辑或(or)

逻辑或通常使用or,逻辑或表示包含的操作数,任意一个为非零值并且不是null值时,返回1,否则返回0。当有一个操作数为null时,如果另一个操作数为非0值,则返回值为1,否则为null,如两个操作数均为null,则返回值为null。

①1 or -1 or 0含有0,但同时包含有非0的值1和-1,所以返回结果为1;

②1 or 2 中没有操作数0,所以返回结果为1;

③1 or null虽然有null,但是有操作数1,所以返回结果为1;

④0 or null中没有非0值,并且有null,所以返回值为null;

⑤null or null中只有null,所以返回值为null。

(4)逻辑异或(xor)

两个非null值的操作数,如果两者都是0或者都是非0,则返回0;如果一个为0,另一个为非0,则返回结果为1;当任意一个值为null时,返回值为null。

4、位运算符

位运算符实际上是对二进制数进行计算的运算符。MySQL内位运算会先将操作数变成二进制格式(10101111),然后进行位运算,最后在将计算结果从二进制变回到十进制格式,方便用户查看。MySQL支持6种位运算符,具体如表所示。

序号

位运算符

含义

1

&

按位与

2

|

按位或

3

~

按位取反

4

^

按位异或

5

<<

按位左移

6

>>

按位右移

第①步骤:10转换为二进制数是1010, 15转换为二进制数是1111。

第②步骤:按位与运算(&),是对应的二进制位都是1的,它们的运算结果为1,否则为0,所以10 & 15的结果为10。

第③步骤:按位或运算(|),是对应的二进制位有一个或两个为1的,运算结果为 1,否则为0, 所以10 | 15的结果为15。

第④步骤:按位异或运算(^),是对应的二进制位不相同时,运算结果 1,否则为 0,所以 10 ^ 15的结果为5。

第⑤步骤:按位取反(~),是对应的二进制数逐位反转,即1取反后变为0, 0取反后变为 1。数字1的二进制是0001,取反后变为1110,数字5的二进制是0101,将1110和0101。

第⑥步骤:进行求与操作,其结果是二进制的0100,转换为十进制就是4。

优先级

运算符

1

!

2

~

3

^

4

*,/,%

5

+,-

6

>>,<<

7

&

8

|

9

=,<=>,>=,>,<=,<,<>,!=,is,like,regexp,in

10

between,case,when,then,else

11

not

12

&&,and

13

||,or,xor

14

:=

四、连接查询

MySQL的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接。

1、内连接

MySQL中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在from子句中使用关键字inner join来连接多张表,并使用on子句设置连接条件,内连接是系统默认的表连接,所以在from子句后可以省略inner关键字,只使用关键字join。同时有多个表时,也可以连续使用inner join来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表。

通过inner join的方式将两张表指定的相同字段的记录行输出相同结果。

2、左连接

左连接也可以被称为左外连接,在from子句中使用left join或者left outer join关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。

左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为NULL。

3、右连接

右连接也被称为右外连接,在from子句中使用right join或者 right outer join关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。

在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹配的行,这些记录在左表中以NULL补足。

五、数据库函数

1、数学函数

数据库内存储的记录,经常要进行一系列的算术操作,所以MySQL支持很多数学函数。常用的数学函数如表所示

序号

数学函数

含义

1

abs(x)

返回x的绝对值

2

rand()

返回0到1的随机数

3

mod(x,y)

返回x除以y以后的余数

4

power(x,y)

返回x的y次方

5

round(x)

返回离x最近的整数

6

round(x,y)

保留x的y位小数四舍五入后的值

7

sqrt(x)

返回x的平方根

8

truncate(x,y)

返回数字x截断为y位小数的值

9

ceil(x)

返回大于或等于x的最小整数

10

floor(x)

返回小于或等于x的最大整数

11

greatest(x1,x2…)

返回集合中最大的值

12

least(x1,x2…)

返回集合中最小的值

(1)-2的绝对值返回x的绝对值

(2)0-1的随机数(0<=x<1)返回0到1的随机数

(3)可以搭配运算符

(4)5除以2的余数返回x除以y以后的余数

(5)2的3次方

(6)离1.49最和1.89近的整数

(7)1.893保留小数点后2位,1.896保留小数点后2位,这里会四舍五入

(8)平方根

(9)保留小数点后2位,但truncate函数不会四舍五入(截断)

(10)返回大于或等于5.2的最小整数

(11)返回小于或等于5.2的最大整数

(12)返回最大值

(13)返回最小值

2、聚合函数

MySQL数据库函数中专门有一组函数是特意为库内记录求和或者对表中的数据进行集中概括而设计的,这些函数被称作聚合函数。

序号

聚合函数

含义

1

avg()

返回指定列的平均值

2

count()

返回指定列中非 NULL 值的个数

3

min()

返回指定列的最小值

4

max()

返回指定列的最大值

5

sum(x)

返回指定列的所有值之和

(1)返回分数的总和

(2)返回分数字段的个数

(3)返回分数的最小值

(4)返回分数的最大值

(5)返回分数的平均值

3、字符串函数

序号

字符串函数

含义

1

length(x)

返回字符串 x 的长度

2

trim()

返回去除指定格式的值

3

concat(x,y)

将提供的参数 x 和 y 拼接成一个字符串

4

upper(x)

将字符串 x 的所有字母变成大写字母

5

lower(x)

将字符串 x 的所有字母变成小写字母

6

left(x,y)

返回字符串 x 的前 y 个字符

7

right(x,y)

返回字符串 x 的后 y 个字符

8

repeat(x,y)

将字符串 x 重复 y 次

9

space(x)

返回 x 个空格

10

replace(x,y,z)

将字符串 z 替代字符串 x 中的字符串 y

11

strcmp(x,y)

比较 x 和 y,返回的值可以为-1,0,1

12

substring(x,y,z)

获取从字符串 x 中的第 y 个位置开始长 度为 z 的字符串

13

reverse(x)

将字符串 x 反转

(1)length(x)返回字符串x的长度

(2)trim()返回去除格式的值

(3)concat(x,y) 将提供的参数x和y拼接成一个字符串

(4)结合其他函数,如trim(将后面的函数删除格式)

(5)upper(x)将字符串x的所有字母变成大写字母

(6)lower(x)将字符串x的所有字母变成小写字母

(7)left(x,y)返回字符串x的前y个字符

(8)right(x,y)返回字符串x的后y个字符

(9)把字符串的前3个字母和后3个字母拼接起来

(10)repeat(x,y)将字符串x重复y次

(11)space(x)返回x个空格

(12)replace(x,y,z)将字符串z替代字符串x中的字符串y

(13)strcmp(x,y)比较x和y,返回的值可以为-1,0,1(小于返回-1,等于返回0,大于返回1,只会返回这3个值,它是比较第一位不同的数字)

(14)substring(x,y,z)获取从字符串x中的第y个位置开始长度为z的字符串

(15)reverse(x)将字符串x反转

4、日期时间函数

序号

日期时间函数

含义

1

curdate()

返回当前时间的年月日

2

curtime()

返回当前时间的时分秒

3

now()

返回当前时间的日期和时间

4

month(x)

返回日期x中的月份值

5

week(x)

返回日期x是年度第几个星期

6

hour(x)

返回x中的小时值

7

minute(x)

返回x中的分钟值

8

second(x)

返回x中的秒钟值

9

dayofweek(x)

返回x是星期几,1星期日,2星期一

10

dayofmonth(x)

计算日期x是本月的第几天

11

dayofyear(x)

计算日期x是本年的第几天

(1)返回年月日

(2)返回当前时间

(3)返回当前完整时间

(4)返回月份

(5)返回当前日期是一年中的第几周

(6)返回当前时间的小时

(7)返回当前时间的分钟

(8)返回当前时间的秒

(9)当前是星期几

(10)当前日期是本月的第几天

(11)当前日期是今年的第几天

六、存储过程

1、概述

在实际的数据库应用中,有些数据库操作可能会非常复杂,可能会需要多条SQL 语句一起去处理才能够完成,这时候就可以使用存储过程,轻松而高效的去完成这个需求,有点类似shell脚本里的函数。

2、简介

(1)存储过程是一组为了完成特定功能的SQL语句集合。

(2)存储过程这个功能是从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。操作数据库的传统SQL语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高。

3、存储过程的优点

(1)执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率;

(2)SQL语句加上控制语句的集合,灵活性高;

(3)在服务器端存储,客户端调用时,降低网络负载;

(4)可多次重复被调用,可随时修改,不影响客户端调用;

(5)可完成所有的数据库操作,也可控制数据库的信息访问权限。

4、语法

CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
<过程名>:尽量避免与内置的函数或字段重名
<过程体>:语句
[ IN | OUT | INOUT ] <参数名><类型>

 5、创建存储过程

mysql> delimiter $$     #将语句的结束符号从分号;临时改为两个$$(可以自定义)
mysql> create procedure proc()     #创建存储过程,过程名为proc,不带参数
-> begin     #过程体以关键字begin开始
-> create table mk (id int (10), name char(10),score int (10));
-> insert into mk values (1,'wang',13);
-> select * from mk;      #过程体语句
-> end $$     #过程体以关键字end结束
delimiter ;     #将语句的结束符号恢复为分号

6、调用存储过程

call proc();
I    存储过程的主体都分,被称为过程体
II   以begin开始,以end结束,若只有一条SQL语句,则可以省略begin-end
III  以delimiter开始和结束
mysgl>delimiter $$     #$$是用户自定义的结束符 
省略存储过程其他步骤
mysql>delimiter ;     #分号前有空格

7、查看存储过程

格式:show create procedure [数据库.]存储过程名;

8、查看指定存储过程信息

show procedure status like '%proc%'\G;

9、存储过程的参数

IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)。

OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)。

INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)。

即表示调用者向过程传入值,又表示过程向调用者传出值(只能是变量)

mysql> delimiter @@
mysql> create procedure proc2 (in inname varchar(40))     #行参
    -> begin
    -> select * from info where name=inname;
    -> end @@                                                              
mysql> delimiter ;
mysql> call proc2('wangwu');     #实参

10、修改存储过程

alter procedure <过程名>[<特征>... ]

alter procedure proc modifies sqldata sql security invoker;

modifies sql date:表明子程序包含写数据的语句

security:安全等级

invoker:当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。

11、删除存储过程

存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。

drop procedure if exists proc;

总结

1、按照关键字排序(order by):单字段排序(asc、desc);条件查询(where);多字段排序;区间判断及查询不重复记录(and/or:且/或)。

2、查询不重复记录(distinct):distinct必须放在最开头;distinct只能使用需要去重的字段进行操作;distinct去重多个字段时(几个字段同事重复才会被过滤)。

3、对结果进行查询常用的聚合函数:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),group by分组的时候可以按一个或多个字段对结果进行分组处理。

4、对结果进行查询:分组排序;分组条件。

5、限制结果条目(limit):需要注意的是,第一条记录的位置偏移量是0,第二条是1,以此类推。

6、设置别名(alias):简洁明了,增强可读性。

7、通配符:%(百分号表示零个、一个或多个字符);_(下划线表示单个字符)。

8、子查询:内查询或者嵌套查询。

9、视图:数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了映射。

10、NULL值:null值与空值的区别(空气与真空);空值长度为0时不占空间,null值的长度为null时占用空间;is null无法判断空值;空值使用”=”或者”<>"来处理(!=);count()计算时null会忽略,空值会加入计算。

11、MySQL正则表达式:使用regexp这个关键字来指定正则表达式的匹配模式。

12、运算符:算术运算符、比较运算符、逻辑运算符和位运算符。

13、连接查询:内连接、左连接、右连接。

14、数据库函数:数学函数、聚合函数、字符串函数、日期时间函数

15、存储过程:在实际的数据库应用中,有些数据库操作可能会非常复杂,可能会需要多条SQL 语句一起去处理才能够完成,这时候就可以使用存储过程,轻松而高效的去完成这个需求,有点类似shell脚本里的函数。

这篇关于MySQL高级SQL语句的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!