📚查询
这篇文章主要是记录数据库查询命令,以前用 Python 操作数据库都是直接将所有数据读取出来,然后再在对应的表类的函数里面来进行处理,因此用到的 SQL 都是比较简单,着实没有想到 SQL 怎么方便。
像数据分组、排序、分页等功能,我老早都是通过将所有数据取出来,然后再将数据放到相应函数里面进行数据分组、排序、分页等功能,显然这样效率低还浪费资源。
下面我将会记录如何使用这些命令,来做一些简单的应用巩固自己的基础。
mysql> select * from java.person;
+-----------+------+------+
| name | age | sex |
+-----------+------+------+
| hjhcos.cn | 12 | 男 |
| hjhcos.cn | 12 | 男 |
| hjhcos | 15 | 女 |
| hjh | 13 | NULL |
| cos | 2 | 男 |
| cn | 2 | 女 |
+-----------+------+------+
📕条件表达式
条件表达 | 含义 |
---|---|
between … and … | 某一区间的值 |
in (set) | 符合 set 条件的值 |
like | 模糊查询 % _ |
is null | 判断是否为空 |
- %:表示 0 个或多个任意字符
- _:表示占位符,即任意一个字符
查询 age 字段在 13 ~ 15 的数据
mysql> select * from java.person where `age` between 13 and 15;
+--------+------+------+
| name | age | sex |
+--------+------+------+
| hjhcos | 15 | 女 |
| hjh | 13 | NULL |
+--------+------+------+
mysql> select * from java.person where `age` in (13, 14, 15);
+--------+------+------+
| name | age | sex |
+--------+------+------+
| hjhcos | 15 | 女 |
| hjh | 13 | NULL |
+--------+------+------+
查询 name 后缀为 .cn 的数据
mysql> select * from java.person where `name` like '%.cn';
+-----------+------+------+
| name | age | sex |
+-----------+------+------+
| hjhcos.cn | 12 | 男 |
| hjhcos.cn | 12 | 男 |
+-----------+------+------+
查询 sex 字段为空的数据
mysql> select * from java.person where `sex` is null;
+------+------+------+
| name | age | sex |
+------+------+------+
| hjh | 13 | NULL |
+------+------+------+
📕功能函数
功能 | 含义 |
---|---|
distinct | 数据去重 |
limit start, rows | 分页查询 |
order by | 数据排序,默认 asc 升序,desc 降序 |
group by | 根据某一个或多个字段的不同数据进行分组 |
having | 对分组进行过滤 |
count | 统计 dataRow |
- order by 位于 select 语句句尾
- count 不会将空的数据放到里面进行统计
- group by 接受聚合查询
例如select * from java.person group by age ;
这条命令是无法通过,如果使用 count() 这种 aggregated 包住 * 即可通过
查询 name 后缀为 .cn 的数据并去重
mysql> select distinct * from java.person where `name` like '%.cn';
+-----------+------+------+
| name | age | sex |
+-----------+------+------+
| hjhcos.cn | 12 | 男 |
+-----------+------+------+
显示前三行数据
mysql> select * from java.person limit 0, 3;
+-----------+------+------+
| name | age | sex |
+-----------+------+------+
| hjhcos.cn | 12 | 男 |
| hjhcos.cn | 12 | 男 |
| hjhcos | 15 | 女 |
+-----------+------+------+
按 age 从大到小对数据进行排序
mysql> select * from java.person order by `age` desc;
+-----------+------+------+
| name | age | sex |
+-----------+------+------+
| hjhcos | 15 | 女 |
| hjh | 13 | NULL |
| hjhcos.cn | 12 | 男 |
| hjhcos.cn | 12 | 男 |
| cos | 2 | 男 |
| cn | 2 | 女 |
+-----------+------+------+
根据 age 对数据进行分组
mysql> select `age` from java.person group by `age` ;
+------+
| age |
+------+
| 2 |
| 12 |
| 13 |
| 15 |
+------+
根据 age 为 12 以上的进行分组
mysql> select `age` from java.person group by `age` having `age` > 12;
+------+
| age |
+------+
| 13 |
| 15 |
+------+
统计有多少个 age 为 12 以上的数据
mysql> select count(*) from java.person where `age` > 12;
+----------+
| count(*) |
+----------+
| 2 |
+----------+
📕数学函数
数学 | 含义 |
---|---|
sum | 合计字段的所有数据 |
avg | 字段的所有数据的平均数 |
max | 字段的所有数据里面最大的数 |
min | 字段的所有数据里面最小的数 |
abs(number) | 绝对值 |
bin(number) | 十进制转二进制 |
conv(number, 10, 2) | 进制转换 |
hex(number) | 十进制转十六进制 |
ceiling(number) | 向上取整 |
floor(number) | 向下取整 |
format(number, decimal_places) | 保留小数,四舍五入 |
least(number1, …, numberN) | 求最小值 |
mod(number, denominator) | 求余 |
rand() | 随机数 |
- rand 范围为 0~1 ,如果小括号有值,随机数不会变化
计算字段 age 所有数据的总和
mysql> select sum(age) from java.person;
+----------+
| sum(age) |
+----------+
| 56 |
+----------+
计算字段 age 所有数据的平均数
mysql> select avg(age) from java.person;
+----------+
| avg(age) |
+----------+
| 9.3333 |
+----------+
计算字段 age 所有数据的最大值
mysql> select max(age) from java.person;
+----------+
| max(age) |
+----------+
| 15 |
+----------+
计算字段 age 所有数据的最小值
mysql> select min(age) from java.person;
+----------+
| min(age) |
+----------+
| 2 |
+----------+
将 10 转化为二进制
mysql> select bin(10) from dual;
+---------+
| bin(10) |
+---------+
| 1010 |
+---------+
将 10 转化为十六进制
mysql> select hex(10) from dual;
+---------+
| hex(10) |
+---------+
| A |
+---------+
将 9 转化为八进制
mysql> select conv(9, 10, 8) from dual;
+----------------+
| conv(9, 10, 8) |
+----------------+
| 11 |
+----------------+
将 5.5 和 -5.5 向上取整
mysql> select ceiling(5.5), ceiling(-5.5) from dual;
+--------------+---------------+
| ceiling(5.5) | ceiling(-5.5) |
+--------------+---------------+
| 6 | -5 |
+--------------+---------------+
1 row in set (0.00 sec)
将 5.5 和 -5.5 向下取整
mysql> select floor(5.5), floor(-5.5) from dual;
+------------+-------------+
| floor(5.5) | floor(-5.5) |
+------------+-------------+
| 5 | -6 |
+------------+-------------+
将 5.555 保留小数点后 2 位
mysql> select format(5.555, 2) from dual;
+------------------+
| format(5.555, 2) |
+------------------+
| 5.56 |
+------------------+
求集合 {12, 13, 2} 中的最小值
mysql> select least(12, 13, 2) from dual;
+------------------+
| least(12, 13, 2) |
+------------------+
| 2 |
+------------------+
求 12 / 5 的余数
mysql> select mod(12, 5) from dual;
+------------+
| mod(12, 5) |
+------------+
| 2 |
+------------+
随机生成一个 100 以内的整数
mysql> select format(rand()*100, 0) from dual;
+-----------------------+
| format(rand()*100, 0) |
+-----------------------+
| 72 |
+-----------------------+
📕时间函数
时间函数 | 含义 |
---|---|
current_date() | 当前日期 |
current_time() | 当前时间 |
current_timestamp() | 当前时间戳 |
now() | 当前时间 |
date(datetime) | 返回datetime的日期部分 |
date_add(date, interval d_value d_type) | 在date中加上日期或时间 |
date_sub(date, interval d_value d_type) | 在date中减去一个时间 |
datediff(date1, date2) | 两个日期差(天) |
unix_timestamp() | 时间戳 |
from_unixtime(timestamp, ‘%Y-%M-%D’) | 将时间戳转换为日期 |
- d_type:year、day、minute、second 等等
获取当前日期和时间
mysql> select current_date(), current_time() from dual;
+----------------+----------------+
| current_date() | current_time() |
+----------------+----------------+
| 2022-03-05 | 11:44:25 |
+----------------+----------------+
mysql> select now() from dual;
+---------------------+
| now() |
+---------------------+
| 2022-03-05 11:45:11 |
+---------------------+
mysql> select current_timestamp() from dual;
+---------------------+
| current_timestamp() |
+---------------------+
| 2022-03-05 11:49:21 |
+---------------------+
mysql> select from_unixtime(unix_timestamp(), '%Y-%m-%d %H:%m:%s') from dual;
+------------------------------------------------------+
| from_unixtime(unix_timestamp(), '%Y-%m-%d %H:%m:%s') |
+------------------------------------------------------+
| 2022-03-05 12:03:01 |
+------------------------------------------------------+
获取 2022-03-05 22:07:43 的年月日部分
mysql> select date('2022-03-05 22:07:43') from dual;
+-----------------------------+
| date('2022-03-05 22:07:43') |
+-----------------------------+
| 2022-03-05 |
+-----------------------------+
获取前一天时间
mysql> select date_sub(current_date(), interval 1 day) from dual;
+------------------------------------------+
| date_sub(current_date(), interval 1 day) |
+------------------------------------------+
| 2022-03-04 |
+------------------------------------------+
获取后一天时间
mysql> select date_add(current_date(), interval 1 day) from dual;
+------------------------------------------+
| date_add(current_date(), interval 1 day) |
+------------------------------------------+
| 2022-03-06 |
+------------------------------------------+
比较两个日期的差值
mysql> select datediff(current_date(), '2021-03-05') from dual;
+----------------------------------------+
| datediff(current_date(), '2021-03-05') |
+----------------------------------------+
| 365 |
+----------------------------------------+
📕加密和系统函数
加密和系统函数 | 含义 |
---|---|
user() | 查询使用数据库的用户 |
database() | 查询当前使用的数据库 |
md5(str) | 使用32位字符加密数据 |
password(str) | 加密数据 |
当前使用数据库管理器的用户
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
当前用户使用的数据库
mysql> select database();
+------------+
| database() |
+------------+
| NULL |
+------------+
毕竟我没有使用 use 命令来指定使用数据库,命令都是靠 数据库名.表名
的方式。
使用 md5 加密 hjhcos 数据
mysql> select md5('hjhcos') from dual;
+----------------------------------+
| md5('hjhcos') |
+----------------------------------+
| 8cbeac8c470f183bfa8e4cc836d15521 |
+----------------------------------+
使用 password 加密 hjhcos 数据
mysql> select password('hjhcos') from dual;
+-------------------------------------------+
| password('hjhcos') |
+-------------------------------------------+
| *4579A208EFCFAAC9F82C74DDD0CBD1A7AD89D614 |
+-------------------------------------------+
如果你是无意刷到这篇文章并看到这里,希望你给我的文章来一个赞赞👍👍。如果你不同意其中的内容或有什么问题都可以在下方评论区留下你的想法或疑惑,谢谢你的支持!!😀😀