《Mysql基础》【Mysql表查询、去重、表连接、左连接 右连接、子表查询、排序、分组等】 编程入门 学习分享 【公开免费】

 -- mysql数据库程序设计笔记:

第三章:查询

1、单表查询:
1)、简单查询 查所有列:
格式:select * from 表名;
举例:
mysql> select * from tb_student;
+----+-----------+-------------+------+------------+----------+--------+---------+-------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo | studentID         |
+----+-----------+-------------+------+------------+----------+--------+---------+-------------------+
|  1 | 201338941 | 张骞        | 男   | 1980-01-22 | 山西侯马 | 汉     | 3班     | 1423373457656789  |
|  2 | 201348589 | 王博        | 男   | 1981-01-22 | 山西大同 | 汉     | 2班     | 1423377764456632  |
|  3 | 201345232 | 黎明        | 女   | 1983-11-22 | 山西太原 | 汉     | 1班     | 142337776669966   |
|  4 | 201357356 | 李强        | 男   | 1980-03-22 | 山西侯马 | 汉     | 5班     | 1423379476543589  |
|  5 | 201338947 | 李天        | 女   | 1984-07-22 | 山西太原 | 汉     | 4班     | 1423377766656789  |
|  6 | 201323145 | 刘强        | 男   | 1990-04-22 | 山西应县 | 汉     | 3班     | 142337346246789   |
|  7 | 201323462 | 刘泽        | 男   | 1997-09-22 | 山西太原 | 汉     | 2班     | 1423374573456789  |
|  8 | 201323457 | 刘慧        | 女   | 1985-01-22 | 山西大同 | 汉     | 1班     | 14233723414556789 |
+----+-----------+-------------+------+------------+----------+--------+---------+-------------------+
8 rows in set (0.00 sec)

2)、根据列查:
格式:select 列1,列2,列3.... from 表名;
测试:
mysql> select studentName,sex,classNo from tb_student;
+-------------+------+---------+
| studentName | sex  | classNo |
+-------------+------+---------+
| 张骞        | 男   | 3班     |
| 王博        | 男   | 2班     |
| 黎明        | 女   | 1班     |
| 李强        | 男   | 5班     |
| 李天        | 女   | 4班     |
| 刘强        | 男   | 3班     |
| 刘泽        | 男   | 2班     |
| 刘慧        | 女   | 1班     |
+-------------+------+---------+
8 rows in set (0.00 sec)

3)、去重查询:distinct
格式:select distinct(列名) from 表名;
测试:
mysql> select distinct(classNo) from tb_student;
+---------+
| classNo |
+---------+
| 3班     |
| 2班     |
| 1班     |
| 5班     |
| 4班     |
+---------+
5 rows in set (0.03 sec)

4)、年计算查询:(年龄 为自定义别名)
mysql> select year(now())-year(birthday) '年龄' from tb_student;
+-------+
| 年龄  |
+-------+
|    43 |
|    42 |
|    40 |
|    43 |
|    39 |
|    33 |
|    26 |
|    38 |
+-------+
8 rows in set (0.01 sec)
5)、自定义别名:

mysql> select studentName '姓名',sex '性别',classNo '班级' from tb_student;
+------+------+------+
| 姓名 | 性别 | 班级 |
+------+------+------+
| 张骞 | 男   | 3班  |
| 王博 | 男   | 2班  |
| 黎明 | 女   | 1班  |
| 李强 | 男   | 5班  |
| 李天 | 女   | 4班  |
| 刘强 | 男   | 3班  |
| 刘泽 | 男   | 2班  |
| 刘慧 | 女   | 1班  |
+------+------+------+
8 rows in set (0.00 sec)

