学习笔记 2021.12.8

2021.12.8

运算符

整章都是一个对应的问题,也没有啥思考的地方,都是记忆一下即可。尽快过了。

算数运算符

image-20211208102908555

下面是一些使用的小例子,也没啥演示的必要了:

  • 一个整数类型的值对整数进行加法和减法操作,结果还是一个整数;

  • 一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数;

  • 加法和减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的;

  • 在Java中,+的左右两边如果有字符串,那么表示字符串的拼接。但是在MySQL中+只表示数值相加。如果遇到非数值类型,先尝试转成数值,如果转失败,就按0计算。(补充:MySQL中字符串拼接要使用字符串函数CONCAT()实现)

  • 一个数乘以整数1和除以整数1后仍得原数;

  • 一个数乘以浮点数1和除以浮点数1后变成浮点数,数值与原数相等;

  • 一个数除以整数后,不管是否能除尽,结果都为一个浮点数;

  • 一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后4位;

  • 乘法和除法的优先级相同,进行先乘后除操作与先除后乘操作,得出的结果相同。

  • 在数学运算中,0不能用作除数,在MySQL中,一个数除以0为NULL。

比较运算符

通过比较后的值1和0来标识结果的真假。其他的情况则为NULL。

前面where筛选的就是结果为1的情况。

符号类型的比较:

image-20211208103326265

  • 等号运算符(=)判断等号两边的值、字符串或表达式是否相等,如果相等则返回1,不相等则返回0。

  • 在使用等号运算符时,遵循如下规则:

    • 如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
    • 如果等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
    • 如果等号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
    • 如果等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。

安全等于运算符(<=>)与等于运算符(=)的作用是相似的,唯一的区别是‘<=>’可以用来对NULL进行判断。在两个操作数均为NULL时,其返回值为1,而不为NULL;当一个操作数为NULL时,其返回值为0,而不为NULL。

即实现将NULL也看作一个数来比较,为NULL而生。

其他的就略了。

通过字段比较

image-20211208103750889

IS NULL和IS NOT NULL这种就是一眼懂了,没必要更多的演示了。

最小值运算符
语法格式为:LEAST(值1,值2,...,值n)。其中,“值n”表示参数列表中有n个值。在有两个或多个参数的情况下,返回最小值。

mysql> SELECT LEAST (1,0,2), LEAST('b','a','c'), LEAST(1,NULL,2);
+---------------+--------------------+-----------------+
| LEAST (1,0,2) | LEAST('b','a','c') | LEAST(1,NULL,2) |
+---------------+--------------------+-----------------+
|       0       |        a           |      NULL       |
+---------------+--------------------+-----------------+
1 row in set (0.00 sec)

由结果可以看到,当参数是整数或者浮点数时,LEAST将返回其中最小的值;当参数为字符串时,返回字母表中顺序最靠前的字符;当比较值列表中有NULL时,不能判断大小,返回值为NULL。

最大值运算符
语法格式为:GREATEST(值1,值2,...,值n)。其中,n表示参数列表中有n个值。当有两个或多个参数时,返回值为最大值。假如任意一个自变量为NULL,则GREATEST()的返回值为NULL。

mysql> SELECT GREATEST(1,0,2), GREATEST('b','a','c'), GREATEST(1,NULL,2);
+-----------------+-----------------------+--------------------+
| GREATEST(1,0,2) | GREATEST('b','a','c') | GREATEST(1,NULL,2) |
+-----------------+-----------------------+--------------------+
|               2 | c                     |               NULL |
+-----------------+-----------------------+--------------------+
1 row in set (0.00 sec)

由结果可以看到,当参数中是整数或者浮点数时,GREATEST将返回其中最大的值;当参数为字符串时,返回字母表中顺序最靠后的字符;当比较值列表中有NULL时,不能判断大小,返回值为NULL。

BETWEEN运算符使用的格式通常为SELECT D FROM TABLE WHERE C BETWEEN A AND B,此时,当C大于或等于A,并且C小于或等于B时,结果为1,否则结果为0。

IN运算符
IN运算符用于判断给定的值是否是IN列表中的一个值,如果是则返回1,否则返回0。如果给定的值为NULL,或者IN列表中存在NULL,则结果为NULL。

