07:MYSQL----多表查询

2023-11-09

目录

1:多表查询概述

2:多表查询分类

 3:内连接

3:外连接

4:自连接  

 5:联合查询-union,union all

6:子查询


1:多表查询概述

select * from emp , dept;

emp:表中有6条数据,   dept表中有5条数据只查询出来的数据为:30条

概述:指从多张表中查询数据

笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合和 B集合的所有组合情况。(在多表查询时,需要消除无效的笛0卡尔积)

--加上where条件消除笛卡尔积

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

2:多表查询分类

内连接:相当于查询A、B交集部分数据

外连接:   

                左外连接:查询左表所有数据,以及两张表交集部分数据

                右外连接:查询右表所有数据,以及两张表交集部分数据

自连接:当前表与自身的连接查询,自连接必须使用表别名

 3:内连接

语法   [  ]是可选向,所有可以省略 :

--隐式内连接
select 字段列表 from 表1,表2  where 条件....;

--显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件;

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

-- 内连接演示
-- 1. 查询每一个员工的姓名 , 及关联的部门的名称 隐式内连接实现
-- 表结构: emp ,dept
-- 连接条件: emp.dept_id = dept.id
select emp.name,dept.name from emp , dept where emp.dept_id=dept.id ;
select e.name,d.name from emp e , dept d where e.dept_id=d.id ;
-- 在起的别名后,只可以使用别名否则会报错
-- 显示内连接 
select e.name, d.name from emp e inner join dept d on e.dept_id = d.id;

3:外连接

左外连接:

select 字段列表 from 表1  left [outer] join 表2 on 条件...;

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

右外连接:

select 字段列表 from 表1 right [outer] join 表2 on 条件....;

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

-- 左连接
select e.name, d.name from emp e left outer join dept d on e.dept_id = d.id;
select e.*, d.name from emp e left join dept d on e.dept_id = d.id; -- outer 是可选项
-- 右连接
select d.*, e.* from emp e right outer join dept d on e.dept_id = d.id;
-- 一般情况下左连接使用的较多,右连接可以转换为左连接
select d.*, e.* from dept d left outer join emp e on e.dept_id = d.id;

4:自连接  

语法:

对一张表进行查询(一张表自己连接自己)

select 字段列表 from 表A 别名A join 表B 别名B on 条件....;

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

-- 自连接
-- 1. 查询员工 及其 所属领导的名字
-- 表结构: emp
select a.name , b.name from emp a , emp b where a.managerid = b.id;
-- 2. 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来
-- 表结构: emp a,emp b
select a.name '员工', b.name '领导' from emp a left join emp b on a.managerid = b.id;

 自连接时要把一张表看为两张表

 5:联合查询-union,union all

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

select 字段列表 from 表A...
union [all]
select 字段列表 from 表B...

对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致

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

实际上就是把2次的查询结果放在一起打印出来

select * from emp where salary < 50000
union all
select * from emp  where age > 50;


select * from emp where salary < 50000
union 
select * from emp  where age > 50;

6:子查询

概念:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。

select * from t1 where column1=(select column1 from t2);

子查询外部语句可以是: insert    update    delete   select   的任何一个

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

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

B:列子查询(子查询结果为一列)

C:行子查询(子查询结果为一行,可以是多列)

D:表子查询(子查询结果为多行多列)

根据子查询位置,分为where之后、from之后、select之后。

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

-- 2.查询在“小昭”入职之后的员工信息
-- a.查询小昭的入职日期
select entrydate from emp where name ="小昭";
-- b 查询所有员工的的入职日期
select * from emp where entrydate > "2004-10-12";
-- 完整的sql
select * from emp where entrydate >(select entrydate from emp where name ="小昭");
-- -- 1.查询“研发部"的所有员工信息
-- a:研发部的部门id
select id from dept where name="研发部";
-- b:查询所有员工的信息
select * from emp where dept_id="1";
-- 完整sql
select * from emp where dept_id=(select id from dept where name="研发部");

B:列子查询(子查询结果为一列)

子查询返回的结果为一列(可以是多行),这种子查询称为列子查询

常使用的符号:in,    not in   ,any ,some ,allch

        操作符 描述
in 在指定的集合范围之内,多选一
not in 不在指定的集合范围之内
any 子查询返回列表中,有任意一个满足即可
some 与ANY等同,使用SOME的地方都可以使用ANY
all 子查询返回列表的所有值都必须满足
--列子查询
-- 1.查询“销售部"和“研发部""的所有员工信息
-- a.查询“销售部"和1“研发部"的部门ID
select id from dept where name='销售部' or name= '研发部' ;
-- b.根据部门ID,查询员工信息
select * from emp where dept_id in (select id from dept where name='销售部' or name= '研发部' );