2、查询条件:(筛选、数据选择、过滤数据)
格式 :select 列 from 表名 where 条件;
常用条件:
——————————————————————————————————————————————————
查询条件 
比较:  =,<>,!=,<,<=,>,>=,!<,!>,not 和比较运算式
集合:  in, not in
字符串:like ,not like 
空值:  is null, is not null
多重:  and ,or
——————————————————————————————————————————————————
1)、查询1班同学:
测试:
select studentName '姓名',sex '性别',classNo '班级' from tb_student where classNo='1班';
+------+------+------+
| 姓名 | 性别 | 班级 |
+------+------+------+
| 黎明 | 女   | 1班  |
| 刘慧 | 女   | 1班  |
+------+------+------+
2 rows in set (0.03 sec)

2)、查合格分,90分合格:
mysql> select * from tb_score where score>=90;
+----+-----------+----------+------+-------+
| id | studentNo | courseNo | term | score |
+----+-----------+----------+------+-------+
|  2 | 201348589 | 9311     | 1    |    96 |
|  8 | 201323457 | 9312     | 4    |    95 |
+----+-----------+----------+------+-------+
2 rows in set (0.00 sec)

mysql>

3)、查询不是1班的同学:
select studentName '姓名',sex '性别',classNo '班级' from tb_student where classNo!='1班';
+------+------+------+
| 姓名 | 性别 | 班级 |
+------+------+------+
| 张骞 | 男   | 3班  |
| 王博 | 男   | 2班  |
| 李强 | 男   | 5班  |
| 李天 | 女   | 4班  |
| 刘强 | 男   | 3班  |
| 刘泽 | 男   | 2班  |
+------+------+------+
6 rows in set (0.00 sec)

4)、带between条件的查询,出生1981到1983年在之间的同学:
mysql> select * from tb_student where birthday between '1981-01-01' and '1983-12-30';
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo | studentID        |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
|  2 | 201348589 | 王博        | 男   | 1981-01-22 | 山西大同 | 汉     | 2班     | 1423377764456632 |
|  3 | 201345232 | 黎明        | 女   | 1983-11-22 | 山西太原 | 汉     | 1班     | 142337776669966  |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
2 rows in set (0.00 sec)

5)、查询出生1981到1983年在之间的同学:

mysql> select * from tb_student where birthday >= '1981-01-01' and  birthday <'1983-12-30';
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo | studentID        |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
|  2 | 201348589 | 王博        | 男   | 1981-01-22 | 山西大同 | 汉     | 2班     | 1423377764456632 |
|  3 | 201345232 | 黎明        | 女   | 1983-11-22 | 山西太原 | 汉     | 1班     | 142337776669966  |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
2 rows in set (0.00 sec)

6)、用in查询1班和2班的同学:
mysql> select * from tb_student where classNo in('1班','2班');
+----+-----------+-------------+------+------------+----------+--------+---------+-------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo | studentID         |
+----+-----------+-------------+------+------------+----------+--------+---------+-------------------+
|  2 | 201348589 | 王博        | 男   | 1981-01-22 | 山西大同 | 汉     | 2班     | 1423377764456632  |
|  3 | 201345232 | 黎明        | 女   | 1983-11-22 | 山西太原 | 汉     | 1班     | 142337776669966   |
|  7 | 201323462 | 刘泽        | 男   | 1997-09-22 | 山西太原 | 汉     | 2班     | 1423374573456789  |
|  8 | 201323457 | 刘慧        | 女   | 1985-01-22 | 山西大同 | 汉     | 1班     | 14233723414556789 |
+----+-----------+-------------+------+------------+----------+--------+---------+-------------------+
4 rows in set (0.00 sec)


7)、查不在1班和2班的同学:
mysql> select * from tb_student where classNo not in('1班','2班');
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo | studentID        |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
|  1 | 201338941 | 张骞        | 男   | 1980-01-22 | 山西侯马 | 汉     | 3班     | 1423373457656789 |
|  4 | 201357356 | 李强        | 男   | 1980-03-22 | 山西侯马 | 汉     | 5班     | 1423379476543589 |
|  5 | 201338947 | 李天        | 女   | 1984-07-22 | 山西太原 | 汉     | 4班     | 1423377766656789 |
|  6 | 201323145 | 刘强        | 男   | 1990-04-22 | 山西应县 | 汉     | 3班     | 142337346246789  |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
4 rows in set (0.00 sec)


