MySQL高级SQL语句操作

按关键字排序

使用ORDER BY语句来实现排序
排序可针对一个或多个字段
ASC:升序默认排序方式
DESC:降序
ORDER BY的语法结构

SELECT column1, column2,... FROM table_name ORDER BY column1, column2,...ASC|DESC;

按单字段排序
按多字段排序

在这里插入图片描述

使用 ORDER BY 进行字段查询

select name,age from aa order by age desc;

在这里插入图片描述

select name,age from aa order by age;

在这里插入图片描述
使用 ORDER BY 进行多字段查询

select age,name,height from aa order by age desc,height desc;

在这里插入图片描述

select age,name,height from aa order by age,height ;

在这里插入图片描述

对结果进行分组

使用GROUP BY语句来实现分组
通常结合聚合函数一起使用
可以按一个或多个字段对结果进行分组

GROUP BY分组示例

select name,age from aa where height >=200 group by age;

在这里插入图片描述

GROUP BY分组示例

select name,age from aa where height >=200 group by age order by count(name) desc;

在这里插入图片描述

限制结果条目

只返回SELECT查询结果的第一行或前几行
使用LIMIT语句限制条目
LIMIT语法结构

SELECT column1, column2,... FROM table_name LIMIT [offset,] number;

LIMIT限制结果条数
不从第一条开始取值

以此表进行限制条目操作
限制结果的行数
限制表的前 2行

select * from aa limit 2;

在这里插入图片描述
不从第一条开始取值

 select * from aa limit 1,3;

在这里插入图片描述

设置别名

使用AS语句设置别名,关键字AS可省略
设置别名时,保证不能与库中其他表或字段名称冲突
别名的语法结构

SELECT column_name AS alias_name FROM table_name;
SELECT column_name(s)FROM table_name AS alias_name;

AS的用法

select count(*) as number from player;
select p.id,p.name from player as p limit 1;

AS作为连接语句

create table tmp as select * from player;

AS 的第一种操作

select count(*) as num from aa;

在这里插入图片描述

AS 的第二种操作

设置别名,id 设为 aa,height 设为 bb,表 aa 设为 表 aaa

select id aa,height bb,from aa as aaa;

+----+--------+
| aa | | bb   |
+----+--------+
|  2 |    200 |
|  3 |    300 |
|  4 |    400 |
+----+--------+

select id aa,height bb from a as aa where aa.height>=200;
+----+--------+
| aa | | bb   |
+----+--------+
|  3 |    300 |
|  4 |    400 |
+----+--------+

AS作为连接语句
复制表的结构以及数据

create table bb as select * from aa;

在这里插入图片描述
select * from bb;
在这里插入图片描述

通配符

用于替换字符串中的部分字符
通常配合 LIKE 一起使用,并协同 WHERE 完成查询
常用通配符

%表示零个、一个或多个
_表示单个字符

通配符%的用法

select id,name,level from player where name like "%s";

通配符_的用法

select id,name,level from player where name like '_uess";

使用 % 进行检索查询

查询表里以 Z 开头的 name

select * from aa where name like 'z%';

在这里插入图片描述
查询表里以 n 结尾的 name

select * from aa where name like '%n';

在这里插入图片描述
通配符_的用法
查询 name 里的单个字符

select * from aa where name like 'zhangs_n';

在这里插入图片描述

子查询

也称作内查询或者嵌套查询
先于主查询被执行,其结果将作为外层主查询的条件
在增删改查中都可以使用子查询
支持多层嵌套
IN语句是用来判断某个值是否在给定的结果集中
子查询的用法

查询条件

select name,level from player where id in (select id from player where level>=45);

插入数值

