MYSQL sql 高阶语句 (sequel)

sql 高阶语句

一、空值(NULL) 和 无值(’’) 的区别

· 无值的长度为 0,不占用空间的;而 NULL 值的长度是 NULL,是占用空间的。
· S NULL 或者 IS NOT NULL,是用来判断字段是不是为 NULL 或者不是 NULL,不能查出是不是无值的
. 无值的判断使用=’‘或者<>’'来处理。<> 代表不等于。
. 在通过 count()指定字段统计有多少行数时,如果遇到 NULL 值会自动忽略掉,遇到无值会加入到记录中进行计算。

在这里插入图片描述

二、MySQL之正则表达式

匹配模式			描述									    实例
^ 				匹配文本的开始字符 						‘^bd’ 匹配以 bd 开头的字符串
$ 				匹配文本的结束字符 						‘qn$’ 匹配以 qn 结尾的字符串
. 				匹配任何单个字符							‘s.t’ 匹配任何 s 和 t 之间有一个字符的字符串
* 				匹配零个或多个在它前面的字符 				‘fo*t’ 匹配 t 前面有任意个 o
+ 				匹配前面的字符 1 次或多次					‘hom+’ 匹配以 ho 开头,后面至少一个m 的字符串
字符串 			匹配包含指定的字符串 						‘clo’ 匹配含有 clo 的字符串
p1|p2 			匹配 p1 或 p2 							‘bg|fg’ 匹配 bg 或者 fg
[...] 			匹配字符集合中的任意一个字符 				‘[abc]’ 匹配 a 或者 b 或者 c
[^...] 			匹配不在括号中的任何字符 					‘[^ab]’ 匹配不包含 a 或者 b 的字符串
{n} 			匹配前面的字符串 n 次 					    ‘g{2}’ 匹配含有 2 个 g 的字符串
{n,m}			匹配前面的字符串至少 n 次,至多m 次		    ‘f{1,3}’ 匹配 f 最少 1 次,最多 3 次

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

三、运算符

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

运算符     描述
 +        加法
 -        减法
 *        乘法
 /        除法
 %        取余

在这里插入图片描述

四、比较运算符

字符串的比较默认不区分大小写,可以使用binary来区分,常用比较运算符(比较对象:数字,字符)

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

等于(=)
等号(=)用来判断数字、字符串和表达式是否相等的,如果相等则返回1,如果不相等则返回0。
如果比较的两者有一个值是NULL,则比较的结果就是NULL。
PS:其中字符的比较是根据AscII码来判断的,如果ASCcIT码相等,则表示两个字符相同;如果AsCcIT码不相等,则表示两个字符不相同。例如字符串(字母)比较:(‘a’ > ‘b’)其实比较的是底层ascii码
需要关注的ascii码有: a、A、0

示例:
select 2=4,2='2', 'e'='e',(2+2)=(3+1),' 4'=null;

在这里插入图片描述
不等于(!=或<>)
用于针对数字、字符串和表达式不相等的比较,如果不相等则返回1,如果相等则返回0,与等于(=)的返回值相反,同时不等于(!=,<>)无法用于判断是否为null

示例:
SELECT 'kgc'<>'bdqn',1<>2,3!=3,2.5!=2,NULL<>NULL;