8)、查询刘姓同学:
mysql> select * from tb_student where studentName like '刘%';
+----+-----------+-------------+------+------------+----------+--------+---------+-------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo | studentID         |
+----+-----------+-------------+------+------------+----------+--------+---------+-------------------+
|  6 | 201323145 | 刘强        | 男   | 1990-04-22 | 山西应县 | 汉     | 3班     | 142337346246789   |
|  7 | 201323462 | 刘泽        | 男   | 1997-09-22 | 山西太原 | 汉     | 2班     | 1423374573456789  |
|  8 | 201323457 | 刘慧        | 女   | 1985-01-22 | 山西大同 | 汉     | 1班     | 14233723414556789 |
+----+-----------+-------------+------+------------+----------+--------+---------+-------------------+
3 rows in set (0.00 sec)

9)、查询不姓刘的同学:
mysql> select * from tb_student where studentName not like '刘%';
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo | studentID        |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
|  1 | 201338941 | 张骞        | 男   | 1980-01-22 | 山西侯马 | 汉     | 3班     | 1423373457656789 |
|  2 | 201348589 | 王博        | 男   | 1981-01-22 | 山西大同 | 汉     | 2班     | 1423377764456632 |
|  3 | 201345232 | 黎明        | 女   | 1983-11-22 | 山西太原 | 汉     | 1班     | 142337776669966  |
|  4 | 201357356 | 李强        | 男   | 1980-03-22 | 山西侯马 | 汉     | 5班     | 1423379476543589 |
|  5 | 201338947 | 李天        | 女   | 1984-07-22 | 山西太原 | 汉     | 4班     | 1423377766656789 |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
5 rows in set (0.00 sec)

10)、查询姓名中含有强的同学:
mysql> select * from tb_student where studentName like '%强%';
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo | studentID        |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
|  4 | 201357356 | 李强        | 男   | 1980-03-22 | 山西侯马 | 汉     | 5班     | 1423379476543589 |
|  6 | 201323145 | 刘强        | 男   | 1990-04-22 | 山西应县 | 汉     | 3班     | 142337346246789  |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
2 rows in set (0.00 sec)




11)、下划线转义查询,需要加 escape '#'

测试:
查询含别名的班级:
mysql> select * from tb_student where classNo like '%#_%' escape '#';
+----+-----------+-------------+------+------------+----------+--------+----------+-------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo  | studentID         |
+----+-----------+-------------+------+------------+----------+--------+----------+-------------------+
|  9 | 201328864 | 刘名义      | 女   | 1985-01-22 | 山西大同 | 汉     | 1班_超越 | 14233723414556789 |
| 10 | 201324565 | 天一        | 南   | 1985-01-22 | 山西大同 | 汉     | 1班_火箭 | 14233723414556789 |
| 11 | 201323772 | 刘泽好      | 女   | 1985-01-22 | 山西大同 | 汉     | 1班_加强 | 14233723414556789 |
+----+-----------+-------------+------+------------+----------+--------+----------+-------------------+
3 rows in set (0.00 sec)


12)、用 regexp查询 1班和3班的学生:
mysql> select * from tb_student where classNo regexp '1班|3班';
+----+-----------+-------------+------+------------+----------+--------+----------+-------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo  | studentID         |
+----+-----------+-------------+------+------------+----------+--------+----------+-------------------+
|  1 | 201338941 | 张骞        | 男   | 1980-01-22 | 山西侯马 | 汉     | 3班      | 1423373457656789  |
|  3 | 201345232 | 黎明        | 女   | 1983-11-22 | 山西太原 | 汉     | 1班      | 142337776669966   |
|  6 | 201323145 | 刘强        | 男   | 1990-04-22 | 山西应县 | 汉     | 3班      | 142337346246789   |
|  8 | 201323457 | 刘慧        | 女   | 1985-01-22 | 山西大同 | 汉     | 1班      | 14233723414556789 |
|  9 | 201328864 | 刘名义      | 女   | 1985-01-22 | 山西大同 | 汉     | 1班_超越 | 14233723414556789 |
| 10 | 201324565 | 天一        | 南   | 1985-01-22 | 山西大同 | 汉     | 1班_火箭 | 14233723414556789 |
| 11 | 201323772 | 刘泽好      | 女   | 1985-01-22 | 山西大同 | 汉     | 1班_加强 | 14233723414556789 |
+----+-----------+-------------+------+------------+----------+--------+----------+-------------------+
7 rows in set (0.02 sec)


