首页 > 数据库 >MySQL多表查询

MySQL多表查询

时间:2024-09-02 21:52:17浏览次数:9  
标签:JOIN name 查询 MySQL 多表 t1 连接 SELECT

目录

等值连接

单表等值连接

表别名

多表等值连接

自然连接

USING

ON

USING和ON的区别

自连接

外连接

1.左外连接 LEFT OUTER JOIN

2.右外连接 RIGHT OUTER JOIN

子查询

单行子查询

多行子查询

相关子查询 EXISTS


等值连接

单表等值连接

SELECT 表名1.列名1,表名2.列名2 
FROM 表名1,表名2 
WHERE 表名1.列名3 = 表名2.列名4;

从表1和表2中 查询 表1中列名3与表2中列名4中 内容相同的数据

表别名

表别名直接写在表名后即可

SELECT t1.列1,t2.列2
FROM 表1 t1,表2 t2
WHERE t1.列3 = t2.列4

使用表别名时,表别名的范围只在该条SQL语句中生效

多表等值连接

如果连接的表超过两张,则需要使用 AND 来组合多个等值条件 

SELECT t1.列1,t2.列2,t3.列3
FROM 表1 t1,表2 t2,表三 t3
WHERE t1.列4 = t2.列5 AND t1.列6 = t3.列7

等值连接的关键在于找到表与表之间的等值条件,通过构建一个信息更全面的表,以达到多表查询的目的。

自然连接

自然连接是特殊的等值连接:

  • 等值连接用于连接的字段值相同即可
  • 自然连接用于连接的字段必须同名且同类型

自然连接使用关键字 NATURAL JOIN

SELECT t1.列1,t2.列2
FROM 表1 t1
NATURAL JOIN 表2 t2

解析引擎会自动探测两个表中相同的字段并设置等值条件。这样的字段可以不止一个,有多少个这样的字段就有多少个等值条件。

USING

当你想要基于两个表中具有相同名称的列进行连接时, USING 关键字可以提供一个更简洁的语法。使用USING时,你不需要在ON子句中明确指定两个列名,因为 SQL 会自动查找并匹配两个表中名称相同的列。

SELECT t1.*,t2.*
FROM 表1 t1
JOIN 表2 t2
USING(字段)

注意:

  • using里面的字段不能加表名作为前缀,该字段是一个连接字段,不再属于某张单独的表。
  • 连接的表中必须有相同字段才能使用using

ON

ON关键字主要用于JOIN操作中指定两个表之间的连接条件,JOIN操作是SQL中用于根据两个或多个表之间的共同字段来合并这些表中的数据的一种方式。

SELECT t1.*,t2.*
FROM 表1 t1
JOIN 表2 t2
ON(t1.字段 = t2.字段)

注意:

  • 不会消除重复列,因为ON中的等值条件无需列相同
  • 连接的字段名可以不同

USING和ON的区别

  1. USING进行连接时,结果中用于链接的列不会重复出现,ON的结果在不进行干预的情况下会出现两次
  2. USING进行连接时,两张表中必须有相同的字段,ON时可以不出现

自连接

一张表与自己进行连接。将一张表视为两张或多张表进行连接,通过别名区分

员工表employee
idnamemanager_id
1领导null
2员工1
SELECT e1.name AS employee_name, e2.name AS manager_name  
FROM employee e1,employee e2 
ON e1.manager_id = e2.id;

外连接

员工表 employees
idnamedepartment_id
1a1
2b2
部门表 departments
idname
1x部门
2y部门

1.左外连接 LEFT OUTER JOIN

左外连接返回左表(FROM子句中指定的第一个表)的所有行,以及右表中与左表匹配的行。如果左表中的某行在右表中没有匹配行,则结果集中右表的部分将包含NULL值。

SELECT employees.name, departments.department_name  
FROM employees  
LEFT OUTER JOIN departments
ON employees.department_id = departments.id;

LEFT OUTER JOIN 可缩写为 LEFT JOIN

在以上代码中,所有的员工表表中的员工姓名会被查询出来,未分配的部门时,员工名字会显示出来,部门id会显示null

2.右外连接 RIGHT OUTER JOIN

右外连接与左外连接相反,它返回右表(JOIN子句中指定的第二个表)的所有行,以及左表中与右表匹配的行。如果右表中的某行在左表中没有匹配行,则结果集中左表的部分将包含NULL值。

SELECT employees.name, departments.name d_name
FROM employees  
RIGHT OUTER JOIN departments
ON employees.department_id = departments.id;

RIGHT OUTER JOIN 可简写为 RIGHT JOIN

在以上代码中,所有的部门表中的部门名字会被查询出来,没有员工时,会显示部门名字,员工名字会显示为null

子查询

SELECT语句中还有SELECT语句,称为子查询或内查询,外面的称为主查询或外查询

  • 根据查询结果记录数量分为
    • 单行子查询
    • 多行子查询
  • 根据内外查询的相关性分为
    • 不相关子查询
    • 相关子查询

