数据库中的分组查询和连接查询

分组查询和连接查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 转载联系邮箱:1363119685@qq.com
Copyright © 2018 DAR林克斯 保留所有权利

一、分组查询:
在使用SELECT查询数据时,还可以使用它的一个子句GROUP BY对查询结果进行分组统计,所以分组查询往往需要结合聚合函数一起使用。
语法:

SELECT <字段名列表|*> FROM <表名> [WHERE <条件表达式1>] [GROUP BY <分组地字段名> [HAVING <条件表达式2>]];

说明:
1)GROUP BY <分组地字段名>:表示按哪个字段进行分组。
2)WHERE <条件表达式1>:在分组前对查询进行过滤。
3)HAVING <条件表达式2>:在分组统计地结果再进行过滤。

1.GROUP BY单独使用的情况:
举例:

/*按年级编号统计学生人数*/
SELECT COUNT(*) 学生人数,grade_id 年级编号 FROM tb_student GROUP BY grade_id ; 
#查询成绩表:按课程编号统计平均分
SELECT AVG(student_score) 平均分,subject_id 课程编号 FROM tb_score GROUP BY subject_id;

2.GROUP BY结合HAVING一起使用:
举例:

/*按课程编号统计平均分(只显示平均分高于73的信息)*/
SELECT AVG(student_score) 平均分,subject_id 课程编号 FROM tb_score GROUP BY subject_id HAVING 平均分 > '73';
3.GROUP BY结合HAVINGWHERE地使用:

举例:

/*按课程编号统计"成绩及格"的平均分(只显示平均分高于78的信息)*/
SELECT ROUND(AVG(student_score),2) 平均分,subject_id 课程编号 
FROM tb_score WHERE student_score >= '60' GROUP BY subject_id HAVING 平均分 >= '78';

二、连接查询:
在实际项目开发过程中,往往需要将多个表关联查询,关联的方式“连接查询”、“子查询”。
1.内连接查询:
语法:

SELECT <字段名列表|*> FROM <表1名> INNER JOIN <表2名> ON <连接条件表达式> [WHERE <筛选条件表达式>];

说明:
1)连接的表可以是多个,都使用INNER JOIN连接。
2)连接条件表达式是使用ON来指定的。

1)等值的内连接查询:

#查询学生信息,显示学生所在的“年级名称”
SELECT * FROM tb_student st INNER JOIN tb_grade ge ON st.grade_id = ge.grade_id; 

2)不等值的内连接查询:

#查询学生信息,显示学生所在的“年级名称”
SELECT * FROM tb_student st INNER JOIN tb_grade ge ON st.grade_id <> ge.grade_id;

自然连接NATURAL JOIN
语法:

SELECT <字段名列表|*> FROM <表1名> NATURAL JOIN <表2名>

举例:SELECT * FROM tb_student NATURAL JOIN tb_grade;
SELECT * FROM tb_grade NATURAL JOIN tb_score;

2.交叉连接查询:CROSS JOIN
语法:

SELECT <字段名列表|*> FROM <表1名> CROSS JOIN <表2名> ON <连接条件表达式> [WHERE <筛选条件表达式>];

说明:连接的表可以是多个,都使用CROSS JOIN连接。
连接条件表达式是使用ON来指定的。

/*举例:*/
SELECT ge.*,st.* FROM tb_student st CROSS JOIN tb_grade ge ON st.grade_id = ge.grade_id;

3.外连接查询:
1)左外连接查询:LEFT JOIN
语法:

SELECT <字段名列表|*> FROM <左表名> LEFT JOIN <右表名> ON <连接条件表达式> [WHERE <筛选条件表达式>];

说明:以左表为主,左表有的数据都会显示出来,若右表没有的数据使用NULL代替。
举例:

SELECT * FROM tb_grade ge LEFT JOIN tb_student st ON st.grade_id = ge.grade_id;

2)右外连接查询:RIGHT JOIN
语法:

SELECT <字段名列表|*> FROM <左表名> RIGHT JOIN <右表名> ON <连接条件表达式> [WHERE <筛选条件表达式>];

说明:以右表为主,右表有的数据都会显示出来,若左表没有的数据使用NULL代替。
举例:

SELECT * FROM tb_grade ge RIGHT JOIN tb_student st ON st.grade_id = ge.grade_id;

小结:“内连接”、“外连接”的查询区别:
“外连接”以左表或右表位基准进行,基准表中的主键(外键)有的数据都会被查询。
“内连接”是确保两个都有的数据(主键/外键)才能进行连接查询(关键字是ON)。
以前使用的多个联合查询就是一个隐式的内连接查询,也就是两个表中都有的数据才能进行连接查询(关键字是WHERE)。
4.自连接查询(一个案例):
/思路:将一张表当作多张表来看待,多张表就可以进行连接查询,最终实现自己连接的效果/

#请查询tb_emp表,查询“员工编号”、“员工姓名”、“上司编号”、“上司姓名”
SELECT employee.EMPNO 员工编号,employee.ENAME 员工姓名,manager.EMPNO 上司编号,manager.ENAME 上司姓名 
FROM tb_emp manager INNER JOIN tb_emp employee ON employee.MGR = manager.EMPNO;

ps:博主最近也是遇到了很多问题,在不断的学习进步,想成为一个大神,可惜路途遥远,希望所学对大家有所帮助吧!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值