13)、查询缺少课程的信息:
mysql> select * from tb_class where classNo is null;
+----+-----------+---------+-----------+------------+------------+-------+----------+
| id | studentNo | classNo | className | department | enrollTime | grade | classNum |
+----+-----------+---------+-----------+------------+------------+-------+----------+
| 13 |           | NULL    |           |            | 1999-09-01 |     3 |       56 |
+----+-----------+---------+-----------+------------+------------+-------+----------+
1 row in set (0.00 sec)



14)、查询是傣族并且是男性同学:
mysql> select * from tb_student where nation='傣族' and sex='男';
+----+-----------+-------------+------+------------+--------+--------+----------+---------------+
| id | studentNo | studentName | sex  | birthday   | native | nation | classNo  | studentID     |
+----+-----------+-------------+------+------------+--------+--------+----------+---------------+
| 13 | 201385    | 天一        | 男   | 1985-01-22 | 运城   | 傣族   | 1班_火箭 | 1423374456789 |
| 19 | 201385    | 张氏一      | 男   | 1981-01-22 | 运城   | 傣族   | 2班      | 1423374456789 |
| 22 | 201555    | 张通透      | 男   | 1987-01-22 | 临淄   | 傣族   | 5班      | 14233723334   |
+----+-----------+-------------+------+------------+--------+--------+----------+---------------+
3 rows in set (0.00 sec)

15)、查询是傣族或者是山西侯马的同学:
mysql> select * from tb_student where nation='傣族' or native='山西侯马';
+----+-----------+-------------+------+------------+----------+--------+----------+------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo  | studentID        |
+----+-----------+-------------+------+------------+----------+--------+----------+------------------+
|  1 | 201338941 | 张骞        | 男   | 1980-01-22 | 山西侯马 | 汉     | 3班      | 1423373457656789 |
|  4 | 201357356 | 李强        | 男   | 1980-03-22 | 山西侯马 | 汉     | 5班      | 1423379476543589 |
| 13 | 201385    | 天一        | 男   | 1985-01-22 | 运城     | 傣族   | 1班_火箭 | 1423374456789    |
| 19 | 201385    | 张氏一      | 男   | 1981-01-22 | 运城     | 傣族   | 2班      | 1423374456789    |
| 20 | 201399    | 柳依依      | 女   | 1985-01-22 | 太原     | 傣族   | 3班      | 1423456289       |
| 22 | 201555    | 张通透      | 男   | 1987-01-22 | 临淄     | 傣族   | 5班      | 14233723334      |
+----+-----------+-------------+------+------------+----------+--------+----------+------------------+
6 rows in set (0.00 sec)
16)、查询是傣族或者是山西侯马的女性同学的姓名、民族、城市:
mysql> select studentName,nation,native from tb_student where sex='女' and (native='山西侯马' or nation='傣族');
+-------------+--------+--------+
| studentName | nation | native |
+-------------+--------+--------+
| 柳依依      | 傣族   | 太原   |
+-------------+--------+--------+
1 row in set (0.00 sec)