LIKE运算符
LIKE运算符主要用来匹配字符串,通常用于模糊匹配,如果满足条件则返回1,否则返回0。如果给定的值或者匹配条件为NULL,则返回结果为NULL。

LIKE运算符通常使用如下通配符:

“%”:匹配0个或多个字符。
“_”:只能匹配一个字符。

SQL语句示例如下:

mysql> SELECT NULL LIKE 'abc', 'abc' LIKE NULL;  
+-----------------+-----------------+
| NULL LIKE 'abc' | 'abc' LIKE NULL |
+-----------------+-----------------+
|          NULL   |          NULL   |
+-----------------+-----------------+
1 row in set (0.00 sec)
SELECT	first_name
FROM 	employees
WHERE	first_name LIKE 'S%';
SELECT last_name
FROM   employees
WHERE  last_name LIKE '_o%';

%的具体用法就是可以省略指代的意思

image-20211208104412888

比如像上面这么写就是指后面可以随意多少个。

其余的都用到再看吧,太没意义了。

逻辑运算符

image-20211208104620736

注意:

OR可以和AND一起使用,但是在使用时要注意两者的优先级,由于AND的优先级高于OR,因此先对AND两边的操作数进行操作,再与OR中的操作数结合。

位运算符

image-20211208104838615

运算符的优先级

image-20211208104925038

排序与分页

排序:

首先要知道没有按照排序操作话,默认情况下查询返回的数据是按照添加数据的顺序排序的。

因此sql中具体的排序实现:

  • 使用 ORDER BY 子句排序
    • ASC(ascend): 升序(默认情况)
    • DESC(descend):降序
  • ORDER BY 子句在SELECT语句的结尾。

单列排序

image-20211208105723883

注意此时对于列的重名只有在order by中才能使用,在where中是没法使用别名的。 也是函数的返回值能在order关键字后进行使用。

格式的强调:where需要声明在from后面,order by前面。

多列排列

image-20211208110121816

就是在order行中多加个对象即可。

  • 可以使用不在SELECT列表中的列排序。
  • 在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。

分页

  • 分页原理

    所谓分页显示,就是将数据库中的结果集,一段一段显示出来需要的条件。

  • MySQL中使用 LIMIT 实现分页

  • 格式:

    LIMIT [位置偏移量,] 行数
    

    第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);第二个参数“行数”指示返回的记录条数。

下面例子即是显示了第二页的数据

image-20211208110458198

公式如下:

image-20211208110533106

  • 注意:LIMIT 子句必须放在整个SELECT语句的最后!
  • limit 0,条目数=limit 条目数
  • 使用 LIMIT 的好处

约束返回结果的数量可以减少数据表的网络传输量,也可以提升查询效率。如果我们知道返回结果只有 1 条,就可以使用LIMIT 1,告诉 SELECT 语句只需要返回一条记录即可。这样的好处就是 SELECT 不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。

多表查询

多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。

前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。

需求所在:当需要通过多个表之间相关联的数据进行查询的话,如果只使用单表查询,就会导致请求的次数增多,此时使用多表查询可以明显的降低查询次数。

笛卡儿积错误

笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中元素个数的乘积数。

image-20211208112740724

错误的原因即是缺少了多表的连接条件。会导致每个都交叉连接了。

笛卡尔积的错误会在下面条件下产生

  • 省略多个表的连接条件(或关联条件)
  • 连接条件(或关联条件)无效,要保证存在着相同的字段。
  • 所有表中的所有行互相连接
  • 在表中有相同列时,在列名之前加上表名前缀。

正确的处理方式:

image-20211208113147572

此时会发现依然无法处理NULL值对应的情况。

其他的一些注意的:

image-20211208113502859

且起了别名,就必须用,即原来的名字直接无效了。

image-20211208113710387

此时注意一个小的编写细节就是可以现在from阶段将表取别名后再在其他的地方进行使用。

各种连接相关

等值连接和非等值连接

即连接条件时看是不是等号,前面的情况都是等值连接的例子。

非等值连接的例子:

image-20211208114155468

即写连接条件的时候做好对应就好了。

自连接与非自连接

自连接即自己表连接自己的情况,之前的情况都属于非自连接。

自连接的情况:

image-20211208114840909

此时就要注意必须标明具体的表。

内连接和外连接

posted @ 2021-12-08 11:52  damndamit  阅读(53)  评论(0)    收藏  举报