应用1:分组查人数

查找一个表中男有多少人,女有多少人?

mysql统计各部门男女的人数_右连接

 

 思路:

1.通过性别分组group by

2.聚合函数count(1)来计算男、女性别的人数。

select ........from.... group by....;

 

应用2:定义等级(必考!!!背也要记住)

例1:

根据每个人的薪资情况,输出他们的等级?

mysql统计各部门男女的人数_数据_02

 分等级问题的格式↑:case  when ...then...  when ... then... end(case是开始,end是结束,when后面是等级判断条件,then是定义的等级)

上图的例子中salary是查询出来的薪资,company用来放我们定义的等级。


例2:

给成绩分等级

 

mysql统计各部门男女的人数_右连接_03

select (case when...then...when....then....when....then....end)重命名 ,字段  from  表名;

括号里面是对等级的定义,case 开头,end结尾,when..then...  when....then....

 

应用3:子查询 select * from 表名 where......(select.......)

查询表中有相同的薪资的所有人的所有信息:(重复薪资)

mysql统计各部门男女的人数_右连接_04

 

思路:

1.括号里:通过薪资分组,having过滤出函数count(*)结果大于1的,这些都是有重复薪资的人。

2.括号外:我们要的是这些人的所有信息,括号里查找的salary,括号外的where表达式也使用salary这个条件。

子查询括号里单独拿出来运行的结果应该是这样的:(通过薪资分组,计算出每种薪资的人数,过滤出人数大于1的信息,也就是有重复薪资的那部分人)

mysql统计各部门男女的人数_数据_05

 括号外的意思是查出这个表里薪资的所有人的信息。 

 

应用4:

where和having的区别:

1.创建学生成绩表,包括姓名,年龄,成绩这三个字段:

mysql统计各部门男女的人数_mysql统计各部门男女的人数_06

 

 2.插入学生的成绩信息:

mysql统计各部门男女的人数_mysql_07

 

 3. 子句中group by grade以成绩作为分组,having过滤出聚合函数计算出的有相同成绩的学生(也就是count(1)>1的)。select加where查询所有学生中有相同成绩的学生的信息。

mysql统计各部门男女的人数_数据_08

 

mysql统计各部门男女的人数_右连接_09

 

应用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

例:

mysql统计各部门男女的人数_mysql_10

 

mysql统计各部门男女的人数_右连接_11

子句中查询有重复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.根据题目,可以看出是以班级做为分组的。还需要每个班的女生的人数和平均分。如果以班级分了组之后 女生就很难挑出来了,所以要做的是先把所有女生都挑出来,再根据班级把他们分组就可以了。

mysql统计各部门男女的人数_数据_12

 注意:这道题的过滤条件用在from后 group by 前,所以不能用having 要用where来过滤。(where和having的区别)