3、排序查询:查询sql最后加:order by 列名;
1)、按姓名升序:
mysql> select * from tb_student order by studentName;
+----+-----------+-------------+------+------------+----------+----------+----------+-------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation   | classNo  | studentID         |
+----+-----------+-------------+------+------------+----------+----------+----------+-------------------+
|  9 | 201328864 | 刘名义      | 女   | 1985-01-22 | 山西大同 | 汉       | 1班_超越 | 14233723414556789 |
| 12 | 201664    | 刘名义      | 女   | 1985-01-22 | 山西大同 | 汉       | 1班_超越 | 1423372333344     |
|  6 | 201323145 | 刘强        | 男   | 1990-04-22 | 山西应县 | 汉       | 3班      | 142337346246789   |
|  8 | 201323457 | 刘慧        | 女   | 1985-01-22 | 山西大同 | 汉       | 1班      | 14233723414556789 |
| 21 | 201664    | 刘明辉      | 女   | 1989-01-22 | 临汾     | 维吾尔族 | 4班      | 1423367789        |
|  7 | 201323462 | 刘泽        | 男   | 1997-09-22 | 山西太原 | 汉       | 2班      | 1423374573456789  |
| 11 | 201323772 | 刘泽好      | 女   | 1985-01-22 | 山西大同 | 汉       | 1班_加强 | 14233723414556789 |
| 13 | 201385    | 天一        | 男   | 1985-01-22 | 运城     | 傣族     | 1班_火箭 | 1423374456789     |
| 10 | 201324565 | 天一        | 南   | 1985-01-22 | 山西大同 | 汉       | 1班_火箭 | 14233723414556789 |
| 19 | 201385    | 张氏一      | 男   | 1981-01-22 | 运城     | 傣族     | 2班      | 1423374456789     |
| 23 | 201442    | 张泽好      | 女   | 1988-01-22 | 晋中     | 汉       | 6班      | 14233723449       |
| 22 | 201555    | 张通透      | 男   | 1987-01-22 | 临淄     | 傣族     | 5班      | 14233723334       |
|  1 | 201338941 | 张骞        | 男   | 1980-01-22 | 山西侯马 | 汉       | 3班      | 1423373457656789  |
|  5 | 201338947 | 李天        | 女   | 1984-07-22 | 山西太原 | 汉       | 4班      | 1423377766656789  |
|  4 | 201357356 | 李强        | 男   | 1980-03-22 | 山西侯马 | 汉       | 5班      | 1423379476543589  |
| 20 | 201399    | 柳依依      | 女   | 1985-01-22 | 太原     | 傣族     | 3班      | 1423456289        |
|  2 | 201348589 | 王博        | 男   | 1981-01-22 | 山西大同 | 汉       | 2班      | 1423377764456632  |
| 18 | 201664    | 王梦        | 女   | 1980-01-22 | 山西大同 | 汉       | 1班      | 1423372333344     |
|  3 | 201345232 | 黎明        | 女   | 1983-11-22 | 山西太原 | 汉       | 1班      | 142337776669966   |
+----+-----------+-------------+------+------------+----------+----------+----------+-------------------+
19 rows in set (0.05 sec)

2)、按姓名降序:最后加:desc;

 select * from tb_student order by studentName desc;