在这里插入图片描述
大于、大于等于、小于、小于等于运算符
大于(>)运算符用来判断左侧的操作数是否大于右侧的操作数,若大于返回1,否则返回0,同样不能用于判断NULL。
小于(<〉运算符用来判断左侧的操作数是否小于右侧的操作数,若小于返回 1,否则返回0,同样不能用于判断NULL。
大于等于(>=)判断左侧的操作数是否大于等于右侧的操作数,若大于等于返回1,否则返回0,不能用于判断 NULL。
小于等于(<=)判断左侧的操作数是否小于等于右侧的操作数,若小于等于返回1,否则返回0,不能用于判断NULL。

示例:
select 5>4,'a'>'b',2>=3,(2+3)>=(1+2),4.4<3,1<2,'x'<='y',5<=5.5, 'u'>=NULL;

在这里插入图片描述
判断一个值为/不为null( IS NULL、IS NOT NULL)
IS NULL判断一个值是否为 NULL,如果为NULL返回1,否则返回0。
IS NOT NULL 判断一个值是否不为 NULL,如果不为NULL返回1,否则返回0。

示例:
select 2 IS NULL,'f' IS NOT NULL,NULL IS NULL;

在这里插入图片描述
两者之间(BETWEEN … AND …)BETWEENAND
比较运算通常用于判断一个值是否落在某两个值之间。
例如,判断某数字是否在另外两个数字之间,也可以判断某英文字母是否在另外两个字母之间,具体操作,条件符合返回1,否则返回0。

示例:
select 4 BETWEEN 2 AND 6,5 BETWEEN 6 AND 8, 'c'BETWEEN 'a'AND 'f';提问:
select 2 between 2 and 6;返回是否为1?

在这里插入图片描述
在/不在集合中(in , not in)
IN判断一个值是否在对应的列表中,如果是返回1,否则返回0
NOT IN判断一个值是否不在对应的列表中,如果不在则返回1,否则返回0

示例:
例如,判断某数字是否在一组数字中,也可判断某字符是否在一组字符中,具体操作如下
SELECT 2 in (1,2,3,4,5),'c' not in ('a','b','C');

在这里插入图片描述
通配符匹配
LIKE用来匹配字符串,如果匹配成功则返回1,反之返回 0。LIKE支持两种通配符:
'%’用于匹配任意数目的字符,
而“_”只能匹配一个字符。
NOT LIKE 正好跟LIKE相反,如果没有匹配成功则返回1,反之返回0。如:
若要判断某字符串能否匹配成功,分单字符匹配和多字符匹配,也可以判断不匹配

具体操作如下所示
SELECT 'bdqn' LIKE 'bdq_',' kgc' LIKE '%c','etc' NOT LIKE '%th';

在这里插入图片描述

五、逻辑运算符

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

NOT 或 !     逻辑非
AND 或 &&    逻辑与
OR           逻辑或
XOR          逻辑异或

逻辑非( NOT 或 !)
逻辑非将跟在他后面的值取反,如果 NOT后面的操作数为0时,所得值为1;如果操作数为非0时,所得值为0;如果操作数为NULL时,所得值为NULL
小结:返回值为0、1、null值(根据匹配条件判断为何值)

SELECT not 2,!3,not 0,!(4-4);
优先级问题:
mysql>SELECT !1+1,NOT 1 + 1;
为什么!1+1 =1 而not 1+1 =0

在这里插入图片描述
在这里插入图片描述
逻辑与( AND或&& )
AND 和& &都是逻辑与运算符,具体语法规则为:
当所有操作数都为非零值并且不为 NULL时,返回值为 1;当一个或多个操作数为0 时,返回值为0;
操作数中有任何一个为NULL时,返回值为NULL。

SELECT 2 AND 3,4 && 0,0 && NULL,1 AND NULL;

由结果可以看到:
AND 和 & &的作用相同。
1 AND -1中没有0或者NULL,所以返回值为1;
1 AND 0 中有操作数0,所以返回值为0;
1 AND NULL因为有NULL,所以返回值为NULL
null AND 0返回值为0

在这里插入图片描述
逻辑或( OR )
OR 是逻辑或运算符,具体语法规则为:
当两个操作数都为非 NULL值时,如果有任意一个操作数为非零值,则返回值为1,否则结果为0;
当有一个操作数为NULL时,如果另一个操作数为非零值,则返回值为 1,否则结果为NOLL;
假如两个操作数均为NULL时,则返回值为NULL。
使用或运算符OR进行逻辑判断,运行结果如下:示例:

SELECT 2 OR 3,-1 OR 0,5 OR NULL,0 OR NULL,0 OR 0;

小结:
1 OR -1 OR 0含有0,但同时包含有非0的值 -1,所以返回结果为1;
1 OR 2中没有操作数0,所以返回结果为1;
1 OR NULL虽然有NULL,但是有操作数1,所以返回结果为1;
0 OR NULL中没有非0值,并且有NULL,所以返回值为NULL;
NULL OR NULL中只有NULL,所以返回值为NULL。

在这里插入图片描述
逻辑异或
XOR表示逻辑异或,具体语法规则为:
当任意一个操作数为NULL时,返回值为NULL;
对于非 NULL的操作数,如果两个操作数都是非0值或者都是0值,则返回值为1;
如果一个为0值,另一个为非0值,返回值为1

使用异或运算符xOR进行逻辑判断,SQL语句如下:
select 2 xor 3,0 xor 1,1 xor 0,1 xor null, null xor 3;

在这里插入图片描述

六、位运算符

 位运算符是在二进制数上进行计算的运算符。
位运算会先将操作数变成二进制数,进行位运算。
然后再将计算结果从二进制数变回十进制数。

&                按位与
|                按位或
^                按位异或
!                取反
<<               左移
>>               右移

0转换为二进制数是1010,15转换为二进制数是1111

**按位与运算(&),**是对应的二进制位都是1的,它们的运算结果为1,否则为0,所以10 & 15的结果为10。
select 10 & 15;

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

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

按位取反(~),是对应的二进制数逐位反转,即1取反后变为0,0取反后变为1。数字 1的二进制是0001,取反后变为1110,数字5的二进制是0101,将1110 和 0101进行求与操作,其结果是二进制的0100,转换为十进制就是4
select 5 &~1;
在这里插入图片描述

七、连接查询(ms)

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

实验准备,创建两张表
CREATE TABLE test1 (
a_id int(11) DEFAULT NULL,
a_name varchar(32) DEFAULT NULL,
a_level int(11) DEFAULT NULL);
)

