MySQL高阶语句二

Posted 水木,年華

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL高阶语句二相关的知识,希望对你有一定的参考价值。

一.MySQL视图

1.1视图的概念

数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射
视图可以理解为镜花水月/倒影,动态保存结果集(数据)

1.2作用场景

针对不同的人(权限身份),提供不同结果集的“表”(以表格的形式展示)

1.3作用范围

select * from info;			#展示的部分是info表
select * from view_name;	#展示的一张或多张表

1.4功能

简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性
本质而言视图是一种select(结果集的呈现)
查询方便:视图不保存真实数据,视图本质类似select,同时可以多表查询更为迅速
安全性:视图无法显示完整的约束

PS:视图适合于多表连接浏览时使用!不适合增、删、改
而存储过程适合于使用较频繁的SQL语句,这样可以提高执行效率!

视图和表的区别和联系
区别
①、视图是已经编译好的sql语句。而表不是

②、视图没有实际的物理记录。而表有。

show table status\\G

③、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改

④、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。

⑤、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。

⑥、视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的)

联系
视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。

示例:
需求:满足80分的学生展示在视图中
PS:这个结果会动态变化,同时可以给不同的人群(例如权限范围)展示不同的视图

创建视图(单表)

create view v_score as select * from info where score >=80;

#查看表状态

show table status\\G

在这里插入图片描述

#查看视图

select * from v_score;

在这里插入图片描述
#查看视图与源表结构

desc v_score;

在这里插入图片描述
#多表创建视图
创建test01表

create table test01 (id int,name varchar(10),age char(10));
insert into test01 values(1,'zhangsan',20);
insert into test01 values(2,'lisi',30);
insert into test01 values(3,'wangwu',29);

在这里插入图片描述
需求:需要创建一个视图,需要输出id、学生姓名、分数以及年龄

create view v_info(id,name,score,age) as select info.id,info.name,info.score,test2.age from info,test2 

在这里插入图片描述

在这里插入图片描述

#修改原表数据

update info set score='60' where name='liuyi';

在这里插入图片描述
#可以通过视图修改原表

update v_score set score='120' where name='tianqi';

在这里插入图片描述
6、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会忽略,空值会加入计算

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

#验证:

alter table info add column addr varchar(50);

在这里插入图片描述

update info set addr='sh' where score >=70;

在这里插入图片描述
#统计数量:检测null是否会加入统计中

 update info set addr='' where name='tianqi';

在这里插入图片描述
#统计数量,检测空值是不会被添加到统计中

select count(addr) from info;

在这里插入图片描述
#查询null值

select * from info where addr is NULL;

在这里插入图片描述
#查询不为空的值

select * from info where addr is not null;

在这里插入图片描述

二.MySQL正则表达式

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

匹配 描述

^		                   匹配文本的开始字符
$		                   匹配文本的结束字符
.		                   匹配任何单个字符
*		                   匹配零个或多个在它前面的字符
%		                   匹配所有
+		                   匹配前面的字符 1 次或多次
?
字符串	                   匹配包含指定的字符串
p1|p2	                   匹配 p1  p2
[]		                   匹配字符集合中的任意一个字符
[^…]	                   匹配不在括号中的任何字符
{n}		                   匹配前面的字符串 n 
{n,m}	                   匹配前面的字符串至少 n 次,至多 m 

查询以sh开头的学生信息

select id,name from info where name regexp '^sh';

查询以n结尾的学生信息

select id,name from info where name regexp 'n$';

查询名字中包含an的学生信息

select id,name from info where name regexp 'an';

查询名字是tangy开头,n结尾,中间不知道是一个什么字符的学生信息

select id,name from info where name regexp 'tangy.n';

查询名字中包含an或者zh的学生信息

select id,name from info where name regexp 'an|zh';

查询名字中有an,g可有可无的学生信息
必须要有的部分是’an’ 而’g’可有可无

select id,name from info where name regexp 'ang*';

在这里插入图片描述

查询名字中含有an,g至少出现一次的学生信息

select id,name from info where name regexp 'li+';

在这里插入图片描述
查询名字以s-x开头的学生信息

select id,name from info where name regexp '^[s-x]';

查询名字不是caicai的学生信息

select id,name from info where name regexp '[^caicai]';

查询学生名字不以czx各字母开头的学生信息

select id,name from info where name regexp '^[^czx]';

三.运算符

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

3.1算术运算符

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

运算符 描述

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

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

3.2比较运算符

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

运算符 描述

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

3.3逻辑运算符(布尔值)

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

运算符			描述
not  !		逻辑非
and  &&		逻辑与
or 				逻辑或
xor				逻辑异或

3.4位运算符

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

位运算符	描述
&			按位与
|			按位或
~			按位取反
^			按位异或
<<			按位左移
>>			按位右移

四.连接查询

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

4.1内连接

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

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

4.2左连接

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

4.3右连接

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

以上是关于MySQL高阶语句二的主要内容,如果未能解决你的问题,请参考以下文章

MySQL高阶语句二

MySQL高阶语句

mysql高阶语句

mysql高阶语句一

Mysql高阶sql语句

MySQL高阶语句