表关联查询

文章目录

  • 表关联查询
  • 内连接
  • 左连接
  • 右连接

如果多个表存在一定关联关系,可以多表在一起进行查询操作,其实表的关联整理与外键约束之间并没有必然联系,但是基于外键约束设计的具有关联性的表往往会更多使用关联查询查找数据。

  • 简单多表查询

多个表数据可以联合查询,语法格式如下:

select  字段1,字段2... from 表1,表2... [where 条件]
e.g.
select c.name,c.score,h.hobby from class as c,hobby as h
where c.name=h.name;select name,salary,dname from person,dept
where person.dept_id = dept.id;select name,salary,dname from person,dept
where person.dept_id = dept.id and salary>=20000;

笛卡尔积现象就是将A表的每一条记录与B表的每一条记录强行拼在一起。所以,如果A表有n条记录,B表有m条记录,笛卡尔积产生的结果就会产生n*m条记录。

select * from class,hobby;
  • 内连接

内连接查询只会查找到符合条件的记录,其实结果和表关联查询是一样的,官方更推荐使用内连接查询。

SELECT 字段列表FROM 表1  INNER JOIN  表2
ON 表1.字段 = 表2.字段;
select name,salary,dname from person inner join dept
on person.dept_id = dept.id
where salary>=20000;
  • 左连接

  • 左表全部显示,显示右表中与左表匹配的项

SELECT 字段列表FROM 表1  LEFT JOIN  表2
ON 表1.字段 = 表2.字段;
e.g.
select name,salary,dname
from person left join dept
on person.dept_id = dept.id
where salary>=20000;-- 查询每个部门员工人数
select dname,count(name) from dept left join person on dept.id=person.dept_id group by dname;
  • 右连接

  • 右表全部显示,显示左表中与右表匹配的项

SELECT 字段列表FROM 表1  RIGHT JOIN  表2
ON 表1.字段 = 表2.字段;
e.g.
select dname,count(name)
from person right join dept
on person.dept_id = dept.id
group by dname;

注意:我们尽量使用数据量大的表作为基准表,放在前面。

综合查询练习create table class(cid int primary key auto_increment,caption char(4) not null);create table teacher(tid int primary key auto_increment,tname varchar(32) not null);create table student(sid int primary key auto_increment,sname varchar(32) not null,gender enum('male','female','others') not null default 'male',class_id int,foreign key(class_id) references class(cid) on update cascade on delete cascade);create table course(cid int primary key auto_increment,cname varchar(16) not null,teacher_id int,foreign key(teacher_id) references teacher(tid)on update cascade on delete cascade);create table score(sid int primary key auto_increment,student_id int,course_id int,number int(3) not null,foreign key(student_id) references student(sid)on update cascade on delete cascade,foreign key(course_id) references course(cid)on update cascade on delete cascade);insert into class(caption) values('三年一班'),('三年二班'),('三年三班');
insert into teacher(tname) values('魏老师'),('祁老师'),('小泽老师');
insert into student(sname,gender,class_id) values('钢蛋','female',1),('铁锤','female',1),('山炮','male',2),('彪哥','male',3),('虎子','male',3),('妞妞','female',2),('建国','male',2);
insert into course(cname,teacher_id) values('生物',1),('体育',1),('物理',2);
insert into score(student_id,course_id,number) values(1,1,60),(1,2,59),(2,2,100),(3,2,78),(4,3,66),(2,3,78),(5,2,77),(6,1,84),(7,1,79),(5,3,80),(3,1,59);1. 查询每位老师教授的课程数量
2. 查询各科成绩最高和最低的分数,形式 : 课程ID  课程名称 最高分  最低分
3. 查询平均成绩大于85分的所有学生学号,姓名和平均成绩
4. 查询课程编号为2且课程成绩在80以上的学生学号和姓名
5. 查询各个课程及相应的选修人数
6. 查询每位学生的姓名,所在班级和各科平均成绩1. 查询每位老师教授的课程数量
select tname,count(cname)
from teacher left join course
on teacher.tid = course.teacher_id
group by tname;2. 查询各科成绩最高和最低的分数,形式 : 课程ID  课程名称 最高分  最低分
select cid as 课程ID,cname as 课程名称,
max(number) as 最高分,min(number) as 最低分
from course left join score
on course.cid = score.course_id
group by cid,cname;3. 查询平均成绩大于85分的所有学生学号,姓名和平均成绩
select student.sid,sname,avg(number)
from student left join score
on student.sid = score.student_id
group by student.sid,sname
having avg(number) > 85;4. 查询课程编号为2且课程成绩在80以上的学生学号和姓名
select student.sid,sname,number
from student left join score
on student.sid = score.student_id
where course_id=2 and number>80;5. 查询各个课程及相应的选修人数
select cname,count(course_id)
from course left join score
on course.cid = score.course_id
group by cname;6. 查询每位学生的姓名,所在班级和平均成绩
select sname,caption,avg(number)
from student left join class
on student.class_id = class.cid
left join score
on student.sid = score.student_id
group by sname,caption;

