mysql多表查询和子查询,视图

1,217 阅读4分钟

这是我参与更文挑战的第14天,活动详情查看: 更文挑战

多表查询

笛卡尔积与union

  • 合并结果集(行合并)
  1. 什么是合并结果集

    合并结果集就是将两个select语句查询结果合并在一起

  2. 合并结果集的两种方式

    UNION:合并时去除重复记录

    UNION ALL:合并时不去除重复记录

    select * from table1 union select * from table2;

  3. 注意事项

    被合并的结果:列的数量及类型必须完全一样

应用场景:消息和历史消息

连接查询(列合并)

  1. 连接查询也叫跨表查询,将多个表关联获取结果集,将多个列合并在一起

  2. 同时查询两张表,默认出现的就是笛卡尔积结果,[交叉连接]

    select * from table1,table2;

  3. 上述结果基本不可用,优化

    查询时保持主键与外键一致

    主表的主键和从表的外键保持相等(引用完整性)

  4. 根据连接方式得到取出满足业务的最佳效果

    连接方式:内连接,外连接,交叉连接

  5. 连接查询不需要建立外键,外键只是用来包装引用完整性的手段

内连接(inner join on ,inner可省略不写)

使用比较运算符(=,>,<,<>,>=,<=,!>,!<)进行表间比较操作,查询与连接条件相匹配的数据,内连接只返回满足连接条件的数据行

根据所使用的比较方式不同,内连接分为等值连接(使用=连接)、非等值连接和自连接(一个连接查询中涉及的两个表都是同一张表)三种

自连接:select a1.name,a2.mobile from a as a1 inner join a as a2 on a1.id = a2.pid

内连接和笛卡尔积优化的等效(下面两sql是等效的): select a1.name,a2.title from a1 join a2 on a1.id = a2.pid where 1=1;

select a1.name,a2.title from a1 , a2 where a1.id = a2.pid where 1=1;

外连接(left,right,FULL [outer] JOIN)

自然连接(natural join)

连接是在两张表转给你寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件的结果。自然连接不包含重复的属性。

select * from table1 natural join table2;

子查询

  • 一个select语句中包含至少一个完整的select

  • 出现位置 select中:把子查询的结果当做列显示

    from后面:把查询结果当做一个新表

    where后面:把子查询结果当做另一个select中的条件

  • EXISTS用于检查子查询是否至少返回一行数据,该子查询实际上并不返回任何数据,而是返回true或false

https://blog.csdn.net/mhd2312/article/details/81037755

视图

  • 什么是视图

    视图是一个虚拟表,其内容由查询产生

    与真实的表一样,包含行和列

    行和列数据来自于定义视图的查询所引用的表,并且在引用视图时动态生成

    简单说,视图是由select 结果组成的表

  • 视图特性

    不存储具体数据

    可以跟基本表一样,进行增删改查操作(增删改有条件限制)

    视图一般用作查询

  • 视图作用

    安全性:创建一个视图,定义好该视图所操作的数据,使用到了授权特性

    查询性能提高

    提高数据独立性

    create view emp_view as select * from emp

    select * from emp_view

    创建视图参数

    ALGORITHM

      MERGE:处理方式为替换式,可以进行更新真实表中的数据
      
      TEMPTABLE:具化式,由于数据保存在临时表中,所以不可进行更新操作
      
      UNDEFINED: 未定义参数,mysql倾向选择替换方式。
      
    

    视图机制:

      替换式:操作视图时,视图名直接被视图定义给替换掉
      
      具化式:mysql先得到视图执行结果,该结果形成一个中间结果攒存在内存中,先处理视图结果,后处理外面的查询需求。
    

    create ALGORITHM = merge view emp_view as select * from emp

  • WITH CHECK OPTION create view emp_view as select * from emp where sal < 5000 WITH CHECK OPTION

视图不可更新部分

  1. 聚合函数
  2. DISTINCT关键字
  3. GROUP BY子句
  4. HAVING子句
  5. UNION运算符
  6. FROM子句中包含多个表
  7. SELECT语句中引用了不可更新视图
  8. 只要视图当中对数据不是来自于基表,就不能直接修改