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

   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.mfbz.cn/a/103835.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

28、Flink 的SQL之DROP 、ALTER 、INSERT 、ANALYZE 语句

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

笔记/日记应用 memos

memos &#xff0c;一款很惊艳的笔记应用&#xff0c;UI很漂亮&#xff0c;交互体验也很好&#xff0c;还有其他的小伙伴基于memos开发了不同平台的客户端。 图源-Gihub页 可以说这个是私人笔记系统的天花板&#xff0c;推荐给大家。

vue重修之Vuex【上部】

文章目录 版权声明Vuex 概述Vuex 的主要概念和组件 vuex的使用状态 &#xff08;state&#xff09;Vuex特点 访问vuex中数据$store访问mapState辅助函数访问 开启严格模式及Vuex的单项数据流突变&#xff08;mutations&#xff09;mutations初识带参 mutations辅助函数 mapMuta…

N——>BatchSize 数据维度理解和处理(chun, cat, squeeze, unsqueeze)

数据处理之N——>BatchSize N——>batch_size train_data TensorDataset(torch.Tensor(x_train).double(), torch.Tensor(y_train).double()) train_loader DataLoader(train_data, batch_sizeargs.bs, shuffleTrue, drop_lastTrue) for batch_idx, (inputs, results…

自动化测试07Selenium01

目录 什么是自动化测试 Selenium介绍 Selenium是什么 Selenium特点 工作原理 SeleniumJava环境搭建 Selenium常用的API使用 定位元素findElement CSS选择语法 id选择器&#xff1a;#id 类选择 .class 标签选择器 标签名 后代选择器 父级选择器 自己选择器 xpath …

Django实现音乐网站 (22)

使用Python Django框架做一个音乐网站&#xff0c; 本篇音乐播放器功能完善&#xff1a;顺序播放、设置播放数、歌词滚动等功能。 目录 顺序播放 设置顺序播放 单曲播放数 添加路由 视图处理 模板处理 歌词滚动 视图内容返回修改 样式设置 模板内容 歌词滚动脚本 歌…

【C++代码】安排行程,N皇后,解数独--代码随想录

题目&#xff1a;重新安排行程 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…

[Docker]二.Docker 镜像,仓库,容器介绍以及详解

一.Docker 镜像,容器,仓库的简单介绍 通俗来讲:镜像相当于VM虚拟机中的ios文件,容器相当于虚拟机系统,仓库相当于系统中的进程或者执行文件,容器是通过镜像创建的 1.镜像 Docker 镜像就是一个 Linux 的文件系统&#xff08; Root FileSystem &#xff09;&#xff0c;这个文…

一百九十五、MySQL——MySQL数据库创建只读权限的账号(附流程截图)

一、目的 在团队开发过程中&#xff0c;为了实现数据共享以及避免其他团队修改库表数据&#xff0c;需要提供数据库只读权限的账号&#xff0c;因此以MySQL数据库为例&#xff0c;创建MySQL数据库只读权限的账号 二、实施步骤 &#xff08;一&#xff09;第一步&#xff0c;…

栈(Stack)的概念+MyStack的实现+栈的应用

文章目录 栈&#xff08;Stack&#xff09;一、 栈的概念1.栈的方法2.源码分析 二、MyStack的实现1.MyStack的成员变量2.push方法3.isEmpty方法和pop方法4.peek方法 三、栈的应用1.将递归转化为循环1.调用递归打印2.通过栈逆序打印链表 栈&#xff08;Stack&#xff09; 一、 栈…

Nginx动静分离

为了加快网站的解析速度&#xff0c;可以把动态页面和静态页面由不同的服务器来解析&#xff0c;加快解析速度。降低原来单个服务器的压力。 在动静分离的tomcat的时候比较明显&#xff0c;因为tomcat解析静态很慢&#xff0c;其实这些原理的话都很好理解&#xff0c;简单来说&…

T113-S3-buildroot文件系统tar解压缩gz文件

目录 前言 一、现象描述 二、解决方案 三、tar解压缩.gz文件 总结 前言 本文主要介绍全志T113-S3平台官方SDK&#xff0c;buildroot文件系统tar不支持.gz文件解压缩的问题以及如何配置buildroot文件系统解决该问题的方法介绍。 一、现象描述 在buildroot文件系统中&#xff…

Doceker-compose——容器群集编排管理工具

目录 Docker-compose 1、Docker-compose 的三大概念 2、YAML文件格式及编写注意事项 1&#xff09;使用 YAML 时需要注意下面事项 2&#xff09;ymal文件格式 3&#xff09;json格式 3、Docker Compose配置常用字段 4、Docker-compose的四种重启策略 5、Docker Compos…

强劲升级,太极2.x你值得拥有!

嗨&#xff0c;大家好&#xff0c;最近桃桃没顾得上给大家分享好用好玩的软件。 还记得前段时间给大家分享的太极1.0软件&#xff1f; 最近大佬对软件进行了全新升级&#xff0c;升级后的功能更强更稳定&#xff0c;轻度用户使用基本功能就已经足够了&#xff0c;壕无人性的同学…

Openssl数据安全传输平台004:Socket C-API封装为C++类 / 服务端及客户端代码框架和实现

文章目录 0. 代码仓库1. 客户端C API2. 客户端C API的封装分析2.1 sckClient_init()和sckClient_destroy()2.2 sckClient_connect2.3 sckClient_closeconn()2.4 sckClient_send()2.5 sckClient_rev()2.6 sck_FreeMem 3. 客户端C API4. 服务端C API5. 服务端C6. 客户端和服务端代…

Ubuntu 安装 npm 和 node

前言 最近学习VUE&#xff0c;在ubuntu 2204 上配置开发环境&#xff0c;涉及到npm node nodejs vue-Cli脚手架等内容&#xff0c;做以记录。 一、node nodejs npm nvm 区别 &#xff1f; node 是框架&#xff0c;类似python的解释器。nodejs 是编程语言&#xff0c;是js语言的…

题目 1053: 二级C语言-平均值计算(python详解)——练气三层初期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…

外网nat+nat server,内网做路由过滤,以及ppp CHAR认证 企业网搭建

作业 网络拓扑图如下所示&#xff1a; 要求&#xff1a;做适当的截图&#xff0c;表示完成相应的操作。 按照网络拓扑要求搭建网络结构&#xff0c;按照个人学号配置每个节点的IP地址&#xff0c;其中X为班级号&#xff0c;Y为学号末尾2位&#xff1b;Y1为学号末尾2位1&#…

uniapp接入萤石微信小程序插件

萤石官方提供了一些适用于uniapp / 小程序的方案 如 小程序半屏 hls rtmp 等 都TM有坑 文档写的依托答辩 本文参考了uniapp小程序插件 以及 萤石微信小程序插件接入文档 效果如下 1. 插件申请 登录您的小程序微信公众平台&#xff0c;点击左侧菜单栏&#xff0c;进入设置页…

【超详细】CentOS 7安装MySQL 5.7【安装及密码配置、字符集配置、远程连接配置】

准备工作&#xff1a;CentOS 7系统&#xff0c;并确保可以联通网络 1、获取MySQL 5.7 Community Repository软件包 注意&#xff1a;这里使用的是root用户身份。 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm2、安装软件包 rpm -ivh mysql5…
最新文章