MySQL多表查询
多表查询也叫关联查询,把多张相关联的表通过关联关系联系起来,并通过关联关系(外键)去查询需要的数据。
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
一对多(多对一)
案例: 部门与员工的关系
关系: 一个部门对应多个员工,一个员工对应一个部门。
实现: 在多的一方建立外键,指向一的一方的主键。
多对多
案例: 学生与课程的关系。
关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择。
实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。create table student_course(id int auto_increment comment "主键" primary key, studentid int not null comment "学生ID", courseid int not null comment "课程ID", constraint fk_courseid foreign key (courseid) references course (id), constraint fk_studentid foreign key (studentid) references student (id) )comment "学生课程中间表";
一对一
案例: 用户与用户详情的关系
关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另 一张表中,以提升操作效率
实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合 和 B集合的所有组合情况。
在SQL语句中,如何来去除无效的笛卡尔积呢? 我们可以给多表查询加上连接查询的条件即可。 select * from dept,emp where dept.id = emp.dept_id;
连接查询
内连接:相当于查询A、B交集部分数据
内连接的语法分为两种: 隐式内连接、显式内连接。
隐式内连接select d.name,e.name from dept as d ,emp as e where d.id = e.dept_id;
显式内连接select d.name,e.name from dept as d join emp e on d.id = e.dept_id;
外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据select e.*,d.name from emp as e left join dept d on d.id = e.dept_id;
右外连接:查询右表所有数据,以及两张表交集部分数据select e.*,d.* from emp as e right join dept d on d.id = e.dept_id;
注意事项: 左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺 序就可以了。而我们在日常开发使用时,更偏向于左外连接。
自连接:当前表与自身的连接查询,自连接必须使用表别名
内连接查询select e.name"领导",m.name from emp as e join emp as m on e.id = m.managerid;
外连接查询select e.name,m.name from emp as e left join emp as m on e.id = m.managerid;
子查询
SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
子查询外部的语句可以是INSERT增 /DELETE删 /UPDATE改 / SELECT查 的任何一个。
根据子查询结果不同,分为:
A. 标量子查询(子查询结果为单个值)(单人员单条件)
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
常用的操作符:= <> > >= < <=select id from dept where name = "研发部";
select * from emp where dept_id = (select id from dept where name = "研发部");
B. 列子查询(子查询结果为一列)(多人员单条件)
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL
select id from dept where name = "销售部" or name = "研发部";select * from emp where dept_id in (select id from dept where name = "销售部" or name = "研发部");
C. 行子查询(子查询结果为一行)(单人员多条件)
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:= 、<> 、IN 、NOT INselect salary, managerid from emp where name = "张无忌";
select * from emp where (salary,managerid) = (select salary, managerid from emp where name = "张无忌");
D. 表子询(子查询结果为多行多列)(多条件多人员)
子查询返回的结果是多行多列,这种子查询称为表子查询。
常用的操作符:INselect job, salary from emp where name = "鹿杖客" or name = "宋远桥"; select * from emp where (job,salary) in (select job, salary from emp where name = "鹿杖客" or name = "宋远桥");
多表查询实现的方式很多,只要是方便快捷,都可以尝试。
萎缩性胃炎,距离癌症有多远?胃癌是中国的高发肿瘤之一,大概发病率排在第四位。在全球范围之内,中国的胃癌患者大约占了全球的43左右。而萎缩性胃炎其实是一个癌前病变,经过三年五年之后,就可能会成为胃癌。那么萎缩性
如何通过睡眠感知尿酸高的情况?尿酸高,睡觉会有哪些症状?严重吗?通常而言,在没有出现痛风前,尿酸高没有症状。什么是尿酸高呢?在正常嘌呤饮食状态下,(非同日)两次空腹血尿酸水平420molL,就被称为高尿酸血症,
常吃6种食物,或可帮助延缓衰老从生物学角度讲,衰老是生物体随时间而自发和不可避免的过程,这是一种复杂的自然现象,表现为结构退化和功能下降,以及适应性和抵抗力下降。随着生活水平的提高,人们越来越意识到养生,希望通
肝癌的预防措施是哪些生活中很多人们对于预防肝癌疾病的方法都是想要了解的,因为大家在生活中只有做好预防工作才可以减少肝癌这种疾病的发生与伤害,帮助更多的人们都能够拥有一个健康的身体,那么肝癌的预防措施都
32年来第一人!天才少年首次闯进大满贯决赛,球王宝座一战定乾坤2022年美国网球公开赛继续进行。男子单打赛场,一场下半区半决赛落下帷幕。比赛的双方,是由赛会3号种子西班牙天才少年阿尔卡拉斯,迎战东道主宠儿,赛会22号种子蒂亚福。今年美网男单四
欧洲杯上戏剧化的一场比赛今天法国对阵土耳其的比赛简直不要太刺激,强如NBA都很少在生死战出现这样的神剧本啊!法国这边由富尼耶戈贝尔领衔,土耳其则是科尔克马兹奥斯曼带队,首节比赛打完,比赛几乎是对法国一边倒
中超最新积分榜,黑马60大胜升第5,申花被绝平,守住第4位北京时间9月10日,中超联赛第17轮,上海申花客场1比1战平浙江队,于汉超连续3场比赛进球,穆谢奎点球破门扳平比分。梅州客家6比0大胜河北队,积分达到29分,排名第5位,河北队再次
7382!男篮世界第1倒下无缘决赛再见美国队三分球30中8美锦赛半决赛,美国男篮对阵阿根廷男篮,最终,美国队7382倒下,无缘决赛!再见美国队,他们本场比赛三分命中率不高,只有30中8。美国队世界排名第1,阿根廷队世界排名第7,虽然这次的
3球7助攻!梅西法甲狂飙,创2大纪录5大联赛第一,完胜007C罗北京时间9月10日2300,202223赛季法甲联赛第7轮,法甲领头羊巴黎圣日耳曼坐镇主场王子公园球场迎战布雷斯特。最终,巴黎凭借着梅西上半场助攻内马尔的进球10战胜了对手。新赛季
恭喜!中国体坛又一对冠军夫妻求婚成功,相恋15年队友变爱人说起中国田径队,苏炳添的名字想必大家都不会陌生,在中国田径队,队内除了苏炳添,还有一位优秀的短跑运动员,那就是谢震业。虽然在短跑队的成绩赶不上苏炳添,但是对爱情的专一程度,丝毫不输
直播天选之子刘国宝,3分钟造两点,中国男足3比1战胜亚洲劲旅U20亚洲杯预选赛中国男足VS缅甸。这场比赛,在凌晨二点半举行,依然有无数的铁杆球迷观看直播。虽然我们球迷常常恨铁不成钢,怒骂他们,然而,关键时刻,还是这些铁杆球迷站在中国男足身边