精华内容
下载资源
问答
  • mysql多表连接查询
    万次阅读
    2019-10-16 01:25:37

    三个数据库

     

     

     

     

     

    多表连接查询,且去掉重复列,使用  USING()

    select * from (select * from school left join course USING (courseid)) e left join student USING (studentid);

    select * from school left join course USING (courseid)相当于

    select * from school left join course on school.courseid=course.courseid;

    更多相关内容
  • Mysql 多表连接查询

    万次阅读 多人点赞 2018-05-08 19:27:21
    本文部分内容转载至:Mysql 多表查询详解,同时感谢原作者的整理与创作;

    本文部分内容参考了:Mysql 多表查询详解图解SQL的各种连接,同时感谢原作者的整理与创作;
    另外,推荐:
    Mysql 连接的使用 – 菜鸟教程
    MySQL 8.0参考手册 – 官方手册

    Mysql 连接

    在一般的业务情况下,我们大致将 Mysql多表连接 分为如下几种:

    • 内连接:INNER JOIN – 可简写为 JOIN
    • 左外连接:LEFT OUTER JOIN – 可简写为 LEFT JOIN
    • 右外连接:RIGHT OUTER JOIN – 可简写为 RIGHT JOIN
    • 全连接:使用 UNION 完成;
    • 交叉连接:CROSS JOIN – 也称为 笛卡儿乘积连接,大抵不使用;

    内连接 – INNER JOIN

    SQL 语句:

    SELECT * 
    FROM a 
    INNER JOIN b ON(a.id = b.id)

    解释:
    查询出 a表b表交集

    图例:
    INNER JOIN


    左外连接 – LEFT OUTER JOIN

    SQL 语句:

    SELECT * 
    FROM a 
    LEFT OUTER JOIN b ON(a.id = b.id)

    解释:
    查询出 左边表 -- 即a表 的完全集,而 右边表 -- 即b表 中匹配的则有值,没匹配的以 null 值取代;

    图例:
    LEFT OUTER JOIN


    右外连接 – RIGHT OUTER JOIN

    SQL 语句:

    SELECT * 
    FROM a 
    RIGHT OUTER JOIN b ON(a.id = b.id)

    解释:
    左外连接相反 ,查询出 右边表 -- 即b表 的完全集,而 左边表 -- 即a表 中匹配的则有值,没匹配的以 null 值取代;

    图例:
    RIGHT OUTER JOIN


    全连接 – UNION

    事实上由于 Mysql 不支持 FULL JOIN,所以我们将使用 UNION 来完成 全连接

    SQL 语句:

    SELECT * FROM a LEFT OUTER JOIN b ON(a.id = b.id) 
    UNION 
    SELECT * FROM a RIGHT OUTER JOIN b ON(a.id = b.id)

    解释:
    全连接左右外连接 的并集,连接表包含被连接的表的所有记录,如果缺少匹配的记录,,则以 null 取代;

    图例:
    这里写图片描述


    交叉连接 – CROSS JOIN

    关于 交叉连接 的教程,可以参考:MySQL交叉连接(CROSS
    JOIN)
    ,本文此处便是转载于此;

    CROSS JOIN 子句从连接的表返回行的 笛卡儿乘积

    假设使用 CROSS JOIN 连接两个表;
    结果集将包括两个表中的所有行,其中结果集中的每一行都是第一个表中的行与第二个表中的行的组合;
    当连接的表之间没有关系时,会使用这种情况;

    要特别注意的是,如果每个表有 1000 行,那么结果集中就有 1000 x 1000 = 1,000,000 行,那么数据量是非常巨大的;

    SQL 语句:

    SELECT *
    FROM a
    CROSS JOIN b
    
    /**
     * 注意: 
     * 与 INNER JOIN 或 [LEFT, RIGHT] OUTER JOIN 子句不同
     * CROSS JOIN 连接没有 ON 条件
     */

    添加了 WHERE 子句后,如果 a表b表 有关系,则 CROSS JOIN 的工作方式与 INNER JOIN 类似,SQL 语句为:

    SELECT *
    FROM a 
    CROSS JOIN b 
    WHERE a.id = b.id

    本文至此已结束,若有疏漏,还望诸位提醒更正

    展开全文
  • MySQL多表联合查询连接查询、子查询

    万次阅读 多人点赞 2019-06-03 17:08:20
    【2】联合查询 【3】子查询 带in关键字的子查询 带比较运算符的子查询 带exists的子查询 带any关键字的子查询 带all关键字的子查询 【1】连接查询 连接查询的意义: 在用户查看数据的时候,需要显示的数据来自张表....

    【1】连接查询

    连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表.

    内连接查询

    内连接查询是最常见的连接查询,内连接查询可以查询两张或两张以上的表

    内连接:[inner] join:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.

    基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;
    on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)

    当两个表中存在相同意义的字段的时候,就可以通过该字段来连接查询这两个表,当该字段的值相同时就可以查出该记录。

    内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果。

    例:

    select a.id,a.name,a.sex,b.country,b.city,b.street 
    from student a 
    join addr b 
    on a.addrid=b.addrid;
    

    在这里插入图片描述

    外连接查询

    以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL。

    左连接

    left join: 左外连接(左连接), 以左表为主表
    基本语法: from 左表 left join 右表 on 左表.字段 = 右表.字段;

    左表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,右表的字段都置NULL。

    例:

    select a.id,a.name,a.addrid,b.country,b.city
    from student a left join addr b
    on a.addrid=b.addrid;
    

    在这里插入图片描述

    右连接

    right join: 右外连接(右连接), 以右表为主表
    基本语法: from 左表 right join 右表 on 左表.字段 = 右表.字段;
    右表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,左表的字段都置NULL。

    例:

    select a.id,a.name,a.addrid,b.country,b.city
    from student a right join addr b
    on a.addrid=b.addrid;
    

    在这里插入图片描述

    【2】联合查询

    联合查询
    联合查询结果是将多个select语句的查询结果合并到一块因为在某种情况下需要将几个select语句查询的结果合并起来显示。比如现在需要查询两个公司的所有员工的信息,这就需要从甲公司查询所有员工信息,再从乙公司查询所有的员工信息,然后将两次的查询结果进行合并。
    可以使用unionunion all关键字进行操作

    语法格式如下:

    select 语句1
    union[union 选项]
    select 语句2
    union|[union 选项]
    select 语句n
    

    其中union选项有两个选项可选
    all:表示无论重复都输出
    distinct: 去重(整个重复)(默认的)

    select *from addr
    union all
    select *from addr;
    

    在这里插入图片描述

    select id,addrid 
    from addr 
    union all 
    select id,addrid 
    from student;
    

    在这里插入图片描述联合查询只要求字段一样, 跟数据类型和顺序无关

    select id,addrid,sex,score 
    from student 
    union all 
    select sex,addrid,id,score 
    from student;
    

    在这里插入图片描述
    联合查询的意义:

    1. 查询同一张表,但是需求不同 如查询学生信息, 男生身高升序, 女生身高降序
    2. 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.

    联合查询order by的使用
    在联合查询中: order by不能直接使用(不能出现两次),需要对查询语句使用括号才行;

    select *from student 
    where sex="woman" 
    order by score
    union
    select *from 
    student where sex="man" 
    order by score;
    

    这种情况是会报错的。因为语句中不允许出现两个order by。

    select *from student where sex="woman" 
    union
    select *from student where sex="man" order by score;
    

    如果是上边这样只出现一次他的意义就是等合并完成之后再进行排序就没有任何意义了,因为又把前边sex分好的类打乱了

    (select *from student 
    where sex="woman" 
    order by score )
    union
    (select *from 
    student where sex="man" 
    order by score;)
    

    这种方式的目的是为了让两个结果集先分别order by,然后再对两个结果集进行union。但是你会发现这种方式虽然不报错了,但是两个order by并没有产生最后的效果,所以应该改成如下:

    select *from
    (select *from student 
    where sex="woman" 
    order by score)student
    union
    select *from
    (select *from student 
    where sex="man" 
    order by score)student ;
    

    也就是说,order by不能直接出现在union的子句中,但是可以出现在子句的子句中。
    在这里插入图片描述

    【3】子查询

    通常我们在查询的SQL中嵌套查询,称为子查询。子查询通常会使复杂的查询变得简单,但是相关的子查询要对基础表的每一条数据都进行子查询的动作,所以当表单中数据过大时,一定要慎重选择

    带in关键字的子查询

    使用in关键字可以将原表中特定列的值与子查询返回的结果集中的值进行比较
    如果某行的特定列的值存在,则在select语句的查询结果中就包含这一行。

    例:查询成绩大于80的学生的所有信息,
    先在子查询中查出成绩大于80的结果集,然后将原成绩表中的成绩与结果集进行比较,如果存在,就输出这条学生的记录。

    select *
    from student 
    where score in
    (select score from student where score>80);
    

    在这里插入图片描述

    带比较运算符的子查询

    如果可以确认子查询返回的结果只包含一个单值,那么可以直接使用比较运算符连接子查询。
    经常使用的比较运算符包括等于(=)、不等于(<>或!=)、小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。

    select *
    from student 
    where score> 
    (select score 
    from scholarship
    where dengji=1);
    

    查询奖学金等级为1的学生信息

    带exists的子查询

    exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表),
    exists是接在where之后
    exists返回的结果只有0和1.

    例:如果存在成绩大于90的人则列出整个表的记录

    select *
    from student 
    where exists
    (select *from student where score>90);
    

    在这里插入图片描述

    带any关键字的子查询

    any关键字表示满足其中的任意一个条件使用any关键字时,只要满足内层查询语句结果的的任意一个,就可以通过该条件来执行外层查询语句。

    select *
    from student 
    where addrid<any
    (select addrid 
    from addr);
    

    在这里插入图片描述

    带all关键字的子查询

    all和any刚好是相反的,all关键字表示满足所有结果使用all关键字,要满足内层查询语句的所有结果,才可以通过该条件来执行外层查询语句。

    select *
    from student 
    where addrid>all
    (select addrid 
    from addr);
    

    在这里插入图片描述

    展开全文
  • MYSQL中,如何使用多表连接查询

    千次阅读 2021-06-02 11:10:33
    一,多表连接查询方法 如果查询的信息来源与张表,则可通过两两相连的方式建立多表连接查询。 其三表连接查询语法如下: SELECT feldlist FROM table1 JOIN table2 ON table1.column1=table2.column2_1 JOIN ...

    一,多表连接查询方法

    如果查询的信息来源与多张表,则可通过两两相连的方式建立多表连接查询。
    其三表连接查询语法如下:

    SELECT feldlist FROM table1 JOIN table2 ON
     table1.column1=table2.column2_1 JOIN table3 on 
     mable2.colamn2_2=table3.column3【where condition】
    

    在日常数据查询应用实践中,需要获取的数据来源于三张表以上,此时需要通过多表连接进行查询。
    例如:获取所有非空调车的车牌号,型号和司机姓名,所属线路的线路号,起点站和终点站信息。
    代码如下:

    select d.name 司机姓名,v.plateNo 车牌号,v.model 型号,l.lineNo 线路
    号,l.from_station 起点站, l.end_station 终点站 
    from vehicle v 
    JOIN driver d ON v.driverID=d.driverID
    JOIN line l ON l.lineID=v.lineID
    WHERE type='非空调车';
    

    执行结果:
    在这里插入图片描述

    二,简单连接查询

    如果在FROM子句中,直接列出所有要连接的表,然后在WHERE子句中指定连接条件,此为简单多表查询。
    两表连接语法如下:

    SELECT fieldlist from table1,table2
    WHERE table1.column1=table2.column2【and 其他条件】
    

    三表连接语法如下:

    ELECT fieldlist from table1,table2,table3
    WHERE table1.column1=table2.column2_1 and 
    table2.column2_2=table3.column3【and 其他条件】
    

    事例:
    1.获取所有非空调车的车牌号,型号和司机姓名,所属路线的路线号,起点站和终点站信息。
    代码如下:

    SELECT name,plateNo,model,lineNo,from_station,end_station 
    from vehicle v,driver D,line l 
    where v.driverID=D.driverID
    and v.lineID=l.lineID
    and type='非空调车';
    

    执行结果:
    在这里插入图片描述
    2.获取公交二公司所有司机信息。要求输出司机姓名,身份证,性别和电话。
    代码如下:

    SELECT name,licenseNo,gender,phone
    from vehicle v,driver d,line l 
    where v.driverID=d.driverID
    and v.lineID=l.lineID
    and company='公交二公司';
    

    执行结果:
    在这里插入图片描述

    作业:
    1.统计每一家公交公司所属路线的站点总数
    代码如下:

    SELECT company,COUNT(*)
    FROM line_station ls,line l
    WHERE ls.lineNo=l.lineNo
    GROUP BY company ORDER BY COUNT(*)
    

    执行结果:
    在这里插入图片描述

    2.计算经过站点“解放大道四路”的公交线路的数量已及运营车辆数量
    代码如下:

    SELECT COUNT(*),sum(number)
    from line_station ls,line l
    WHERE ls.lineNo=l.lineNo
    and station='解放大道古田四路'
    

    执行结果:在这里插入图片描述
    3.计算每条公交线路的司机人数,并显示司机人数大于3的分组信息,按司机人数逆序显示
    代码如下:

    SELECT lineNo ,COUNT(*)司机数 
    from driver d,vehicle v,line l
    WHERE d.driverID=v.driverID
    AND v.lineID=l.lineID
    GROUP BY lineNo
    having count(*)>3
    ORDER BY 司机数 desc;
    

    执行结果:
    在这里插入图片描述
    4.统计每件商品的销售数量和销售金额,要求按照销售量和销售金额升序显示商品名、销售量和销售金额
    代码如下:

    SELECT
    	g.goodsName 商品名,
    	sum( od.quantity ) 销售量,
    	sum( od.quantity * g.unitPrice ) 销售金额 
    FROM
    	goods g
    	LEFT JOIN ordersdetail od ON g.goodsID = od.goodsID 
    GROUP BY
    	g.goodsID 
    ORDER BY
    	销售量,销售金额;
    

    执行结果:在这里插入图片描述

    5.计算每个订单的金额,要求按照订单下单日期升序和订单金额降序显示订单 ID、订单下单日期、订单金额和顾客姓名
    代码如下:

    SELECT o.ordersID 订单,o.ordersDate 下单日期,sum(od.quantity*g.unitPrice) 订单金额,c.cName 客户名
    FROM orders o,ordersdetail od,goods g,customer c
    WHERE o.ordersID=od.ordersID
    AND od.goodsID=g.goodsID 
    AND o.customerID=c.customerID
    GROUP BY o.ordersID
    ORDER BY 下单日期,订单金额 desc;
    

    执行结果:
    在这里插入图片描述

    学习总结:
    1.需要多加强对语法的记忆,做到能熟练的写出语法。
    2.在做练习时尽力做到不要看书,能够自己写出来。
    3.课后要多加练习,对不熟悉的代码反复练习。

    展开全文
  • MySql多表查询优化

    千次阅读 2021-01-18 21:21:22
    一、多表查询连接的选择相信内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上,我就补贴出来了,这个图只是让大家熟悉一下各种连接查询。然后要告诉大家的是,需要根据查询的信息,想好...
  • 图一 : 也就是我们说的查询左边的全部数据 使用左连接 select 字段列表 from A left join B on 关联条件 图二 : 也就是我们说的查询右边的全部数据 使用右连接 select 字段列表 from A right ...
  • 有4个, #### attr |字段名|类型| |---|---| |id | BIGINT| ...**查询 commodity中的数据,但是 因为prop可以关联个attr,所以 希望一条commodity中的数据能带上全部的attr数据,mysql查询语句么写**
  • PHP完成MySQL多表连接查询-- JOIN

    千次阅读 2019-06-08 10:09:42
    可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。 JOIN 按照功能大致分为如下三类: 1、INNER JOIN(内连接,或等值连接):获取两个中字段匹配关系的记录。 2、LEFT JOIN(左连接):...
  • MySql 数据库多表链接查询的方式

    千次阅读 2022-05-19 00:01:01
    MySql 数据库多表链接查询的方式
  • Mysql表关系 连接查询

    万次阅读 2022-06-15 09:05:09
    数据可以联合查询,语法格式如下: 笛卡尔积现象就是将A的每一条记录与B的每一条记录强行拼在一起。所以,如果A有n条记录,B有m条记录,笛卡尔积产生的结果就会产生n*m条记录。 内连接连接...
  • Mysql多表连接

    千次阅读 2021-04-30 23:02:47
    前提: 有时候我们需要的数据不止在一张中,需要结合查询时,就可以使用表连接 分类 1.1 内部连接(提供了两种标语之间的连接方式) 之间建立起关联的列,要求列名可以不一样,但是这两个列的数据...
  • 所谓中相同意义的字段,是指在中名字不一定相同,但取值的含义相同的字段,这是之间实现连接查询的前提。 在实现连接的实验前需要对mysql的语法进行扎实的掌握,以下有mysql的基础知识可以查看 mysql...
  • Mysql 多表联查优化

    千次阅读 2022-05-01 00:36:31
    四、尽量使用数字型字段,若只含数值信息的字段尽量不要设置为字符型,这会降低查询连接的性能,并会增加存储开销。这是因为迎请在处理查询连接时会逐个比较字符串中每一个字符,而对于数字型二闫只需要比较一次...
  • MySQL表连接查询实例

    千次阅读 2020-06-13 23:23:05
    如图,三个 MySQL 语句: select s.no,name,subname,score from stu s inner join score sc on s.no=sc.no LEFT JOIN sub sb on sc.subno=sb.subno; 结果如图
  • Mysql多表查询(几种连接方式)

    千次阅读 2021-03-02 15:15:02
    Mysql多表查询 (随手记录学习笔记) 我们先建立两个,并向中插入数据(方便我们等会实验): #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key ...
  • MySQL中的连接查询

    千次阅读 2021-08-11 20:38:21
    对于本文章,所用的为student和scoremysql> create table student(id int, name varchar(20)); mysql> insert into student values(1, "morris"), (2, "bob"), (3, "tom"), (4, "jack"); mysql> ...
  • mysql 多表 个条件 查询

    千次阅读 2021-01-19 13:21:06
    mysql 查询关键字SELECT 类名 FROM 主表名INNER JOIN 子表名1ON 主=次 同样的内容 WHERE 查询条件多表请用INNER JOIN连接 且加 同样条件内容SELECT 类名 FROM 主表名INNER JOIN 子表名1INNER JOIN 子表名2ON 主...
  • MySQL (内、左、右)连接查询一、MySQL连接查询连接的语法结构实例操作二、MySQL连接查询连接的语法结构实例操作三、MySQL连接查询连接的语法结构实例操作 一、MySQL连接查询连接的语法结构 ...
  • select a.*,b.*,c.* from a join c on a.a2=c.c2 join b on c.c2=b.b2 where b.b1>4;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,358,623
精华内容 543,449
关键字:

mysql多表连接查询

mysql 订阅