+----+-----------+-------------+------+------------+----------+----------+----------+-------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation   | classNo  | studentID         |
+----+-----------+-------------+------+------------+----------+----------+----------+-------------------+
|  3 | 201345232 | 黎明        | 女   | 1983-11-22 | 山西太原 | 汉       | 1班      | 142337776669966   |
| 18 | 201664    | 王梦        | 女   | 1980-01-22 | 山西大同 | 汉       | 1班      | 1423372333344     |
|  2 | 201348589 | 王博        | 男   | 1981-01-22 | 山西大同 | 汉       | 2班      | 1423377764456632  |
| 20 | 201399    | 柳依依      | 女   | 1985-01-22 | 太原     | 傣族     | 3班      | 1423456289        |
|  4 | 201357356 | 李强        | 男   | 1980-03-22 | 山西侯马 | 汉       | 5班      | 1423379476543589  |
|  5 | 201338947 | 李天        | 女   | 1984-07-22 | 山西太原 | 汉       | 4班      | 1423377766656789  |
|  1 | 201338941 | 张骞        | 男   | 1980-01-22 | 山西侯马 | 汉       | 3班      | 1423373457656789  |
| 22 | 201555    | 张通透      | 男   | 1987-01-22 | 临淄     | 傣族     | 5班      | 14233723334       |
| 23 | 201442    | 张泽好      | 女   | 1988-01-22 | 晋中     | 汉       | 6班      | 14233723449       |
| 19 | 201385    | 张氏一      | 男   | 1981-01-22 | 运城     | 傣族     | 2班      | 1423374456789     |
| 10 | 201324565 | 天一        | 南   | 1985-01-22 | 山西大同 | 汉       | 1班_火箭 | 14233723414556789 |
| 13 | 201385    | 天一        | 男   | 1985-01-22 | 运城     | 傣族     | 1班_火箭 | 1423374456789     |
| 11 | 201323772 | 刘泽好      | 女   | 1985-01-22 | 山西大同 | 汉       | 1班_加强 | 14233723414556789 |
|  7 | 201323462 | 刘泽        | 男   | 1997-09-22 | 山西太原 | 汉       | 2班      | 1423374573456789  |
| 21 | 201664    | 刘明辉      | 女   | 1989-01-22 | 临汾     | 维吾尔族 | 4班      | 1423367789        |
|  8 | 201323457 | 刘慧        | 女   | 1985-01-22 | 山西大同 | 汉       | 1班      | 14233723414556789 |
|  6 | 201323145 | 刘强        | 男   | 1990-04-22 | 山西应县 | 汉       | 3班      | 142337346246789   |
| 12 | 201664    | 刘名义      | 女   | 1985-01-22 | 山西大同 | 汉       | 1班_超越 | 1423372333344     |
|  9 | 201328864 | 刘名义      | 女   | 1985-01-22 | 山西大同 | 汉       | 1班_超越 | 14233723414556789 |
+----+-----------+-------------+------+------------+----------+----------+----------+-------------------+
19 rows in set (0.00 sec)

3)、按姓名降序后,从第二条数据开始查,查询三条数据:
mysql>  select * from tb_student order by studentName desc limit 1,3;
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
| id | studentNo | studentName | sex  | birthday   | native   | nation | classNo | studentID        |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
| 18 | 201664    | 王梦        | 女   | 1980-01-22 | 山西大同 | 汉     | 1班     | 1423372333344    |
|  2 | 201348589 | 王博        | 男   | 1981-01-22 | 山西大同 | 汉     | 2班     | 1423377764456632 |
| 20 | 201399    | 柳依依      | 女   | 1985-01-22 | 太原     | 傣族   | 3班     | 1423456289       |
+----+-----------+-------------+------+------------+----------+--------+---------+------------------+
3 rows in set (0.01 sec)


4、聚合函数查询:

1)、常用聚合函数表:
统计表记录数:count(*) 
统计列值个数:count(列)
求列值最大值:max(列)
求列值最小值:min(列)
求列总和:    sum(列)
求列中平均值:avg(列)

2)、查询班级人数:
mysql> select count(*) num from tb_student;
+-----+
| num |
+-----+
|  17 |
+-----+

3)、查询选课的总人数:
mysql> select count(distinct(studentNo)) from tb_score;
+----------------------------+
| count(distinct(studentNo)) |
+----------------------------+
|                          8 |
+----------------------------+
1 row in set (0.00 sec)

4)、查询编号为:9311的平均成绩:
mysql> select avg(score) from tb_score where courseNo='9311';
+------------+
| avg(score) |
+------------+
|    78.5000 |
+------------+
1 row in set (0.00 sec)

5)、查询课程编号为 9311的最高成绩:
 select max(score) from tb_score where courseNo='9311';
+------------+
| max(score) |
+------------+
|         96 |
+------------+
1 row in set (0.00 sec)


