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;

MYSQL sql 高阶语句 (sequel)相关推荐

  1. (六)MySQL数据库高阶语句之正则表达式、运算符、连接表达式JOIN

    文章目录 一.正则表达式 二.运算符 1.算术运算符 2.比较运算符 3.逻辑运算符(布尔值) 4.位运算符 5.优先级 三.连接查询 1.内连接 2.左连接 3.右连接 一.正则表达式 MySQL ...

  2. MySQL——高阶语句、存储过程(下)

    MySQL--高阶语句(下) 一.数据库函数 1.数学函数 2.聚合函数 3.字符串函数 4.日期时间函数 二.存储过程 1.概述 2.简介 3.优点 4.创建存储过程 调用存储过程 带参数的存储过程 ...

  3. MySQL——高阶语句(中)

    MySQL--高阶语句(中) 一.正则表达式 二.运算符 三.比较运算符 四.逻辑运算符 五.位运算符 六.连接查询 1.内连接 2.左连接 3.右连接 一.正则表达式 MySQL 正则表达式通常是在 ...

  4. MySQL——高阶语句(上)

    MySQL高阶语句(上) 一.MySQL高级语句 1.ORDER BY----按关键字排序 单字段排序 多字段排序 2.OR/AND----或/且 3.DISTINCT----查询不重复记录 4.GR ...

  5. Mysql数据库(九)——mysql高阶语句(下)

    Mysql数据库(九)--mysql高阶语句(下) 一.函数 1.数学函数 2.聚合函数 3.字符串函数 4.日期时间函数 二.存储过程 1.简介 2.优点 3.语法 ①.例 ②.参数分类 ③.带参数 ...

  6. Mysql数据库(七)——mysql高阶语句(上)

    Mysql数据库(七)--mysql高阶语句(上) 一.按关键字排序 1.单字段排序 2.多字段排序 二.或/且的运用 三.查询不重复记录 四.对结果进行分组 五.限制结果条目 六.设置别名 使用场景 ...

  7. Mysql数据库(八)——mysql高阶语句(中)

    Mysql数据库(八)--mysql高阶语句(中) 一.正则表达式(同shell脚本的正则表达式) 1.以"."代替任意一个字符 2.匹配前面字符多次 3.匹配前面字符至少一次 4 ...

  8. mysql高阶语句一

    高阶语句一 1.按关键字排序 (1)按一个字段排序: (2)多字段排序 2.区间判断及查询不重复记录 2.1 AND/OR --且/或 2.2.对结果进行分组统计 3.限制结果条目 4.设置别名(al ...

  9. Hive建表高阶语句、Hive视图

    Hive建表高阶语句.Hive视图 Hive建表高阶语句 - CTAS and WITH 创建临时表 Hive视图(Views) 视图概述 应用场景 Hive视图操作 Hive侧视图(Lateral ...

最新文章

  1. golang枚举类型 - iota用法拾遗
  2. 四川音乐学录音艺术与计算机音乐,艺考中作曲专业和录音专业有什么不同呢?...
  3. 最佳学习方法(3)听课--听一反三
  4. Python学习教程:Python爬虫抓取技术的门道
  5. Python: tkinter实例改名小工具
  6. linux下vi的一些简单的操作
  7. CodeForce 2A —— Winner
  8. CentOS 7 使用 ACL 设置文件权限
  9. Apollo自动驾驶入门课程第②讲 — 高精地图
  10. android 水平进度条 自定义颜色,android 水平进度条的颜色设置
  11. caffe与tensorflow框架下卷积的维度计算与一致性证明
  12. Javascript IE 内存释放
  13. 此上下文中不允许函数定义。_DAX函数---ALL家族
  14. oracle改成归档模式_将Oracle数据库改为归档模式并启用Rman备份
  15. 如果出现这些,你就必须跳槽了
  16. oracle processes 的大小,Oracle中sessions和processes的大小关系(10g和11g不同)
  17. Unix操作系统发展历史
  18. 收藏!这10部关于数学的顶级纪录片,告诉孩子数学跟枯燥不沾边!
  19. PHP安装教程及相关说明
  20. 【爬虫】花瓣图片爬虫,Python图片采集下载源码

热门文章

  1. 好用的GIF捕捉器——LICEcap
  2. 微信小程序城市选择--iview weapp组件
  3. 职场人必备:工作述职报告PPT模板
  4. android 实现圆形头像
  5. java+英尺英寸,[Java教程]【JavaScript】7-1 厘米换算英尺英寸 (15分)
  6. 【魅力开源】第7集:开源ERP系统Odoo发展史(Odoo中文社区野史2019版)
  7. 获取日期(昨天、今天、本周第一天和最后一天、本月第一天和最后一天、本年第一天和最后一天)
  8. AppLocale 乱码解决方案
  9. 如何加声调口诀_一年级-拼音声调标注口诀
  10. 数据分析项目-FIFA-2018 player