文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Mysql 多表关联查询

2023-08-21 18:28

关注

1.1 多表关系

Mysql多表之间具有三种关系:一对一、一对多、多对多

1.2 外键约束

外键约束(foreign key)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。在有外键约束的前提下,不能直接删除主表中的数据,因为从表对主表有关联关系,但是可以删除从表中的数据。在实际sql查询中,外键约束对查询无影响

外键约束的创建

语法1,在创建表的时候设置外键约束,在 create table 语句中,通过 foreign key 关键字来指定外键:[constraint <外键名>] foreign key 字段名 [,字段名2,…] references <主表名> 主键列1 [,主键列2,…]示例1-- 部门表create table if not exists dept(  deptno varchar(20) primary key ,  -- 部门号  name varchar(20) -- 部门名字);-- 员工表create table if not exists emp(  eid varchar(20) primary key , -- 员工编号  ename varchar(20), -- 员工名字  age int,  -- 员工年龄  dept_id varchar(20),  -- 员工所属部门  constraint emp_fk foreign key (dept_id) references dept (deptno)- 外键约束);语法2,创建表之后创建外键约束alter table <数据表名> add constraint <外键名> foreign key(<列名>) references <主表名> (<列名>);示例2-- 创建部门表create table if not exists dept2(  deptno varchar(20) primary key ,  -- 部门号  name varchar(20) -- 部门名字);-- 创建员工表create table if not exists emp2(  eid varchar(20) primary key , -- 员工编号  ename varchar(20), -- 员工名字  age int,  -- 员工年龄  dept_id varchar(20)  -- 员工所属部门 );-- 创建外键约束alter table emp2 add constraint dept_id_fk foreign key(dept_id) references dept2 (deptno);

在表的多对多关系中,我们只需要在中间表创建两个外键约束即可。

外键约束的删除

语法:alter table <表名> drop foreign key <外键约束名>;示例:alter table emp2 drop foreign key dept_id_fk;

2.1 交叉连接查询:笛卡尔积

select * from A,B; 
  1. 交叉连接查询返回被连接的两个表所有数据行的笛卡尔积
  2. 笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
  3. 假如A表有m行数据,B表有n行数据,则返回m*n行数据
  4. 笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选

2.2 内连接查询:inner join

在这里插入图片描述

-- 隐式内连接:select * from A,B where 条件; -- 显示内连接:select * from A inner join B on 条件;-- 示例:select * from dept3,emp3 where dept3.deptno = emp3.dept_id;select * from dept3 inner join emp3 on dept3.deptno = emp3.dept_id;

2.3 外连接查询

2.3.1 左连接:

在这里插入图片描述

-- 语法:select * from A left outer join B on 条件;-- 示例:select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id;

2.3.2 右连接:

在这里插入图片描述

-- 语法: select * from A right outer join B on 条件; -- 示例:select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;

2.3.4 满外连接:

在这里插入图片描述
mysql中,我们经常使用union关键字实现两个表(两个查询)的满外连接,两者的区别如下

使用union关键字需要注意

-- 使用union关键字实现左外连接和右外连接的并集select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_idunion select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;

2.4 子查询:

子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含select嵌套的查询。

-- 1. 子查询返回单行单列select eid,ename,age from emp3 where age = (select max(age) from emp3);-- 2. 单行多列select eid,ename,t.name from emp3 where dept_id in (select deptnofrom dept3 where name = '研发部' or name = '销售部') ;-- 3. 多行多列select eid,age,ename,name from (select * from dept where name = '研发部 ')t1,(select * from emp3 where age <20)t2

子查询中的关键字

-- 1. all关键字:与子查询返回的所有值比较为true 则返回true-- 查询年龄大于‘1003’部门所有年龄的员工信息select * from emp3 where age > all(select age from emp3 where dept_id = '1003’);-- 2. any(some)关键字:与子查询返回的任何值比较为true 则返回true-- 查询年龄大于‘1003’部门任意一个员工年龄的员工信息select * from emp3 where age > any(select age from emp3 where dept_id = '1003)-- 3. in关键字:用于判断某个记录的值,是否在指定的集合中-- 查询研发部和销售部的员工信息,包含员工号、员工名字select eid,ename,t.name from emp3 where dept_id in (select deptno from dept3 where name = '研发部' or name = '销售部') ;-- 4. exists关键字:EXISTS后面的子查询不返回任何实际数据,只返回真或假,当返回真时 where条件成立,EXISTS关键字,比IN关键字的运算效率高-- 查询公司是否有大于60岁的员工,有则输出select * from emp3 a where exists(select * from emp3 b where a.age > 60);

2.5 表自关联

有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。注意自关联时表必须给表起别名。

select 字段列表 from1 a ,1 b where 条件;或者 select 字段列表 from1 a [left] join1 b on 条件;

来源地址:https://blog.csdn.net/weixin_44639720/article/details/129765949

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