文章目录

  • 视图
    • 什么是视图
    • 视图的作用
  • NULL 值
    • null值与空值(' ')的区别(空气与真空)
  • 正则表达式
  • 运算符
    • 算术运算符
    • 比较运算符
      • 等号(=)
      • 不等于(<>,!=)
      • between and
      • Between and 覆盖的范围是>= 和 <=关系
  • 逻辑运算符(布尔值)
    • 逻辑非
    • 逻辑与(and)
    • 逻辑或(or)
    • 逻辑异或(xor)
    • 位运算符
  • 总结

视图

什么是视图

视图是从一个或多个表中导出来的表,是一种虚拟存在的表。

视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。

这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据。

数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。

使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。

视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。

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

视图的作用

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

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

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

  • 总结:使用视图的大部分情况是为了保障数据安全性,提高查询效率
mysql> select * from shitu;   #查看表结构
+------+----------+-------+
| id   | name     | score |
+------+----------+-------+
|    1 | zhangsan | 80    |
|    2 | zhaosi   | 80    |
|    3 | liuliu   | 60    |
|    4 | xixi     | 65    |
+------+----------+-------+
4 rows in set (0.00 sec)mysql> create view v_score as select * from shitu where score>=80;    #创建一个视图,定义分数为大于等于80
Query OK, 0 rows affected (0.00 sec)mysql> show table status\G   #竖向展示表状态
mysql> select * from v_score;   #查看视图
+------+----------+-------+
| id   | name     | score |
+------+----------+-------+
|    1 | zhangsan | 80    |
|    2 | zhaosi   | 80    |
+------+----------+-------+
2 rows in set (0.00 sec)
mysql> update shitu set score='70' where name='zhaosi';  #修改原表视图数据
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from v_score;   #查看视图表结构发现zhaosi没有了,因为定义
+------+----------+-------+
| id   | name     | score |
+------+----------+-------+
|    1 | zhangsan | 80    |
+------+----------+-------+
1 row in set (0.00 sec)

NULL 值

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

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

null值与空值(’ ')的区别(空气与真空)

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

mysql> desc shitu;   #降序查看
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(10)     | YES  |     | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
| score | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)mysql> alter table shitu add column addr varchar(20);   #插入一条记录,分数字段输入null,显示出来就是null
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> update shitu set addr='nn' where score >=70; #将表中大于等于70的改成nn
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0mysql> select count(addr) from shitu;   #统计数量:检测null是否会加入统计中
+-------------+
| count(addr) |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)mysql> select * from shitu;   #查看设置的结构,大于等于70的都变成了nn
+------+----------+-------+------+
| id   | name     | score | addr |
+------+----------+-------+------+
|    1 | zhangsan | 80    | nn   |
|    2 | zhaosi   | 70    | nn   |
|    3 | liuliu   | 60    | NULL |
|    4 | xixi     | 65    | NULL |
+------+----------+-------+------+
4 rows in set (0.00 sec)mysql> update shitu set addr='' where name='zhaosi'; #将info表中其中一条数据修改为空值''
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select count(addr) from shitu;   #统计数量
+-------------+
| count(addr) |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)mysql> select * from shitu;  #统计数量,检测空值是不会被添加到统计中
+------+----------+-------+------+
| id   | name     | score | addr |
+------+----------+-------+------+
|    1 | zhangsan | 80    | nn   |
|    2 | zhaosi   | 70    |      |
|    3 | liuliu   | 60    | NULL |
|    4 | xixi     | 65    | NULL |
+------+----------+-------+------+
4 rows in set (0.00 sec)#查询null值
select * from shitu where addr is null;
空值数据: select count(*) from YourTable where Your Column Name is null
#查询不为空的值
select * from shitu where addr is not null;
非空值数据: select count(*) from YourTable where YourColumnName is not null

正则表达式

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

匹配 描述
1、^ 匹配文本的开始字符
2、$ 匹配文本的结束字符
3、. 匹配任何单个字符
4、* 匹配零个或多个在它前面的字符
5、+ 匹配前面的字符 1 次或多次
6、字符串 匹配包含指定的字符串
7、p1|p2 匹配 p1 或 p2
8、[…] 匹配字符集合中的任意一个字符
9、[^…] 匹配不在括号中的任何字符
10、{n} 匹配前面的字符串 n 次
11、{n,m} 匹配前面的字符串至少 n 次,至多 m 次

