中秋 -2024/9/16
今天是中秋假期的第二天,已经过了2/3了,怎么俺滴中秋这么快就没了
今天学习了SQL语句种的查询聚合函数进行查询和Java种的集合 TreeSet,HashSet,LinkedHashSet
DQL-聚合函数
- 介绍:将一列数据作为一个整体,进行纵向计算
- 常见聚合函数
count - 统计数量
max - 最大值
min - 最小值
avg - 平均值
sum - 求和
3. 语法
SELECT 聚合函数(字段列表) FROM 表名;
注意:所有的null值不参与所有聚合函数运算
//统计数量
select count(id) from emp;
//统计平均值
select avg(age) from emp;
//求最大值
select max(age) from emp;
//求和
select sum(age) from emp where age = 22;
DQL -分组查询
SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名[HAVING 分组后过滤条件];
注意
- 执行顺序:where > 聚合函数 > having
- 分组之后,查询的字段一般为聚合函数和分组函数,查询其他字段无任何含义
HashSet底层原理
- 创建一个默认长度为16,默认加载因子为0.75(用于数组扩容,12个时扩容)的数组,数组名为table
JDK8以后,当链表长度超过8,而且数组长度大于等于64时,自动转换为红黑树
如果集合中存储的是自定义对象,必须重写hashCode和equals方法
LinkedHashSet底层机制
TreeSet的特点
- 不重复,无索引,可排序
- 可排序:按照元素的默认规则(由小到大)排序
- TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好
import java.util.Iterator;
import java.util.TreeSet;
public class a07TreeSet_Test {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<>();
ts.add(1);
ts.add(4);
ts.add(5);
ts.add(2);
ts.add(3);
//1.迭代器遍历
Iterator<Integer> it = ts.iterator();
while(it.hasNext()) System.out.println(it.next());
//2.增强for循环遍历
for(Integer i : ts){
System.out.println(i);
}
//3.Lambda表示式遍历
ts.forEach(i -> System.out.println(i));
}
}
TreeSet集合的默认的规则
- 对于数值类型,Integer,Double,默认按照从小到大的顺序进行排序
- 对于字符,字符串类型:按照字符在ASCII码表的数字升序进行排序
TreeSet的两种比较方式
- 默认排序/自然排序:javabean类实现Comparable接口指定接口比较规则
@Override
public int compareTo(Student o) {
return this.age - o.getAge();
}
2.比较器排序:创建TreeSet对象时候,传递比较器Comparator指定规则
使用规则:默认使用第一种,如果第一种不能满足当前需求,就使用第二种
//重写接口Comparable compareTo方法
@Override
public int compareTo(Stu o) {
//总分从小到大排序
int i = this.getChinese() + this.getMath() + this.getEnglish() - o.getEnglish() - o.getMath() - o.getChinese();
//总分一样,语文从小到大
i = i == 0 ? this.getChinese() - o.getChinese() : i;
//语文一样,数学从小到大
i = i == 0 ? this.getMath() - o.getMath() : i;
//数学一样,年龄从小到大
i = i == 0 ? this.getAge() - o.getAge() : i;
//年龄一样,名字首字母排序
i = i == 0 ? this.getName().compareTo(o.getName()) : i;
return i;
}