精华内容
下载资源
问答
  • 等值连接
    千次阅读
    2021-01-28 06:47:53

    mysql-数据查询语句-多表

    连接查询

    连接查询,是关系数据库中最主要的查询,包括等值查询、自然连接查询、非等值查询、自身连接查询、外连接查询和复合条件连接查询等。

    1、等值与非等值连接查询

    连接查询的where子句中用来连接两个表的条件称为连接条件或连接谓词。当连接运算符为 = 时,称为等值连接。使用其他运算符称为非等值连...

    文章

    harry_h

    2018-06-26

    819浏览量

    SQL - 内连接与外连接

    PDF下载地址:SQL-内连接与外连接.pdf

    连接查询在关系型数据库中经常用到,是多表联合查询的基础。

    主要包含:内连接,外连接,交叉连接。

    SQL - 内连接与外连接

    内连接

    等值连接

    不等值连接

    自然连接

    外连接

    左连接

    右连接

    全连接...

    文章

    北岛知寒

    2016-03-27

    674浏览量

    SQL应用与开发:(五)多个数据表的连接

    数据库中的各个表中存储着不同的数据,用户往往需要用多个表中的数据来组合、提炼出所需要的信息。如果一个查询需要对多个表进行操作,就称为连接查询。连接查询的结果集或结果表称为表之间的连接。查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系型数据库查询最主要的特征。

    实现连接的结果是在向数据...

    文章

    吴士龙

    2015-04-04

    1262浏览量

    ff0c35e3aa0877a25f7873cca08f3438.png

    Quick BI 数据可视化分析平台

    2020年入选全球Gartner ABI魔力象限,为中国首个且唯一入选BI产品

    广告

    MySQL 基础---多表数据查询

    多表数据记录查询:

    关系数据的各种操作

    内连接查询

    外连接查询

    子查询

    关系数据操作

    传统的运算:

    并(UNION)

    笛卡尔积(CARTESIAN PRODUCT)

    专门针对数据库操作的运算---连接(JOIN)

    (1) 并(UNION)

    “并”就是把具有相同字段数目和字段类型的表合并...

    文章

    凌浩雨

    2017-10-11

    619浏览量

    数据库多表连接查询详解

    通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

    在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大...

    文章

    橘子红了呐

    2017-11-08

    980浏览量

    《数据库技术基础与应用(第2版)》学习笔记——第4章

    第4章 关系运算

    4.1 关系代数

    基于集合运算分类

    传统的集合运算:并、差、交、乘积

    专门的关系运算:选择、投影、连接、自然连接、除法等

    基于关系代数完备性分类

    五种基本运算:并、差、乘积、选择、投影,构成关系代数完备运算集

    其他扩充运算:交、连接、自然连接、除法等

    4.1.1 关系代数的五种基...

    文章

    李博 bluemind

    2017-12-06

    901浏览量

    《数据库原理与应用(第3版)》——习题

    本节书摘来自华章出版社《数据库原理与应用(第3版)》一 书中的第3章,第3.1节,作者:何玉洁,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

    习题

    1.?试述关系模型的三个组成部分。2.?解释下列术语的含义:(1)笛卡儿积(2)主键(3)候选键(4)外键(5)关系(6)关系模式(7)关系...

    文章

    华章计算机

    2017-05-02

    1616浏览量

    数据库常见面试题总结

    说明:本文仅供学习交流。转载请标明出处,欢迎转载!

    数据库常见面试题总结

    1.      SQL的表连接方式有哪些?

    SQL中连接按结果集分为:内连接。外连接,交叉连接

    内连接:inner join on,两表都满足的组合。内连接分为等值连接,不等连接。自然连接。

    等值连接:两表中同...

    文章

    技术mix呢

    2017-10-19

    855浏览量

    SQL 多个表之间联合查询

    非常少用join,这次学学,并备忘两篇文章!

    转自:http://hcx-2008.javaeye.com/blog/285661

    连接查询

    通过连接运算符能够实现多个表查询。连接是关系数据库模型的主要特点,也是它差别于其他类型数据库管理系统的一个标志。

    在关系数据库管理系统中,表建立时各数据之间...

    文章

    云栖希望。

    2018-01-06

    1430浏览量

    Apache Spark机器学习.2.5 数据集连接

    2.5 数据集连接

    本节,我们将介绍数据连接的技术,并讨论Spark处理数据连接的特有的特征,以及一些使工作更容易进行的数据连接解决方案。

    学习完本节,我们将有能力按照各类机器学习需要做数据连接。

    2.5.1 数据连接及其工具——Spark SQL

    为机器学习项目准备数据集时,我们一般需要组合多...

    文章

    华章计算机

    2017-05-02

    1855浏览量

    通用SQL数据库查询语句精华使用简介

    通用SQL数据库查询语句精华使用简介

    一、 简单查询

    简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。

    例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。

    SE...

    文章

    余二五

    2017-11-14

    845浏览量

    漫谈SQL查询语句

    漫谈SQL查询语句

    无锡/王乾

    本文来谈谈SQL Server的查询语句,包括简单查询、联合查询、连接查询:

    一.简单查询

    简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。

    例如,下面的...

    文章

    技术小美

    2017-10-31

    956浏览量

    sql常用语句

    一、 简单查询

    简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的

    表或视图、以及搜索条件等。例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。

    SELECT nickname,email...

    文章

    范大脚脚

    2017-11-20

    900浏览量

    软件设计师12-数据库(数据操作)

    数据操作

    二目运算

    1)并   RUS

    R U S={t|t∈R v t∈S}

    2)差:R-S

    R-S={t|t∈R v t∉ S}

    3)交: R ∩ S

    R ∩ S={t|t∈R^t∈S}

    3)笛卡儿积

    关系运算

    1)投...

    文章

    阿墨呦

    2018-10-15

    852浏览量

    《数据库原理与应用(第3版)》——3.5 关系代数

    本节书摘来自华章出版社《数据库原理与应用(第3版)》一 书中的第3章,第3.5节,作者:何玉洁,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

    3.5 关系代数

    关系模型源于数学。关系是由元组构成的集合,可以通过关系的运算来表达查询要求,而关系代数恰恰是关系操作语言的一种传统的表示方式,它...

    文章

    华章计算机

    2017-05-02

    1598浏览量

    MySQL-简要说明

    分类

    安装发展顺序分为:

    网状型数据库

    层次型数据库

    关系型数据库

    面向对象数据库

    主流:关系型数据库

    关系型数据库

    事务transaction:

    多个操作被当作一个整体对待

    • ACID:     A :原子性     C :一致性     I :隔离性     D:持久性

    实体Ent...

    文章

    刘小四

    2018-07-29

    1013浏览量

    oracle数据库 总结

    数据库概念

    oracle数据库

    一组:数据文件、控制文件、日志文件

    oracle实例,它与数据库的关系

    oracle实例:实例就是数据库启动后分配的内存和建立的后台进程. 数据库关闭后,物理上的文件还存在,但实例(分配的内存和建立的进程)就没有了

    数据库:物理操作系统文件或磁盘(disk)的集合。...

    文章

    wbliu

    2013-09-26

    756浏览量

    数据库(mysql oracle)学习小结

    数据库概念

    oracle数据库

    一组:数据文件、控制文件、日志文件

    oracle实例,它与数据库的关系

    oracle实例:实例就是数据库启动后分配的内存和建立的后台进程. 数据库关闭后,物理上的文件还存在,但实例(分配的内存和建立的进程)就没有了

    数据库:物理操作系统文件或磁盘(disk)的集合。...

    文章

    wbliu

    2013-09-25

    939浏览量

    SQL语法大全

    SQL语法大全

    1. ASP与Access数据库连接:

    <%@ language=VBscript%>

    <%

    dim conn,mdbfile

    mdbfile=server.mappath("数据库名称.mdb")

    set conn=server.createobject("ad...

    文章

    科技探索者

    2017-11-18

    867浏览量

    学习SQLite之路(三)

    20160616更新

    参考: http://www.runoob.com/sqlite/sqlite-tutorial.html

    1. SQLite  PRAGMA:可以用在 SQLite 环境内控制各种环境变量和状态标志。

    一个 PRAGMA 值可以被读取,也可以根据需求进行设置。

    ...

    文章

    xcywt

    2016-06-20

    503浏览量

    1-6 数据查询(下)——复杂查询

    1-6-4 多表连接查询及使用关系代数的理论查询数据

    多表连接查询是用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:

    [.]   [.]

    其中比较运算符主要有:=、...

    文章

    余二五

    2017-11-15

    935浏览量

    (转)经典SQL查询语句大全

    (转)经典SQL查询语句大全

    一、基础1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addum...

    文章

    thinkyoung

    2015-09-22

    765浏览量

    MySQL 学习笔记 二

    Ø function 函数

    函数的作用比较大,一般多用在select查询语句和where条件语句之后。按照函数返回的结果,

    可以分为:多行函数和单行函数;所谓的单行函数就是将每条数据进行独立的计算,然后每条数据得到一条结果。

    如:字符串函数;而多行函数,就是多条记录同时计算,得到最终只有一条结...

    文章

    嗯哼9925

    2017-11-23

    930浏览量

    MySQL数据库常用面试题解析(100题收藏版)

    前言 MySQL数据库常用面试题解析(100题收藏版) 数据库 1. MySQL 索引使用有哪些注意事项呢? 可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则 索引哪些情况会失效

    查询条件包含or,可能导致索引失效

    如何字段类型是字符串,where时一定用引号括起来,...

    文章

    游客x3ep55vjljc6o

    2020-09-29

    461浏览量

    云原生之数据库:《数据库最佳实践_问题诊断》

    演讲嘉宾简介:郑旦,阿里云高级数据库专家 以下内容根据演讲视频以及PPT整理而成。本次分享主要围绕以下三个方面:

    一、MySQL基本原理

    二、库表设计规范

    三、诊断实践案例

    一、MySQL基本原理

    MySQL是非常常见的数据库,适用于多种场景中的应用,其次MySQL活跃的社区使其流行度非常高。同...

    文章

    영~

    2020-06-24

    302浏览量

    Android SQLite (五 ) 全面详解(三)

    SQLite约束

    约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性。约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表。

    以下是在SQLite中常用的约束:

    NOT NULL约束:确保某列不能有NULL值。

    DEFAU...

    文章

    技术小胖子

    2017-11-14

    963浏览量

    数据仓库架构的变迁

    数据仓库架构的变迁

    作者

    digoal

    日期

    2016-11-10

    标签

    Greenplum , HAWQ , PostgreSQL , MPP , OLAP , HDFS , Hadoop

    背景

    本文是HashData发表的关于Greenplum, HAWQ的文章,内容很丰富,向作者致...

    文章

    德哥

    2016-11-24

    3533浏览量

    mysql查询

    查询有多种方式:普通查询,连接查询,子查询查询,集合查询

    1.select 查询语句具有5个子句,只有from是必须的。

    SELECT [ALL|DISTINCT|DISTINCTROW|TOP]{*|table.*|[table.]field(x)[AS alias(x)]}

    FROMtabl...

    文章

    技术小阿哥

    2017-11-27

    923浏览量

    《MySQL DBA修炼之道》——3.3 SQL基础

    本节书摘来自华章出版社《MySQL DBA修炼之道》一书中的第3章,第3.3节,作者:陈晓勇,更多章节内容可以访问云栖社区“华章计算机”公众号查看

    3.3 SQL基础

    SQL是一种高级查询语言,它是声明式的,也就是说,只需要描述希望怎么获取数据,而不用考虑具体的算法实现。3.3.1 变量MySQL...

    文章

    华章计算机

    2017-05-02

    1406浏览量

    MySql高级二

    一、库的创建、删除及修改:

    create database [if not exists] db_anme [default] [character set=''] [collate=''];

    drop database if exists db_name;

    alter database db...

    文章

    技术小甜

    2017-11-16

    657浏览量

    更多相关内容
  • 假设存在两张表 c 和 p,这里使用的是MySQL数据库。 数据表 c: course_id title dept_name credits BIO-301 Genetics Biology 4 CS-190 Game Design Comp.sci 4 CS-315 Robotics ...select *
  • 为便于更多的技友快速读懂、理解,我们只讨论2张表对象进行连接操作的情况,大于2张表对象进行的连接操作原理也是一样的。SELECTM.columnname……,N.*columnname…..FROMleft_tableMLEFTJOINright_table NONM.column...
  • #案例:查询员工的工资级别 SELECT salary,grade_level FROM employees e JOIN job_grades g ON e.`salary` BETWEEN g.`lowest_sal` AND g.`lowest_sal`;...#案例:查询每个工资级别的个数,并且按级别降序 ...
  • ** 小白终是踏上了这条不归路—-小文的mysql学习笔记(1) 小白终是踏上了这条不归路—-小文的...连接查询有点多,但是模式是固定的和前面的也基本相差不多。唉什么时候才能出去唉,我都在家两个多月了都没出过门。
  • 等值连接和非等值连接 这个分类其实上面等值连接,非等值连接是什么呢? 就是关联的时候,两个表之间的关系无法进行等于的时候,确定关系,其实这样说的话有点懵逼,还是老规矩看代码, 比如员工公司的等级,这个...

    其实前面说过数据库一句话:

    这个就设计到一个E-R(entity -relatiosn 实体--联系)模型,其主要设计到三个主要概念:实体集,属性,联系集。

    联系集本质就是表之间的关系,现在聊一些表之间的关系,毕竟这个也是数据库中最重要的组成部分之一。毕竟对数数据不可能放在一张表中。

    首先看下数据库中表之间的关系
    在这里插入图片描述

    在看一下具体的数据:

    部门表(dept)数据:

    在这里插入图片描述

    员工表(emp)数据:

    在这里插入图片描述

    工资等级表(slgrade):

    在这里插入图片描述

    可以看出表之emp表和dept表之间有关联,可以通过部门号进行关联。

    其实在表与表之间的关联中会有一种错误,这个错误和数学中的迪卡尔积(作为一个了解)。

    这个错误就是说两个表之间的数据,每一行都对应的匹配一遍,然后依次匹配,这个开结果

    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp,dept;
    

    在这里插入图片描述

    可以看出这样搜索的结果数量竟然是两个表数据数量的积75=15*5。说实话这个就是一个错误的搜索而已,其没多少意义,或者可以称之为一个没有意义的搜索结果。

    这个时候又想到既然有个表里面都有部门号deptno,如果将其进行相等匹配呢?

    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp,dept WHERE emp.deptno=dept.deptno;
    

    在这里插入图片描述

    这个可以看出数据进行了一一匹配,而且其后面可以得到所有的员工表。这个又涉及到一个为什么需要表.字段其又什么意义呢?

    这个很简单就是告诉数据库,这个字段是属于那个表的,如果单表或者两个表之间如果SELECT后面的字段不是两个表之间同名的,不写也不会报错,但是如果为了提高查询顺序建议带上表或者表的别名。当然也可以超过两个表。

    可以看以下出出的错误:

    SELECT deptno FROM emp,dept WHERE emp.deptno=dept.deptno;
    

    在这里插入图片描述

    等值连接和非等值连接

    这个分类其实上面等值连接,非等值连接是什么呢?

    就是关联的时候,两个表之间的关系无法进行等于的时候,确定关系,其实这样说的话有点懵逼,还是老规矩看代码,

    比如员工公司的等级,这个工资等级有个范围,而这个如何匹配呢?

    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,salgrade.grade FROM emp,salgrade WHERE emp.sal  BETWEEN   salgrade.losal AND salgrade.hisal;
    --  或者
    
    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,salgrade.grade FROM emp,salgrade WHERE emp.sal >=  salgrade.losal AND   emp.sal <=  salgrade.hisal;
    
    

    在这里插入图片描述

    这样可以看出对员工表数据进行处理的时候,可以看出其不是用等号进行条件筛选的。

    自连接和非自连接

    这个在表与表之间的关系的时候,说过就是自己关联自己表的就是自连接,与其它的表进行关联的就是非自连接。

    上面演示的是非自连接,现在演示一个自连接,这个就是查看每个员工的领导是谁。

    SELECT a.ename,b.ename mgrname FROM emp a,emp b WHERE a.mgr=b.empno;
    

    在这里插入图片描述

    内连接和外连接

    前面两种还算很容易理解,其中最难里面的是这分类。

    内连接

    合并具有同一列的两个以上的表的行,结果只有两者都有的数据。而上面的几乎都是内连接。其实这个有点像是数学的交集概念。如下

    在这里插入图片描述

    如果无法两者都满足的话就会舍去,所以

    SELECT a.ename,b.ename mgrname FROM emp a,emp b WHERE a.mgr=b.empno;
    

    在这里插入图片描述

    为啥得到了15行而不是16行,毕竟公司都有老板,老板虽然有工号,但是没有上级的工号,所以只有15行。

    在聊外连接的时候先补充一个内容。

    UNION 和 UNION ALL

    这个就需要补充关键字:UNION 和 UNION ALL

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

    现在我们来尝试写一下

    SELECT deptno FROM  emp
    UNION 
    SELECT deptno FROM  dept
    

    在这里插入图片描述

    这个可以看员工表中 部门号有一个是NULL,以及部门表中部门号40,50中没有员工,因为两表查询都是一个字段而且的都是部门号通过UNION将其连接。可以看出将两个表中所有部门号的内容都取出来了。

    这个地方要注意一点,其关心的是是否前后表的列是否相同,不关心是否是一样的字段名和类型。例如下:

    SELECT deptno FROM  emp
    UNION 
    SELECT dname FROM  dept
    

    在这里插入图片描述

    但是一般也不会将两张不同数据的表进行合并,这里只是补充而已。

    UNION ALL又是什么数据呢?

    SELECT deptno FROM  emp
    UNION  ALL
    SELECT deptno FROM  dept
    

    在这里插入图片描述

    这样就可以看出一件事,那就是UNION ALL相对于UNION不会去重。

    所以如果一般的时候在UNION ALLUNION都可以实现的功能的时候,为了性能更快侧重选择使用UNION ALL,毕竟这种方式返回的数据更快,因为其不会去重。

    为什么会补充合并两个表的关键字呢,下面聊外连接的时候就明白了,

    外连接

    说实话看图比文字更容易理解,但是表达出来的意思会很绕。

    外连接其实就是上面空白的地方,这个又分三种可能

    • 左外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左表中不满足的行,这种连接称之为左外连接。

    在这里插入图片描述

    • 右外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回右表中不满足的行,这种连接称之为右外连接。

    在这里插入图片描述

    • 满外连接:就是将两者的数据全部得到。

    在这里插入图片描述

    左外连接(左连接)

    这个自然固定的SQL可以使用,需要用的就是JOIN..... ON....这个关键字组合,这个组合也是可以实现内连接的,其实这个组合是SQL99引入的。

    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp,dept WHERE emp.deptno=dept.deptno;
    -- 这个是上面根据= 实现的一个内连接 这个是SQL92的一种写法
    
    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp INNER JOIN dept ON emp.deptno=dept.deptno;
    
    
    -- 这个INNER 可以省略写 
    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp  JOIN dept ON emp.deptno=dept.deptno;
    
    

    在这里插入图片描述

    当然JOIN ON 也可以跟多个表的:

    
    -- 当然如果多个表也是可以使用的
      SELECT .... FROM A JOIN B on A.a=B.a
       	               JOIN C on B.b=C.b
    
    
    

    表(>=3)等值内链接(inner join)最好用SQL92语法,链接逻辑简单,代码语句少,可读性强。(也就是使用=)

    现在开始来一个左外连接。

    这个注意一些,用的员工表在左边,部门表在右,而且员工中有一个没有部门号。

    这个需要用到关键字A LEFT OUTER JOIN B ON A.a=B.a 或者 A LEFT JOIN B ON A.a=B.a

    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp LEFT OUTER JOIN dept ON emp.deptno=dept.deptno;
    
    -- 这个可以省略 OUTER 这个关键字
    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp LEFT  JOIN dept ON emp.deptno=dept.deptno;
    

    在这里插入图片描述

    可以看出以左边表为基,如果右表不含有匹配的字段内容就会补充NULL.

    因为可以省略OUTER这个关键字可以省略,所以也叫做左连接。

    前面说到SQL92其实也有外连接的操作,不过其不用关键字,而是符号+,不过MYSQL不支持,而ORCLE支持,如下:

    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp,dept WHERE  emp.deptno=dept.deptno(+);
    
    --  左连接的时候(+)放在右表的关键字后面 
    

    右外连接(右连接)

    这个其实和左外连接本质上一样的,只不过其关键字是 A RIGHT OUTER JOIN B ON A.a=B.a 或者 A RIGHT JOIN B ON A.a=B.a

    这个注意一些,用的员工表在左边,部门表在右,而且部门表中有的部门没有员工对应。

    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp RIGHT OUTER JOIN dept ON emp.deptno=dept.deptno;
    -- 这个可以省略 OUTER 这个关键字
    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp RIGHT  JOIN dept ON emp.deptno=dept.deptno;
    

    在这里插入图片描述

    当然也有SQL92写法,左外说过,所以不在陈述。

    满外连接

    这个才是最难的,先说一下SQL99中的写法 A FULL OUTER JOIN B ON A.a=B.a 或者 A FULL JOIN B ON A.a=B.a

    还是用上面的两个表用的员工表在左边,部门表在右

    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp FULL OUTER JOIN dept ON emp.deptno=dept.deptno;
    -- 这个可以省略 OUTER 这个关键字
    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp FULL  JOIN dept ON emp.deptno=dept.deptno;
    

    在这里插入图片描述

    先声明一下,写的不错,**但是MYSQL 不支持A FULL OUTER JOIN B ON A.a=B.a 或者 A FULL JOIN B ON A.a=B.a **

    这个ORACLE支持,所以有条件的朋友,可以在ORACLE中进行尝试。

    但是既然聊MYSQL自然,就要想法将其搞定。前面聊了UNIONUNION ALL.

    而这个时候可以通过其它的方式通过合并表实现这个满外连接。

    根据已知的语句SQL99中的JOIN ON可以得到以下的表:

    在这里插入图片描述

    而MYSQL不支持A FULL OUTER JOIN B ON A.a=B.a 或者 A FULL JOIN B ON A.a=B.a

    但是MYSQL却支持 左外和右外,所以我们可以也就是上图中的 1和2 ,而1,2通过WHERE 进行限制可以得到4和5.然后通过4合并2或者5合并1就得到类似上图中的6的效果。现在我们搞一波。

    满连接通过图中的1和5进行合并:

    途中1的效果左连接,就不需要演示,而这个5就是对右边连接进行WHERE 条件语言进行限制,这个可以实现吗?无论左右外连接都是少的一方会自动补充为NULL,所以可以可以用左边数据为空的,也就是图5 的内容。猜想后用代码演示:

    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp  RIGHT  JOIN dept ON emp.deptno=dept.deptno WHERE  emp.deptno IS NULL;
    

    在这里插入图片描述

    可以看出满足了我们的猜想。那现在将其和左外连接进行合并:

    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp LEFT   JOIN dept ON emp.deptno=dept.deptno 
    UNION ALL
    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp  RIGHT  JOIN dept ON emp.deptno=dept.deptno WHERE  emp.deptno IS NULL;
    
    

    在这里插入图片描述

    满外连接用4和2并的效果:

    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp LEFT   JOIN dept ON emp.deptno=dept.deptno WHERE  dept.deptno IS NULL 
    UNION ALL
    SELECT emp.empno,emp.ename,emp.job,emp.mgr,emp.hiredate,emp.sal,emp.comm,emp.deptno,dept.deptno,dept.dname,dept.loc FROM emp  RIGHT  JOIN dept ON emp.deptno=dept.deptno ;
    

    在这里插入图片描述

    所以这个时候,需要仔细看需求,比如某表的全部,以及其对应的另一个。这样的一般都是外连接,然后再仔细分析是左右外连接还是满外连接。

    展开全文
  • #资源达人分享计划#
  • 等值连接-内连接4.1 什么是等值连接4.2 抉择矩阵4.3 使用AND操作符附加搜索条件4.4使用表别名4.5多于两个表的连接5. 非等值连接5.1非等值连接6. 自连接6.1 什么是自连接7. 外连接7.1什么是外连接7.2孤儿数据(Orphan...


    Oracle多表查询

    备注:本文中使用到的sql为HR用户提供的数据和表。HR用户介绍查看以下链接。

    https://blog.csdn.net/weixin_45842494/article/details/122528264

    1. 什么是多表查询

    当查询的数据并不是来源一个表时,需要使用多表链接操作完成查询。根据不同表中的数据之间的关系查询相关联的数据。

    在这里插入图片描述

    2. 多表链接方式

    内连接:链接两个表,通过相等或不等判断链接列,称为内连接。在内连接中典型的连接运算有 = 或 <> 之类的比较运算符。包括等值连接和自然连接。

    等值连接

    非等值连接

    自连接

    SQL99:交叉连接(CROSS JOIN)

    SQL99:内连接(INNER JOIN)

    SQL99:自然连接(NATURAL JOIN)

    外连接:在两个表之间的连接,返回内连接的结果,同时还返回不匹配的行的左(或右)表的连接,称为左(或右)连接。返回连接的结果,同时还返回左和右连接,称为全连接。

    左外连接

    右外连接

    全外连接

    子查询:当一个查询是另一个查询的条件时,称之为子查询。

    3. 多表连接语法

    3.1 语法结构

    使用一个连接从多个表中查询数据。

    在这里插入图片描述

    • 在WHERE字句中写连接条件
    • 当多个表中有相同列名时,将表名或者表的别名作为列名的前缀。

    3.2 定义连接

    当数据从多表中查询时,要使用连接(JOIN)条件。一个表中的行按照存在于相应列中的值被连接到另一个表中的行。

    3.3 原则

    • 在写一个连接表的select语句时,在列名前面用表名或者表的别名可以使语义清楚,并且加快了数据库访问。
    • 为了链接n个表在一起,最少需要n-1个链接条件。例如,为了链接4个表,最少需要3个链接条件。

    4. 等值连接-内连接

    4.1 什么是等值连接

    等值连接也被称为简单连接(simple joins)或内连接(inner joins)。是通过等号来判断连接条件中的数据值是相匹配。

    4.2 抉择矩阵

    是通过行与列来分析一个查询的方式。

    例如:如果你想显示同一个部门所有名字为Taylor的雇员的名字和部门名称,可以写出下面的决策矩阵。

    在这里插入图片描述

    示例:

    查询所有雇员名字以及他们所在的部门名称。

    select last_name,department_name from employees e,departments d where e.employee_id = d.department_id;
    

    4.3 使用AND操作符附加搜索条件

    除连接之外,还可以要求用WHERE子句在连接中限制一个或多个表中的行。

    4.4使用表别名

    使用表别名简化查询语句的长度。

    4.4.1表别名

    可以使用表别名代替表名。就象列别名给列另一个名字一样。表别名有助于保持SQL代码较小,因此使用的存储器也少。

    4.4.2使用表别名原则

    • 表别名最多可以有30个字符,但短一些更好。
    • 如果在FROM子句中表别名被用于指定的表,那么在整个SELECT语句中都可以使用表别名。
    • 表别名应该是有意义的。.
    • 表别名只对当前的SELECT语句有效。

    4.5多于两个表的连接

    为了连接n个表,你最少需要n-1 个连接条件。例如,为了连接3个表,最少需要两个连接。

    5. 非等值连接

    5.1非等值连接

    一个非等值连接是一种不使用相等(=)作为连接条件的查询。如!=、>、<、>=、<=、BETWEEN AND等都是非等值链接的条件判断。

    6. 自连接

    6.1 什么是自连接

    使用一个表连接它自身的操作。

    7. 外连接

    7.1什么是外连接(LEFT | RIGHT | FULL JOIN )

    外连接是指查询出符合连接条件的数据同时还包含孤儿数据。左外链接包含左表的孤儿数据,右外连接包含右表的孤儿数据,全外连接包含两个表中的孤儿数据。

    7.2孤儿数据(Orphan Data)

    孤儿数据是指被连接的列的值为空的数据。

    7.3外连接类型

    • 左外(LEFT OUTER JOIN):包含左表的孤儿数据。
    • 右外(RIGHT OUTER JOIN):包含右表的孤儿数据。
    • 全外(FULL OUTER JOIN):包含两个表中的孤儿数据。

    7.4 SQL99中的外连接

    SQL99外连接语法格式:

    用LEFT OUTER JOIN | RIGHT OUTER JOIN | FULL OUTER JOIN定义连接类型,用ON子句创建连接条件。

    7.4. 1左外链接(LEFT OUTER JOIN)

    7.4.1.1示例

    用左外链接查询雇员名字以及他们所在的部门名称,包含那些没有部门的雇员。

    select e.last_name,d.department_name from employees e left outer join departments d on e.department_id = d.department_id;
    返回(部分):
    LAST_NAME                 DEPARTMENT_NAME
    ------------------------- ------------------------------
    Gietz                     Accounting
    Higgins                   Accounting
    Grant                     
    107 rows selected
    

    说明:Grant这个雇员没有部门,是一个孤儿数据。

    7.4.2右外链接(RIGHT OUTER JOIN)

    示例:

    用右外链接查询雇员名字以及他们所在的部门名称,包含那些没有雇员的部门。

    select e.last_name,d.department_name from employees e right outer join departments d on e.department_id = d.department_id;
    返回(部分):
    LAST_NAME                 DEPARTMENT_NAME
    ------------------------- ------------------------------
    Gietz                     Accounting
    Higgins                   Accounting
                              Treasuryl
    122 rows selected
    
    

    说明:Treasuryl这个部门还没有雇员,是一个孤儿数据

    7.4.3 全外连接(FULL OUTER JOIN)

    用全外链接查询雇员名字以及他们所在的部门名称,包含那些没有雇员的部门以及没有部门的雇员。

    select e.last_name,d.department_name from employees e full outer join departments d on e.department_id = d.department_id;
    返回(部分):
    LAST_NAME                 DEPARTMENT_NAME
    ------------------------- ------------------------------
    Baer                      Public Relations
    Higgins                   Accounting
    Gietz                     Accounting
    Grant                     
                              NOC
                              Manufacturing
    123 rows selected
    

    7.5 0racle扩展的外连接

    在Oracle数据库中对外连接中的左外与右外连接做了扩展,可以简化外连接的语法。通过在连接条件的后侧使用(+)来表示是否显示孤儿数据,有(+)表示不显示孤儿数据而另一侧则显示孤儿数据。但是该种写法仅能在Oracle数据库中使用。

    示例一:

    查询雇员名字以及他们所在的部门名称,包含那些没有雇员的部门。

    select e.last_name,d.department_name from employees e ,departments d where e.department_id(+) = d.department_id;
    返回(部分):
    LAST_NAME                 DEPARTMENT_NAME
    ------------------------- ------------------------------
    Gietz                     Accounting
    Higgins                   Accounting
                              Treasury
    122 rows selected
    

    说明:相当于正常写了一个内连接查询,不显示孤儿数据的写个(+),要显示的不用写。Treasury是个孤儿数据。

    示例二:

    查询雇员名字以及他们所在的部门名称,包含那些没有部门的雇员。

    select e.last_name,d.department_name from employees e ,departments d where e.department_id = d.department_id(+);
    返回(部分):
    LAST_NAME                 DEPARTMENT_NAME
    ------------------------- ------------------------------
    Gietz                     Accounting
    Higgins                   Accounting
    Grant                     
    107 rows selected
    

    Grant是个孤儿数据。

    8. SQL99中的交叉连接

    • CROSS JOIN子句导致两个表的交叉乘积
    • 该连接和两个表之间的笛卡尔乘积是一样的。

    在这里插入图片描述

    示例:

    查询Employees表与Departments表的笛卡尔乘积

    select e.last_name,d.department_id from employees e cross join departments d;
    返回(部分):
    LAST_NAME                 DEPARTMENT_ID
    ------------------------- -------------
    Taylor                              270
    Taylor                              270
    Tobias                              270
    2889 rows selected
    

    说明:我们使用多表连接查询,如果不加任何条件,返回的也是笛卡尔乘积。

    上面的sql语句相当于:

    select e.last_name,d.department_id from employees e,departments d;
    

    9 SQL99 中的自然连接(NATURAL JOIN)

    • NATURAL JOIN子句基于两个表之间有相同名字的所有列。
    • 它从两个表中选择在所有的匹配列中有相等值的行。
    • 如果有相同名字的列的数据类型不同,返回一个错误。

    9.1使用自然连接需要注意

    1.如果做自然连接的两个表的有多个字段都满足有相同名称类型,那么他们会被作为自然连接的条件。

    2.如果自然连接的两个表仅是字段名称相同,但数据类型不同,那么将会返回一个错误。

    3.由于oracle中可以进行这种非常简单的natural join,我们在设计表时对具有相向含义的字段需要考虑到使用相同的名字和数据类型。

    9.2示例:

    查询部门ID,部门名称以及他们所在的城市。

    select d.department_id,d.department_name,l.city from departments d natural join locations l;
    返回(部分):
    DEPARTMENT_ID DEPARTMENT_NAME                CITY
    ------------- ------------------------------ ------------------------------
              250 Retail Sales                   Seattle
              260 Recruiting                     Seattle
              270 Payroll                        Seattle
    27 rows selected
    

    说明:以上sql相当于:

    select d.department_id,d.department_name,l.city from departments d , locations l where d.location_id = l.location_id;
    

    区别就是少了where条件语句。因为自然连接的两个表的有多个字段都满足有相同名称类型,那么他们会被作为自然连接的条件。

    9.3用USING 子句创建连接

    • 当有多个列匹配时,用USING子句匹配唯一的列。

    • 如果某列在USING中使用,那么在引用该列时不要使用表名或者别名。

    • NATURAL JOIN和USING子句是相互排斥的。

    9.3.1示例

    查询location_ id为1800的部门名称以及他们所在的城市名称,指定location_ id 为连接列。

    select d.department_name,l.city from departments d join locations l using (location_id) where location_id = 1800;
    返回(部分):
    DEPARTMENT_NAME                CITY
    ------------------------------ ------------------------------
    Marketing                      Toronto
    

    说明:使用了using子句,就不能出现natural,这里只写了join。并且where子句中的location_id没有写限定哪个表的location_id 。

    10 SQL99中的内连接

    内连接(INNER JOIN):内连接通过INNER JOIN来建立两个表的连接。在内连接中使用INNER JOIN作为表的连接,用ON子句给定连接条件。INNER JOIN语句在性能上其他语句没有性能优势。

    10.1示例

    查询雇员id为202的雇员名字,部门名称,以及工作的城市。

    答案一:(等值连接)

    select e.last_name,d.department_name,l.city from employees e,departments d,locations l where e.department_id = d.department_id and d.location_id = l.location_id and e.employee_id = 202;
    返回:
    LAST_NAME                 DEPARTMENT_NAME                CITY
    ------------------------- ------------------------------ ------------------------------
    Fay                       Marketing                      Toronto
    

    答案二:(内连接)

    select e.last_name,d.department_name,l.city from employees e inner join departments d on e.department_id = d.department_id inner join locations l on d.location_id = l.location_id and e.employee_id = 202;
    返回:
    LAST_NAME                 DEPARTMENT_NAME                CITY
    ------------------------- ------------------------------ ------------------------------
    Fay                       Marketing                      Toronto
    

    答案三:在内连接中使用USING子句定义等值连接

    select e.last_name,d.department_name,l.city from employees e inner join departments d using(department_id) inner join locations l using(location_id) where e.employee_id = 202;
    返回:
    LAST_NAME                 DEPARTMENT_NAME                CITY
    ------------------------- ------------------------------ ------------------------------
    Fay                       Marketing                      Toronto
    

    11. 子查询

    11.1 子查询介绍

    11.1.1 什么是子查询

    子查询是一个select语句,它是嵌套在另一个select语句中的子句。
    在这里插入图片描述
    可以用组合两个查询的方法解决这个问题,放置一个查询到另一个查询中。内查询或子查询返回一个值给外查询或主查询。使用一个子查询相当于执行两个连续查询并且用第一个查询的结果作为第二个查询的搜索值。

    11.1.2 子查询语法
    在这里插入图片描述

    • 子查询(内查询)在主查询之前执行一次。
    • 子查询的结果被用于主查询(外查询)。

    可以将子查询放在许多SQL子句中,包括:

    • WHERE子句
    • HAVING子句
    • FROM子句

    11.2 使用子查询

    11.2.1 使用子查询的原则

    • 子查询放在圆括号中
    • 将子查询放在比较条件的右边
    • 在单行子查询中用单行运算符,在多行子查询中用多行运算符

    示例:

    谁的薪水比Abel高

    答案一:(内连接查询)

    select em.last_name,em.salary from employees abel,employees em where abel.last_name = 'Abel' and  em.salary > abel.salary;
    返回(部分):
    LAST_NAME                     SALARY
    ------------------------- ----------
    King                        24000.00
    Kochhar                     17000.00
    Higgins                     12008.00
    10 rows selected
    

    答案二:(子查询)

    select em.last_name,em.salary from employees em where em.salary > (select m.salary from employees m where m.last_name = 'Abel');
    返回:
    同上
    

    11.3 子查询的类型

    在这里插入图片描述

    • 单行子查询:子查询语句返回一行的查询
    • 多行子查询:子查询语句返回多行的查询

    11.3.1 单行子查询

    • 仅返回一行
    • 使用单行比较符

    主查询对子查询结果的单行比较运算符:

    在这里插入图片描述

    示例:

    显示job_id与雇员141相同,并且薪水高于雇员143的那些雇员。

        select e.last_name,e.job_id,e.salary from employees e where e.job_id = (select em.job_id from employees em where em.employee_id = '141') and e.salary > (select emp.salary from employees emp where emp.employee_id = 143);
        返回(部分):
        LAST_NAME                 JOB_ID         SALARY
        ------------------------- ---------- ----------
        Nayer                     ST_CLERK      3200.00
        Mikkilineni               ST_CLERK      2700.00
        Bissot                    ST_CLERK      3300.00
        11 rows selected
    

    11.3.2 在子查询中使用组函数

    在子查询中可以使用组函数。

    示例:

    显示所有薪水等于最低薪水的雇员的last_name,job_id,salary

    select e.last_name,e.job_id,e.salary from employees e where e.salary = (select min(salary) from employees);
    返回:
    LAST_NAME                 JOB_ID         SALARY
    ------------------------- ---------- ----------
    Olson                     ST_CLERK      2100.00
    

    11.3.3 带子查询的HAVING子句

    可以在WHERE子句中使用子查询,也可以在HAVING子句中使用子查询

    示例:

    显示所有最低薪水小于部门50的最低薪水的部门号和最低薪水。

    select em.department_id,min(em.salary) from employees em group by em.department_id having min(em.salary) > (select min(e.salary) from employees e where e.department_id = 50);
    返回(部分):
    DEPARTMENT_ID MIN(EM.SALARY)
    ------------- --------------
              100           6900
               30           2500
               10           4400
    11 rows selected
    

    11.4 什么是子查询错误?

    在这里插入图片描述

    使用子查询的一个常见错误就是单行子查询返回了多行。

    11.5 多行子查询(ANY,ALL,IN)

    • 返回多于一行
    • 使用多行比较符

    主查询对子查询的多行比较运算符

    在这里插入图片描述
    在条件中也可以使用NOT取反。

    11.5.1 在多行子查询中使用IN

    示例:

    查找各部门收入为部门最低的那些雇员,显示他们的名字,薪水以及部门ID。

    select e.last_name,e.department_id,e.salary from employees e where e.salary in (select min(em.salary) from employees em group by em.department_id);
    返回(部分):
    LAST_NAME                 DEPARTMENT_ID     SALARY
    ------------------------- ------------- ----------
    Perkins                              50    2500.00
    Whalen                               10    4400.00
    Fay                                  20    6000.00
    Mavris                               40    6500.00
    Baer                                 70   10000.00
    Gietz                               110    8300.00
    26 rows selected
    

    15.5.2 在多行子查询中使用ANY运算符
    在这里插入图片描述

    < ANY意思是小于最大值。> ANY意思是大于最小值。

    示例:

    显示工作岗位不是IT_PROG的雇员,并且这些雇员的薪水少于IT_PROG工作岗位的雇员的ID,名字,工作岗位和薪水。

    select e.employee_id, e.last_name,e.job_id from employees e where e.job_id <> 'IT_PROG' and e.salary < any (select em.salary from employees em where em.job_id = 'IT_PROG');
    返回(部分):
    EMPLOYEE_ID LAST_NAME                 JOB_ID
    ----------- ------------------------- ----------
            154 Cambrault                 SA_REP
            160 Doran                     SA_REP
            111 Sciarra                   FI_ACCOUNT
    76 rows selected
    

    15.5.3 在多行子查询中使用ALL运算符
    在这里插入图片描述

    < ALL意思是小于最小值,> ALL意思是大于最大值。

    示例:

    显示那些薪水低于工作岗位IT_PROG的最低薪水,并且工作岗位不是IT_PROG的所有雇员。

    select em.employee_id,em.last_name,em.job_id,em.salary from employees em where em.job_id <> 'IT_PROG' and em.salary < all (select e.salary from employees e where e.job_id = 'IT_PROG');
    返回(部分):
    EMPLOYEE_ID LAST_NAME                 JOB_ID         SALARY
    ----------- ------------------------- ---------- ----------
            128 Markle                    ST_CLERK      2200.00
            136 Philtanker                ST_CLERK      2200.00
            132 Olson                     ST_CLERK      2100.00
    44 rows selected
    
    展开全文
  • 按年代分类: SQL1992标准(192标准):仅支持内连接 SQL1999标准(199标准) [推荐]:支持内连接+外联结(左外与右外)+交叉连接 按功能分类: 内连接: 等值连接等值连接 自联结 外连接: 左外连接 右外连接 全外连接 交叉...

    时光在不经意间,总是过得出奇的快。小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊。在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由我继续带你回顾MySql的知识吧!

    回顾练习资料girls库以及两张表的脚本: https://pan.baidu.com/s/1NAvIOIrIPB8ZVfRblU2ppg 提取码:                                                                               rrwa

    引题:笛卡尔现象,先来观看一下两张表。

    SELECT* FROM boys;

    8ef09994e6779f077867b8c255d8153b.png

    SELECT * FROM beauty;

    91a30836fce671891e00dc7ab5368ac0.png

    SELECT NAME,boyname FROM boys,beauty;

    最终结果:12*4=48行

    d5d9c534446c65a25c9a8c00eddee4ca.png

    #进阶6:连接查询

    含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

    笛卡儿积现象: 表1 有m行,表2有n行,结果=m*n行

    产生原因:没有有效的连接条件

    解决方法:添加有效的连接条件

    连接分类:

    按年代分类:

    SQL1992标准(192标准):仅支持内连接

    SQL1999标准(199标准) [推荐]:支持内连接+外联结(左外与右外)+交叉连接

    按功能分类:

    内连接:

    等值连接

    非等值连接

    自联结

    外连接:

    左外连接

    右外连接

    全外连接

    交叉连接:

    左外连接

    右外连接

    全外连接

    交叉连接:

    SELECT NAME,boyname FROM boys,beauty

    WHERE beauty.boyfriend_id = boys.id;

    0b855030a9c89d9df74226822c192df6.png

    #一.SQL192标准

    #1.等值连接

    ①多表等值连接的结果为多表的交集部分

    ②n表连接,至少需要n-1个连接条件

    ③多表的顺序没有要求

    ④一般需要为表起别名

    ⑤可以搭配前面介绍的所有子句使用,比如,排序,分组,筛选。

    #多表查询,先匹配在筛选

    #案例1.查询员工名和对应的部门名。

    SELECT first_name AS 名,department_name AS 部门名

    FROM employees,departments

    WHERE employees.department_id= departments.department_id;

    8e702b3da743fed8811fa5726cc34c0b.png

    #案例2.查询员工名,工种号,工种名。对于两张表共有的字段需要加表名作限定不然会报错。

    错误示例:

    SELECT first_name AS 名,employees.job_id AS 工种号,job_title AS 工种名

    FROM employees,jobs

    WHERE employees.job_id= jobs.job_id;

    #2.为表起别名

    ①提高语句的简洁度

    ②区分多个重命名的字段

    注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定

    SELECT first_name AS 名,e.job_id AS 工种号,job_title AS 工种名

    FROM employees AS e,jobs AS j

    WHERE e.job_id= j.job_id;

    51fe00ae84463ae28c6a0490dac79651.png

    给表起了别名,再用表完整名子做限定会报错,不允许。根据执行顺序走先走FROM,

    走完FROM后就用别名的,相当于生成了一个虚拟的视图,不再认原来的表名。

    8d844bba1025e2cae130c44de7a86456.png

    #3.两个表名的顺序是否可以调换,是可以调换的。

    SELECT first_name AS 名,e.job_id AS 工种号,job_title AS 工种名

    FROM jobs AS j,employees AS e

    WHERE e.job_id=j.job_id;

    #4.可以加筛选

    #案例3.查询有奖金的员工名,部门名。

    SELECT first_name AS 名,department_name AS 部门名,commission_pct AS 奖金

    FROM employees AS e,departments AS d

    WHERE e.department_id=d.department_id

    AND commission_pct IS NOT NULL;

    #AND e.commission_pct IS NOT NULL;

    0048ecf1eda0df2a6aba30674ffa8116.png

    #案例4.查询城市名中第二个字符为o对应的城市名与部门名。

    SELECT city AS 城市,department_name AS 部门名

    FROM locations AS l,departments AS d

    WHERE l.location_id= d.location_id

    AND city LIKE '_o%';

    68a8b25bacd04648ed3c886e6e7ae64b.png

    #5.可以加分组

    #案例1.查询每个城市的部门个数。

    SELECT city AS 城市,COUNT(department_id) AS 个数

    FROM locations AS l,departments AS d

    WHERE l.location_id= d.location_id

    GROUP BY l.city;

    7899c02bc9bf70a91ca7ebccaad40563.png

    #案例2.查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资。

    #查询的时候不确定把两个列都加上。

    SELECT commission_pct AS 奖金,department_name AS 部门名,

    d.manager_id AS 领导编号,MIN(salary) AS 最低工资

    FROM employees AS e,departments AS d

    WHERE e.department_id= d.department_id

    AND commission_pct IS NOT NULL

    GROUP BY department_name,d.manager_id;

    96812ef6b7d75ddc4ec14b5b5054dbdd.png

    #6.可以加排序

    #案例1:查询每个工种的工种名和员工的个数,并且按员工个数降序。

    SELECT j.job_title AS 工种名,COUNT(employee_id) AS 个数

    FROM employees AS e,jobs AS j

    WHERE e.job_id= j.job_id

    GROUP BY job_title

    ORDER BY 个数 DESC;

    6d8a875a0cffd11755fcacfd61095099.png

    #7.三表连接

    #案例1.查询员工名,部门名与所在的城市

    SELECT first_name AS 名,d.manager_id AS 部门名,city AS 城市

    FROM employees AS e,departments AS d,locations AS l

    WHERE e.department_id= d.department_id

    AND d.location_id = l.location_id;

    9c8447f7c2b0756e0f250ea2b208feeb.png

    #案例2.查询员工名,部门名与所在的城市,城市以s开头。

    SELECT first_name AS 名,d.manager_id AS 部门名,city AS 城市

    FROM employees AS e,departments AS d,locations AS l

    WHERE e.department_id= d.department_id

    AND d.location_id = l.location_id

    AND city LIKE 's%';

    14946acb5025a1d22fe29936b4ebdf19.png

    #案例3.查询员工名,部门名与所在的城市,城市以s开头,按姓名降序排列。

    SELECT first_name AS 名,d.manager_id AS 部门名,city AS 城市

    FROM employees AS e,departments AS d,locations AS l

    WHERE e.department_id= d.department_id

    AND d.location_id = l.location_id

    AND city LIKE 's%'

    ORDER BY department_name DESC;

    fc747cd74c556b2c81a33d8edfb3eae4.png

    新增一张工资等级表。

    CREATE TABLE job_grades

    (grade_level VARCHAR(3),

    lowest_salint,

    highest_salint);

    INSERT INTO job_grades

    VALUES ('A', 1000, 2999);

    INSERT INTO job_grades

    VALUES ('B', 3000, 5999);

    INSERT INTO job_grades

    VALUES('C', 6000, 9999);

    INSERT INTO job_grades

    VALUES('D', 10000, 14999);

    INSERT INTO job_grades

    VALUES('E', 15000, 24999);

    INSERT INTO job_grades

    VALUES('F', 25000, 40000);

    3e041fc154887103341e03f347ea25fb.png

    #2.非等值连接,(范围判断)

    #案例1.查询员工的工资和工资级别。

    SELECT salary AS 工资,grade_level AS 等级

    FROM employees AS e,job_grades AS g

    WHERE salary BETWEEN g.lowest_sal AND g.highest_sal;

    b11088c47661d15b326e66ca0b8e2851.png

    #案例2.查询员工的工资和工资级别,展示出A级别的员工。

    SELECT salary AS 工资,grade_level AS 等级

    FROM employees AS e,job_grades AS g

    WHERE salary BETWEEN g.lowest_sal AND g.highest_sal

    AND g.grade_level= 'A';

    c0ad20a15d0410142b86b0b6db919d23.png

    #3.自联接[自己连接自己]

    227992be1c52f08468f96363487828bd.png

    #案例1.查询员工名和上级的名称.

    SELECT e.employee_id,e.last_name AS 员工,

    m.employee_id,m.last_name AS 领导

    FROM employees e,employees m

    WHERE e.manager_id= m.employee_id;

    14bcee05f5250ce178f679ac5957b19d.png

    经过了以上的示例,相信你对多表查询已经有了一个了解,赶快动动你的小手手来练习一下吧!o(^▽^)o

    展开全文
  • 多表查询的分类1:等值连接和非等值连接。什么是等值连接和非等值连接?MySQL中的等值连接和非等值连接如何实现?看完本篇文章,相信你会得到答案。
  • 三种连接的语法为便于更多的技友快速读懂、理解,我们只讨论2张表对象进行连接操作的情况,大于2张表对象进行的连接操作原理也是一样的。1.左连接(LEFT JOIN )SELECT M.columnname……,N.* columnname…..FROM left_...
  • 特点: 1.可以添加排序,分组,筛选。 2.inner 可以省略 3.筛选条件可以放在where 后面,连接条件可以放在on 后面,提高分离性,便于阅读。...4.inner join连接和sql语法中的等值连接的效果是一样的,都是查询交集 ...
  • 多表连接查询 含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询 ...内连接:等值连接 、非等值连接 、 自连接 外连接:左外连接 、 右外连接 、 全外连接 交叉连接 一、sql92标准 1》等值
  • 内链接:等值连接, 非等值连接,自连接 外连接 :左外,右外,全外 交叉连接 一般语法 SELECT 查询的列表 FROM 表1 别名1,表2 别名2 WHERE 表1.关键词= 表2.关键词; 【and 筛选条件】 【gr...
  • 等值连接3. 自连接 1. 内连接 内连接最大的特点是:条件是等量关系。 案例:查询每个员工的部门名称,要求显示员工名和部门名。 从emp表中取ename,从dept表中取dname SQL92(太老了,不用): select e.ename,d....
  • 1.区分笛卡儿积,自然连接,等值连接,内连接,外连接(左连接,右连接和全连接)假设存在两张表R和S,这里使用的是MySQL数据库。下面这张表是R下面这张是S为了测试左连接和右连接,现在增加一张表T,字段和S表的字段...
  • sql92语法连接查询(等值连接,非等值连接,自连接) 连接查询 含义:又称多表查询,当查询的字段来自于多个表时,就要用到连接查询 笛卡尔积现象:表1 有m行,表2有n行,结果有m*n行 发生原因:没有有效的连接条件 ...
  • 所以一般直接在where语句中直接将相同字段用等号连接就行。fromarightjoinbon连接条件。fromaleftjoinbon连接条件。注意连接的表也可以是自身,这叫自身连接
  • 1 等值连接 等值连接:它是基于两个表之间的相等测试,展现出来的是共同的数据,因此又称内部连接。 举例: # 等值连接/内部连接 -- 使用WHERE SELECT `snum`, `cname`, `grade` FROM `course`, `sc` WHERE `...
  • 一,非等值连接 二,等值连接 三,自然连接 自然连接:是一种特殊的等值连接。它要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中去除重复的属性列。 上面的等值连接进行比较的都是B属性,...
  • 1 连接概念及连接类型介绍 合并思想. N个表 --> 1个表 定义:将2个或2个以上的表通过一定的条件拼接起来形成一个虚表的过程. 连接是from子句的一部分.
  • 文章目录内连接自然连接和等值连接的区别内连接的实现方式外连接左连接右连接全连接 内连接 内连接INNERJOIN是最常用的连接操作。从数学的角度讲就是求两个表的交集,从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句...
  • 1、笛卡尔积:笛卡尔积的元素是元组,关系A和B的笛卡尔积可以记为(AXB),如果A为a目,B为b目,那么A和B的笛卡尔积为(a+b)列的元组集合。...2、内连接:内连接又称为普通连接或自然连接。在说自然连接...
  • mysql等值连接

    2021-09-21 12:13:55
  • 等值连接:inner join自然连接: out join, left join,right join 等值连接连接join 是从两个关系的笛卡儿积中选取属性间满足一定条件的元组。连接运算中有两种最为重要也最为常用的连接,一种是等值连接,一种是外...
  • sqlserver等值连接等值连接PPT教案.pptx
  • 等值连接

    千次阅读 2020-08-04 11:45:10
    #2、非等值连接 #案例1:查询员工的工资和工资级别 SELECT * FROM `job_grades`; SELECT `salary`,`employee_id` FROM `employees`; SELECT `salary`,`grade_level` FROM `employees` e,`job_grades` j WHERE `salary...
  • 内连接之等值连接:最大特点是:条件是等量关系。 案例:查询每个员工的部门名称,要求显示员工名和部门名。 下面是SQL92的(太老,不用了) mysql> select e.ename ,d.dname from emp e,dept d where e...
  • 连接查询 含义:又称多表查询,当查询的字段来自于多个表时,就会使用到连接查询 笛卡尔乘积现象:表一有m行,表二有n行,结果=m*n行 发生原因:没有有效的连接条件 如何避免:添加有效的连接条件 分类:按年代分类:1sql192 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,463
精华内容 20,585
关键字:

等值连接