CREATE TABLE test2 (
b_id int(11) DEFAULT NULL,
b_name varchar(32) DEFAULT NULL,
b_level int(11) DEFAULT NULL);
)

insert into test1(a_id, a_name, a_level) values(1, 'aaaa', 10); 
insert into test1(a_id, a_name, a_level) values(2, 'bbbb', 20); 
insert into test1(a_id, a_name, a_level) values(3, 'cccc', 30); 
insert into test1(a_id, a_name, a_level) values(4, 'dddd', 40);

insert into test2(b_id, b_name, b_level) values(2, 'bbbb', 20); 
insert into test2(b_id, b_name, b_level) values(3, 'cccc', 30); 
insert into test2(b_id, b_name, b_level) values(5, 'eeee', 50); 
insert into test2(b_id, b_name, b_level) values(6, 'ffff', 60);

在这里插入图片描述

内连接

MySQL中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM子句中使用关键字INNER JOIN来连接多张表,并使用ON子句设置连接条件,内连接是系统默认的表连接,所以在 FROM子句后可以省略INNER关键字,只使用关键字JOIN。同时有多个表时,也可以连续使用INNER JOIN来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表
语法:
SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
示例:
select a.a_id,a.a_name,a.a_level from test1 a inner join test2 b on a.a_id = b.b_id;

在这里插入图片描述

左连接

左连接也可以被称为左外连接,在 FROM子句中使用LEFT JOIN或者 LEFT OUTER JOIN关键字来表示。
左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,
也就是说匹配左表中的所有行以及右表中符合条件的行。
示例:
select * from test1 a left join test2 b on a.a_name=b.b_name;

在这里插入图片描述

右连接

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

select * from test1 a right join test2 b on a.a_name=b.b_name;

在这里插入图片描述

八、数据库函数

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(x1,x2…)  返回集合中最大的值
least(x1,x2…)	  返回集合中最小的值

在这里插入图片描述

九、聚合函数

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

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

十、字符串函数

trim()	返回去除指定格式的值
concat(x,y)	将提供的参数 x 和 y 拼接成一个字符串
substr(x,y)	获取从字符串 x 中的第 y 个位置开始的字符串,跟substring()函数作用相同
substr(x,y,z)	获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
length(x)	返回字符串 x 的长度
replace(x,y,z)	将字符串 z 替代字符串 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 个空格
strcmp(x,y)	比较 x 和 y,返回的值可以为-1,0,1
reverse(x)	将字符串 x 反转

