MYSQL–>多表查询

多表之间的关系

一对多(多对一)

如多个员工都属于一个部门的关系

实现方式:在多的一方建立外键连接少的一方

多对对

如学生与课程表之间的关系

实现方式:在学生与课程表之间建立第三方表,第三方表分别于学生和课程之间建立外键即可

一对一

如用户和用户详细信息的关系

实现方式:在任意一方加入唯一外键即可实现

多表查询

概述

select * from 表1,表2

这种就叫多表查询,
但是这样查询到的内容行数=表1的行数表二的行数
这种现象叫
笛卡尔积*

笛卡尔积:俩个集合A和集合B的所有组合的情况(在多表查询时需要消除无效笛卡尔积)
在多表查询中一般查询其中一个表中字段写法为:表1.字段1

分类

  1. 内连接查询 :查询表A和表B之间交集部分
  2. 外连接查询 :
  3. 左外连接查询:查询 左表左边与右边之间交集部分
  4. 右外连接查询:查询 右表右边与左表之间交集部分
  5. 自连接查询:当前只有一张表,但是我们会对这种表自身进行连接查询
  6. 子查询查询:在sql语句中嵌套select语句叫子查询

内连接查询

定义

内连接查询就是查询俩张表之间的交集部分

MYSQL-->多表查询

隐式内连接查询

语法

select 字段列表 from 表A,表B where 连接条件;

显式内连接查询

语法

select 字段列表 from 表A [inner] join 表B on  连接条件;

外连接查询

定义

查询表A和表B交集部分+表A部分/表B部分

左外连接查询

查询表A和表B交集部分+表A部分

MYSQL-->多表查询

语法

select 字段列表 from 表A left [outer] join 表B on 连接条件;

右外连接查询

查询表A和表B交集部分+表B部分

MYSQL-->多表查询

语法

select 字段列表 from 表A right [outer] join 表B on 连接条件;

自连接查询

自己查询自己的内容,通常要用到别名。
比如说查询表内年龄一致的人的信息
语法

Select 字段列表 from 表A [as] 别名a join 表A [as] 别名b on 条件….;

联合查询

将多次查询的结果联合起来就叫联合查询
语法

Select 字段列表 from 表A [where]….

Union [all]
Select 字段列表 from 表B [where]….;

  • Union all是联合查询是将结果直接合并!
  • Union是联合查询结果去掉重复的再合并
  • 每次查询返回的列数必须一致,字段类型也必须一致

子查询

定义

在SQL中嵌套select的叫子查询

语法

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

外部的select可以为update、insert、delete、select、任意一种

分类

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

  1. 标量子查询(子查询的结果为单个值)
  2. 列子查询(子查询结果为一列)
  3. 行子查询(子查询结果为一行)
  4. 表子查询(子查询结果为多行多列)

即值,列,行,表四种

根据子查询的位置分为

  1. Where之后
  2. From之后
  3. Select之后

即,作为条件,作为表,作为字段三种

标量子查询(值)

常用符号

符号 描述 = 等于 > 大于 < 小于 >= 大于等于

用法举例
假定存在俩张表
其中一张表为员工信息表,
另外一种表为部门信息表
如图

MYSQL-->多表查询

MYSQL-->多表查询

其中员工信息表中的dep字段关联着部门信息的id用来代表员工所属哪个字段.

  • 问:查询研发部所属员工全部信息
    问题分解:

  • 查询出研发部的部门编号(id)

select id from dep where dept_name='&#x7814;&#x53D1;&#x90E8;';
  1. 查询出dep=研发部编号的员工信息
select * from dep where dep=(select id from dep where dept_name='&#x7814;&#x53D1;&#x90E8;');

列子查询

常用操作符

IN

  • 用法举例: 字段 > in(a,b,c)
  • 相当于 字段>(a or b or c),即只要字段大于a,b,c中任意一个即可

NOT IN

  • 用法举例: 字段= not in(a,b,c)
  • 相当于 字段 <> (a or b or c),即只要字段不等于a,b,c中任意一个才通过

ANY

  • 用法举例: 字段 > any(select语句)
  • 假定select语句返回a,b,c
  • 那么相当于 字段 > (a or b or c),即只要字段大于a,b,c任意一个才通过

SOME,是ANY的别名

ALL

  • 用法举例: 字段 = all(select语句)
  • 假定select语句返回a,b,c
  • 那么相当于 字段=(a and b and c)即只要字段等于a,b,c三个全部才通过

用法举例
假定存在俩张表
其中一张表为员工信息表,
另外一种表为部门信息表
如图

MYSQL-->多表查询

MYSQL-->多表查询
  • 问:查询研发部和后勤部的所有员工信息

  • 查询研发部和后勤部部门编号

select num from dept where part='&#x7814;&#x53D1;&#x90E8;' || part ='&#x540E;&#x671F;&#x90E8;';
  1. 查询部门id满足研发部或者后勤部的员工的信息
select * from emps where worknum in (4,6);
  1. 合并
select * from emps where worknum in (select num from dept where part='&#x7814;&#x53D1;&#x90E8;' || part ='&#x540E;&#x671F;&#x90E8;');

行子查询

常用符号

符号 描述 = 等于 <> 不等于 IN 在这这内 Not in 不在这之内

特殊写法:

select * from &#x8868; where (id,gender)=(1,'&#x7537;');

