MYSQL 基础(二)

1. 算术运算符

算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加(+)、减(-)、乘(*)、除(/)和取模(%)运算。

 

加法与减法运算符

1 mysql> SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 -30, 100 + 35.5, 100 - 35.5 FROM dual;
2 +-----+---------+---------+----------+--------------+------------+------------+
3 | 100 | 100 + 0 | 100 - 0 | 100 + 50 | 100 + 50 -30 | 100 + 35.5 | 100 - 35.5 |
4 +-----+---------+---------+----------+--------------+------------+------------+
5 | 100 |     100 |     100 |      150 |          120 |      135.5 |       64.5 |
6 +-----+---------+---------+----------+--------------+------------+------------+
7 1 row in set (0.00 sec)

由运算结果可以得出如下结论:

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

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

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

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

 

 

 乘法与除法运算符

1 mysql> SELECT 100, 100 * 1, 100 * 1.0, 100 / 1.0, 100 / 2,100 + 2 * 5 / 2,100 /3, 100 DIV 0 FROM dual;
2 +-----+---------+-----------+-----------+---------+-----------------+---------+-----------+
3 | 100 | 100 * 1 | 100 * 1.0 | 100 / 1.0 | 100 / 2 | 100 + 2 * 5 / 2 | 100 /3  | 100 DIV 0 |
4 +-----+---------+-----------+-----------+---------+-----------------+---------+-----------+
5 | 100 |     100 |     100.0 |  100.0000 | 50.0000 |        105.0000 | 33.3333 |      NULL |
6 +-----+---------+-----------+-----------+---------+-----------------+---------+-----------+
7 1 row in set (0.00 sec)

 

由运算结果可以得出如下结论:

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

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

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

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

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

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

求模(求余)运算符

1 mysql> SELECT 12 % 3, 12 MOD 5 FROM dual;
2 +--------+----------+
3 | 12 % 3 | 12 MOD 5 |
4 +--------+----------+
5 |      0 |        2 |
6 +--------+----------+
7 1 row in set (0.00 sec)
#筛选出employee_id是偶数的员工

2. 比较运算符

比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其他情况则返回NULL。

比较运算符经常被用来作为SELECT查询语句的条件来使用,返回符合条件的结果记录。

 

 

 

 

此外,还有非符号类型的运算符:

 

 

BETWEEN AND运算符

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。

 

1 mysql> SELECT 'a' IN ('a','b','c'), 1 IN (2,3), NULL IN ('a','b'), 'a' IN ('a', NULL);
2 +----------------------+------------+-------------------+--------------------+
3 | 'a' IN ('a','b','c') | 1 IN (2,3) | NULL IN ('a','b') | 'a' IN ('a', NULL) |
4 +----------------------+------------+-------------------+--------------------+
5 |            1         |        0   |         NULL      |         1          |
6 +----------------------+------------+-------------------+--------------------+
7 1 row in set (0.00 sec)

NOT IN运算符

NOT IN运算符用于判断给定的值是否不是IN列表中的一个值,如果不是IN列表中的一个值,则返回1,否则返回0。

1 mysql> SELECT 'a' NOT IN ('a','b','c'), 1 NOT IN (2,3);
2 +--------------------------+----------------+
3 | 'a' NOT IN ('a','b','c') | 1 NOT IN (2,3) |
4 +--------------------------+----------------+
5 |                 0        |            1   |
6 +--------------------------+----------------+
7 1 row in set (0.00 sec)

 

 

3.逻辑运算符

逻辑运算符主要用来判断表达式的真假,在MySQL中,逻辑运算符的返回结果为1、0或者NULL。

MySQL中支持4种逻辑运算符如下:

 

 

 

 

4.运算符的优先级 

             

 

 

 

5. 排序数据

5.1 排序规则

  • 使用 ORDER BY 子句排序

    • ASC(ascend): 升序

    • DESC(descend):降序

  • ORDER BY 子句在SELECT语句的结尾。

5.2 单列排序

1 SELECT   last_name, job_id, department_id, hire_date
2 FROM     employees
3 ORDER BY hire_date ;

5.3多列排序

1 SELECT last_name, department_id, salary
2 FROM   employees
3 ORDER BY department_id, salary DESC;
  • 可以使用不在SELECT列表中的列排序。

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

 

6.分页

6.1 背景

背景1:查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢?

背景2:表里有 4 条数据,我们只想要显示第 2、3 条数据怎么办呢?

6.2 实现规则

  • 分页原理

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

  • MySQL中使用 LIMIT 实现分页

  • 格式:

LIMIT [位置偏移量,] 行数

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

 

举例

 1 --前10条记录:
 2 SELECT * FROM 表名 LIMIT 0,10;
 3 或者
 4 SELECT * FROM 表名 LIMIT 10;
 5 
 6 --第11至20条记录:
 7 SELECT * FROM 表名 LIMIT 10,10;
 8 
 9 --第21至30条记录: 
10 SELECT * FROM 表名 LIMIT 20,10;
  • 注意:LIMIT 子句必须放在整个SELECT语句的最后!

  • 使用 LIMIT 的好处

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

7.多表查询

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

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

从多个表中获取数据:

 

 

 

 

1 #案例:查询员工的姓名及其部门名称
2 SELECT last_name, department_name
3 FROM employees, departments;

 

我们把上述多表查询中出现的问题称为:笛卡尔积的错误。

笛卡尔积(或交叉连接)的理解

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

img

 

 

 

案例分析与问题解决

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

    • 省略多个表的连接条件(或关联条件)

    • 连接条件(或关联条件)无效

    • 所有表中的所有行互相连接

  • 为了避免笛卡尔积, 可以在 WHERE 加入有效的连接条件。

  • 加入连接条件后,查询语法:

1 SELECT    table1.column, table2.column
2 FROM    table1, table2
3 WHERE    table1.column1 = table2.column2;  #连接条件
1 #案例:查询员工的姓名及其部门名称
2 SELECT last_name, department_name
3 FROM employees, departments
4 WHERE employees.department_id = departments.department_id;
  • 在表中有相同列时,在列名之前加上表名前缀。

内连接 vs 外连接

除了查询满足条件的记录以外,外连接还可以查询某一方不满足条件的记录。

 

 

 

  • 内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

  • 外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。

  • 如果是左外连接,则连接条件中左边的表也称为主表,右边的表称为从表

    如果是右外连接,则连接条件中右边的表也称为主表,左边的表称为从表

语法说明:

  • 可以使用 ON 子句指定额外的连接条件

  • 这个连接条件是与其它条件分开的。

  • ON 子句使语句具有更高的易读性

  • 关键字 JOIN、INNER JOIN、CROSS JOIN 的含义是一样的,都表示内连接

内连接(INNER JOIN)的实现

SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;

外连接(OUTER JOIN)的实现

  • 语法:
1 #实现查询结果是A
2 SELECT 字段列表
3 FROM A表 LEFT JOIN B表
4 ON 关联条件
5 WHERE 等其他子句;
  • 举例:
1 SELECT e.last_name, e.department_id, d.department_name
2 FROM   employees e
3 LEFT OUTER JOIN departments d
4 ON   (e.department_id = d.department_id) ;

满外连接(FULL OUTER JOIN)

  • 满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。

  • SQL99是支持满外连接的。使用FULL JOIN 或 FULL OUTER JOIN来实现。

  • 需要注意的是,MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT join代替。

 

posted @ 2022-01-20 18:31  宗神一  阅读(65)  评论(0编辑  收藏  举报