1.位运算符
位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算, 最后将计算结果从二进制变回十进制数。
1.1按位与运算符
按位与(&)运算符将给定值对应的二进制数逐位进行逻辑与运算。当给定值对应的二进制位的数值都为1时,则该位返回1,否则返回0;
mysql> SELECT 1 & 10, 20 & 30;
+--------+---------+
| 1 & 10 | 20 & 30 |
+--------+---------+
| 0 | 20 |
+--------+---------+
1 row in set (0.00 sec)
1 的二进制数为 0001 , 10 的二进制数为 1010 ,所以 1 & 10 的结果为 0000 ,对应的十进制数为 0;20 的二进制 数为10100 , 30 的二进制数为 11110 ,所以 20 & 30 的结果为 10100 ,对应的十进制数为 20;
1.2按位或运算符
按位或(|)运算符将给定的值对应的二进制数逐位进行逻辑或运算。当给定值对应的
二进制位的数值有一个或两个为
1
时,则该位返回
1
,否则返回
0,然后再返回对应的十进制数
mysql> SELECT 1 | 10, 20 | 30;
+--------+---------+
| 1 | 10 | 20 | 30 |
+--------+---------+
| 11 | 30 |
+--------+---------+
1 row in set (0.00 sec)
1的二进制数为 0001 , 10 的二进制数为 1010 ,所以 1 ^ 10 的结果为 1011 ,对应的十进制数为 11 。 20 的二进 制数为10100 , 30 的二进制数为 11110 ,所以 20 ^ 30 的结果为 01010 ,对应的十进制数为 10 。
按位异或:也是跟上述一个道理,只不过是在两个数的二进数进行的是异或的操作,然后结果的二进制再转为十进制数;
1.3按位取反符号
按位取反(~)运算符将给定的值 的二进制数逐位进行取反操作,
1.4 按位右移符号
按位右移(>>)运算符将给定的值的二进制数的所有位右移指定的位数。右移指定的 位数后,右边低位的数值被移出并丢弃,左边高位空出的位置用0
补齐。
1 的二进制数为 0000 0001 ,右移 2 位为 0000 0000 ,对应的十进制数为 0 。4 的二进制数为 0000 0100 ,右移 2 位为0000 0001 ,对应的十进制数为 1 。
按位左移也是差不多道理,只是左移两位,低位补充0;
2.运算符的优先级
————————————————————————————————————————
REGEXP正则表达式的补充:
3.排序数据order by
3.1排序规则
使用
ORDER BY
子句排序
ASC
(
ascend
)
:
升序
DESC
(
descend
)
:
降序
ORDER BY
子句在
SELECT
语句的结尾。默认某列明orderby后面没有标明asc还是DESC,默认是升序排序
3.2单例排序
SELECT employee_id, last_name, salary*12 annsal FROM employees ORDER BY annsal;
3.3多列排序的原理
可以使用不在 SELECT 列表中的列排序。在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第 一列数据中所有值都是唯一的,将不再对第二列进行排序。
SELECT last_name, department_id, salary FROM employees ORDER BY department_id, salary DESC;
4.limit分页操作
4.1分页格式
LIMIT [ 位置偏移量 ,] 行数偏移量可以不加,若limit后面只有一个数,默认是行数;
--前10条记录:
SELECT * FROM 表名 LIMIT 0,10;
--或者
SELECT * FROM 表名 LIMIT 10;
--第11至20条记录:
SELECT * FROM 表名 LIMIT 10,10;
--第21至30条记录:
SELECT * FROM 表名 LIMIT 20,10;
MySQL 8.0 中可以使用 “LIMIT 3 OFFSET 4” ,意思是获取从第 5 条记录开始后面的 3 条记录,和 “LIMIT 4,3;”返回的结果相同。
4.2分页显示公式
分页显式公式
:(当前页数
-1
)
*
每页条数,每页条数
SELECT * FROM tableLIMIT (PageNo - 1 )*PageSize,PageSize;
当前页数指的是:以pagesize为一个页的下一页
比如
查询第1条到第10条的数据的sql是:select * from table limit 0,10; ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;
查询第10条到第20条的数据的sql是:select * from table limit 10,20; ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;
注意:LIMIT 子句必须放在整个SELECT语句的最后!
使用limit的好处 :约束返回结果的数量可以 减少数据表的网络传输量 ,也可以 提升查询效率 。
4.3 limit的拓展使用
如果是 Oracle,你需要基于 ROWNUM 来统计行数:
SELECT rownum,last_name,salary FROM employees WHERE rownum < 5 ORDER BY salary DESC;