精华内容
下载资源
问答
  • 1、单表查询 ...联结查询 1、内部联结 A、 select 列名,列名 from 表名,表名 where 条件 select ename,job,dname,loc from emp,dept where emp.deptno=dept.deptno; select ename,job,dname,loc ...

    1、单表查询

    select…from…

    where…

    group by…

    order by…

    2、多表查询

    联结查询

    1、内部联结

    A、

    select 列名,列名 from 表名,表名

    where 条件

    select ename,job,dname,loc from emp,dept where emp.deptno=dept.deptno;

    select ename,job,dname,loc from emp e,dept d where e.deptno=d.deptno;

    select ename,job,dname,loc,e.deptno from emp e,dept d where e.deptno=d.deptno;

    再筛选

    select ename,job,dname,loc,e.deptno from emp e,dept d where e.deptno=d.deptno and job=‘CLERK’;

    B、

    select 列名,列名 from 表1

    inner join 表2 on 联结条件

    表1,表2可互换位置,不影响结果,顺序不一样

    select ename,job,dname,loc from emp

    inner join dept on emp.deptno=dept.deptno;

    再筛选

    select ename,job,dname,loc from emp

    inner join fept on emp.deptno=dept.deptno where job=‘CLERK’;

    笛卡尔集

    select ename,job,dname,loc from emp,dept ;

    每一个表都与另一个表匹配一次

    查工资等级

    select ename,job,sal,grade,dname from emp

    inner join dept on emp.deptno=dept.deptno

    inner join salgrade on sal between losal and hisal;

    再筛选排序

    select ename,job,sal,grade,dname from emp

    inner join dept on emp.deptno=dept.deptno

    inner join salgrade on sal between losal and hisal

    where grade>=2

    order by dname;

    统计每个工资级别都有多少人

    select grade,count(*) as 人数 from emp

    inner join salgrade on sal between losal and hisal

    group by grade;

    每个部门平均工资

    select dname,avg(sal) from emp

    inner join dept on emp.deptno=dept.deptno

    group by dname;

    2、外部联结

    select * from user_table

    查询都有多少表

    重新建表进行查询,外部联结并不需要两个表之间有关系

    create table student

    (stuid number(10) not null,

    stuname varchar(20) not null,

    gender varchar(4) not null,

    phone varchar(11) null

    )

    create table exam

    (stuid number(10) not null,

    subject varchar(30) not null,

    score number(5) not null

    )

    insert into student values(100,‘张山’,‘男’);

    insert into student values(101,‘里斯’,‘男’);

    insert into exam values(100,‘JAVA’,95);

    insert into exam values(102,‘JAVA’,95);

    姓名 科目 成绩

    内部联结查询法

    select stuname,subject,score from student

    inner join exam on student.stuid=exam.stuid;

    外部联结查询法

    两表互换,结果不一样

    左外部联结

    select stuname,subject,score from student

    left outer join exam on student.stuid=exam.stuid;

    右外部联结

    select stuname,subject,score from student

    right outer join exam on student.stuid=exam.stuid;

    完整外部联结

    select stuname,subject,score from student

    full join exam on student.stuid=exam.stuid;

    没有成绩显示缺考

    select stuname,nvl(subject,‘缺考’),nal(score,0) from student

    left outer join exam on student.stuid=exam.stuid;

    查询没参加过考试的学生

    select stuname,subject,score from student

    left outer join exam on student.stuid=exam.stuid

    where subject is null;

    自联结

    查询员工姓名,职位,上司姓名,职位

    select e.ename,e.job,m.ename as 上司职位,m.job as 上司职位 from emp e

    inner join emp m on e.mgr=m.empno;

    左外部联结

    select e.ename,e.job,m.ename as 上司职位,m.job as 上司职位 from emp e

    left outer join emp m on e.mgr=m.empno;

    展开全文
  • 通过以下实例,来验证自联结和子查询的区别 题目:目前有两张表,cust_info是客户表,order_list是订单表,两张表都有同样的字段名cust_id 要求查询客户赵一的所有订单信息,要求结果如下: 解题思路: 1.首先筛选...

    通过以下实例,来验证自联结和子查询的区别

    题目:目前有两张表,cust_info是客户表,order_list是订单表,两张表都有同样的字段名cust_id
    要求查询客户赵一的所有订单信息,要求结果如下:
    在这里插入图片描述

    解题思路:
    1.首先筛选出客户赵一的对应订单id
    2.再根据订单id找到对应的订单信息

    解法一:子查询:

    select *
    from order_list 
    where cust_id=(
                   select cust_id 
    			   from cust_info 
    			   where cust_name='赵一'
    							 );
    							 
    

    解法二:自联结1

    select o.*
    from order_list o INNER JOIN cust_info c
    on c.cust_id=o.cust_id
    where c.cust_name='赵一'
    

    解法三:自联结2

    select o.*
    from order_list o
    ,cust_info c
    where c.cust_id=o.cust_id
    and c.cust_name='赵一';
    

    总结:
    1.自联结是子查询的简化,自联结的代码行数更少
    2.同时自联结的运行速度更快

    展开全文
  • MySQL联结查询操作系统:ubuntu 18.04mysql版本:8.0创建:2020/7/2修改:2020/7/2使用的演示表:用户表(users)订单表(orders)联结的种类:内联结,左外联结,右外联结,全外联结,自联结,自然联结内联结(inner ...

    MySQL联结查询

    操作系统:ubuntu 18.04

    mysql版本:8.0

    创建:2020/7/2

    修改:2020/7/2

    使用的演示表:

    用户表(users)

    037b41df6160dbb17bcd8301eae9fb68.png

    订单表(orders)

    2e9358295a31523134b14106c20ae5fc.png

    联结的种类:内联结,左外联结,右外联结,全外联结,自联结,自然联结

    内联结(inner join)

    内联结也被称为等值联结,是将两张或多张表通过联结列进行匹配联结为一张表。以联结两个表为例,指定一列或多列作为联结列,使用第一张表中一行中的指定列与第二张表中每一行对应的列比较,如果这些列都与对应列相等,那么将这两行拼接加入联结表。在第二张表中找不到匹配的行不会出现在联结表中。联结表行数可能会超过第一张表,因为在第二张表中可能有多行与第一张表中的一行匹配。

    内联结有两种写法,两种写法结果一样,使用join的写法更加标准

    -- 内联结不使用JOIN

    SELECT *

    FROM users, orders

    WHERE users.userId = orders.userId;

    -- 内联结使用JOIN

    SELECT *

    FROM users JOIN orders

    ON users.userId = orders.userId;

    765133b2296f5c02376c95b7324b963b.png

    当不使用联结条件时,返回的结果是笛卡尔积,也就是第一张表中的每一行和第二张表中所有行匹配,最终结果的行数为第一张表行数乘以第二张表的行数

    SELECT *

    FROM users JOIN orders;

    在使用多个列联结或者联结多张表时,可以使用AND拼接条件

    SELECT *

    FROM users JOIN orders JOIN order_items

    ON users.userId = orders.userId AND orders.orderId = order_items.orderId;

    在MySQL中还可以进行简写

    SELECT *

    FROM users JOIN orders USING(userId);

    简写的条件是在两张表中联结列的列名是相同的,使用USING后结果集中会去除重复的联结列

    f693f89b2bf3909d14c6eb538dc63693.png

    外联结(outer join)

    外联结与内联结相似,区别是外联结将在另一个表中没有匹配的行与全是null值的行匹配

    外联结分为:左外连接,右外联结,全外联结

    左外联结(left outer join)

    以左边表做主表,左边的表中不能与右边表匹配的行,与全是null值的行匹配并加入联结表。

    这样左边表中的所有行都在联结表中至少出现了一次

    -- 使用ON

    SELECT *

    FROM users LEFT OUTER JOIN orders

    ON users.userId = orders.userId;

    -- 使用USING

    SELECT *

    FROM users LEFT OUTER JOIN orders USING(userId);

    8fb7b6e54e432e3fd55c1dd2f525deaa.png

    右外联结(right outer join)

    右外联结以右边的表作为主表,右边表中不能在左边表匹配的行,与全是null值的行匹配。

    这样右边表中所有的行都在联结表中至少出现了一次

    -- 使用ON

    SELECT *

    FROM users RIGHT OUTER JOIN orders

    ON users.userId = orders.userId;

    -- 使用USING

    SELECT *

    FROM users RIGHT OUTER JOIN orders USING(userId);

    16ab75768d6f7f7622a0c22c1b359d7a.png

    左外联结和右外联结区别仅在顺序,比如下面两句效果相同

    A LEFT OUTER JOIN B;

    B RIGHT OUTER JOIN A;

    全外联结(full outer join)

    全外联结是将左右两张表中,不能与另一张表中行匹配的行都与全是null值的行匹配,MySQL不支持FULL OUTER JOIN,可以使用UNION实现,UNION会去除那些重复的行

    -- 这里不能使用USING,使用USING会使两个结果集中列的对应关系错乱

    SELECT *

    FROM users LEFT OUTER JOIN orders

    ON users.userId = orders.userId

    UNION

    SELECT *

    FROM users RIGHT OUTER JOIN orders

    ON users.userId = orders.orderId;

    09ef103628e04a99de34e797bb3028b2.png

    自然联结(natural join)

    自然联结是一种特殊的等值联结。在联结两个表时,使用两个表的公共列进行联结,公共列是指列名和值类型都相同的列,并且在结果中会去除冗余的联结列。

    -- 使用NATURAL JOIN进行自然联结

    SELECT *

    FROM users NATURAL JOIN orders;

    -- 上面语句的结果,与此句使用内联结的结果相同

    SELECT *

    FROM users JOIN orders USING(userId);

    上面的例子因为users和orders表中都有userId这个列,并且值类型也相同,所以使用userId进行联结。在自然联结中不能使用ON或 USING来限制

    11befcbe5703e9818eb107a51525d703.png

    自联结(self join)

    自联结就是一张表和自己联结,比如要找出users表中和伞木希美同一个年龄的用户,我们可以使用子查询先得到伞木希美的年龄,再查询这个年龄的所有用户,也可以使用自联结完成此项工作

    -- 使用子查询

    SELECT *

    FROM users

    WHERE age = (

    SELECT age

    FROM users

    WHERE name = '伞木希美'

    );

    -- 使用自联结

    SELECT u.*

    FROM users JOIN users AS u USING(age)

    WHERE users.name = '伞木希美';

    6d3bef589643cdeddfdf56c570478d8d.png

    展开全文
  • sql中自联结的使用

    2018-06-28 11:24:43
    sql中自联结的使用一、用SQL自联结查询处理列之间的关系SQL自身连接,可以解决很多问题。下面举的一个例子,就是使用了SQL自身连接,它解决了列与列之间的逻辑关系问题,准确的讲是列与列之间的层次关系。SQL代码...

    一、用SQL自联结查询处理列之间的关系

    SQL自身连接,可以解决很多问题。下面举的一个例子,就是使用了SQL自身连接,它解决了列与列之间的逻辑关系问题,准确的讲是列与列之间的层次关系。SQL代码如下:

    1 SELECT FIRST.CNumber, SECOND.PCNumber
    2 FROM Course FIRST, Course SECOND
    3 WHERE FIRST.PCNumber=SECOND.CNumber;

     在这个代码中,只涉及到一个表,即课程信息表COURSE(CNumber, CName, PCNumber),其中CNumber是该课程的课程号,PCNumber是该课程的先修课课程号。在FROM子句中,为Course表起了两个不同的别名,即FIRST和SECOND,即为Course表创建了两个不同的实例。查询时,使用了条件语句WHERE,要求FIRST表中的先修课号PCNumber同SECOND表中的课程号CNumber相同,而查询所需要的结果,是FIRST表的课程号CNumber和SECOND表中的PCNumber,那么查询结果,就应该是FIRST表中的课程号CNumber和该课程号所对应的间接先修课课程号。
      
      同样的查询,如果不使用自联结,而纯粹是对单表本身进行操作,那将是非常困难的。假设在这个表中,有两个元组(cnumber1, cname1, pcnumber1)和(cnumber2, cname2, pcnumber2),其中,pcnumber1=cnumber2。在同一个COURSE表上,关于课程号的信息,只有CNumber和PCNumber这两个属性,它们只能表示一个课程号(cnumber1)和该课程号直接先修课(pcnumber1=cnumber2)的一层关系。而间接先修课,需要求出cnumber1和pcnumber2的关系,这是一个二层关系。对于这个只能表示一层关系的表而言,如果纯粹对单表进行操作而不使用自然连接,那么一个可行的方案是,为Course表再增加一个列PPCNumber,令该列表示间接先修课,那么,通过三个列,就可以表示这种二层关系了。
      通过这个例子以及对这个例子的分析,我们可以初步得出结论,自联结查询,可以表示表中各列的层次关系。当所要查询的信息都出于同一个表,而又不能直接通过该表的各个列的直接层次关系得到最终结果的时候,那么应该考虑使用表的自连接查询。
      

    二、SQL自联结查询表示其它关系

      除了处理前面例子中的列之间的层次关系之外,SQL自联结查询还可用于处理列之间的顺序关系、因果关系等多种逻辑关系。此外,SQL自身查询还可以用于处理单列本身的逻辑关系。下面的例子,就说明了对单列的逻辑关系的处理。

    1 SELECT FIRST.Num, FIRST Stop, SECOND.Stop
    2 FROM Route FIRST, Route SECOND
    3 WHERE FIRST.NUM=SECOND.NUM;

     这个代码中,只涉及到一个表Route(Num, Stop),这个表可以表示某一线路的火车的车站线路信息。Num表示该车的车次号,Stop表示该次车停靠的城市名称。上面的代码,可以求出某一线路的火车可以联通的任意两个城市的名称。
     在这里例子中,连接的操作对象只有Num这一个列,通过相同的车次号,找出该列车联通的任意两个城市的信息。在这个例子中,原来表Route中的每一个元组,只能表示车号和该车的某一站点的信息,实际上,这是“1Vs1”的映射关系。如果要表示两个站点的联通关系,那么就应该把两个“1Vs1”关系合并,形成“1Vs多”的关系。我们利用自联结,很容易地解决了这个关系扩充的问题。
    下面的这里例子,是对单一的列进行连接处理:
     

    1 SELECT FIRST.Num, SECOND.Num, FIRST.Stop
    2 FROM Route FIRST, Route SECOND
    3 WHERE FRIST.Stop=SECOND.Stop;

     

      
      上面的SQL代码,求出了路经相同城市的车次的信息。原表中的车次和车站是“1Vs1”关系,通过自联结后,得到了车次和车站的“多Vs1”关系。

     一些自联结代码经典例子:

    到目前为止,我们连接的都是两张不同的表,那么能不能对一张表进行自我连接呢?答案是肯定的。
    有没有必要对一张表进行自我连接呢?答案也是肯定的。

    表的别名:
    一张表可以自我连接。进行自联结时我们需要一个机制来区分一个表的两个实例。 
    在FROM clause(子句)中我们可以给这个表取不同的别名, 然后在语句的其它需要使用到该别名的地方
    用dot(点)来连接该别名和字段名。

    我们在这里同样给出两个表来对自联结进行解释。
    爱丁堡公交线路,

    车站表:
    stops(id, name)

    公交线路表:
    route(num, company, pos, stop)

    关于这两个表更详细的解释可以参考这里:http://sqlzoo.cn/buses.htm

    一、对公交线路表route进行自联结。

    1 SELECT * FROM route R1, route R2
    2 WHERE R1.num=R2.num AND R1.company=R2.company

     

        我们route表用字段(num, company)来进行自联结. 结果是什么意思呢?
    你可以知道每条公交线路的任意两个可联通的车站。

    二、用stop字段来对route(公交线路表)进行自联结。

    1 SELECT * FROM route R1, route R2
    2 WHERE R1.stop=R2.stop;

     

    查询的结果就是共用同一车站的所有公交线。这个结果对换乘是不是很有意义呢。

        从这两个例子我们可以看出,自联结的语法结构很简单,但语意结果往往不是
    那么容易理解。就我们这里所列出的两个表,如果运用得当,能解决很多实际问题,
    例如,任意两个站点之间如何换乘。

    1 SELECT R1.company, R1.num
    2 FROM route R1, route R2, stops S1, stops S2
    3 WHERE R1.num=R2.num AND R1.company=R2.company
    4 AND R1.stop=S1.id AND R2.stop=S2.id
    5 AND S1.name='Craiglockhart'
    6 AND S2.name='Tollcross'

     


      
      总结
      
      同其它连接相比,SQL自联结查询本身并没有什么特殊的。但是,在应用中,自连接查询因为其语法结构简单,而逻辑结构复杂,语义往往不是那么容易被人理解,因此,在使用时,经常令人觉得迷惑不解。但只要把自连接运用的得当,把单表看成是多表,牢固树立这一思维定式,我们会发现,自连接查询会为我们解决很多复杂的问题。

    展开全文
  • 自联结如前所述,使用表别名的主要原因之一是能在单条 SELECT 语句中不止一次引用相同的表。下面举一个例子。假如你发现某物品(其ID为 DTNTR )存在问题,因此想知道生产该物品的供应商生产的其他物品是否也存在这些...
  • 表联结,自联结

    2020-09-12 18:46:45
    联结是一种查询的机制,在一个select中关联多个表进行查询,成为联结。 用人话来说意思就是如果你要查两个数据,但是两个数据在不同的表中,你就把两个表联起来查。 给定一个需求。 A表包含 x y z三个字段 B表...
  • 联结查询 1.内部联结 语法1:select 列名,列名 from 表名,表名 where 条件 例如: select ename,job,dname,loc from emp,dept where emp.deptno=dept.deptno; --或者对表定义别名: select ename,job,dname,loc,e....
  • MySQL 自联结 自连接

    千次阅读 多人点赞 2019-06-02 21:31:39
    自联结顾名思义就是把一张表假设为两张一样的表,然后在做“多表查询” 例如想于下方表中找出与在“爱艺奇”公司的客户同名的顾客。 第一步:找出在“爱艺奇”的客户的姓名,第二步:从全表中去查询姓名与第一步查询...
  • 1.使用表别名 ...自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。虽然最终的结果是相同的,但有时候处理联结远比处理子查询快得多。 上述例子查询中需要的两个表实际上是相同的表,
  • mysql-自联结讲解

    2019-04-29 21:21:07
    自联结是通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。 例:一个表里根据这个人名字,查询同这个人性别相同的所有人,一条sql语句 自联结:select u1.id, u1.name, u1.sex from user as u1, user ...
  • 自联结 上例子: 找到Jim Jones所在公司工作的所有客户。...当然可以使用子查询,在这里就不把子查询的代码写出来了,使用自联结查询一下: SELECT c1.cust_id,c1.cust_name,c1.cust_contact FROM Customers A
  • Mysql自联结深入剖析

    2015-12-17 00:29:06
    自联结通常作为外部语句用来代替从相同表中检索数据时使用的子查询语句 自联结SELECT * FROM products AS p1, products AS p2;返回数据结果为196行,由此可以看出他是 p1 和 p2 的笛卡尔积; 可以推测,所谓的自联
  • MySQL的联结(Join)语法1.内联结、外联结、左联结、右联结的含义及区别:在讲MySQL的Join语法前...国内关于MySQL联结查询的资料十分少,相信大家在看了本文后会对MySQL联结语法有相当清晰的了解,也不会被Oracle的...
  • 自联结就是一个表自己和自己联结,一般用来替代子查询比如班上有1个学生数学考了100分,你不知道他是谁,你想知道他的其他学科的成绩新手的写法select student_id from score where type='mathematics' and score=...
  • mysql多表联结查询

    2016-09-13 12:33:43
    联结的本质多表联结是在将多个表做笛卡尔积,后在加入where的限定条件,获取指定的行。(非官方说法) 在此 提醒一下 我们这说的...比如现在又两张表student表和course表,都含有stuId字段,我们需要查询某位学生所
  • 自联结 就是一个表自己和自己联结,一般用来替代子查询 比如班上有1个学生数学考了100分,你不知道他是谁,你想知道他的其他学科的成绩 新手的写法 select student_id from score where type='mathematics' and ...
  • 下边的SQL整体来看是几个left join , 而join的表不是表名, 是一个子查询 1 select a.uid, c.nickname, c.mobile, a.uid_cards, (a.uid_cards - b.send_uids) as self_cards, b.send_uids, c.regdate, ...
  • 自联结就是一个表自己和自己联结,一般用来替代子查询比如班上有1个学生数学考了100分,你不知道他是谁,你想知道他的其他学科的成绩新手的写法select student_id from score where type='mathematics' and score=...
  • 1、自联结语句 主要用途: 树形结构的应用, mid 传统模式 mysql> select * from products where prod_id in (select prod_id from products where vend_id = '1003'); +---------+---------+----------------+--...
  • MYSQL:自联结

    2020-04-09 08:59:25
    使用表别名的一个主要原因...这个查询要求首先找出Jim Jones工作的公司,然后找出在该公司工作的顾客。 第一种解决方案,子查询: SELECT cust_id, cust_name, cust_contact FROM customers WHERE cust_name = (SEL...
  • 多表查询,就是多个表之间相互关联,利用这些表之间的关联来达到由一个或是多个表查询到另外一个或多个表中数据的目的。例如:学生表中有学生所修课程的id号(此id既是课程表的主键id,又作为学生表中的外键id),...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 349
精华内容 139
关键字:

自联结查询