已更新!宝藏教程!MYSQL-第六章节多表查询(一对一,多对多,一对多),连接查询(内,外连接),联合查询,子查询 代码例题详解这一篇就够了(附数据准备代码)

news2024/9/27 12:18:04

   c++知识点合集已经完成欢迎前往主页查看,点点赞点点关注不迷路哦

点我进入c++第一章知识点合集

MYSQL第一章节DDL数据定义语言的操作----点我进入

MYSQL第二章节DDL-数据库操作语言 DQL-数据查询语言----点我进入

MYSQL第三章节DCL-管理用户,控制权限----点我进入

MYSQL第四章节常用函数说明----点我进入

MYSQL第五章节有关约束操作详解----点我进入

MYSQL-第六章节多表查询

目录

多表查询

多对多

例子 :将学生表与课程表建立联系

 一对一

例子

多表查询例题

多表查询 -- 笛卡尔积

连接查询-内连接

隐式内连接

显示内连接 

例子 

连接查询-外连接

左外连接 

右外连接 

例子 

连接查询-自连接 

例题

联合查询 -unio,unio all

例子

子查询 

标量子查询

例子

列子查询 

例子


多表查询

多表查询基本分为三种(一对多,多对多,一对一) 

多对多

对于多对多的关系而言应该需要建立第三张中间表,中间表至少包含两个外键,分别关联两个主键

例子 :将学生表与课程表建立联系

​创建学生表

CREATE TABLE studen (
id int auto_increment primary key comment '主键id',
name varchar(50),
no int 
)comment '学生表';
insert into student (name,no)  values ('黛绮丝',200100101),('谢逊',200100102),('嬴政天',200100103),('韦一笑',200100104);

创建课程表

CREATE TABLE course(
id int auto_increment primary key comment '主键id',
name varchar(50) comment '课程名称'
)comment '课程表';
insert into course VALUES (NULL,'JAVA'),(NULL,'PHP'),(NULL,'Mysql'),(null,'hadoop');

建立第三张表(学生课程关系表)并于上面两张表关联

CREATE TABLE student_course(
id int auto_increment primary key comment '主键id',
studentid int not null comment '学生id', 
courseid int not null comment '课程id',
constraint fk_studentid FOREIGN KEY (studentid) REFERENCES student(id),
constraint fk_courseid foreign key (courseid) references course(id)
)comment '学生课程中间表';
insert into student_course (studentid,courseid) values(1,1),(1,2),(1,3),(2,1),(2,4);

 一对一

 在任意一方加入外键,关联另一方的主键,并且设置外键的唯一约束(UNIQUE)

例子

创建用户基本信息表

CREATE TABLE tb_user(
id int auto_increment primary key comment '主键id',
name varchar(50) comment '姓名',
age int comment '年龄',
gender char(1) comment '性别',
phone varchar(11) comment '电话号码'
)comment '用户基本信息表';
insert into tb_user (name,age,gender,phone) values('黄渤',45,'1','17263648590'),('冰冰',35,'2','17276448590'),
('码云',55,'1','17364950374'),('李彦宏',50,'1','17263495064');

创建用户教育信息表并添加外键约束

CREATE TABLE tb_user_edu(
id int auto_increment primary key ,
degree char(2),
major varchar(50),
primaryschool  varchar(50),
middleschool varchar(50),
university varchar(50),
userid int,
constraint fk_userid foreign key (userid) references tb_user(id)
)
insert into tb_user_edu (degree,major,primaryschool,middleschool,university,userid) values
('本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈学院',1),
('硕士','表演','朝阳区第一小学','朝阳区第一中学','北京电影学院',2),
('本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学',3),
('本科','应用数学','阳泉第一小学','阳泉第一中学','清华大学',3);

多表查询例题

数据准备

-- 准备数据
create table dept(
    id   int auto_increment comment 'ID' primary key,
    name varchar(50) not null comment '部门名称'
)comment '部门表';

create table emp(
    id  int auto_increment comment 'ID' primary key,
    name varchar(50) not null comment '姓名',
    age  int comment '年龄',
    job varchar(20) comment '职位',
    salary int comment '薪资',
    entrydate date comment '入职时间',
    managerid int comment '直属领导ID',
    dept_id int comment '部门ID'
)comment '员工表';