insert into tmp select * from player where id in (select id from player;

创建别名查询

update tmp set level = level -7 where id in (select a.id from (select id from tmp where level >= 47) a);

删除符合条件后查询

delete from tmp where id in (select a.id from(select id from tmp where level=47) a);

EXIST 关键字子查询

EXIST这个关键字在子查询时,主要用于判断子查询的结果集是否为空。如果不为空,则返回 TRUE;反之,则返回 FALSE。例如,先通过子查询判断返回是否为 TRUE,如果用户shirley存在,则计算整个tmp表的总记录数量

select count(*) as number from tmp where EXISTS (select id from tmp where name='shirley);

查询列表信息
查询 name 和 height 两列并列出 height 大于 180 的

select name,height from aa where height in (select height from aa where height >=200);

在这里插入图片描述

查询 name 和 height 两列并列,后面不添加条件

select name,height from aa where height in (select height from aa where height );

在这里插入图片描述
插入数值

重新复制表 aa 的表结构,为表 cc

create table cc like aa;

符合条件的数值从表 aa 中 复制给 表 cc
将表 aa 中的 height 大于等于 100 的插入给表 cc

insert into cc select * from aa where height in (select height from aa where height >=100);

在这里插入图片描述
定义别名根据条件查询
定义别名为 bb ,查询 height 大于等于 200 的以 name 和 height 列表显示

select bb.name,bb.height from (select name,height from aa where height>=200) as bb;

在这里插入图片描述

使用 update 对 bb 表里符合条件的 height 的数值加 10 (条件为 height 值大于等于200)

update bb set height=height+10 where height in(select bb.height from (select height from bb where height>=200) as bb);

在这里插入图片描述

删除符合条件后删除
删除 height 值大于等于 100 小于等于 200 的值将被删除

delete from bb where height in (select height from (select height from bb where height >=100 and height<=200)bb);

在这里插入图片描述

NULL值

表示缺失的值
与数字0或者空白(spaces)是不同的
使用IS NULL或IS NOT NULL进行判断
NULL值和空值的区别

空值长度为0,不占空间;NULL值的长度为NULL,占用空间
IS NULL无法判断空值
空值使用“=”或者“<>”来处理
COUNT()计算时,NULL会忽略,空值会加入计算

测试 NULL 值为空
添加 NULL

insert into bb values(default,default,default,default,default);

正则表达式

根据指定的匹配模式匹配记录中符合要求的特殊字符
使用REGEXP关键字指定匹配模式
常用匹配模式

^匹配开始字符
p1|p2匹配p1或p2
$匹配结束字符
[…]匹配字符集中的任意一个字符
.匹配任意单个字符
[^…]匹配不在中括号内的任何字符
*匹配任意个前面的字符
{n}匹配前面的字符串n次
+匹配前面字符至少1次
{n,m} 匹配前面的字符串至少n次,至多m次

查询 name 段以 w 开头的数据

select * from aa where name REGEXP '^z';

在这里插入图片描述

查询 name 段以 n 结尾的数据

select * from aa where name REGEXP 'n$';

在这里插入图片描述

查询 name 段的任意字符

select * from aa where name REGEXP '[a-z]';

在这里插入图片描述
查询不在括号内的任何字符

select * from aa where name REGEXP '[^a-z]';

查询 name 段中至少有一个 i 的数据

select * from aa where name REGEXP 'i{1}';

在这里插入图片描述
查询 name 段中至少有两个 i 的数据

select * from aa where name REGEXP 'i{2}';

在这里插入图片描述

查询 name 段某个范围的数据

select * from aa where name REGEXP 'zhangsan|zhaoliu';

在这里插入图片描述

查询 name 段中至少有一个 m 的

select * from aa where name REGEXP 'z+';	

在这里插入图片描述

运算符

用于对记录中的字段值进行运算
运算符分类

算术运算符
比较运算符
逻辑运算符
位运算符

算术运算符

MySQL支持的算术运算符

+加法
-减法
*乘法
/除法
%取余数

示例
加法

select 6+6;

在这里插入图片描述

多个算数在一起

select 2+2,3-2,1*2,3/3,2*3;

在这里插入图片描述
查看算数表结构

创建表

create table xx select 2+2,3-2,1*2,3/3,2*3;

在这里插入图片描述

比较运算符

字符串的比较默认不区分大小写,可使用binary来区分
常用比较运算符

= 等于
< 小于、>大于
<= 小于等于、>=大于等于
!=或 <> 不等于
IN 在集合中
LlKE 通配符匹配
IS NULL 判断一个值是否为NULL
IS NOT NULL判断一个值是否不为NULL
BETWEEN AND 两者之间
GREATEST两个或多个参数时返回最大值
LEAST 两个或多个参数时返回最小值

注释
等号 =

是用来判断数字、字符串和表达式是否相等的,如果相等则返回1,如果不相等则返回0
如果比较的两者有一个值是NULL,则比较的结果就是NULL
其中字符的比较是根据ASCII码来判断的,如果 ASCII码相等,则表示两个字符相同;如果ASCII码不相等,则表示两个字符不相同

select 1=2,3=3,5='5','a'='b';

在这里插入图片描述
结论

如果两者都是整数,则按照整数值进行比较
如果一个整数一个字符串,则会自动将字符串转换为数字,再进行比较
如果两者都是字符串,则按照字符串进行比较
如果两者中至少有一个值是 NULL,则比较的结果是 NULL

不等于运算符

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

select 3!=5,3!=3,9<>'9','a'<>'b','a'<>'a';

在这里插入图片描述

大于、大于等于、小于、小于等于运算符

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

select 6>9;

在这里插入图片描述

select 6<9;

在这里插入图片描述

select 6>=9;

在这里插入图片描述

select 6<=9;

在这里插入图片描述

select 2>NULL;

在这里插入图片描述

select 2=NULL;

在这里插入图片描述

select 2>=NULL;

在这里插入图片描述

IS NULL、IS NOT NULL

IS NULL判断一个值是否为 NULL,如果为 NULL返回1,否则返回0
IS NOT NULL判断一个值是否不为NULL,如果不为 NULL返回1,否则返回0


select 10 is NULL;

在这里插入图片描述

select 10 is not NULL;

在这里插入图片描述

BETWEEN AND

BETWEEN AND比较运算通常用于判断一个值是否落在某两个值之间
例如,判断某数字是否在另外两个数字之间,也可以判断某英文字母是否在另外两个字母之间

5 在3 与 6 之间

select 5 between 3 and 6;

在这里插入图片描述
7 不在 3 与 6 之间

select 7 between 3 and 6;

在这里插入图片描述

b 在 a 与 c 之间

select 'b' between 'a' and 'c';

在这里插入图片描述
c 不在 a 与 b 之间

select 'c' between 'a' and 'b';

在这里插入图片描述
LEAST、GREATEST

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

比较最小值

select least(1,2,3);

在这里插入图片描述

select least('a','b','c');

在这里插入图片描述
比较最大值

select greatest(1,2,3);

在这里插入图片描述

select greatest('a','b','c');

在这里插入图片描述

LEAST 比较的参数为数字时,返回的是其中最小的值;当比较的参数为字符串时,返回字母表中顺序最靠前的字符
GREATEST比较的参数为数字时,返回的是其中最大的值;当比较的参数为字符串时,返回字母表中顺序最靠后的字符

判断 1 是否在数值里面,为真则返回 1

select 1 in (1,2,3);

在这里插入图片描述

判断 4 是否在数值里面,为假则返回 0

select 4 in (1,2,3);

在这里插入图片描述

判断 3 不在数值里面,为假则返回 0

select 3 not in (1,3,5);

在这里插入图片描述

判断 7 不在数值里面,为真则返回 1

select 7 not in (1,3,5);

在这里插入图片描述
LIKE、NOT LIKE

LIKE 用来匹配字符串,如果匹配成功则返回1,反之返回O
LIKE 支持两种通配符:‘%’ 用于匹配任意数目的字符;而 ‘_’ 只能匹配一个字符
NOT LIKE正好跟LlKE 相反,如果没有匹配成功则返回1,反之返回0

select 'abcd' like 'ab';

在这里插入图片描述
‘%’ 用于匹配任意数目的字符

select 'abcd' like '%d';

在这里插入图片描述

‘_’ 用于只能匹配一个字符

select 'abcd' like 'ab_d';

在这里插入图片描述

逻辑运算符

逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假
如果为真返回1,否则返回0,真和假也可以用 TRUE 和 FALSE 表示
MySQL 中支持使用的逻辑运算符有四种
运算符描述
NOT或!逻辑非
AND或&&逻辑与
OR或II逻辑或
XOR逻辑异或

逻辑非

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

not 或 !

9 为真非 0 值;为 1,1 取反就是 0

在这里插入图片描述

相反为真

select !0;

在这里插入图片描述
AND 或 &&

5 为非 0 值,统一为真,真的话就是 1

select 5 or 0;

在这里插入图片描述
5 和 3 都为非 0 值,两个真值相与便为真

select 5 && 3;

在这里插入图片描述
在这里插入图片描述
OR 或 ||

两个数值类型都为非 0 值,为真

select 5 or 4;

在这里插入图片描述
有一个数值类型为真便为真

select 5 or 0;

在这里插入图片描述
XOR

 select 3 xor 0;

在这里插入图片描述
两个数值类型都为真,为假

select 3 xor 2;

在这里插入图片描述
两个非 0 值也为假

select 0 xor 0;

在这里插入图片描述
异或:同为真或同为假都为假,一个真一个假时才为真

逻辑或

逻辑或表示包含的操作数,任意一个为非零值并且不是NULL值时,返回1,否则返回0
逻辑或通常使用 OR 或者 || 来表示

逻辑异或

两个非 NULL值的操作数,如果两者都是О或者都是非0,则返回0
如果一个为0,另一个为非0,则返回结果为1

当任意一个值为NULL 时,返回值为 NULL

位运算符

位运算符实际上是对二进制数进行计算的运算符
MySQL内位运算会先将操作数变成二进制格式,然后进行位运算,最后在将计算结果从二进制变回到十进制格式,方便用户查看
MySQL支持6种位运算符
运算符描述
&按位与
I按位或
~按位取反
^按位异或
<<按位左移
>>按位右移

按位与

5 的二进制为 101;3 的二进制位 011,相乘得出 1

select 5 & 3;

在这里插入图片描述
按位或

select 5 | 3;

在这里插入图片描述
按位取反

select ~4;

在这里插入图片描述
按位异或

5 为101,3 为 011,1 与 0 异或为 1;0 与 1 异或为 1;1 与 1 异或为 0,结果为 110,换算成 6

select 5 ^ 3;

在这里插入图片描述
按位左移

5 为 101,左移两位为 10100,换算成 20

select 5 << 2;

在这里插入图片描述
3 为 011,左移两位为 01100,换算成 12

select 3 << 2;

在这里插入图片描述
按位右移

10 为 1010,右移两位为 10,换算成 2

select 10 >> 2;

在这里插入图片描述
运算符的优先级

决定了不同的运算诱在计算过程中的先后顺序
优先级高的先进算。同级的按从左到右进行计算
可以使用()小括号来改变计算优先级

表的连接方式

内连接

两张或多张表中同时符合某种条件的数据记录组合
FROM子句中使用INNER JOIN关键字连接多张表,并使用ON设置连接条件
是系统默认的表连接方式,可以省略INNER关键字
多表支持连续使用 INNER JOUN,建议不超过三个表
语法结构

SELECT column_name(s)FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;

在这里插入图片描述
新建两张表

create table qq(id int(1),height int(3));
create table ww(id int(1),weight int(3));

在这里插入图片描述
往两张表里添加数据

insert into qq values(1,10),(2,20),(3,30),(4,40),(5,50);
insert into ww values(1,10),(2,20),(3,30),(8,80),(9,90),(10,100);

将两张表内连接

select * from qq inner join ww on qq.id=ww.id;

在这里插入图片描述

外连接

左连接

**也被称为左外连接
在FROM子句中使用LEFT JOIN关键字来表示
匹配左表中所有行及右表中符合条件的行
实现原理**

将内连接创建的两张表左连接

select * from qq left join ww on qq.id=ww.id;

在这里插入图片描述
右连接

也被称为右外连接
在FROM子句中使用RIGHT JOIN关键字来表示
匹配右表中所有行及左表中符合条件的行
实现原理

将内连接创建的两张表右连接

select * from qq right join ww on qq.id=ww.id;

在这里插入图片描述

数据库函数

MySQL提供了实现各种功能的函数
常用的函数分类

数学函数
聚合函数
字符串函数
日期时间函数

常用的数学函数

abs(x) 返回x的绝对值
rand() 返回0到1的随机数
mod(x,y) 返回x除以y以后的余数
power(x,y) 返回x的y次方
round(x) 返回离x最近的整数
round(x,y) 保留x的y位小数四舍五入后的值
sqrt(x) 返回x的平方根
truncate(x,y) 返回数字x截断为y位小数的值
ceil(x) 返回大于或等于x的最小整数
floor(x) 返回小于或等于x的最大整数
greatest(×1,x2…) 返回集合中最大的值
least(x1,×2…) 返回集合中最小的值

示例
abs(x) 返回x的绝对值

-5的绝对值为5

select abs(-5);

在这里插入图片描述
rand() 返回0到1的随机数

随机返回 0-1 的数

select rand();

在这里插入图片描述
在这里插入图片描述
mod(x,y) 返回x除以y以后的余数

得出的结果为1

在这里插入图片描述
power(x,y) 返回x的y次方

4 的 4 次方为 256

select power(4,4);

在这里插入图片描述
round(x) 返回离x最近的整数

离 5.4 最近的整数为 5

在这里插入图片描述

离 5.5 最近的整数为 6

select round(5.5);

在这里插入图片描述

(2)常用的聚合函数

1:对表中数据记录进行集中概括而设计的一类函数

2:常用的聚合函数

  • avg() 返回指定列的平均值
  • count() 返回指定列中非NULL值的个数
  • min() 返回指定列的最小值
  • max() 返回指定列的最大值
  • sum() 返回指定列的所有值之和

示例

以此表为例

mysql> select * from a;
+------+------+----------+--------+--------+
| id   | age  | name     | height | weight |
+------+------+----------+--------+--------+
|    1 |   16 | liming   |    175 |    130 |
|    2 |   18 | zhangsan |    165 |    160 |
|    3 |   17 | wangwu   |    170 |    140 |
|    4 |   18 | lisi     |    180 |    120 |
|    5 |   19 | weipai   |    190 |    180 |
|    6 |   20 | zhucii   |    150 |     90 |
|    7 |   20 | maliu    |    180 |    140 |
|    8 |   22 | wuhan    |    190 |    170 |
|    9 |   19 | lisi     |    168 |    130 |
+------+------+----------+--------+--------+

avg() 返回指定列的平均值

  • 得出 height 字段的平均值
mysql> select avg(height) from a;
+-------------+
| avg(height) |
+-------------+
|    174.2222 |
+-------------+
1 row in set (0.00 sec)

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

  • 得出 height 字段右 9 行
mysql> select count(height) from a;
+---------------+
| count(height) |
+---------------+
|             9 |
+---------------+
1 row in set (0.00 sec)

min() 返回指定列的最小值

  • 得出 height 字段最小值为 150
mysql> select min(height) from a;
+-------------+
| min(height) |
+-------------+
|         150 |
+-------------+
1 row in set (0.00 sec)

max() 返回指定列的最大值

  • 得出 height 字段最大值为 190
mysql> select max(height) from a;
+-------------+
| max(height) |
+-------------+
|         190 |
+-------------+
1 row in set (0.00 sec)

sum() 返回指定列的所有值之和

  • 得出 height 字段总和为 1568
mysql> select sum(height) from a;
+-------------+
| sum(height) |
+-------------+
|        1568 |
+-------------+
1 row in set (0.00 sec)
(3)常用的字符串函数
  • length(x)返回字符串x的长度
  • trim()返回去除指定格式的值
  • concat(x,y)将提供的参数x和y拼接成一个字符串
  • upper(x)将字符串x的所有字母变成大写字母
  • lower(x)将字符串x的所有字母变成小写字母
  • left(x,y)返回字符串x的前y个字符
  • right(x,y)返回字符串x的后y个字符
  • repeat(x,y)将字符串x重复y次
  • space(x)返回x个空格
  • replace(x,y,z)将字符串z替代字符串x中的字符串
  • strcmp(x,y)比较x和y,返回的值可以为-1,0,1
  • substring(x,y,z)获取从字符串x中的第y个位置开始长度为z的字符串
  • reverse(x)将字符串x反转

示例

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

  • 一共有 5 个字段
mysql> select length('12345');
+-----------------+
| length('12345') |
+-----------------+
|               5 |
+-----------------+
1 row in set (0.01 sec)

trim()返回去除指定格式的值

  • 去除了结果的前面的空格
mysql> select trim('12345');
+---------------+
| trim('12345') |
+---------------+
| 12345         |
+---------------+
1 row in set (0.00 sec)

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

  • 拼接成 123456
mysql> select concat('123','456');
+---------------------+
| concat('123','456') |
+---------------------+
| 123456              |
+---------------------+
1 row in set (0.00 sec)

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

  • 大写字母为 H
mysql> select upper('h');
+------------+
| upper('h') |
+------------+
| H          |
+------------+
1 row in set (0.00 sec)

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

  • 小写字母为 h
mysql> select lower('H');
+------------+
| lower('H') |
+------------+
| h          |
+------------+
1 row in set (0.00 sec)

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

  • 字符串前 3 位为 abc
mysql> select left('abcdefg',3);
+-------------------+
| left('abcdefg',3) |
+-------------------+
| abc               |
+-------------------+
1 row in set (0.00 sec)

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

  • 字符串后 3 位为 efg
mysql> select right('abcdefg',3);
+--------------------+
| right('abcdefg',3) |
+--------------------+
| efg                |
+--------------------+
1 row in set (0.00 sec)

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

  • 字符串重复 3 次
mysql> select repeat('abcdefg',3);
+-----------------------+
| repeat('abcdefg',3)   |
+-----------------------+
| abcdefgabcdefgabcdefg |
+-----------------------+
1 row in set (0.00 sec)

space(x)返回x个空格

  • 长度不一样
mysql> select space(5);
+----------+
| space(5) |
+----------+
|          |
+----------+
1 row in set (0.00 sec)

mysql> select space(35);
+-------------------------------------+
| space(35)                           |
+-------------------------------------+
|                                     |
+-------------------------------------+
1 row in set (0.00 sec)

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

  • 将字符串中的 1 替换 6
mysql> select replace('123456','1','6');
+---------------------------+
| replace('123456','1','6') |
+---------------------------+
| 623456                    |
+---------------------------+
1 row in set (0.00 sec)

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

  • 返回值不同
mysql> select strcmp(2,3);
+-------------+
| strcmp(2,3) |
+-------------+
|          -1 |
+-------------+
1 row in set (0.00 sec)

mysql> select strcmp(2,2);
+-------------+
| strcmp(2,2) |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)

mysql> select strcmp(3,2);
+-------------+
| strcmp(3,2) |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

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

  • 字符串第 3 个开始的后 6 位数为 345678
mysql> select substring('123456789',3,6);
+----------------------------+
| substring('123456789',3,6) |
+----------------------------+
| 345678                     |
+----------------------------+
1 row in set (0.00 sec)

reverse(x)将字符串x反转

  • 将字符串倒过来
mysql> select reverse('123456789');
+----------------------+
| reverse('123456789') |
+----------------------+
| 987654321            |
+----------------------+
1 row in set (0.00 sec)
(4) 常用的日期时间函数
  • curdate()返回当前时间的年月日
  • curtime()返回当前时间的时分秒
  • now()返回当前时间的日期和时间
  • month(x)返回日期x中的月份值
  • week(x)返回日期x是年度第几个星期
  • hour(x)返回x中的小时值
  • minute(x)返回x中的分钟值
  • second(x)返回x中的秒钟值
  • dayofweek(x)返回x是星期几,1星期曰,2星期—
  • dayofmonth(x)计算曰期x是本月的第几天
  • dayofyear(x)计算日期x是本年的第几天

示例

curdate()返回当前时间的年月日

  • 当前日期
mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2020-12-27 |
+------------+
1 row in set (0.00 sec)

curtime()返回当前时间的时分秒

  • 当前时间
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 14:37:51  |
+-----------+
1 row in set (0.00 sec)

now()返回当前时间的日期和时间

  • 当前日期和时间
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2020-12-27 14:38:27 |
+---------------------+
1 row in set (0.00 sec)

month(x)返回日期x中的月份值

  • 返回月份
mysql> select month('2020-12-27');
+---------------------+
| month('2020-12-27') |
+---------------------+
|                  12 |
+---------------------+
1 row in set (0.00 sec)

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

  • 为第 52 个星期
mysql> select week('2020-12-27');
+--------------------+
| week('2020-12-27') |
+--------------------+
|                 52 |
+--------------------+
1 row in set (0.00 sec)

hour(x)返回x中的小时值

  • 获取小时
mysql> select hour('6:30:55');
+-----------------+
| hour('6:30:55') |
+-----------------+
|               6 |
+-----------------+
1 row in set (0.00 sec)

minute(x)返回x中的分钟值

  • 获取分钟
mysql> select minute('6:30:55');
+-------------------+
| minute('6:30:55') |
+-------------------+
|                30 |
+-------------------+
1 row in set (0.00 sec)

second(x)返回x中的秒钟值

  • 获取秒
mysql> select second('6:30:55');
+-------------------+
| second('6:30:55') |
+-------------------+
|                55 |
+-------------------+
1 row in set (0.00 sec)

dayofweek(x)返回x是星期几,1星期曰,2星期—

  • 礼拜天为 1
mysql> select dayofweek('2020-12-30');
+-------------------------+
| dayofweek('2020-12-30') |
+-------------------------+
|                       4 |
+-------------------------+
1 row in set (0.00 sec)

dayofmonth(x)计算曰期x是本月的第几天

  • 30 为本月的第 30 天
mysql> select dayofmonth('2020-12-30');
+--------------------------+
| dayofmonth('2020-12-30') |
+--------------------------+
|                       30 |
+--------------------------+
1 row in set (0.00 sec)

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

  • 日期为今年的第 362 天
mysql> select dayofyear('2020-12-30');
+-------------------------+
| dayofyear('2020-12-30') |
+-------------------------+
|                     365 |
+-------------------------+
1 row in set (0.00 sec)

二:存储过程

(1)简介

1:是一组为了完成特定功能的SQL语句集合

2:比传统SQL速度更快、执行效率更高

3:存储过程的优点

  • 执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
  • SQL语句加上控制语句的集合,灵活性高
  • 在服务器端存储,客户端调用时,降低网络负载
  • 可多次重复被调用,将多条 SQL 封装到了一起,针对 SQL 可随时修改,不影响客户端调用
  • 可完成所有的数据库操作,也可控制数据厍的信息访问权限

4:使用CREATE PROCEDURE语句创建存储过程

5:创建存储过程的语法结构

CREATE PROCEDURE <过程名>([过程参数[....]])<过程体>
[过程参数[,...]]格式
[ IN | OUT | INOUT ]<参数名><类型>

6:参数分为

  • 输入参数:IN
  • 输出参数:OUT
  • 输入/输出参数:INOUT
(2)创建存储过程

1:存储过程的主体部分,被称为过程体

2:以BEGIN开始,以END结束,若只有一条SQL语句,则可以省略BEGIN-END

3:以DELIMITER 开始和结束

mysql> DELIMITER $$      //$$是用户自定义的结束符
//省略存储过程其他步骤
mysql> DELIMITER ;/分号前有空格

4:不带参数的存储过程

mysql> use xinxi $$
mysql> delimiter $$              # 结束符号定义为$$
mysql> create procedure cc()     #创建存储过程为 aa
    -> begin
    -> create table xinxi.tt(name varchar(64),height int(3));
    -> insert into xinxi.tt values('lisi',170),('wangwu',180);
    -> select * from xinxi.tt;              
    -> end $$                                                                  
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call cc();
+--------+--------+
| name   | height |
+--------+--------+
| lisi   |    170 |
| wangwu |    180 |
+--------+--------+
2 rows in set (0.01 sec)

5:带参数的存储过程

mysql> use xinxi $$
Database changed
mysql> delimiter $$
mysql> create procedure cc1(IN a varchar(64))  #参数类型为 IN 类型,参数名称为 a
    -> begin
    -> select * from tt where name=a;
    -> end $$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call cc1('lisi');
+------+--------+
| name | height |
+------+--------+
| lisi |    170 |
+------+--------+
1 row in set (0.00 sec)
(3)修改存储过程

1:存储过程的修改分为特征修改和内容修改

2:特征修改的方法

ALTER PROCEDURE<过程名>[<特征>...]

3:内容修改可先删除原有存储过程,之后再创建的方法

(4)删除存储过程

1:删除存储过程的语法

DROP{ PROCEDURE|FUNCTION }[ IF EXISTS]<过程名>

2:删除的具体用法

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

mysql> call cc;
ERROR 1305 (42000): PROCEDURE xinxi.cc does not exist
mysql> call cc();
ERROR 1305 (42000): PROCEDURE xinxi.cc does not exist

存储过程 in、out、inout 参数示例与总结

mysql> set @num1=1,@num2=2,@num3=3;
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter $$
mysql> create procedure z(in num1 int,out num2 int,inout num3 int)
    -> begin
    -> select num1,num2,num3;
    -> set num1=100,num2=200,num3=300;
    -> select num1,num2,num3;
    -> end $$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call z(@num1,@num2,@num3);
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
|    1 | NULL |    3 |
+------+------+------+
1 row in set (0.00 sec)

+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
|  100 |  200 |  300 |
+------+------+------+
1 row in set (0.00 sec)

总结1:in 和 inout 参数会将全局变量的值传入存储过程中,而 out 参数不会将全局变量的值传入存储过程中。在存储过程使用中,参数值 in out inout 都会发生改变。

mysql> select @num1,@num2,@num3;                               
+-------+-------+-------+
| @num1 | @num2 | @num3 |
+-------+-------+-------+
|     1 |   200 |   300 |
+-------+-------+-------+
1 row in set (0.00 sec)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值