mysql> select id,name from shitu where name regexp '^zh';   #查询以zh开头的学生信息
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | zhaosi   |
+------+----------+
2 rows in set (0.00 sec)mysql> select id,name from shitu where name regexp 'n$';  #查询以n结尾的学生信息
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
+------+----------+
1 row in set (0.00 sec)mysql> select id,name from shitu where name regexp 'an';   #查询名字中包含an的学生信息
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
+------+----------+
1 row in set (0.00 sec)mysql> select id,name from shitu where name regexp 'l.u';  查名字以l开头以u结尾的学生信息
+------+--------+
| id   | name   |
+------+--------+
|    3 | liuliu |
+------+--------+
1 row in set (0.00 sec)mysql> select id,name from shitu where name regexp 'zh|xi';  #查有zh或者xi的学生信息
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | zhaosi   |
|    4 | xixi     |
+------+----------+
3 rows in set (0.00 sec)mysql> select id,name from shitu where name regexp 'aoi*';
#查询名字中有ao,i可有可无的学生信息
必须要有的部分是'ao' 而'i'可有可无
+------+--------+
| id   | name   |
+------+--------+
|    2 | zhaosi |
+------+--------+
1 row in set (0.00 sec)mysql> select id,name from shitu where name regexp 'zhan+';
#查询名字中含有zha,n至少出现一次的学生信息
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
+------+----------+
1 row in set (0.00 sec)#查询名字以s-x开头的学生信息mysql> select id,name from shitu where name regexp '^[s-x]';#查询名字不是xixi的学生信息mysql> select id,name from shitu where name regexp '[^xixi]';#查询学生名字不以zx各字母开头的学生信息mysql> select id,name from info where name regexp '^[^zx]';

运算符

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

算术运算符

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

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

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

比较运算符

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

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

等号(=)

是用来判断数字、字符串和表达式是否相等的,如果相等则返回 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。

不等于(<>,!=)

不等于号有两种写法,分别是<>或者!=,用于针对数字、字符串和表达式不相等的比较。 如果不相等则返回 1,如果相等则返回 0,这点正好跟等于的返回值相反。需要注意的是不等于运算符不能用于判断 NULL
判断一个值为/不为null ( IS NULL、IS NOT NULL )
#IS NULL判断一个值是否为 NULL,如果为NULL返回1,否则返回0。
#IS NOT NOLL判断一个值是否不为 NULL,如果不为NULL返回1,否则返回 0。示例:
select 2 IS NULL,‘f’ IS NOT NULL,NULL IS NULL;

between and

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

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

least 和greatest(取最小值、取最大值)
LEAST:当有两个或者多个参数时,返回其中的最小值。如果其中一个值为 NULL,则返回结果就为 NULL。

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

若要判断一组数字或字母中哪个最小、哪个最大,可以通过使用 LEAST 和 GREATEST 来实现
IN 判断一个值是否在对应的列表中,如果是返回 1,否则返回 0。
NOT IN 判断一个值是否不在对应的列表中,如果不是返回 1,否则返回 0
LIKE 用来匹配字符串,如果匹配成功则返回 1,反之返回 0
LIKE 支持两种通配符:’%’ 用于匹配任意数目的字符(*匹配的是前面一个字符),而
’_’只能匹配一个字符。
NOT LIKE 正好跟 LIKE 相反,如果没有匹配成功则返回 1,反之返回 0。

逻辑运算符(布尔值)

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

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

逻辑非

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

