首页 > 数据库 >35.MySQL数据库【五】多表查询和子查询

35.MySQL数据库【五】多表查询和子查询

时间:2024-05-31 09:22:09浏览次数:12  
标签:多表 name dep 35 查询 emp where id select

多表查询和子查询

【一】概念

  • 子查询:将一条SQL语句的查询结果加括号当做另外一条SQL语句的查询结果

  • 链表查询:先将多张表拼接到一起,形成一张大表,让后基于单表查询获取数据

1)创建数据

# 建表
create table dep(
		id int PRIMARY KEY AUTO_INCREMENT,
    name varchar(20)
);
CREATE TABLE emp (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20),
    sex ENUM("male","female") NOT NULL DEFAULT "male",
    age INT,
    dep_id INT
);

# 插数据
insert into dep values
("200","技术部"),
("201","人力资源"),
("202","销售部"),
("203","运营部"),
("204","售后部");
insert into emp(name,sex,age,dep_id) values
("dream","male",18,200),
("chimeng","female",18,201),
("menmgneg","male",38,202),
("hope","male",18,203),
("own","male",28,204),
("thdream","male",18,205);

# 查看数据
mysql> select * from dep;
+-----+--------------+
| id  | name         |
+-----+--------------+
| 200 | 技术部       |
| 201 | 人力资源     |
| 202 | 销售部       |
| 203 | 运营部       |
| 204 | 售后部       |
+-----+--------------+
5 rows in set (0.00 sec)
mysql> select * from emp;
+----+----------+--------+------+--------+
| id | name     | sex    | age  | dep_id |
+----+----------+--------+------+--------+
|  1 | dream    | male   |   18 |    200 |
|  2 | chimeng  | female |   18 |    201 |
|  3 | menmgneg | male   |   38 |    202 |
|  4 | hope     | male   |   18 |    203 |
|  5 | own      | male   |   28 |    204 |
|  6 | thdream  | male   |   18 |    205 |
+----+----------+--------+------+--------+
6 rows in set (0.00 sec)

【一】子查询

1)获取某一员工所在部门

1.先获取员工的部门编号

select dep_id from emp where name='dream';
mysql> select dep_id from emp where name='dream';
+--------+
| dep_id |
+--------+
|    200 |
+--------+
1 row in set (0.00 sec)

2.将结果作为查询条件

select name from dep where id=(select dep_id from emp where name='dream');
mysql> select name from dep where id=(select dep_id from emp where name='dream');
+-----------+
| name      |
+-----------+
| 技术部    |
+-----------+
1 row in set (0.00 sec)

2)查询部门是计数

1.先获取部门id

select id from dep where name ="技术部";
mysql> select id from dep where name ="技术部";
+-----+
| id  |
+-----+
| 200 |
+-----+
1 row in set (0.00 sec)

2.将结果作为查询条件

select * from emp where dep_id in (select id from dep where name ="技术部");
mysql> select * from emp where dep_id in (select id from dep where name ="技术部");
+----+-------+------+------+--------+
| id | name  | sex  | age  | dep_id |
+----+-------+------+------+--------+
|  1 | dream | male |   18 |    200 |
+----+-------+------+------+--------+
1 row in set (0.00 sec)

【二】联表查询

1)笛卡尔积概念

  • 在SQL中,当我们使用JOIN操作将两个或更多的表连接在一起时,结果集中的行数是所有连接表的行数的乘积。这就是所谓的笛卡尔积。
  • 例如,假设我们有两个表A和B,其中A有5行,B有3行。
  • 如果我们使用INNER JOIN将这两个表连接起来,那么结果集中将会有5 x 3 = 15行。
  • 这是因为对于每一行A,我们可以从B中选择任意一行进行匹配。
  • 因此,总共有5种不同的方式来组合A表中的每一行和B表中的每一行,这导致了最终结果集的大小为5 x 3 = 15。
  • 这个过程就是笛卡尔积,它是数学中的一种运算,用于计算两个集合的所有可能的元素组合的数量。
  • 在这个情况下,每个元素都是一个表格中的行。
  • 所以,当我们在MySQL中使用JOIN操作时,结果集的大小实际上是所有连接表的行数的乘积,这就是为什么我们称其为笛卡尔积的原因。

2)拼表

  • 将所有组合都展示出来
select * from dep,emp;

image-20240530192544687

3)拼表升级

  • 只显示符合条件的组合
select * from dep,emp where emp.dep_id = dep.id;

image-20240530192711889

4)拼表关键字

1.inner join(内连接)

  • 只拼两表共有的数据
select * from emp inner join dep on emp.dep_id=dep.id;

image-20240530192944106

