视图、索引、存储过程、触发器

视图、索引、存储过程、触发器

group by补充:

规范来说,分组查询中,select后的字段只能是group by的字段或者是聚合函数。mysql在这有一个小优化,分组后如果某个字段的所有记录相同,同样可以select。

在这里插入图片描述

  

  

视图

视图是虚拟的表。与包含数据的表不一样,视图(虚拟表)是动态检索数据的查询

视图的作用是,如果表结构过于复杂,对于不了解表结构的使用者是不友好的,创建者可以根据使用者需求提炼(筛选)出一批数据成为一个虚拟的表供其使用。再有

在视图创建之后,可以用与表基本相同的方式利用它们。可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至能添加和更新数据。

重要的是知道视图仅仅是用来查看存储在别处的数据的一种设施。视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。在添加或更改这些表中的数据时,视图将返回改变过的数据。

因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能下降得很厉害。所以不要滥用视图。

可以通过视图修改原数据,但是不建议这么做。

扫描二维码关注公众号,回复: 15058757 查看本文章

注意:

  • 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。

  • 对于可以创建的视图数目没有限制。

  • 为了创建视图,必须具有足够的访问权限。这些限制通常由数据库管理人员授予。

  • 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图。

  • ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDER BY,那么该视图中的ORDER BY将被覆盖。

  • 视图不能索引,也不能有关联的触发器或默认值。

  • 视图可以和表一起使用。例如,编写一条联结表和视图的SELECT语句。

使用命令:

  • 视图用CREATE VIEW语句来创建。

  • 使用SHOW CREATE VIEW viewname;来查看创建视图的语句。

  • DROP删除视图,其语法为DROP VIEW viewname;

  • 更新视图时,可以先用DROP再用CREATE。也可以直接用CREATE OR REPLACE VIEW,此时如果要更新的视图不存在,则更新语句会创建一个视图;如果要更新的视图存在,则更新语句会替换原有视图。

使用样例:

#查询订单编号为20005的:产品名称,供应商名称,产品价格,购买数量
SELECT order_num,prod_name, vend_name, prod_price, quantity
FROM orderitems o
         JOIN products p ON o.prod_id = p.prod_id
         JOIN vendors v ON p.vend_id = v.vend_id
WHERE o.order_num = 20005;

# 创建视图,包含所有订单的产品名称,供应商名称,产品价格,购买数量
CREATE VIEW order_detail AS
    SELECT order_num,prod_name, vend_name, prod_price, quantity
FROM orderitems o
         JOIN products p ON o.prod_id = p.prod_id
         JOIN vendors v ON p.vend_id = v.vend_id;

# 查看视图的所有数据
SELECT * FROM order_detail;

# 从视图中过滤数据
SELECT * FROM order_detail WHERE order_num=20005;

# 删除视图
DROP VIEW order_detail; 

  

  

索引

索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,MySQL能快速到达。

索引是对数据库中一列或多列的值进行排序的一种结构,使用索引可提高数据库中特定数据的查询速度。

索引是一个单独的存储在磁盘上的数据库结构,包含着对数据表里所有记录的引用指针。使用索引可以快速找出在某个或多个列中的某个值。所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。

索引是在存储引擎中实现的,因此每一种存储引擎的索引,都不一定完全相同。

  

索引的分类:

  • 普通索引和唯一索引

  普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。

  唯一索引要求索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合,必须唯一。

  主键索引是一种特殊的索引唯一,不允许有空值。在MySQL中,主键PRIMARY KEY会自动创建索引,唯一约束UNIQUE字段也会自动创建索引。

  • 单列索引和组合索引

单列索引及一个索引只包含单个列,一个表可以有多个单列索引。

组合索引是指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀原则。

  

使用命令:

  • 创建
--普通索引
CREATE TABLE book(
    id int AUTO_INCREMENT PRIMARY KEY ,
    bookname varchar(255) NOT NULL ,
    INDEX (bookname)   -- 注意
);
--唯一索引
CREATE TABLE book2(
    id int AUTO_INCREMENT PRIMARY KEY ,
    bookname varchar(255) NOT NULL ,
   UNIQUE INDEX (bookname)   -- 注意
); 
-- 给索引起名字
CREATE TABLE book3(
    id int AUTO_INCREMENT PRIMARY KEY ,
    bookname varchar(255) NOT NULL ,
   UNIQUE INDEX  name_idx (bookname)   -- 注意:如果不指定名称的话,名称则为字段名
); 

-- 注意:index 和key是等价的
  • 单独创建索引(非建表时)
--普通索引
CREATE INDEX index_name
ON table_name (column_name);
--唯一索引
CREATE UNIQUE INDEX index_name
ON table_name (column_name);
--组合索引
CREATE INDEX index_name
ON table_name (column_name1,column_name2);
  • 删除索引(两种方式)
ALTER TABLE table_name DROP INDEX index_name;

DROP INDEX index_name ON table_name; 

  

  

存储过程

简单的说存储过程就是一条或者多条语句的集合,可视为批文件(脚本),但是其作用不仅限于批处理。

  • 基本形式
CREATE PROCEDURE  存储过程名 (参数列表)
BEGIN    
  SQL语句代码块
END
  • 举例一
# 创建存储过程
CREATE PROCEDURE my_test()
BEGIN
    SELECT * FROM book;
END;

# 调用存储过程
CALL my_test();

# 删除存储过程
DROP PROCEDURE my_test;
  • 举例二
# 创建存储过程
CREATE PROCEDURE my_test()
BEGIN
#   declare 定义变量i 
    DECLARE i int DEFAULT 0;
    WHILE i<10 do
        INSERT INTO book (bookname) VALUES (concat('悲惨的世界',i));
        SET i=i+1;
    end WHILE ;
END;

  

  

触发器

MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序。触发器是由事件来触发某个操作,这些事件包括INSERT,UPDATE和DELETE语句。如果定义了触发程序,当数据库执行这些语句的时候就会激发触发器执相应的操作,触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

触发器是个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句来调用,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MySQL自动调用。

创建:

CREATE TRIGGER trigger_name trigger_time trigger_event
ON tab_name FOR EACH ROW trigger_stmt
  • trigger_name:触发器名称,用户自行指定;

  • trigger_time :触发时机,可以指定为before或after;

  • trigger_event:触发事件,包括INSERT,UPDATE和DELETE;

  • tab_name:要建立触发器的表名;

  • trigger_stmt:触发器执行语句。

CREATE TABLE book2(
    id int AUTO_INCREMENT PRIMARY KEY ,
    bookname varchar(255) NOT NULL
);
ALTER TABLE book  ADD INDEX name_idx(bookname);

# 创建触发器,在book表中插入一条数据时自动在book2尾部备份一份新的book
CREATE TRIGGER book_insert_select AFTER INSERT 
ON book FOR EACH ROW INSERT INTO book2(bookname) SELECT bookname FROM book;

INSERT INTO book(bookname)VALUES ('《平凡的世界2》');

# 查看触发器
SHOW TRIGGERS ;

# 也可以在triggers表中查看触发器
SELECT * FROM information_schema.triggers;

# 删除触发器
DROP TRIGGER book_insert_select;

猜你喜欢

转载自blog.csdn.net/qq_40342400/article/details/129050353