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是偶数的员工
比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其他情况则返回NULL。
比较运算符经常被用来作为SELECT查询语句的条件来使用,返回符合条件的结果记录。
此外,还有非符号类型的运算符:
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)
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种逻辑运算符如下:
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 ;
1 SELECT last_name, department_id, salary 2 FROM employees 3 ORDER BY department_id, salary DESC;
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语句的最后!
-
约束返回结果的数量可以减少数据表的网络传输量
,也可以提升查询效率
。如果我们知道返回结果只有 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 的所有可能。组合的个数即为两个集合中元素个数的乘积数。
案例分析与问题解决
-
笛卡尔积的错误会在下面条件下产生:
-
省略多个表的连接条件(或关联条件)
-
连接条件(或关联条件)无效
-
所有表中的所有行互相连接
-
-
为了避免笛卡尔积, 可以在 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 子句使语句具有更高的易读性。
-
SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;
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) ;
-
-
SQL99是支持满外连接的。使用FULL JOIN 或 FULL OUTER JOIN来实现。
-
需要注意的是,MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION
本文来自博客园,作者:宗神一,转载请注明原文链接:https://www.cnblogs.com/zhangmuchen/p/15827610.html