2.left join(左连接)

  • 展示左表所有数据,没有对应数据则用null表示
select * from emp left join dep on emp.dep_id=dep.id;

image-20240530193114297

3.right join(右连接)

  • 展示右表所有数据,没有对应数据则用null表示
select * from emp right join dep on emp.dep_id=dep.id;

image-20240530193200940

4.union(全连接)

左右两表的数据都展示出来,没有对应数据则用null表示

select * from emp left join dep on emp.dep_id=dep.id
union
select * from emp right join dep on emp.dep_id=dep.id;

image-20240531084419786

标签:多表,name,dep,35,查询,emp,where,id,select
From: https://www.cnblogs.com/Mist-/p/18223781

相关文章

  • 3598. 二叉树遍历 已知前序 中序 求后序遍历
    #include<iostream>usingnamespacestd;voidpostOrder(stringpre,stringin)//定义后序遍历函数,参数为前序遍历和中序遍历结果字符串{if(in.size()){charroot=pre[0];//获取前序遍历结果的第一个字符作为根节点intk=in.find(......
  • ISBN查询图书api接口
          基本说明:接口地址:http://data.isbn.work/openApi/getInfoByIsbn?isbn={isbn}&appKey={appkey}返回格式:json请求方式:get请求示例:http://data.isbn.work/openApi/getInfoByIsbn?isbn=9787531526445&appKey=ae1718d4587744b0b79f940fbef69e77+v 809137232请求参......
  • CSS3媒体查询与页面自适应示例
    CSS3媒体查询(MediaQueries)是CSS的一个强大功能,它允许你根据设备的特性(如视口宽度、分辨率等)来应用不同的样式。这在创建响应式网站(即能自动适应不同屏幕尺寸和设备的网站)时非常有用。以下是一个简单的CSS3媒体查询和页面自适应的示例:首先,我们假设有一个简单的HTML结构:<!DOCTY......
  • 全国产RK3568J + FPGA的PCIe、FSPI通信实测数据分享!
    测试数据汇总案例时钟频率理论速率测试结果FSPI通信案例150MHz71.53MB/s读速率:67.452MB/s写速率:52.638MB/sPCIe通信案例100MHz803.09MB/s读速率:595.24MB/s写速率:791.14MB/s备注:(1)当TLPheadersize=16Byte时,PCIe理论传输速率为:7......
  • 含税168元起!四核A53+NPU+PCIe+USB3.0,瑞芯微RK3562性价比真高!
     ......
  • MySQL查询详解:单表查询、多表查询、分组查询、子查询
    效率工具推荐一个程序员的常用工具网站,效率加倍嘎嘎好用:程序员常用工具云服务器云服务器限时免费领:轻量服务器2核4G腾讯云:2核2G4M云服务器新老同享99元/年,续费同价阿里云:2核2G3M的ECS服务器只需99元/年,续费同价MySQL查询详解:单表查询、多表查询、分组查询、子查询在......
  • 基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的
    在做一些常规应用的时候,我们往往需要确定条件的内容,以便在后台进行区分的进行精确查询,在移动端,由于受限于屏幕界面的情况,一般会对多个指定的条件进行模糊的搜索,而这个搜索的处理,也是和前者强类型的条件查询处理类似的处理过程,因此本篇随笔探讨两种不同查询在前端界面上的展示效......
  • 日常开发中注意点总结(三)对于分页查询、详情查询总到底哪些字段该回传回来,数据库的回传
    还有个问题,对于分页查询、详情查询这些接口中,到底是哪些字段应该回传给前台,其实还是依赖于前台需要对哪些字段做展示,需要使用哪些字段。一般对于resVo响应实体,都是包含哪些应该返回的字段(前端应该展示的字段),这种的再后面查询数据库的时候,直接查询该展示的字段,这是没有任何异......
  • 分布式任务调度内的 MySQL 分页查询优化
    一、背景介绍最近在线上环境发现了一条执行较慢的分页查询,高并发执行,产生了大量的慢查询日志,CPU使用率逐步升高。通过观察它的执行时间,发现该SQL查询时快时慢,执行时间并不稳定,以至于在高并发执行场景时,数据库来不及响应,数据库服务变慢。二、分析定位2.1定位SQL执行......
  • 多重查询 5 个只有 1 个 ID 的表,连接查询从 5 个表中获取结果
    关于我的表格,我正在为我喜欢玩的一款游戏创建一个脚本,如果人们的账户分配了XYZ语句,我就会创建一个脚本。它基于4个表。1个表保存了带有比赛ID的过往比赛,下一个表保存了比赛ID与玩家ID的关系,表3保存了玩家ID与游戏内ID的关系,而最后一个表保存了有关分配给他们的声......