3.复杂查询

本章重点

  • 1.视图
  • 2.子查询
  • 3.关联子查询

1.视图

  • Mysql视图
  • 从Mysql的一个表或多个表导出的表,是一种虚拟的表
  • 视图表中的数据和它所依赖的表会保持同步
  • 原表发生改变,视图的数据也会发生改变
  • 使用视图的原因
    • 1.安全性,可以隐藏(不显示)表格中的敏感信息。
    • 2.可以使得复杂的查询易于理解和使用,复杂的SQL语句查询的数据进行放入一个视图中,这样就不用每次都重复的写了。
    • 3.视图本身不占用存储空间,所以来的数据表会占用存储空间。
    • 4.实时更新,视图会随着依赖的数据表格的更新而发生变化。
  • 视图的数据组成
    • 1.其他数据库或者当前数据库的一张或者多张表
    • 2.其他视图----多重视图会降低SQL的性能,应为一级视图其实就是两次的Select语句,依此类推。
  • 视图的作用

    • 查询数据(会把经常使用的数据创建为视图)
    • 提供更加精细的访问控制增加一列标志用户名的列,建立视图,只有用户能看到标志自己用户名的行,并把视图授权给其他用户----如何筛选?
    • 逻辑数据的独立性
  • 创建视图
  • 前提-----需要select_priv.create_view_priv权限
  • 创建视图的语法
  • create {UNDEFINED|MERGE|TEMPTABLE} View View_name(column1,column2...)  as Select 语句 WITH CHECK OPTION
  • WITH CHECK OPTION是可选参数,表示更新视图时要保证在该视图的权限范围之内
  • 创建视图的算法
  • 算法会影响MySQL查询视图的SQL语句的执行情况

    1. Merge:合并的执行方式,每当执行的时候,先将创建视图的sql语句与外部查询视图的sql语句,混合在一起,最终执行;

    2.Temptable:临时表模式,每当查询的时候,将视图所使用的select语句生成一个结果的临时表,再在当前的临时表内进行查询------视图不可更新

    3.UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。

    WITH  (CASCADED | local CHECK OPTION)表示更新视图时要保证在该试图的权限范围之内(可选参数)CASCADED:更新视图时要满足所有相关视图和表的条件 LOCAL:更新视图时,要满足该视图本身定义的条件即可

  • 查看表格的信息 show table status like “view_of_books”:  show table status;
  • 创建视图注意事项
  • 1.用户有create view权限,还有相对应数据的select权限
  • 2.不能使用order by关键字---------有的DBMS可以使用order by,但是这不是通用的办法
  • 3.select语句中不能包含子查询-----好像也可以
  • 4.select语句不能应用系统和用户的变量
  • 5.视图不能添加触发器程序
  • 修改视图结构
  • Create or replace view viwe_name as select 语句   //可以创建和修改视图
  • alter view view_name as select;//修改视图
  • 修改视图的数据
  • 视图是虚拟的表格本身并不占用数据,所以说修改视图其实修改的就是基础表格
  • 有如下的几种情况是不能更新视图的
  • 1.视图中包含 count(),max()、sum()等函数是不能更新的
  • 2.包含union、union by 、distinct、group by 、having 等关键字不能更新
  • 3.常量视图不能更新 create or replace view view_name as select “AAA” from table;
  • 4.视图创建算法为Temptable时,视图不能更新
  • 5.对视图添加新数据,对应的表格中包含有没有默认值而且不在视图中的列时,视图不能添加数据。
  • 总结
  • 一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,可能会造成数据更新失败。
  • 删除视图
  • Drop view if exists view_name;

2.子查询

  • 常见的子查询形式
  • from +子查询--需要设置别名
  • eg:SELECT cno FROM (SELECT cno,count(*) as count FROM sc GROUP BY cno) as sc_count WHERE count=1; //查询只有一个人选择的课程的课程号
  • 当然简单一点应该这么写 SELECT cno FROM sc GROUP BY `CNO` HAVING count(*)=1;
  • 标量子查询---子查询仅仅返回某一行某一列的值
  • 优点:可以使用> =等运算符连接子查询
  • select cno from grade > (select avg(grade) from sc);//子查询仅仅返回平均分
  • 甚至可以嵌入常量查询中 select  cno,(select avg(grade) from sc) from sc;

3.关联子查询

  • 通过例子进行理解
  • SC表,column:sno(学号),cno(课程号),grade(分数)
  • select * from sc where grade > (select avg(grade) from sc scx where cno=sc.cno group by cno);
  • 运行过程:
  • 1.每次select 取一行数据 ,会送给子查询进行执行,如果满足条件就保留不满足就丢弃。
  • 2.关键点时内部表和外部表的"连接过程",scx.cno=sc.cno
  • 查询只有一个人选择的课程的课程号
  • SELECT cno FROM sc WHERE `CNO` NOT IN (select cno from sc scx WHERE `SNO`!=sc.`SNO`);
  • 查询选修课程号为“CS-1”的课程的学生
  • SELECT * FROM student WHERE EXISTS (SELECT * from sc WHERE `SNO`=student.`SNO` AND cno="CS-1");