-- 2.查询比研发部所有人工资都高的员工信息
-- a.查询研发部所有财务部人员工资
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='研发部'));

-- 3. 查询比研发部其中任意一人工资高的员工信息
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='研发部'));

C:行子查询(子查询结果为一行,可以是多列)

行子查询
 子查询返回的结果是一行(可以是多列),这种子查询称为行子查询常用的操作符:  = 、<>、IN 、   NOT IN

-- 行子查询
-- 1. 查询与“张无忌”的薪资及直属领导相同的员工信息 ;
select salary,managerid from emp where name='张无忌';

select * from emp where  (salary,managerid)=(select salary,managerid from emp where name='张无忌');

D:表子查询(子查询结果为多行多列)

子查询返回的结果是多行多列,这种子查询称为表子查询C常用的操作符:IN  -----在指定的集合范围之内,多选一

-- 1。 查询与“韦一笑”,“常巡春”的职位和薪资的员工信息
-- a:首先查询韦一笑”,“常巡春”的职位和薪资
select job,salary from emp where name='韦一笑' or name='常巡春';

select * from emp where (job,salary) in (select job,salary from emp where name='韦一笑' or name='常巡春');

-- 2. 查询入职日期是 “2001-01-01” 之后的员工信息 , 及其部门信息
select * from emp where entrydate >'2001-01-01';

select e.*,d.* from (select * from emp where entrydate >'2001-01-01') e left join dept d on d.id=e.dept_id;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

07:MYSQL----多表查询 的相关文章

  • 使用Perl/DBI/MySQL/InnoDB查找外键信息

    我想以编程方式查找 MySQL 数据库中特定 InnoDB 表的外键 我正在使用 Perl 我偶然发现 dbh gt foreign key info 我刚刚尝试使用它 但似乎有点错误 它不会返回 ON DELETE 和 ON UPDATE
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • 错误代码:1305。函数或过程不存在

    因此 我在 MySQL 中创建一个函数 然后尝试向用户授予使用该函数的权限 但我无法这样做 这就是我正在做的 DELIMITER USE rxhelp36 scbn DROP FUNCTION IF EXISTS businessDayDi
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • 如何从批量数据中的mysql列中删除所有非数字字符

    我想从列中删除所有非数字字符 我的数据库中有大量数据 目前我正在使用以下链接中描述的方法 http venerableagents wordpress com 2011 01 29 mysql numeric functions http
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • MySQL/PDO::quote() 尽管使用 PDO::PARAM_INT 参数,但仍在整数周围加上引号

    无论我传递给什么值 数据类型对 它都会出现 pdo gt quote value type 它总是将其引用为字符串 echo pdo gt quote foo PDO PARAM STR foo as expected echo pdo g
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • 数字表与递归 CTE 生成一系列数字

    为什么使用数字表比使用递归 CTE 动态生成它们要快得多 在我的机器上 给定一张桌子numbers单列n 主键 包含从1到100000的数字 查询如下 select n from numbers 大约需要 400 毫秒才能完成 使用递归 C
  • SELECT max(x) 返回 null;我怎样才能让它返回0?

    运行以下命令时如何返回 0 而不是 null SELECT MAX X AS MaxX FROM tbl WHERE XID 1 假设没有XID 1的行 or SELECT coalesce MAX X 0 AS MaxX FROM tbl
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例
  • 使用加权行概率从 PostgreSQL 表中选择随机行

    输入示例 SELECT FROM test id percent 1 50 2 35 3 15 3 rows 你会如何编写这样的查询 平均 50 的时间我可以获得 id 1 的行 35 的时间 id 2 的行 15 的时间 id 3 的行
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主