使用子查询的注意条件

  1. 子查询要放在小括号中
  2. 子查询一般放在条件判断的右侧
  3. 对于单行子查询,常用搭配操作符有>、<、<>、<=、>=等
  4. 对于多行子查询,常用搭配操作符有IN、ANY、ALL等
  5. 不相关子查询,子查询先于主查询,用子查询的结构构造外查询的条件
  6. 相关子查询,以EXISTE为代表,是一个内外一一匹配的过程

单行子查询

只返回一行的子查询称为单行子查询

例如:查询工资高于公司平均工资的员工信息

SELECT employee_id, last_name, salary  
FROM employees  
WHERE salary > (SELECT AVG(salary) FROM employees);

多行子查询

返回多行结果的子查询称为多行子查询

  • IN :等于多行子查询返回的结果中的任意一个即可
  • ANY : 和多行子查询返回的所有值进行比较即可
  • ALL : 和多行子查询查询返回的所有制进行比较
订单表 orders
order_idcustomer_idorder_date
11012024-09-02
21022024-09-02
顾客表 customers
customer_idcustomer_name
101a
102b

例如:获取所有已经下了订单的顾客信息

SELECT customer_name  
FROM customers  
WHERE customer_id IN (SELECT customer_id FROM orders);

相关子查询 EXISTS

  • 不相关子查询:子查询的查询条件不依赖于父查询
  • 相关子查询:子查询的相关条件依赖于外层父查询的某个属性值,带EXISTS的子查询就是相关子查询

EXISTS表示存在量词,带有EXISTS的子查询不返回任何记录的数据,只返回:True 或 False

SELECT column_names  
FROM table_name  
WHERE EXISTS  
(SELECT * FROM table_name WHERE condition);

标签:JOIN,name,查询,MySQL,多表,t1,连接,SELECT
From: https://blog.csdn.net/zhaogx233/article/details/141820488

相关文章

  • 详细分析MySQL事务日志(redo log和undo log)
    innodb事务日志包括redolog和undolog。redolog是重做日志,提供前滚操作,undolog是回滚日志,提供回滚操作。undolog不是redolog的逆向过程,其实它们都算是用来恢复的日志:1.redolog通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的......
  • MySQL 基础命令
    目录一、MySQL简介1.MySQL的主要特点包括2.MySQL的主要用途包括:二、MySQL基础命令1.基本操作1.1进入1.2选择数据库1.3修改密码1.4所有命令后面都要加“;”2.创建2.1创建数据库2.2创建数据表2.3常见字段3.修改/更新3.1添加表字段3.2删除表字段......
  • DWS(PG)自定义函数查询表注释 ,表结构
    createorreplacefunctionshow_table(tableNamevarchar2)returnstable(table_namevarchar2,column_namevarchar2,column_typevarchar2,attnotnullvarchar2,column_commentvarchar2)as$$begin returnquerySELECTc.relname::varchar2astable_name,......
  • 基于centos7.5安装mysql8
    @目录环境初始化部署mysql配置主从报错问题解决重启集群操作环境初始化mysql官网下载使用环境VMware17,centos7.5节点IPmysql01192.168.200.20mysql02192.168.200.21初始化两台节点;免密,主机名,主机映射等viinit.sh#!/bin/bash#定义节点信息NODES=("1......
  • 如何用MySQL设计一个高效的关系数据库架构
    如何用MySQL设计一个高效的关系数据库架构设计一个高效的关系数据库架构是确保数据库性能、可维护性和扩展性的关键。一个良好的数据库设计不仅能够提高查询效率,还能减少数据冗余,降低维护成本。以下将详细介绍如何用MySQL设计一个高效的关系数据库架构,包括设计原则、规范......
  • Mysql基础练习题 610.判断三角形 (力扣)
    题目:对每三个线段报告它们是否可以形成一个三角形题目连接:https://leetcode.cn/problems/triangle-judgement/description/建表插入数据:CreatetableIfNotExistsTriangle(xint,yint,zint)TruncatetableTriangleinsertintoTriangle(x,y,z)values('13'......
  • MySQL复习2
    高级查询准备createdatabasegreatselect;usegreatselect;droptableifexists`class`;createtable`class`(`cid`int(11)notnullauto_increment,`caption`varchar(32)notnull,primarykey(`cid`))engine=innoDBAUTO_INCREMENT=5de......
  • MySQL索引学习总结
    1.什么是索引?MySQL官方定义:索引是帮助MySQL高效获取数据的数据结构。即:索引是数据结构!!!2.索引有哪几种数据结构?6种。二叉树、平衡二叉树、红黑树、BTree、B+Tree、Hash旧金山大学数据结构可视化网站:DataStructureVisualization(usfca.edu)二叉树对半搜索,每个节点最多......
  • 20240902_171049 mysql 填空题 ddl表
    创建一个名为tb的表creatatabletb()创建一个名为tb的表,先判断再创建createtableifnotexiststb()新建一个student表,拷备teacher表的结构createtablestudentliketeacher删除一个名为student的表droptablestudent删除名为student的表,先判断再删除droptableif......
  • 基于SpringBoot+MySQL+SSM+Vue.js的学生选课系统
    获取见最下方名片获取见最下方名片获取见最下方名片演示视频基于SpringBoot+MySQL+SSM+Vue.js的学生选课系统(附论文)技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+SpringBoot文字描......