MySQL~多表查询

2023-11-07

一、多表查询

查询语法:

select
    列名列表
from
    表名列表
where....

1、准备sql

创建部门表

CREATE TABLE dept(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
);
INSERT INTO dept (NAME) 
VALUES ('开发部'),('市场部'),('财务部');

创建员工表

CREATE TABLE emp (
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(10),
    gender CHAR(1), -- 性别
    salary DOUBLE, -- 工资
    join_date DATE, -- 入职日期
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) 
VALUES('zs','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) 
​​​​​​​VALUES('ls','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) 
VALUES('王五','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) 
VALUES('赵六','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) 
VALUES('刘能','女',4500,'2011-03-14',1);

2、笛卡尔积

有两个集合A、B ,取这两个集合的所有组成情况

要完成多表查询,需要消除无用的数据

2.1 多表查询的分类

2.1.1 内连接查询
  • 隐式内连接:使用where条件消除无用数据

例子: -- 查询所有员工信息和对应的部门信息

SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;

-- 查询员工表的名称,性别。部门表的名称

SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
SELECT 
    t1.name, -- 员工表的姓名
    t1.gender,-- 员工表的性别
    t2.name -- 部门表的名称
FROM
    emp t1,
    dept t2
WHERE 
    t1.`dept_id` = t2.`id`;
  • 显式内连接:

语法:

select 字段列表 from 表名1 
[inner] join 表名2 on 条件

例如:

SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`; 
SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;   

内连接查询:

  • 从哪些表中查询数据

  • 条件是什么

  • 查询哪些字段

2.1.2 外链接查询

1、左外连接:

语法:

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

查询的是左表所有数据以及其交集部分

例子: -- 查询所有员工信息、如果员工有部门、则查询部门名称;没有部门则不显示部门名称

SELECT  t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;

2、右外连接:

语法:

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

查询的是右表所有数据以及其交集部分

例子:

SELECT  * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;
2.1.3 子查询

概念:查询中嵌套查询,称嵌套查询为子查询。

-- 查询工资最高的员工信息

-- 1 查询最高的工资是多少 9000

SELECT MAX(salary) FROM emp;

-- 2 查询员工信息,并且工资等于9000的

SELECT * FROM emp WHERE emp.`salary` = 9000;

-- 一条sql就完成这个操作(子查询)

SELECT * FROM emp 
WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);

子查询不同情况

  1. 子查询的结果是单行单列的:

    子查询可以作为条件,使用运算符去判断。

    运算符: > >= < <= =

    -- 查询员工工资小于平均工资的人

    SELECT * FROM emp 
    WHERE emp.salary < (SELECT AVG(salary) FROM emp);

  2. 子查询的结果是多行单列的:

    子查询可以作为条件,使用运算符in来判断

  3. -- 查询'财务部'和'市场部'所有的员工信息

    SELECT id FROM dept 
    WHERE NAME = '财务部' OR NAME = '市场部';
    SELECT * FROM emp 
    WHERE dept_id = 3 OR dept_id = 2;
    -- 子查询
    
    SELECT * FROM emp 
    WHERE dept_id IN 
    (SELECT id FROM dept 
    WHERE NAME = '财务部' OR NAME = '市场部');

  4. 子查询的结果是多行多列的:

    子查询可以作为一张虚拟表参与查询

  5. -- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息

  6. -- 子查询

  7. SELECT * FROM dept t1 ,
    (SELECT * FROM emp 
    WHERE emp.`join_date` > '2011-11-11') t2
    WHERE t1.id = t2.dept_id;

    -- 普通内连接

    SELECT * FROM emp t1,dept t2 
    WHERE t1.`dept_id` = t2.`id` 
    AND t1.`join_date` >  '2011-11-11'

    ​​​​​​​

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

MySQL~多表查询 的相关文章

  • Laravel 读写连接不同步

    我在 Laravel 5 2 应用程序中使用读写 MySQL 连接设置 mysql gt write gt host gt env DB HOST WRITE localhost read gt host gt env DB HOST RE
  • 控制数据是否存在于数组中

    我在mysql中有两个不同的表 我正在使用curl从json文件中获取数据 我的第一个表名称是 tblclients 该表存储客户端数据 我的第二个表名称是 tblcustomfieldsvalues 该表使用 tblclients 表的
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • parent_id 是外键(自引用)并且为 null?

    浏览 Bill Karwin 的书 SQL Antipatterns 第 3 章 Naive Trees 邻接表 父子关系 有一个注释表的示例 CREATE TABLE Comments comment id SERIAL PRIMARY
  • 如何关闭整个数据库的区分大小写

    我创建了一个包含许多脚本和许多存储过程的数据库 在这个数据库中 我们没有注意担心区分大小写 因为它对于我的本地开发计算机来说是关闭的 综上所述 我试图弄清楚如何使以下两条语句返回相同的结果 SELECT FROM companies SEL
  • 选择列表;这与我的 sql 中的 DISTINCT 不兼容

    CREATE DEFINER root localhost PROCEDURE GetAllEventIdList SP in skillId varchar 50 in offsetvalue int in recordlimit int
  • 执行mvn sql:execute时出错

    我希望 Maven 执行该 sql 文件 它生成的数据库模式稍后将在我的程序中使用 但它不起作用 可能是由 DELIMITER 引起的 当我执行 mvn sql execute 时 它会打印出 ERROR Failed to execute
  • MySQL 中的 INSERT 和 UPDATE 有什么区别?

    它似乎INSERT and UPDATE对我做同样的事情 有什么场合我应该使用INSERT代替UPDATE反之亦然 In 增删改查操作 http en wikipedia org wiki Create read update and de
  • 使用 MySQL 计算时间线中的变化

    我是 MySQL 新手 我需要你的帮助 我有一个包含类似数据的表 RobotPosX RobotPosY RobotPosDir RobotShortestPath 0 1 0 2 15 1456 0 2 0 3 30 1456 0 54
  • 从heroku 提取数据库失败并出现 Encoding::CompatibilityError

    我在执行 db pull 从 heroku 回到本地开发环境时遇到一些问题 我的设置是通过 RVM 在 Mac OS X Snow Leopard 下的本地 Rails 3 Ruby 1 9 2 环境上通过 MacPorts 安装 MySQ
  • Mac 上的 Emacs 和 MySQL

    我尝试使用 sql mysql 模式 但 emacs 无法找到文件 目录 mysql 但是 我可以从终端访问它 如何将 emacs 中的 mysql 指向 usr local mysql bin mysql setq sql mysql p
  • 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

    我有一个新安装的 MySQL 服务器 它监听 localhost 3306 从 Qt 应用程序连接到它的正确方法是什么 原来我需要将MySQL添加到ODBC数据源 我在遵循这个视频教程后做到了这一点 https youtu be K3GZi
  • MySQL 查询按父级排序然后子级排序

    我的数据库中有一个页面表 每个页面可以有一个父页面 如下所示 id parent id title 1 0 Home 2 0 Sitemap 3 0 Products 4 3 Product 1 5 3 Product 2 6 4 Prod
  • 使用 PHP MySql 进行关键字搜索?

    我的 mysql 表中有标题 varchar 描述 text 关键字 varchar 字段 我保留了关键字字段 因为我认为我只会在这个字段中搜索 但我现在需要在所有三个字段中进行搜索 所以对于关键字 word1 word2 word3 我的
  • 使用整数数组设置外键

    我对使用 SQL 还很陌生 但我在 Stack Overflow 上遇到过这个关于使用标签的问题 推荐用于标记或标记的 SQL 数据库设计 https stackoverflow com questions 20856 recommende
  • 在生产数据库上部署应用程序时无法加载文件或程序集“System.Data”错误

    问题 将我的应用程序部署到生产数据库时 出现以下错误 无法加载文件或程序集 System Data Version 2 0 0 0 Culture neutral PublicKeyToken b77a5c561934e089 或其依赖项之
  • WooCommerce 中的分页

    我使用这个短代码在页面上显示产品的类别 但是当我们使用它时 它不会显示分页 因为我们的类别中有很多产品 我们使用以下代码 product category category snowpeak per page 12 columns 4 or
  • MySql If then 在 Select 语句中

    我想在 mysql select 中使用 IF THEN 语句 但无法弄清楚 当还没有评论时 commentcreated 值应该是该项目本身的创建值 这是查询 SELECT item count comments itemid AS co
  • MySQL 布尔模式匹配对中间词不返回任何内容

    我在 MySQL 数据库中使用 Match Against 时遇到问题 希望有人能提供帮助 这是我的数据库中的数据示例 id name 1 really bitter chocolate 2 soft cheese 当我运行此查询时 SEL
  • 将mysql数据导入kubernetes pod

    有谁知道如何将我的 dump sql 文件中的数据导入到 kubernetes pod 中 直接 与处理 docker 容器的方式相同 docker exec i container name mysql uroot password se

随机推荐