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