5、分组聚合函数查询:格式:group by 列名;  (必要条件:其中列名不能是函数表达式)

1)、仅分组,无筛选条件查询:(返回每组的第一条数据组成的信息)
select * from tb_score  group by ;
    ( 注意:此查询无意义,一般不这样写,一般加入筛选条件或函数)
	

对:返回每组的第一条数据组成的信息 啥意思?解释如下:

先看看有哪些数据:
mysql> select * from tb_score order by studentNo;
+----+-----------+----------+------+-------+
| id | studentNo | courseNo | term | score |
+----+-----------+----------+------+-------+
|  6 | 201323145 | 9334     | 2    |    69 |
| 10 | 201323145 | 9334     | 8    |    69 |
|  8 | 201323457 | 9312     | 4    |    95 |
| 12 | 201323457 | 9312     | 10   |    55 |
|  7 | 201323462 | 9362     | 3    |    88 |
| 11 | 201323462 | 9362     | 9    |    58 |
|  1 | 201338941 | 9397     | 2    |    70 |
|  5 | 201338947 | 9322     | 3    |    77 |
|  9 | 201338947 | 9322     | 7    |    67 |
|  3 | 201345232 | 9323     | 3    |    84 |
|  2 | 201348589 | 9311     | 1    |    96 |
|  4 | 201357356 | 9311     | 4    |    61 |
+----+-----------+----------+------+-------+
12 rows in set (0.00 sec)

先想一想:可以看到:若按studentNo分组:得到:
id为6、10的为一组,
id为8、12为一组,
id为7、11的为一组,
id为5、9的为一组,
剩余不同的各一组。
共计8组,每组返回一条数据,共8条数据;

id列值依次为:6、8、7、1、5、3、2、4

那么根据分组查:
mysql> select row() NO, * from tb_score group by studentNo;
+----+-----------+----------+------+-------+
| id | studentNo | courseNo | term | score |
+----+-----------+----------+------+-------+
|  6 | 201323145 | 9334     | 2    |    69 |
|  8 | 201323457 | 9312     | 4    |    95 |
|  7 | 201323462 | 9362     | 3    |    88 |
|  1 | 201338941 | 9397     | 2    |    70 |
|  5 | 201338947 | 9322     | 3    |    77 |
|  3 | 201345232 | 9323     | 3    |    84 |
|  2 | 201348589 | 9311     | 1    |    96 |
|  4 | 201357356 | 9311     | 4    |    61 |
+----+-----------+----------+------+-------+
8 rows in set (0.00 sec)
是不是和想的一样?
现在已经明白了吧。
	
2)、查询每个学生的平均分、最高分、选课数:

mysql> select studentNo,avg(score),max(score),count(courseNo) from tb_score group by studentNo;
+-----------+------------+------------+-----------------+
| studentNo | avg(score) | max(score) | count(courseNo) |
+-----------+------------+------------+-----------------+
| 201323145 |    69.0000 |         69 |               2 |
| 201323457 |    75.0000 |         95 |               2 |
| 201323462 |    73.0000 |         88 |               2 |
| 201338941 |    70.0000 |         70 |               1 |
| 201338947 |    72.0000 |         77 |               2 |
| 201345232 |    84.0000 |         84 |               1 |
| 201348589 |    96.0000 |         96 |               1 |
| 201357356 |    61.0000 |         61 |               1 |
+-----------+------------+------------+-----------------+
8 rows in set (0.01 sec)


其中:看其中一组数据:
 8 | 201323457 | 9312     | 4    |    95 |
12 | 201323457 | 9312     | 10   |    55 |
平均值(95+55)/2=75;最大值:95;课程数 2;
由此可见,查询的是对的。

3)、having (1、分组后还要加条件用having,2、若没有group by,会把所有数据分一个组。)