时间: 2024-08-05 12:58:34

3.复杂查询的相关文章

SQL查询字段添加括号报错:Operand should contain 1 column(s)

SQL语句:查询连个字段的信息 SELECT (menu_id,menu_captions) FROM bsdb.menulist a WHERE a.menu_id like ('2_'); 然后,因为这是在存储过程中的一个语句所以,在执行存储过程的时候编译不会报错,但是执行的时候却汇报错:Operand should contain 1 column(s):原因不好解释: 下面是官方发解释(MYSQL):https://dev.mysql.com/doc/refman/5.0/en/row-

MySQL(九)之数据表的查询详解(SELECT语法)二

上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1)创建数据表suppliers 前面已经有一张表是book表,我们在建立一张suppliers(供应商)表和前面的book表对应. 也就是说 让book中s_id字段值指向suppliers的主键值,创建一个外键约束关系. 其实这里并没有达到真正的外键约束关系,只是模拟,让fruits中的s_id中

对象序列化和反序列--Hibernate的查询和新增极其相似

Hibernate几个关键字持久化,ORM(关系对象映射)(数据库中关系称作是一张表) 应用在项目中,刘一从写的查询代码,每次都挂掉,想要弄出测试数据,自己想着把查询出来的复杂数据弄到文件里自己要是去造那些复杂数据很麻烦public class Object1 { public static void main(String args[]){ HashMap<String, Object> obj=new HashMap<String,Object>(); obj.put(&quo

Oracle in 查询数据

问题描述: 查询所有的数据,查询结果:146360 select count(1) from bank_cde; in查询的获取部分数据,查询结果 :73080 select count(1) from bank_cde t where t.belongcode2 in('ABC','BCOM','BOC','CCB','CEB','CGB','CIB','CITIC','CMBC','ICBC','PAB','POST','SPDB'); not in查询数据,结果为0 select coun

sqlserver 全库查询 带架构

网上现有的全库查询,无法识别自定义架构的数据库结构: declare @str nvarchar(10) declare @tablename varchar(50) declare @colname varchar(50) declare @counts int declare @sql nvarchar(2000)--以上定义变量 declare cur1 cursor for select a.name tablename,B.name colname from sys.objects a

查询字段描述sql-postgresql

查询字段描述sql SELECT 'comment on column ' || n.nspname ||'.'|| c.relname || '.' || a.attname ||' is '''|| col_description(a.attrelid,a.attnum) ||''';' FROM pg_class as c join pg_attribute as a on a.attrelid = c.oid join pg_namespace n on c.relnamespace=n

基本的查询流【MSSQL】

4个DML(Data Manipulation Language)命令(SELECT INSERT UPDATE DELETE) 查询语法有一个特有的固定顺序 SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY 3.FROM子句数据源 本地SQL Server表.(单个SQL SELECT语句中可访问的表的数量不能超过256个) 子查询作为派生表,也称为子选择或内联视图. 视图或存储的SELECT语句. 表值用户定义的函数返回行和列. 分布式

数据库系统实现 第六章 查询执行

第六章 查询执行 查询执行也就是操作数据库的算法 一次查询的过程: 查询-->查询编译(第七章)-->查询执行(第六章)-->数据 查询编译预览 查询编译可以分为三个步骤: a)分析:构造分析树,用来表达查询和它的结构 b)查询重写,分析树被转化为初始查询计划,通常是代数表达式,之后初始的查询计划会被优化为一个时间更小的计划 c)物理计划生成,将查询计划转化成物理的计划, 为了选择更好的查询计划,需要判断 1)查询哪一个代数的等价形式是最有效的 2)对选中形式的每一个操作,所使用的算法选

说说WordPress的主查询函数-query_posts()

今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 . query_posts()查询函数决定了哪些文章出现在WordPress 主 循环(loop)中,正因为如此,query_posts函数仅用于修改主页循环(Loop),而不是在页面上生成次级循环.如果你希望在主循环外另外生 成循环,应该新建独立的WP_Query对象,用这些对象生成循环.在主循环外的循环上使用query_posts会导致主循环运行偏差,并可能在页面上 显示出你不

使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有名的开源表格插件,在很多项目中广泛的应用.Bootstrap-table插件提供了非常丰富的属性设置,可以实现查询.分页.排序.复选框.设置显示列.Card view视图.主从表显示.合并列.国际化处理等处理功能,而且该插件同时也提供了一些不错的扩展功能,如移动行.移动列位置等一些特殊的功能,插件可