随机推荐

  • 【Linux】重启后进入了紧急模式&应急模式(emergency mode)

    本章进行测试 复现问题 将 etc fstab 挂载 home 参数defaults写错 一般在编辑 etc fstab后都会去执行mount a 这里可以看到执行后并未出现错误 那么咱们重启测试一下 可以看到如图所示出现的错误信息 解决办
  • 系统移植部署开发阶段

    环境搭建 家目录下安装tftp服务器 实现linux系统对tftp目录得文件传输 准备文件 将uboot镜像文件 TF A镜像文件反在tftp目录下 开发板与linux系统得连接 在串口工具打印信息ums 0 mmc 0 将TF卡挂载到Ub
  • Zotero及其插件的安装及使用

    Zotero及其插件的安装及使用 对于学生而言 或多或少得看论文 现在市场上最流行的论文管理工具当属Zotero 作为一个开源的软件 其包括了获取文献 查看文献 文献分类 即时编写笔记等功能 此外还能利用不少插件方面学习 例如Zotero
  • java中将List数据平均切分成N份

    话不多说 直接上代码 直接用 public static
  • 栈与递归

    文章目录 递归 函数调用 递归工作栈 递归算法的效率分析 递归转换为非递归 递归算法优点 递归 若在一个函数 过程或数据结构定义的内部又直接 或间接 出现定义本身的应用 则称它们是递归 三种常使用递归的情况 定义是递归的 例1 阶乘函数 l
  • 网络安全(黑客)必备工具包

    1 NMap 作为Network Mapper的缩写 NMap是一个开源的免费安全扫描工具 可用于安全审计和网络发现 它适用于Windows Linux HP UX Solaris BSD变体 包括Mac OS 以及AmigaOS Nmap
  • PHP的pack/unpack

    前言 直接参照官网 PHP pack Manual PHP中文手册 PHP中国镜像 php 国内镜像 PHP官方网站 PHP unpack Manual PHP中文手册 PHP中国镜像 php 国内镜像 PHP官方网站 1 作用 1 pac
  • Cannot determine path to ‘tools.jar‘ library for openjdk-17

    idea错误 Cannot determine path to tools jar library for openjdk 17 解决方法 把project structure 1 7全部去掉 只留1 8 再运行tomcat7就不报错了
  • vue-cli3打包文件增加hash值

    vue config js中加入以下代码 module exports filenameHashing true 打包后为文件名增加hash值 chainWebpack config gt config output filename js
  • [Python]windows平台python第三方模块安装gcc failed with exit status 1问题的解决

    在windows平台命令行用pip install安装库的时候 经常遇到not found vcvarsall bat这种问题 手动下载源码自己编译 又经常有很多问题 1 在单位没有安装VS 安了mingw32 编译设置成python se
  • [转]增强型N沟道mos管(如si2300)开关条件

    增强型N沟道mos管 如si2300 开关条件 增强型N沟道mos管的S source源极 和 D drain漏极 导通条件取决与Vgs 即栅极和源极间的电压压差 只有当 Vgs gt 2 5V 也就是 Vg G极电压 Vs S极电压 gt
  • Qt类中使用函数指针数组

    接上文例子 将其改成函数指针数组 class Widget public QWidget public int add int x int y int mul int x int y int Widget func p 2 int x in
  • RN 使用第三方组件之react-native-image-picker(拍照/从相册获取图片)

    首先给个github地址 https github com react community react native image picker 英文不行的看下面这个笔记 该插件可以同时给iOS和Android两个平台下使用 但是需要配置下各
  • 京东如何处理数据中心网络对应用性能的影响

    随着现代数据中心规模的不断扩张 网络拓扑和路由转发变得越来越复杂 传统的数据中心使用大型机和小型机 网络规模相对较小 普通的机框式交换机就能满足网络的需求 随着CLOS集群架构的普及 标准的x86服务器集群以低成本和高扩展性逐渐取代大型机和
  • 解决:Failed to connect to repository : Error performing command: git.exe ls-remote -h xxxxxxx HEAD...

    在jenkins新建工程 配置源码管理时 发现输入gitlab的Repository URL 总会抛出一个错误 后来在网上各种百度 终于找到了一篇比较靠谱的文章 顺着文章的提示 去Manage Jenkins Global Tool Con
  • linux 新建文件夹命令

    今天学习了几个命令 是创建 删除文件和文件夹的 在linux里 文件夹是目录 下面说下我学习的命令 创建文件夹 mkdir 一 mkdir命令使用权限 所有用户都可以在终端使用 mkdir 命令在拥有权限的文件夹创建文件夹或目录 二 mkd
  • 集成学习-Voting

    一 什么是集成学习 集成学习是使用一系列学习器进行学习 并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法 一般情况下 集成学习中的多个学习器都是同质的 弱学习器 上面的描述来自百度百科 看定义的话知道
  • Qt关于QProcess使用startDetached函数问题

    最近项目编写自动升级程序使用进程通讯 网上查看大部分资料都使用QProcess类 再使用函数startDetached过程发现一种很奇怪现象 父进程通过startDetached调用子进程 原则上父进程和子进程脱离关系 关闭父进程不会关闭子
  • PyQt5无法导入QtCore问题解决

    今天安装PyQt 执行下面语句的时候出现问题 python3 configure py pyqt PyQt5 搞了一下午 吐血 具体 import PyQt5 完全ok 但是 from PyQt5 import QtCore 就出错 就这个
  • 07:MYSQL----多表查询

    目录 1 多表查询概述 2 多表查询分类 3 内连接 3 外连接 4 自连接 5 联合查询 union union all 6 子查询 1 多表查询概述 select from emp dept emp 表中有6条数据 dept表中有5条数