补充:如sql_mode开启开启了PIPES_AS_CONCAT,"||"视为字符串的连接操作符而非或运算符,和字符串的拼接函数Concat相类似,这和Oracle数据库使用方法一样的
在这里插入图片描述

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

十一、日期时间函数

字符串函数         描述
curdate ()       返回当前时间的年月日
curtime ()       返回当前时间的时分秒
now ()           返回当前时间的日期和时间
month (x)        返回日期x中的月份值
week (x)         返回日期x是年度第几个星期
hour(x)          返回x中的小时值
minute(x)        返回x中的分钟值
second(x)        返回x中的秒钟值
dayofweek(x)     返回x是星期几,1 星期日,2星期一
replace(x,y,z)   将字符串 z替代字符串x中的字符串y
dayofmonth(x)    计算日期x是本月的第几天
dayofyear (x)    计算日期x是本年的第几天

select curdate(); 返回当前年月日如2021-04-20
select curtime(); 返回当前时间
select now();
select month('2021-4-20'); 返回第几月
select hour(curtime());  返回当前的小时
select minute(curtime());  返回当前时间分钟
select second(curtime());  返回当前时间的秒
select dayofweek(curtime());  当前是星期几
select dayofyear(curtime());  当前是今年的第多少天

十二、存储过程

1.概述

前面学习的 MySQL 相关知识都是针对一个表或几个表的单条SQL 语句,使用这样的SQL语句虽然可以完成用户的需求,但在实际的数据库应用中,有些数据库操作可能会非常复杂,可能会需要多条SQL语句一起去处理才能够完成,这时候就可以使用存储过程,轻松而高效的去完成这个需求,有点类似shell脚本里的函数

2.简介

MySQL数据库存储过程是一组为了完成特定功能的SQL语句的集合。存储过程这个功能是从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。存储过程在使用过程中是将常用或者复杂的工作预先使用sQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。操作数据库的传统SQL语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高。存储过程在数据库中创建并保存,它不仅仅是SQL语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。

3.优点

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

4.创建存储过程

使用CREATE PROCEDURE语句创建存储过程(与Shell函数差不多,代码的复用)

格式:
DELIMITER $$							#将语句的结束符号从分号;临时改为两个$$(可以是自定义)
CREATE PROCEDURE xxx()					#创建存储过程,过程名为xxx,不带参数
 BEGIN                                  #过程体以关键字 BEGIN 开始
   sql语句;                             #过程体语句
 END $$								    #过程体以关键字 END 结束
DELIMITER ;                             #将语句的结束符号恢复为分号

例:
delimiter $$                          #定义结束符
create procedure cc()           #创建存储过程(过程名)
  begin                        #开启存储过程
  create table yy (id int(10),name char(10),score int(10));
  insert into yy values (1,'zhang',20);
  select * from yy;            #过程体
  end $$                       #结束存储过程
delimiter ;                    #将结束符还原

PS:
存储过程的主体部分,被称为过程体
以BEGIN开始,以END结束,若只有一条sQL语句,则可以省略BEGIN-END
以DELIMITER开始和结束
mysql> DELIMITER $$            $$是用户自定义的结束符
省略存储过程其他步骤
mysql> DELIMITER ;             分号前有空格

在这里插入图片描述

5.调用存储过程

call cc

在这里插入图片描述

1.带参数的存储过程

IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
例:
delimiter $$    								
create procedure tt(in inname varchar(16))  	
 	begin   		    						
 	select * from test1 where a_name='aaaa';  	
 	end $$    									
delimiter ; 			    					
call tt('aaaa')

在这里插入图片描述

2.查看存储过程

show procedure status;
show create procedure 存储过程名称;

在这里插入图片描述

3.修改存储过程

ALTER PROCEDURE <过程名> [<特征>... ]
ALTER PROCEDURE tt MODIFIES SQL DATA SQL SECURITY INVOKE;
MODIFIES SQL DATA:表明子程序包含写数据的语句
SECURITY:安全等级
invoker:当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。

删除存储过程

DROP PROCEDURE IF EXISTS 过程名;   #所以可以使用if exists确定存在后删除,不存在则不执行删除。
例:
drop procedure if exists cc;

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值