逻辑与(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

逻辑或(or)

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

逻辑异或(xor)

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

位运算符

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

位运算符 描述
&           按位与
|           按位或
~           按位取反
^           按位异或
<<            按位左移
>>            按位右移
mysql> select 10 & 15,10 | 15,10 ^ 15,5 &~1;
+---------+---------+---------+-------+
| 10 & 15 | 10 | 15 | 10 ^ 15 | 5 &~1 |
+---------+---------+---------+-------+
|      10 |      15 |       5 |     4 |
+---------+---------+---------+-------+
1 row in set (0.00 sec)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

以上不管哪种运算符,在使用过程中都有优先级问题。运算符的优先级决定了不同的运 算符在计算过程中的先后顺序。级别高的运算符会先进行计算,如果运算符的级别相同, MySQL 会按照顺序从左到右依次进行计算,优先级如下表所示:

优先级  运算符
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      :=

总结

逻辑运算符:逻辑非(not !)有0返1,有1返0,有null返null
逻辑与(and &&):非0返1,否则返0,有null返null
逻辑或(or):任意一个不是0或者null返1,否则返0,都是null返Null
逻辑异或(xor):两者都是0或者非0的返0,否则1,有null返null

位运算符:转换成二进制计算
与& 11=1,否则0
或| 有1得1,否则0
异或^ 不同得1,否则0
取反~ 取反计算,1
1=1,否则0

mysql之视图运算符逻辑运算符(布尔值)相关推荐

  1. HTML学习9 JS 数字和字符串 变量的类型 运算符和表达式 布尔值和关系运算符、逻辑运算符

    JavaScript简介 1.1 JavaScript的用途 JavaScript用来制作web页面交互效果,提升用户体验. 简单列出几个JavaScript能够制作的页面效果,它能干什么: 轮播图 ...

  2. python 布尔值 bool( ) 与逻辑运算符

    逻辑运算符 notandor 运算符优先级 not > and >or printer(x or y) x为非零,则返回x,否则返回y 学习python中有什么不懂的地方,小编这里推荐加小 ...

  3. 逻辑运算符--布尔运算符

    JS中为我们提供了三种逻辑运算符         !非             !可以用来对一个值进行非运算             --所谓非运算就是对一个值进行取反运算               ...

  4. Python笔记:算术运算符, 赋值运算符, 布尔运算符,比较运算符和逻辑运算符

    算术运算符 + 加 - 减 * 乘 / 除 % 取余(相除后的余数) ** 取幂(注意 ^ 并不执行该运算,你可能在其他语言中见过这种情形) // 相除后向下取整到最接近的整数 算术运算符[相关练习] ...

  5. 如果理解运算符和各类数值的布尔值

    &&(且运算符):表示二者都为true才为true: 短路原则:例如 : a && b;   当a为true时,程序无论如何都会走b,而不管b为true或者false ...

  6. linux shell for while if case break continue echo test 及算术运算符 关系运算符 布尔运算符 逻辑运算符 字符串运算符 文件测试运算符

    linux shell for while if case break continue echo test 及算术运算符 关系运算符 布尔运算符 逻辑运算符 字符串运算符 文件测试运算符

  7. mysql可以存布尔_哪个MySQL数据类型用于存储布尔值

    由于MySQL似乎没有任何"布尔"数据类型,你滥用'哪种数据类型'来存储MySQL中的真/假信息? 特别是在写入和读取PHP脚本的上下文中. 随着时间的推移,我使用并看到了几种方法 ...

  8. mysql判断存在返回布尔_MySqlClient访问tinyint字段返回布尔值篇

    症状: 使用MySqlClient访问tinyint unsign 字段返回布尔值 true 和 false,但是实际上该字段存储值为1-255 分析: 由于在Mysql中没有布尔类型值,MySqlC ...

  9. mysql如何存储布尔值_用于存储布尔值的MySQL数据类型

    用于存储布尔值的MySQL数据类型 由于MySQL似乎没有任何"布尔"数据类型,您在"滥用"哪种数据类型来存储MySQL中的真/假信息? 特别是在写入和读取PH ...

最新文章

  1. illegalargumentexception是什么异常_线程出现异常!应该如何处理?
  2. ARM平台下独占访问指令LDREX和STREX的原理与使用详解
  3. 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!...
  4. 201712-1最小差值
  5. Spring配置文件和Java配置
  6. 过滤日志中不相关的堆栈跟踪行
  7. ffmpeg 同宽度 画中画_FFmpeg中overlay滤镜用法-水印及画中画
  8. Django在settings.py设置安装软件路径,遇到 'Settings' object is not subscriptable报错
  9. MySQL5.5安装版安装教程
  10. 练打字-测试看图说话(AD安装)
  11. 关于YUV格式的一些总结
  12. autocad型源代码_总结一下可以研究的CAD源代码
  13. 泛微e-Bridge未授权文件读取漏洞复现
  14. C++函数参数的缺省值
  15. 香橙派装php_香橙派Orange Pi 3电脑开发板如何安装安卓系统
  16. 统计局解读1月制造业采购经理指数:服务业回升明显
  17. payscale 美国计算机专业,2016PayScale美国大学排名:计算机专业
  18. 软件著作权可以更改名字吗?软著如何更改名字?
  19. nginx打开网页下载php,nginx,_nginx 访问localhost老是下载文件不能打开网页什么情况?,nginx - phpStudy...
  20. Microsoft XBOX 360 Project Natal 体感装置2010年6月15正式发布产品正式命名为“Kinect”

热门文章

  1. 第四课 实战go语言改造php仿优酷-Redis改造优化接口
  2. dubbo多协议配置
  3. 1.7Web前端基础笔记
  4. 电子商务(njupt)
  5. 常州买衣服(优先队列)
  6. 数学建模优化模型简单例题_数学建模中简单的优化模型
  7. 前5名:Dreamweaver的网页设计替代品,Mattermost的高中聊天替代品,等等
  8. 怎样快速删除Word中的空行
  9. Flutter项目快速搭建指南
  10. Python中文社区GitHub开源项目扶持计划