Mysql中其余知识点使用

 1. replace

replace(字段名,“需要替换的值”,“替换后的值”),一般结合 update一起使用:update table_name set attribute = REPLACE( attribute, 旧内容, 新内容) where id = value ;

2.更改数据表的信息

alter table 表名 change 原列名 新列名  类型; --修改表的列属性名
alter table 表名 modify 列名 类型 ;  --修改表的类类型
alter table 表名 drop 列名;  --删除表的某一列
alter table 表名 add  列名 类型;--添加某一列
alter table 表名 rename 新表名; --修改表名

或者在 Mysql 中也支持: 

rename table ‘旧名字’ to ‘新名字’

 3.左连接,没有在右边查询到的一般用左连接(将左边表的所有记录都查询出来,右边表只显示和左边表对应的数据或者 null

select p.id, p.name, t.content 
from person p LEFT JOIN task t   --左连接
on p.id = t.person_id    --根据这两个属性进行连接
ORDER BY p.id   -- 对结果进行升序排序

结果如下:

              

 

4. order by 与 Grouo by 的关系

SELECT user_id, max(date) as d FROM login
GROUP BY user_id
ORDER by date DESC    --错误的方式

以上为错误的方式!!!

不能用order by date 来试图获取每个组内的最大日期,因为 order by 在执行的时候 group by 已经执行了,也就是说此时已经分组完毕每组只携带了默认的第一个记录,所以此时 order by 只是在组与组的维度进行排序

正确写法为:

SELECT user_id, max(date) as d FROM login
GROUP BY user_id
ORDER by user_id    -- 正确写法

 

5.order by 与 Grouo by 、保留小数点后几位 ROUND(牛客SQL-77)

SELECT job, ROUND(AVG(score), 3) AS `avg` FROM grade    --保留小数点后三位
GROUP BY job 
ORDER BY `avg` DESC    --可以使用 select 计算之后的参数作为排序,因为分组之后执行多行函数的结果是一个值

还是上面那个问题,group by 执行后,每组只携带一个记录,而 AVG(score) 之后,每组也只存在一个平均值,所以可以进行排序

ROUND(x, n) 表示保留小数 x 的后 n 位结果。

 

6. YEAR 筛选年份值(牛客 SQL-84)

SELECT job, SUM(num) AS cnt FROM resume_info
WHERE date >= '2025-01-01' AND date <= '2025-12-31'    --筛选 时间为2025年一整年的数据
GROUP BY job
ORDER BY cnt DESC   --同理5,可以对多行函数后的值排序

上面的时间可以修改为如下:

SELECT job, SUM(num) AS cnt FROM resume_info
WHERE YEAR(date) = '2025'   --筛选时间的年份值
GROUP BY job
ORDER BY cnt DESC

 

posted @ 2021-09-26 10:31  星海寻梦233  阅读(30)  评论(0编辑  收藏  举报