分组后加条件:查询平均分在75分及以上的每个学生的平均分、最高分、选课数:
mysql> select studentNo,avg(score),max(score),count(courseNo) from tb_score group by studentNo having avg(score)>=75;
+-----------+------------+------------+-----------------+
| studentNo | avg(score) | max(score) | count(courseNo) |
+-----------+------------+------------+-----------------+
| 201323457 |    75.0000 |         95 |               2 |
| 201345232 |    84.0000 |         84 |               1 |
| 201348589 |    96.0000 |         96 |               1 |
+-----------+------------+------------+-----------------+
3 rows in set (0.00 sec)

查询大于70分的平均成绩:(若没有group by,会把所有数据分一个组。)
mysql> select avg(score) from tb_score   having avg(score)>=70;
+------------+
| avg(score) |
+------------+
|    74.0833 |
+------------+
1 row in set (0.00 sec)


6、连接查询:
inner join:查询关联匹配的所有数据;
left join:  先查询左表,其他表的列没有显示null;
right join: 先查询右表,其他表的列没有显示null;
1)、交叉查询:
格式:select a.列1,a.列2,b.列1,b.列2    ....   from 表1 a,表2名称 b;   
 (a、b别称可以自定义。)
 查询每个学生选修课程:
select tb_student.*,tb_score.*
from tb_student,tb_score
where tb_student.studentNo=tb_score.studentNo;

2)、内连接 :格式: 表1 inner join 表2 on 条件
 
查询每个学生选修课程:
select tb_student.*,tb_score.*
from tb_student inner join tb_score on
tb_student.studentNo=tb_score.studentNo;


3)、查成绩大于60分的有哪些同学?

select a.studentName
from tb_student a inner join tb_score b 
on a.studentNo=b.studentNo and b.score>60;

+-------------+
| studentName |
+-------------+
| 张骞        |
| 王博        |
| 黎明        |
| 李强        |
| 李天        |
| 李天        |
| 刘强        |
| 刘强        |
| 刘泽        |
| 刘慧        |
+-------------+
10 rows in set (0.00 sec)

(实际工作中经常带有别名进行查询)

4)、left join 左连接查询:

select a.studentName,b.score
from tb_student a left join tb_score b 
on a.studentNo=b.studentNo;
+-------------+-------+
| studentName | score |
+-------------+-------+
| 张骞        |    70 |
| 王博        |    96 |
| 黎明        |    84 |
| 李强        |    61 |
| 李天        |    77 |
| 刘强        |    69 |
| 刘泽        |    88 |
| 刘慧        |    95 |
| 李天        |    67 |
| 刘强        |    69 |
| 刘泽        |    58 |
| 刘慧        |    55 |
| 刘名义      |  NULL |
| 天一        |  NULL |
| 刘泽好      |  NULL |
| 王梦        |  NULL |
| 张氏一      |  NULL |
| 柳依依      |  NULL |
| 刘明辉      |  NULL |
| 张通透      |  NULL |
| 张泽好      |  NULL |
+-------------+-------+
21 rows in set (0.00 sec)
(成绩表中没有关联的成绩信息,显示null)

5)、right join 右连接查询:

先加入2条数据:
insert into tb_score(studentNo,courseNo,term,score)values('201300462','93001','14','88');
insert into tb_score(studentNo,courseNo,term,score)values('201300457','93002','102','45');

查询:
select a.studentName,b.score
from tb_student a right join tb_score b 
on a.studentNo=b.studentNo;

+-------------+-------+
| studentName | score |
+-------------+-------+
| 张骞        |    70 |
| 王博        |    96 |
| 黎明        |    84 |
| 李强        |    61 |
| 李天        |    77 |
| 李天        |    67 |
| 刘强        |    69 |
| 刘强        |    69 |
| 刘泽        |    88 |
| 刘泽        |    58 |
| 刘慧        |    95 |
| 刘慧        |    55 |
| NULL        |    88 |
| NULL        |    45 |
+-------------+-------+
14 rows in set (0.00 sec)
(学生表中没有关联的学生编号,就会显示为null)

  

posted @ 2023-04-01 13:49  刘贵庆  阅读(34)  评论(0编辑  收藏  举报