-- 添加外键
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4, '销售部'), (5, '总经办'), (6, '人事部');
INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id) VALUES
            (1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),

            (2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
            (3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
            (4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
            (5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
            (6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),

            (7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),
            (8, '周芷若', 19, '会计',48000, '2006-06-02', 7,3),
            (9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),

            (10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),
            (11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),
            (12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),
            (13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),

            (14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),
            (15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),
            (16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),
            (17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);

​ 

多表查询 -- 笛卡尔积
 

select * from emp , dept where emp.dept_id = dept.id; 

连接查询-内连接

隐式内连接

SELECT 字段列表 FROM 表1,表2 WHERE 条件...;

显示内连接 

SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件...;

内连接是两张表交集的部分

例子 

数据见上面的数据准备

查询每一位员工的姓名,以及关联部门的名称(隐示内连接实现 )

SELECT emp.name,DEPT.name FROM emp,dept WHERE emp.dept_id = dept.id;

数据见上面的数据准备

查询每一位员工的姓名,以及关联部门的名称(显示内连接实现 )

SELECT emp.name ,dept.name from emp join dept on emp.dept_id = dept.id;

连接查询-外连接

左外连接 

SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件...;

相当于查询表1(左表)的所有数据包含表1和表2的所有数据

右外连接 

SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件...;

 相当于查询表2(右表)的所有数据包含表1和表2的所有数据

例子 

数据见上面的数据准备

查询emp表的所有数据,和对应部门的信息(左外连接)

select emp.*,dept.name from emp left outer join dept on emp.dept_id = dept.id;

数据见上面的数据准备

查询dept表的所有数据,和对应员工的信息(右外连接)

select dept.* ,emp.* from dept right outer join emp on emp.dept_id = dept.id;

 

连接查询-自连接 

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;

自连接查询,可以是内连接查询,也可以是外连接查询。

例题

查询每个员工直属领导的名字

SELECT a.name,b.name FROM emp a,emp b where a.managerid=b.id;

 查询所有员工及其领导的名字,如果员工没有领导,也需要查询出来

SELECT a.name,b.name FROM emp a left join dept b on a.managerid=b.id;

 

联合查询 -unio,unio all

对于unio查询,就是把多次查询的结果组合起来,形成一个新的查询结果

SELECT 字段名 FROM 表A...
UNION [ALL]
SELECT 字段名 FROM 表B...;

例子

将薪资低于5000的员工,和年龄大于50岁的员工全部查寻出来

SELECT * FROM emp where salary <5000
union all
SELECT * FROM emp where age>50;

有查询出来但是出现了重复的数据我们可以做如下修改 

SELECT * FROM emp where salary <5000
union 
SELECT * FROM emp where age>50;

 

注意:

联合查询的多张表需要保持一致,字段类型也需要保持一致。

union all 会将全部数据直接合并在一起,union会对合并以后的数据去重。

子查询 

子查询又称为嵌套查询SQL语句里面嵌套SELECT语句

SELECT * FROM T1 WHERE COLUMN1 = (SELECT COULMN1 FROM T2);

子查询外部的语句可以是INSERT/DPDATE/DELETESELECT的任何一个 

根据子查询的结果不同,分为:

标量子查询(结果为单个值)

列子查询(结果为一列)

行子查询(结果为一行)

表子查询(结果为多行或者多列)

标量子查询

常用操作符:= <> > >= < <=

例子

数据准备见上面的数据准备代码

查询销售部的所有员工信息

--查询销售部的所有员工信息--

--查询销售部门的id
SELECT id FROM dept where name='销售部';

--根据销售部门的id来查询员工信息--
SELECT * FROM emp where (SELECT id FROM dept where name='销售部');

查询“方东白”入职之后的员工信息

--查询“方东白”入职之后的员工信息--

--查询房东白的入职时间--
 SELECT ENTRYDATE FROM EMP WHERE NAME='方东白';
 
 --查询指定日期之后的入职员工--
 SELECT * FROM emp WHERE entrydate > ( SELECT ENTRYDATE FROM EMP WHERE NAME='方东白');

列子查询 

常用操作符:IN NOT IN ANY SOME ALL

例子

查询销售部和市场部的所有员工信息

 --查询销售部和市场部的所有员工信息--
 
 --查询销售部和市场部的id--
 SELECT ID FROM dept WHERE NAME='销售部'or name='市场部';
 
 ----根据id查询销售部和市场部的所有员工信息--
 SELECT * FROM emp where dept_id in ( SELECT ID FROM dept WHERE NAME='销售部'or name='市场部');

 查询比财务部所有员工工资都高的员工信息

 -- 查询比财务部所有员工工资都高的员工信息--
 
 --查询财务部的id
 SELECT id FROM DEPT WHERE NAME='财务部';
 
 --查询ID查询财务部所有员工的工资--
 SELECT salary from emp where dept_id=(SELECT id FROM DEPT WHERE NAME='财务部');
 
 --查询比财务部所有员工工资都高的员工信息--
 SELECT * FROM emp where salary >all(SELECT salary from emp where dept_id=(SELECT id FROM DEPT WHERE NAME='财务部'));

 查询比研发部任意员工工资都高的员工信息 

 -- 查询比研发部任意员工工资高的员工信息--
 
 --查询研发部的id
 SELECT id FROM DEPT WHERE NAME='研发部';
 
 --查询ID查询研发部所有员工的工资--
 SELECT salary from emp where dept_id=(SELECT id FROM DEPT WHERE NAME='研发部');
 
 --查询比研发部任意员工工资高的员工信息--
 SELECT * FROM emp where salary >any(SELECT salary from emp where dept_id=(SELECT id FROM DEPT WHERE NAME='研发部'));

行子查询

常用穿制符号 = <>  IN  NOT IN

例子

查询与张无忌的薪资及直属领导相同的员工信息

--查询与张无忌的薪资及直属领导相同的员工信息--

--查询张无忌的薪资以及直属领导--
SELECT salary,managerid  FROM emp where name='张无忌';

--查询与张无忌的薪资及直属领导相同的员工信息--
SELECT * FROM emp where (salary,managerid)=(SELECT salary,managerid  FROM emp where name='张无忌');

表子查询 

常用操作符: IN

--查询与鹿杖客,宋远桥的职位和薪资相同的员工信息--

--查询鹿杖客,宋远桥的职位和薪资--
SELECT salary,job FROM emp where name='鹿杖客'or name='宋远桥';

--查询与鹿杖客,宋远桥的职位和薪资相同的员工信息--
SELECT * FROM emp where (salary,job)in(SELECT salary,job FROM emp where name='鹿杖客'or name='宋远桥');

查询入职日期是“2006-01-01”之后的员工信息,及其部门信息 

    

--查询入职日期是“2006-01-01”之后的员工信息,及其部门信息 --

--查询入职日期是“2006-01-01”之后的员工信息--
SELECT * FROM emp where entrydate>'2006-01-01';

--查询入职日期是“2006-01-01”之后的员工信息,及其部门信息 --
SELECT * FROM (SELECT * FROM emp where entrydate>'2006-01-01') a,DEPT WHERE (a.dept_id=dept.id);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1133428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows安装数据库MySQL

windows安装数据库MySQL 文章目录 windows安装数据库MySQL一、MySQL官网下载压缩包二、在D盘新建文件夹D:\MySQL&#xff0c;将下载的压缩包解压到该文件夹下三、配置环境变量四、通过命令行模式安装、启用、配置SQL服务 一、MySQL官网下载压缩包 下载地址&#xff1a;https:/…

Unity ShaderGraph 必会,实用的渐变滑条

常用来做一下区分不同区间部位的区别 G 对应的是 UV 的垂直轴Y R 对应的是 UV 的水平轴X 举个例子&#xff1a; 是不是层次感立马就不一样了呀&#xff0c;嘻嘻嘻嘻嘻嘻嘻 加了渐变的&#xff1a; 没有加渐变的&#xff1a;

C# 图解教程 第5版 —— 第7章 深入理解类

文章目录 7.1 类成员7.2 成员修饰符的顺序7.3 实例类成员&#xff08;*&#xff09;7.4 静态字段&#xff08;*&#xff09;7.5 从类的外部访问静态成员7.5.1 静态字段示例7.5.2 静态成员的生存期 7.6 静态函数成员7.7 其他静态类成员类型7.8 成员常量7.9 常量与静态量7.10 属性…

SLAM从入门到精通(三边测量法详解)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 三边测量&#xff0c;或者说叫三角定位&#xff0c;是定位系统中很常见的一种测量方法。它最主要的原理就是依靠已有的三个特征坐标和半径&#xf…

安全典型配置(五)SNMP中应用ACL过滤非法网管案例

【微|信|公|众|号&#xff1a;厦门微思网络】 安全典型配置&#xff08;一&#xff09;使用ACL限制FTP访问权限案例 安全典型配置&#xff08;二&#xff09;使用ACL限制用户在特定时间访问特定服务器的权限 安全典型配置&#xff08;三&#xff09;使用ACL禁止特定用户上网…

mysql 命令行安装

一、安装包下载 1、下载压缩包 &#xff08;1&#xff09;公众号获取 关注微信公众号【I am Walker】&#xff0c;回复“mysql”获取 &#xff08;2&#xff09;官网下载 安装地址MySQL :: Download MySQL Community Server ​ ​ 二、解压 下载完之后进行解压&…

如何学习能减少对现有工作的依赖?

减少对现有工作的依赖需要你提升自己的技能和能力&#xff0c;并拓宽你的职业选择。以下是一些具体的步骤&#xff1a; 自我评估: 确定你目前的技能和兴趣&#xff0c;并识别哪些领域你可以提升或学习新的技能。 设定学习目标: 根据自我评估的结果&#xff0c;设定具体的学习目…

嵌入式学习笔记(63)位操作实战

(1)给定一个整型数a&#xff0c;设置a的bit3&#xff0c;保证其他位不变。 a | (1<<3) (2)给定一个整形数a&#xff0c;设置a的bit3~bit7&#xff0c;保持其他位不变 a | (0x1f<<3) (3)给定一个整型数a&#xff0c;清除a的bit15&#xff0c;保证其他位不变。 a …

鸿运主动安全监控云平台任意文件下载漏洞复现 [附POC]

文章目录 鸿运主动安全监控云平台任意文件下载漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 鸿运主动安全监控云平台任意文件下载漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术…

SpringBoot 源码分析(三) 监听器分析以及属性文件加载分析

前言 在创建SpringBoot项目的时候会在对应的application.properties或者application.yml文件中添加对应的属性信息&#xff0c;这些属性文件是什么时候被加载的&#xff1f;如果要实现自定义的属性文件怎么来实现&#xff1f;在讲属性加载之前先讲下监听器分析。 一、监听器分…

Apifox:满足你对 Api 的所有幻想

一、Api 管理的难点在哪&#xff1f; 相信无论是前端&#xff0c;还是后端的测试和开发人员&#xff0c;都遇到过这样的困难。不同工具之间数据一致性非常困难、低效。多个系统之间数据不一致&#xff0c;导致协作低效、频繁出问题&#xff0c;开发测试人员痛苦不堪。 开发人…

面向中小型企业的高效企业备份解决方案

​如今&#xff0c;数据保护并不是一个新概念。无论是在个人、家庭、非营利组织还是企业环境中&#xff0c;我们都不想丢失数据&#xff0c;尤其是对于企业来说。无论您的公司规模有多小&#xff0c;与个人使用环境相比&#xff0c;它都会拥有更多的设备、更大的数据量和更低的…

css 两栏布局的实现

目录 前言 1. 浮动布局 用法 代码示例 理解 2. Flex布局 用法 代码示例 理解 3. Grid布局 用法 代码示例 理解 高质量的设计 前言 两栏布局是一种常见的网页设计模式&#xff0c;它将页面分为两个主要区域&#xff1a;主内容区域和侧边栏。这种布局方式不仅能够提…

Java精品项目源码第61期汽车零件销售商城系统(代号V063)

Java精品项目源码第61期汽车零件销售商城系统(代号V063) 大家好&#xff0c;小辰今天给大家介绍一个汽车零件销售商城系统&#xff0c;演示视频公众号&#xff08;小辰哥的Java&#xff09;对号查询观看即可 文章目录 Java精品项目源码第61期汽车零件销售商城系统(代号V063)难…

资料分析错题

答案 ca 间隔增长率 DD

《动手学深度学习 Pytorch版》 10.4 Bahdanau注意力

10.4.1 模型 Bahdanau 等人提出了一个没有严格单向对齐限制的可微注意力模型。在预测词元时&#xff0c;如果不是所有输入词元都相关&#xff0c;模型将仅对齐&#xff08;或参与&#xff09;输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力集中的输出来实现…

学习嵌入式开发是不是需要很高的天赋智商能力?

今日话题&#xff0c;学习嵌入式开发是不是需要很高的天赋智商能力&#xff1f;我认为提出此疑问的人可能缺乏自信&#xff0c;需要培养自信心。学习嵌入式开发并不要求非常高的智商&#xff0c;成千上万的工程师已经从事这个行业&#xff0c;他们中的大多数都是非常普通的人。…

Hadoop3.0大数据处理学习3(MapReduce原理分析、日志归集、序列化机制、Yarn资源调度器)

MapReduce原理分析 什么是MapReduce 前言&#xff1a;如果想知道一堆牌中有多少张红桃&#xff0c;直接的方式是一张张的检查&#xff0c;并数出有多少张红桃。 而MapReduce的方法是&#xff0c;给所有的节点分配这堆牌&#xff0c;让每个节点计算自己手中有几张是红桃&#…

SpringBoot 源码分析(一) 启动过程分析

SpringBoot源码核心内容 SpringBoot的源码主要核心有以下几块; 1、是run()方法 &#xff0c;做一些准备工作 2、是自动装配原理 3、配置文件加载原理 4、tomcat内嵌原理 一、springboot.run()方法分析 在run方法中主要做的事情如下&#xff1a; SpringBootApplication public c…

局域网内无法连接时间源?使用Chrony服务搭建时间源

1.安装chrony yum install -y chrony2.启动和设置配置文件 systemctl start chronyd3.设置为系统自动启动 systemctl enable chronyd以上服务器都需要安装 4.服务器192.168.1.63配置&#xff1a; 打开配置文件 /etc/chrony.conf 配置 allow 192.168.0.0/24 systemct…