应用1:分组查人数
查找一个表中男有多少人,女有多少人?
思路:
1.通过性别分组group by
2.聚合函数count(1)来计算男、女性别的人数。
select ........from.... group by....;
应用2:定义等级(必考!!!背也要记住)
例1:
根据每个人的薪资情况,输出他们的等级?
分等级问题的格式↑:case when ...then... when ... then... end(case是开始,end是结束,when后面是等级判断条件,then是定义的等级)
上图的例子中salary是查询出来的薪资,company用来放我们定义的等级。
例2:
给成绩分等级
select (case when...then...when....then....when....then....end)重命名 ,字段 from 表名;
括号里面是对等级的定义,case 开头,end结尾,when..then... when....then....
应用3:子查询 select * from 表名 where......(select.......)
查询表中有相同的薪资的所有人的所有信息:(重复薪资)
思路:
1.括号里:通过薪资分组,having过滤出函数count(*)结果大于1的,这些都是有重复薪资的人。
2.括号外:我们要的是这些人的所有信息,括号里查找的salary,括号外的where表达式也使用salary这个条件。
子查询括号里单独拿出来运行的结果应该是这样的:(通过薪资分组,计算出每种薪资的人数,过滤出人数大于1的信息,也就是有重复薪资的那部分人)
括号外的意思是查出这个表里薪资的所有人的信息。
应用4:
where和having的区别:
1.创建学生成绩表,包括姓名,年龄,成绩这三个字段:
2.插入学生的成绩信息:
3. 子句中group by grade以成绩作为分组,having过滤出聚合函数计算出的有相同成绩的学生(也就是count(1)>1的)。select加where查询所有学生中有相同成绩的学生的信息。
应用5:
一、右连接
1、表的结构信息;
mysql> desc A;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a | varchar(10) | YES | | NULL | |
| b | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> select * from A;
+------+------+
| a | b |
+------+------+
| 1 | b |
+------+------+
1 row in set (0.00 sec)
mysql> desc B;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a | varchar(10) | YES | | NULL | |
| c | varchar(10) | YES | | NULL | |
| d | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> select * from B;
+------+------+------+
| a | c | d |
+------+------+------+
| 1 | c | d |
| 1 | cc | dd |
+------+------+------+
2 rows in set (0.01 sec)
解决方案:使用右连接,具体SQL如下:
mysql> select * from A right join B on A.a=B.a where A.a='1';
+------+------+------+------+------+
| a | b | a | c | d |
+------+------+------+------+------+
| 1 | b | 1 | c | d |
| 1 | b | 1 | cc | dd |
+------+------+------+------+------+
2 rows in set (0.00 sec)
(A表右连接B,B表中的所有内容都会显示,而A表具体显示的内容,要看连接条件,A表中和B表满足连接条件的数据都要显示出来。比如上面的A表有一条数据,B表有两条数据,他们两个表右连接之后,但是A表的内容也显示了两条,这是因为B表中的两条数据都与A表能连接上。
三、
mysql> select * from employee;
+------+----------+------+------+-------+
| id | name | sex | age | score |
+------+----------+------+------+-------+
| 001 | lisi | 女 | 23 | 90 |
| 002 | wangwu | 男 | 23 | 98 |
| 003 | wangmazi | 女 | 20 | 56 |
| 004 | zhaosi | 男 | 26 | 88 |
+------+----------+------+------+-------+
聚合函数的应用 (分组人数
mysql> select sex,sum(score) as score from employee group by sex;
+------+-------+
| sex | score |
+------+-------+
| 女 | 146 |
| 男 | 186 |
+------+-------+
2 rows in set (0.01 sec)
根据分数显示不同的判断情况:(等级问题:在括号里使用case when....then....when.....then.... else.. end 定义输出等级的规则,括号外起别名)
mysql> select (case when score>90 then "优秀" when score>80 then "良 好" else "其他" end) score,name from employee;
+---------+----------+
| score | name |
+---------+----------+
| 良 好 | lisi |
| 优秀 | wangwu |
| 其他 | wangmazi |
| 良 好 | zhaosi |
| 优秀 | lisi |
+---------+----------+
5 rows in set (0.01 sec)
3、子查询查找重复字段
select * from employee where name in (select name
例:
子句中查询有重复last_name 的员工(查到的结果是Facello),然后查询last_name为Facello的员工的所有信息 并且以入职日期为降序排列 显示10行。
统计人数:
select sex,count(1) as 总人数 from employee group by sex;
应用6:
学生表(学生id,姓名,性别,分数) )student(s_id, name, sex, score)
班级表(班级id,班级名称) class(c_id, c_name)
学生班级表(班级id,学生id) student_class(s_id,c_id)
1.查询一班得分在80分以上或者等于60,61,62的学生
2.査询所有班级的名称,和所有班中女生人数和女生的平均分。
2.根据题目,可以看出是以班级做为分组的。还需要每个班的女生的人数和平均分。如果以班级分了组之后 女生就很难挑出来了,所以要做的是先把所有女生都挑出来,再根据班级把他们分组就可以了。
注意:这道题的过滤条件用在from后 group by 前,所以不能用having 要用where来过滤。(where和having的区别)