-- 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)
标签:01,22,查询,studentNo,score,Mysql,tb,连接,select From: https://www.cnblogs.com/liuguiqing/p/17278527.html