Mysql表关系 连接查询相关推荐

  1. mysql连接查询(两个表内和多个表内连接查询)

    连接是关系数据模型的主要特点,连接查询是关系数据库中最主要的查询,包括内连接.外连接等. 当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行 连接查询,得到存放在多个表中的记录数据 ...

  2. mysql多张表join_mysql 连接查询(多表查询)+子查询-初学教程 3【重点】

    第一部分:https://zhuanlan.zhihu.com/p/63217422 第二部分:https://zhuanlan.zhihu.com/p/64153448 Day3 九.连接查询 1. ...

  3. delete from删除几张表关联和mysql几种连接查询总结

    delete from删除几张表关联和mysql几种连接查询总结 一.delete from删除几张表关联 ① 在多表连接时删除数据(错误删除示例): delete from sys_role_men ...

  4. mysql 三个表内连接查询_MySQL5.5多表之连接查询

    连接查询 关系型数据库管理系统中,通常将每个实体的所有信息存放在一张表中,当查询数据时,通过连接操作查询多个表中的实体信息,当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查 ...

  5. 怎么提高大表和小表的连接查询效率?

    怎么提高大表和小表的连接查询效率? 我想到会不会和大表和小表的前后顺序有关系. 小表优先能极大减少比对次数 效率更好 例子: a表10条记录 b表10000条记录 连接条件是a.id = b.id 假 ...

  6. php mysql 查询数据出现连接重置_php使用mysql和mysqli连接查询数据

    mysqli: $code = $_POST['code']; $status = ""; $success = ""; $scookies = "& ...

  7. MySQL内的连接查询(新手必知)

    一.内连接查询 查询信息的来源如果来自多张表,则必须对这些表进行连接查询. 连接是把不同表的记录连到一起的最普遍的方法,通过连接查询可将多个表作为一个表进行处理. 连接查询分为内连接和外连接. 内连接 ...

  8. MYSQL数据库字段关联_MySQL数据库基础——操作关系表、连接查询

    MySQL数据库基础入门--day11 一.操作关联表 1.关联关系: 关联关系有:多对一.多对多和一对多. 一对一关联关系可以应用在以下几方面: (1)分割具有很多列的表 (2)由于安全原因而隔离表 ...

  9. MySQL 表关系及多表操作(联合查询、连接查询、子查询)

    文章目录 表关系 一对一关系 一对多关系 多对多关系 总结 MySQL多表操作 联合查询 联合查询排序 连接查询 交叉连接 内连接 外连接 自然连接 using关键字 子查询 表关系 表关系:一个表代 ...

最新文章

  1. OVS sflow(二十六)
  2. windows。forms.timer设置第一次不等待_面试官:换人!他连 TCP 这几个参数都不懂(一)...
  3. htaccess 实现网址缩短
  4. loadrunner-4-4事务摘要分析
  5. 多线程编程-之并发编程:同步容器
  6. ATT与intel汇编格式区分
  7. php_curl模拟登录有验证码实例
  8. 莫兰迪颜色表以及RGB向16进制颜色的转换连接
  9. FPV穿越机飞行入门练习
  10. cutftp连接redhadlinux
  11. seaweedfs学习
  12. 中南大学湘雅医院冯嵩:业财融合一体化信息平台的建设
  13. php5.6 oracle11,解决ORA-16055: FAL request rejected
  14. python 限定数据范围_python取值范围
  15. 若依的框架怎么样_若依后台管理系统初识
  16. 关于性能测试的这点事,值得收藏~
  17. HDU 4607 Park Visit HDU暑期多校1
  18. 数据库基本概念、DBMS、DBS
  19. 电话号码344格式,修改也保持344格式
  20. 关于HtmlCxx对,C++ 解析,编辑,重新生成HTML的

热门文章

  1. Android项目实战--手机卫士14--接电话时显示电话归属地
  2. 意义第一:何谓以学为导向的学习
  3. Ubuntu使用Glmark2进行跑分
  4. Microsoft office 2013官方正版免费完整版腾讯网盘下载
  5. ”系统管理员设置了系统策略,禁止进行此项安装“解决办法
  6. 电脑高手最常用的五个组合键
  7. el-tabs + 导入简单的excel文件
  8. Altium Designer 20 (3)——原理图库、元件库介绍以及电阻电容模型创建
  9. android 图片加密,安卓手机里的图片怎么加密
  10. 卷积神经网络(CNN)讲解及代码(基于matlab)