用法举例
假定存在俩张表
其中一张表为员工信息表,
另外一种表为部门信息表
如图

MYSQL-->多表查询

MYSQL-->多表查询
  • 问 :查询和张三一样年纪和部门的人的信息

  • 查询张三的年纪和部门

select age,dep from employee where name='&#x5F20;&#x4E09;';
  1. 查询符合条件的信息
select * from employee where (age,dep)=(select age,dep from employee where name='&#x5F20;&#x4E09;');

表子查询

常用操作符

IN

用法举例
假定存在俩张表
其中一张表为员工信息表,
另外一种表为部门信息表
如图

MYSQL-->多表查询

MYSQL-->多表查询
  • 问:查询 张三和李四的 年龄部门一样的员工信息

  • 查询张三和李四的年龄+部门

select age,dep from employee where name='&#x5F20;&#x4E09;' or name='&#x674E;&#x56DB;';
  1. 查询符合条件的
Select * from employee where (age,dep) in (select age,dep from employee where name='&#x5F20;&#x4E09;' or name='&#x674E;&#x56DB;');

Original: https://www.cnblogs.com/wdadwa/p/MYSQL_Learning_04.html
Author: wdadwa
Title: MYSQL–>多表查询

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611872/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL 批量修改库、表、列的排序规则

    1.表字段修复 SELECT TABLE_SCHEMA ‘数据库’, TABLE_NAME ‘表’, COLUMN_NAME ‘字段’, CHARACTER_SET_NAME ‘原…

    数据库 2023年6月14日
    0103
  • Python初识

    【参考资料】 零基础入门学习python(小甲鱼) 流畅的Python Python数据类型 Number数字类型 整数类型整数之间的进制转换  二进制     计算机常用    …

    数据库 2023年6月11日
    082
  • jmeter-操作mysql

    1. 环境:jmeter5.3,mysql5.7。 提取码:ZHEN 3. 操作 ①. 测试计划内导入jdbcjar包 ②. jmeter内添加👉线程组,点击”添加→配…

    数据库 2023年6月14日
    083
  • [LeetCode]9. 回文数

    判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 输入: 121输出: true示例 2: 输入: -121输出: false解…

    数据库 2023年6月9日
    0162
  • English words chapter 20220927

    本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://www.cnblogs.com/ukzq/p/16736392.html Or…

    数据库 2023年6月11日
    090
  • MySQL–SELECT检索语句

    1、检索单个列 SELECT prod_name FROM products; –上述语句利用 SELECT语句从 products表中检索一个名为prod_name的列。 Vi…

    数据库 2023年6月16日
    092
  • [springmvc]ajax异步请求数据详细简单

    10.Ajax异步请求 Ajax即 Asynchronous Javascript And XML(异步JavaScript和XML在 2005年被Jesse James Garr…

    数据库 2023年6月16日
    077
  • SQL子查询:介绍及分类

    子查询指一个查询语句 嵌套在另一个查询语句内部的查询。 例如:挑选出 员工工资表中, 工资金额比”张三”高的 员工姓名及 工资:d SELECT &…

    数据库 2023年6月16日
    096
  • 互联网校招指北

    这篇文章写着写着,突然觉得《紧急救援》中有一句台词很对: “不是幸运给你机会,而是因为够坚持,才有了幸运的机会” 共勉~ 时间跨度 一年共两次校招季,2 月…

    数据库 2023年6月6日
    090
  • MySQL Bug:No suitable ‘keyring_component_metadata_query’ service implementation found to fulfill the request

    监控发现公司一台MySQL 8.0.26 的错误日志中出现大量下面告警信息: [Warning] [MY-013712] [Server] No suitable ‘k…

    数据库 2023年5月24日
    084
  • 23种设计模式之状态模式和策略模式的区别

    文章目录 概述 状态模式 策略模式 区别 总结 概述 在行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下 ; 状态模式 …

    数据库 2023年6月6日
    0121
  • 为什么我选择MySQL Workbench・一

    一、官方 官方提供的工具必然有其优势。 MySQL Workbench有两个版本,社区版和商业版。社区版是免费的。 二、第一个选择 使用MySQL之前用的是SQL Server而微…

    数据库 2023年6月9日
    070
  • 8086指令码汇总表(表格)

    8086指令码汇总表 8086指令有汇编语言指令和指令码两种形式,汇编语言指令形式经过汇编程序处理后生成指令码形式。 通过指令码形式可以帮助理解汇编语言指令格式的含义和用法。 80…

    数据库 2023年6月14日
    0154
  • python自动安装mysql5.7

    python版本:python2.6 centos版本:centos6.9 mysql版本:mysql5.7.19 安装目录路径和数据目录路径都是固定,当然也可以自己修改 这个脚本…

    数据库 2023年6月9日
    0164
  • API开放平台网关需要做什么?

    首发于公众号:BiggerBoy欢迎关注,查看更多技术文章 怎么搭建API开放平台网关? API的全称是应用编程接口(Application Programming Interfa…

    数据库 2023年6月11日
    097
  • 未婚妻晚安之后依然在线,于是我用20行代码写了个小工具

    最近发现未婚妻一到晚上总是很忙的样子,每晚匆匆忙忙道过晚安就不说话了。 可是,QQ头像却会偶尔亮起来,我非常担心,是不是账号被盗了呢?然后,就想帮未婚妻排查一下,于是就用pytho…

    数据库 2023年6月14日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球