精华内容
下载资源
问答
  • MySQL多表查询

    千次阅读 2020-05-08 20:34:47
    在关系型数据库中,表与表之间是有练习的,所以在实际应用中,经常使用多表查询多表查询就是同时查询两个或两个以上的表 在 MySQL 中,多表查询主要有 **交叉连接**,**内连接**,**外连接**,**子查询**

    多表查询

    在关系型数据库中,表与表之间是有练习的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表

    在 MySQL 中,多表查询主要有 交叉连接内连接外连接子查询

    交叉连接

    交叉连接 ( CROSS JOIN ) 一般用来返回连接表的笛卡尔积

    语法格式如下:

    # 多表交叉连接时,使用 `cross join` 或者 `,` 皆可,前者是官方建议的标准写法
    select <字段名> from <tab_name> cross join <tab_name> [where子句]
    select <字段名> from <tab_name>,<tab_name> [where子句]
    

    当连接的表之间没有关系时,我们会省略掉 where子句,这时返回结果就是两个表的笛卡尔积,返回结果数量就是两个表的数据行相乘,如果每个表有 1000 行,那么返回数量就有 1000*1000=1000000 行,数据量是非常巨大的!

    如果在交叉连接时使用 where子句,MySQL会先生成两个表的笛卡尔积,然后再选择满足 where条件的记录。因此,表的数量较多时,交叉连接会非常非常慢,一般情况下不建议使用交叉连接

    笛卡尔积

    笛卡尔积( Cartesian product ) 是指两个集合 x 和 y 的乘积

    例如,有两个集合,它们值如下:

    A = {1,2}
    B = {3,4,5}
    
    # 集合 A*B 的结果集为:
    A×B={(1,3), (1,4), (1,5), (2,3), (2,4), (2,5) };
    
    # 集合 B*A 的结果集为:
    B×A={(3,1), (3,2), (4,1), (4,2), (5,1), (5,2) };
    

    以上 AB 和 BA 的结果就叫做两个集合各自的笛卡尔积

    内连接

    内连接 ( inner join ) 使用 inner join 关键字连接两张表,并使用 on 子句来设置连接条件

    语法格式如下:

    select <字段名> from <tab_name> <tab_name> inner join <tab_name> [on子句]
    

    多个表连接时,再 from 后边连续使用 inner joinjoin 即可

    案例操作:

    # 在 学生表 和 课程表中,查询 学生对应的课程
    select s.name c.course_name from student as s inner join course as c on s.course_id = c.id
    

    注意:当对多个表进行查询时,要在 select 语句后面指定字段是来源自哪一张表
    语法为 表名.列名 ,如果表名较长,可以给表设置别名,这样就可以直接在 select 后写 表的别名.列名

    外连接

    内连接查询的结果都是符合连接条件的结果,为外连接会先将连接的表分为基表和参考表,再以基表为依据返回满足与不满足条件的记录

    外连接区分为 左外连接右外连接

    左外连接

    左外连接又称为左连接,使用 left outer join 关键字连接两个表,也可以简写为 left join,并使用 on 设置连接条件

    语法格式如下:

    select <字段名> from <tab1> left join <tab2> [on子句]
    

    上述语法中,tab1 为基表tab2 为参考表,左连接查询时,可以查询处 tab1 中的所有记录和 tab2 中匹配连接条件的记录。如果 tab1 的某行在 tab2 中没有匹配行,那么在返回结果中,tab2 的字段值均为空值 NULL

    img

    右外连接

    右外连接又称为右连接,右连接是左连接的反向连接。使用 right outer join 关键字连接两个表,可以简化为 right join ,并使用 on 子句来设置连接条件

    语法格式如下:

    select <字段名> from <tab1> right outer <tab2> [on子句]
    

    与左连接相反,右连接以 tab2 为基表,tab1 为参考表,可以查询出 tab2 中所有记录和 tab1 中匹配连接条件的记录。如果 tab2 的某行在 tab1 中没有匹配项,那么在返回结果中,tab1 的字段值均为 NULL

    img

    多个表 左/右 连接时,在 on 子句后连续使用 left/right join 即可

    子查询

    子查询是 MySQL 中比较常用的查询方法,通过子查询可以实现多表查询。子查询指将一个查询语句嵌套在另一个查询语句中。子查询可以在 select,update 和 delete 语句中使用,而且可以进行多层嵌套,实际开发中,子查询经常出现在 where 语句中

    语法格式如下:

    select <字段> from <tab_name>
        where <字段><操作符>(子查询)
        );
    

    其中,操作符可以是 innot inexistsnot exists 等关键字

    案例:

    # 查询学习 python 课程的学生
    select name from student s
        where s.course_id = (select id from course c where c.name = "Python")
    
    # 查询学习 python 和 html 的学生
    SELECT name FROM student s WHERE s.course_id in
        (SELECT id FROM course c WHERE c.name="Python" OR c.name="Html");
    

    进阶用法:

    子查询语句可以嵌套在 SQL 语句中任何表达式出现的位置

    select (子查询) from 表名;
    
    select * from (子查询) as 别名;
    
    展开全文
  • 单表多次查询多表联合查询效果对比1、耗时对比 在同等条件下,以用户、角色、及用户角色关联表为例。 对于单表查询: SELECT * FROM `cims_v1.0`.user; //耗时16ms SELECT * FROM `cims_v1.0`.user_role ur where ...

    单表多次查询和多表联合查询效果对比
    1、耗时对比
    在同等条件下,以用户、角色、及用户角色关联表为例。
    对于单表查询:
    SELECT * FROM `cims_v1.0`.user;   //耗时16ms
    SELECT * FROM `cims_v1.0`.user_role ur where ur.user_id=2;  //耗时15ms
    SELECT * FROM `cims_v1.0`.role rol where role_id=4;  //耗时0ms
    总共耗时31ms;
    对于多表联合查询:
    SELECT 
    us.username, us.user_id, ur.role_id, rol.role_name
    FROM `cims_v1.0`.user us
    LEFT JOIN `cims_v1.0`.user_role ur ON ur.user_id=us.user_id
    LEFT JOIN `cims_v1.0`.role rol ON rol.role_id=ur.role_id;
    WHERE us.user_id=2;
    总共耗时375ms
    结论:多表联合查询耗时是单表多次查询耗时的10倍以上。
    2、分解关联查询的方式重构查询的优点
    很多高性能的应用都会对关联查询进行分解,对每个表进行一次单表查询,然后将结果在应用程序中进行关联。
    2.1. 让缓存的效率更高 
    许多应用程序可以方便地缓存单表查询对应的结果对象。另外对于MySQL的查询缓存来说,如果关联中的某个表发生了变化,那么就无法使用查询缓存了,而拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。
    2.2. 减少锁的竞争
    将查询分解后,执行单个查询可以减少锁的竞争。
    2.3. 易于对数据库拆分和扩展
    在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。
    2.4. 提高查询效率
    查询本身效率也可能会有所提升
    3、分解关联查询的方式重构查询的缺点
    原本一条查询,这里却变成了多条查询,返回结果又是一模一样。

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

    万次阅读 多人点赞 2019-06-03 17:08:20
    联合查询的意义: 查询同一张表,但是需求不同 如查询学生信息, 男生身高升序, 女生身高降序 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的. 联合查询order by的使用 在联合查询中: order by不能...

    【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多表查询排序

    千次阅读 2019-09-24 16:27:28
    最近看到一个面试题,是关于mysql的多表查询并排序分组的 题目如下: Music表包含所有歌曲信息,每首歌曲尤其对应的Id,Name,Year和Singer Id。 +----+---------+--------+--------...

    最近看到一个面试题,是关于mysql的多表查询并排序分组的
    题目如下:
    Music表包含所有歌曲信息,每首歌曲尤其对应的Id,Name,Year和Singer Id。
    +----+---------+--------+-----------+
    music表
    +----+---------+--------+-----------+

    Singer表包含所有歌手信息
    +----+----------+
    singer表
    +----+----------+

    请编写一个SQL查询语句,找出每个歌手年份最新的一首歌曲名字
    +------------+----------+--------+
    分组排序表
    +------------+----------+--------+
    建表语句

    -- Music表包含所有歌曲信息,每首歌曲尤其对应的Id,Name,Year和Singer Id
    CREATE TABLE music(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	`name` VARCHAR(20),
    	`year` INT,
    	sign_id INT
    )
    
    INSERT INTO music(id,name,year,sign_id) VALUES(null,'七里香',2003,1),
    (null,'吻别',2000,2),
    (null,'如果爱',2001,2),
    (null,'菊花台',2005,1);
    
    -- Singer表包含所有歌手信息
    CREATE TABLE signer(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	`name` VARCHAR(20)
    )
    
    INSERT INTO signer(id,name) VALUES(null,'周杰伦'),
    (null,'张学友');
    

    查询语句

    SELECT
    	s. NAME AS Signer,
    	m. NAME,
    	m. YEAR
    FROM
    	signer s
    INNER JOIN (
    	SELECT
    		*
    	FROM
    		music
    	ORDER BY
    		`year` DESC
    ) AS m ON m.sign_id = s.id
    GROUP BY
    	s.id
    

    因为我是一个新手,如果有什么更好的解题方法,欢迎写在评论里

    欢迎关注我的个人博客 https://myblog.52fun.fun/

    展开全文
  • 多表查询以及页面的多条件查询

    千次阅读 2019-05-31 15:41:34
    那么呢 现在我就来介绍一下最近学到的一个小知识,多表查询以及多条件查询。我用的开发工具是Visual Studio 2015。 接下来就跟着我一步一步讲解。 首先我们要打开Visual Studio 2015。 接着要创建一个函数已视图的...
  • SQL多表查询

    万次阅读 2019-06-05 22:29:09
    多表查询的话,SQL提供了JOIN关键字来连接多张表的查询(即连接的是SELECT结果集)基本分为以下几种: JOIN / INNER JOIN-也称作内连接,是最为常用的一种JOIN,其效果是在表中存在一个匹配即返回该条数据 等值连接...
  • SQL数据库单表查询多表查询

    万次阅读 2018-11-03 16:57:42
    查询以‘DB_’开头,且倒数第3个字符为‘s’的课程的详细情况; --(1) select * from dbo.course where dbo.course.cname like 'DB\_%s__'ESCAPE'\'; --(2) select * from dbo.course wher...
  • 多表查询

    千次阅读 2020-07-14 16:50:54
    多表查询:在查询为多张表的数据时,通常在from表和表之间使用逗号,作为间隔符号。 1.内连接inner join,相当于两个集合关键字段的全交叉记录。 1:select * from table_name1inner join table_name2; 2:select ...
  • MySQL多表查询where子查询

    千次阅读 2019-05-31 21:49:32
    当前有用户,以及订单,订单详细时,需要查询购买了某商品Id为“1001”的商品的客户信息 如果用单条语句查询需要 先从订单详细表查询商品ID为“1001”的购物订单ID 再从订单表查询该购物订单id...
  • sqlserver 多表联合查询

    万次阅读 2019-04-03 16:53:16
    数据库查询时,对单表的查询很难满足需求,通常都需要多表联合查询多表连接大致分为内连接和外连接。 内连接和外连接的区别主要体现在返回数据上,内连接返回的是符合连接条件和查询条件的记录,外连接返回的...
  • 多表查询和子查询

    万次阅读 2016-11-13 17:59:11
    主要介绍了多表查询,以及在多表/单表查询时常用的函数和关键字,介绍了如何使用子查询多表查询  employee表,departments表,localtions表结构 引例: select  last_name, department_...
  • 总结mybatis多表查询(xml方式)

    千次阅读 2019-07-29 17:26:18
    总结mybatis的多表查询前言数据库表及关系一对多查询多对一及一对一查询总结 前言 表之间的关系有几种:一对多、多对一、 一对一、多对多 在多对一关系中,把多的部分拆成一个一个对象其实就是一对一关系,如账户和...
  • 模糊查询: 用于处理字符串类型的值,运算符包括:like%_[]^%与_写在[]中表示的含义 根据字符查找(%表示左右的字符),名字当中包含懒狗的信息 select * from StudentInfo where Name like '%懒狗%' 查询姓孙的信息 ...
  • 多对多关系的多表关联查询

    万次阅读 多人点赞 2017-11-23 19:14:20
    笔者根据实际的业务和参考网上的处理方法,现在做如下处理,由于笔者技术水平有限,错误之所,在所难免,敬请各位技术大佬批评和指正
  • 28.多表查询——跨关联关系的多表查询

    万次阅读 多人点赞 2021-08-31 15:23:28
    多表查询—跨关联关系的查询 **Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的...
  • 一个orderitem表(从表),一个product表(主表)如下图所示orderitem表:product表:2、如果要查询两个表中指定列的信息,比如orderitem表中的count,subtotal,product表中的pname,pimage等那么就涉及到多表查询,...
  • 分页查询是后台项目中最常见的一种操作,在一对(one to many)的关系中,如何根据主进行分页是一个较为棘手的问题,尤其是查询条件既包含主又包含从/关联的。一般情况下,不是查询结果条数不正确,就是一...
  • Mysql关系利用中间表查询

    万次阅读 多人点赞 2019-05-25 17:24:17
    1、关系,我们举个简单的例子,一个顾客可以买件商品,同时一类商品(指件相同的商品)也可以也可以让个用户购买 下面是对应的,用户,商品以及关系,其中关系中userId、metId的外键分别是...
  • hive 之多表查询

    千次阅读 2018-05-21 15:05:02
    hive 多表查询,转化为一个mapreduce的作业hive&gt;desc dept;deptno doubledname stringloc stringhive&gt;desc emp;empno doubleename stringjob stringmgr doublehiredate stringsal double...
  • 【MySQL】多表查询

    万次阅读 多人点赞 2018-06-18 00:00:22
    多表查询如果不加任何条件,得到的结果称为笛卡尔积。 例如,查找雇员名、雇员工资以及部门所在的名字。 可以发现,结果是这样的,从第一个表中选出第一条记录,和第二个表中的所有所有记...
  • Hibernate之HQL多表查询

    千次阅读 2018-10-25 20:35:00
    多表查询进行使用HQL语句进行查询,HQL语句和SQL语句的查询语法比较类似 内连接查询 显示内连接 select * from customer c inner join orders o on c.cid = o.cno 隐式内连接 select * from customers c....
  • 单表查询多表查询

    千次阅读 2019-04-18 08:37:44
    我们知道数据库有增、删、查、改的四个操作,其中还分为单表和多表的,但凡事都是从简单再到复杂,所有我们就先来说下单表的查询。 注意不是在数据库查询,而是在控制器中从数据库查询,所有写法和数据库中的写法也...
  • JAVA中SQL查询语句大全,select多表查询,各种查询

    万次阅读 多人点赞 2019-03-05 20:04:42
    以员工:emp 为例 id name gender birthday dept job sal bonus 编号 姓名 性别 ...基本查询查询emp中的所有员工信息 ...– 查询emp中的所有员工的姓名、薪资、奖金 ...– 查询emp中...
  • 在之前的总结mybatis多表查询(xml方式)的博客中,已经对多表查询做了一定的介绍,而且总结了基于xml的mybatis多表查询,一些通用的技术点可以翻阅上一篇博客。这次我们总结基于注解的mybatis多表查询。多对多查询...
  • 【Mybatis】多表查询

    千次阅读 多人点赞 2017-11-21 21:58:45
    多表查询一直是数据库的关键部分。网上关于Mybatis的例子天华龙凤,又要自己新建实体类,又在一个实体类中将另一个实体类联系起来,在我看来大可不必,只要将sql查询结果的视图映射到Java里面即可。下面举一个例子来...
  • Oracle 查询技巧与优化(二) 多表查询

    万次阅读 多人点赞 2016-08-05 08:59:59
    关于Oracle多表查询的一些技巧和优化~
  • 应用名/models.py(模型,定义模型类,一对 models.ForeignKey): from django.db import models # 一个图书对应个英雄人物 # 图书类(一类) class BookInfo(models.Model): btitle = models.CharField(max...
  • 以下列举一些涉及单表和多表的基本查询语句例子,简单实用。由于本人是初学者,不足之处恳请大家斧正!附:韩顺平sql语句复杂查询地址http://v.youku.com/v_show/id_XODMxMDI2MTA0.html?spm=a2h0k.8191407.0.0&...
  • SQL语句多表连接查询语法

    万次阅读 多人点赞 2019-07-28 09:32:13
    总结:内连接就是两个的交集 ,左外连接就是左边加两交集 ,右外连接就是右边加两交集 一、外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join score on ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,461,324
精华内容 584,529
关键字:

多表查询是什么