文章目录
- 数据库表设计的三范式
- MySQL 索引的作用,什么情况下使用索引?
- MySQL的分页有哪些方法?
- inner join 和left join的区别?
- 你知道的mysql的存储引擎有哪些,他们有什么区别?
- 数据库的基本属性是哪些?★★★
- 索引在什么情况下会失效?
- Mysql中主键默认是索引么?
- Mysql锁你了解哪些?
- 10.Mysql的事务隔离级别★★★
- 什么是脏读、幻读、和不可重复读?
- 什么是悲观锁和乐观锁
- SQL优化你了解哪些?★★★
- 关于mysql的索引,你觉得他的优点是什么?
- 说说char和varchar的区别?
- 如何设计Mysql索引?
- Mysql日志你了解哪些,有什么作用?
- 针对一条慢 SQL,通常会怎样去优化它?
- 什么是B+树
- 常用关键字总结
- 常用函数有哪些?★★★
- 连接查询操作有哪些?
- 31.视图
如果需要了解常用SQL语句可以通过下面链接进行学习!
数据库表设计的三范式
数据库表设计的三范式是指关系数据库中,每个表必须满足三个规范化条件,以确保数据的完整性、一致性和可维护性。这三个规范化条件分别是:
- 第一范式(1NF):每个属性都是原子性的,即不可再分。这意味着每个属性只能包含一个值,不能有多个值或者组合值。例如,一个订单表应该只包含订单编号、客户编号、订单日期等不可再分的属性。
- 第二范式(2NF):每个非主键属性都完全依赖于码(主键),即不存在部分依赖的情况。这意味着如果一个属性只依赖于主键的一部分,那么它应该被分解成多个表来存储。例如,一个学生表应该包含学生编号、姓名、年龄等完全依赖于码的属性。
- 第三范式(3NF):每个非主属性都不传递依赖于主键。这意味着如果一个属性既不完全依赖于主键,也不传递依赖于其他非主属性,那么它应该被分解成多个表来存储。例如,一个订单表应该包含订单编号、客户编号、订单日期等只传递依赖于主键的属性,而不包含任何与订单无关的属性。
通过遵循这三个规范化条件,可以确保数据库表的设计是合理的、高效的和可靠的,能够支持各种复杂的数据操作和查询。
MySQL 索引的作用,什么情况下使用索引?
索引是数据库中的一种数据结构,用于加速数据库表的查询操作。具体来说,索引可以提高对指定列或列组合的查询速度,因为它能够将这些数据存储在内存中,以便快速访问。
以下是使用索引的一些情况:
1. 频繁查询的列:如果某个列被频繁地查询,那么使用索引可以显著提高查询性能。例如,在一个订单表中,如果经常需要查询订单编号、客户编号和订单日期等列,那么可以在这些列上创建索引。
2. 排序和分组:如果需要对表中的数据进行排序或分组操作,那么使用索引可以提高这些操作的效率。例如,在一个员工表中,如果需要按照员工编号进行排序,那么可以在员工编号列上创建一个索引。
3. 连接操作:如果需要在多个表之间执行连接操作(如联合查询),那么使用索引可以提高连接操作的性能。例如,在一个订单表和一个产品表之间执行联合查询,可以使用连接字段(如订单编号)创建一个索引。
需要注意的是,虽然索引可以提高查询性能,但它们也会增加插入、更新和删除操作的开销。因此,应该根据具体情况来决定是否需要为表创建索引。同时,为了避免索引造成过度占用内存的情况,也应该适当地选择索引类型和设置索引的相关参数。
MySQL的分页有哪些方法?
MySQL的分页是一种将数据库结果集按照指定大小进行分割的方法,以便于快速地显示数据。以下是MySQL中常见的分页方法:
1. LIMIT和OFFSET:这是最常见的分页方法,它使用LIMIT和OFFSET关键字来限制查询结果的数量和偏移量。例如,要获取第2-5个记录,可以使用LIMIT 4 OFFSET 2。
2. ORDER BY:通过在SELECT语句中添加ORDER BY子句,可以对查询结果进行排序并进行分页。例如,要按照ID字段对结果进行排序并获取前10条记录,可以使用SELECT * FROM table ORDER BY ID ASC LIMIT 10。
3. GROUP BY:通过在SELECT语句中添加GROUP BY子句,可以将结果集根据一个或多个字段进行分组。然后,可以使用聚合函数(如SUM、COUNT等)来计算每个分组的总数,并使用LIMIT和OFFSET来获取指定数量的记录。
4. UNION:如果需要同时获取多组数据,可以使用UNION关键字将多个SELECT语句的结果合并为一个结果集。然后,可以使用LIMIT和OFFSET来获取指定数量的记录。
需要注意的是,不同的分页方法适用于不同的场景和需求。例如,在使用ORDER BY进行分页时,需要确保查询结果的顺序是正确的;而在使用GROUP BY进行分页时,需要确保聚合函数的使用正确并且结果是可重复的。因此,在实际应用中应该根据具体情况选择合适的分页方法。
inner join 和left join的区别?
INNER JOIN和LEFT JOIN是MySQL中常用的两种连接查询方式,它们的区别如下:
- INNER JOIN返回匹配的行:INNER JOIN只会返回两个表中都存在的匹配行。如果一个表中有数据而另一个表中没有,则不会返回该行。
- LEFT JOIN返回左表中的所有行,包括NULL值:LEFT JOIN会返回左表中的所有行,即使右表中没有匹配的行。如果右表中的一列有NULL值,则左表中对应列的值也会是NULL。
- RIGHT JOIN返回右表中的所有行,包括NULL值:RIGHT JOIN会返回右表中的所有行,即使左表中没有匹配的行。如果左表中的一列有NULL值,则右表中对应列的值也会是NULL。
- INNER JOIN比LEFT JOIN更精确:由于INNER JOIN只返回匹配的行,所以它比LEFT JOIN更精确。在某些情况下,使用INNER JOIN可以避免不必要的数据传输和处理。
- LEFT JOIN比RIGHT JOIN更容易理解:LEFT JOIN更直观,因为它返回的是左表中的所有行。而RIGHT JOIN需要理解右表中的数据是如何得到的。
需要注意的是,INNER JOIN和LEFT JOIN都是不包含重复行的,也就是说它们都会去除重复的记录。如果需要保留重复的记录,可以使用子查询或者UNION语句来实现。
你知道的mysql的存储引擎有哪些,他们有什么区别?
MySQL中的存储引擎有InnoDB、MyISAM等类型。它们的区别如下:
-
InnoDB:支持事务处理、行级锁定和外键约束等功能,适用于大型数据库系统。它使用B+树作为索引结构,支持多版本并发控制(MVCC)机制。但是,它的性能相对较低,对于大量重复数据的查询效率不高。
-
MyISAM:不支持事务处理和行级锁定等功能,适用于小型数据库系统。它使用B树作为索引结构,支持全文检索和压缩等功能。但是,它的性能相对较高,对于大量重复数据的查询效率很高。
数据库的基本属性是哪些?★★★
ACID是数据库系统中的四个基本属性,用于描述事务的正确性、一致性、隔离性和持久性。
- A代表原子性(Atomicity),指一个事务是一个不可分割的整体,要么全部执行成功,要么全部失败回滚。
- C代表一致性(Consistency),指事务执行的结果必须符合一定的约束条件,如外键约束、唯一性约束等。
- I代表隔离性(Isolation),指多个事务同时操作同一个数据时,每个事务都应该感觉不到其他事务的存在,即事务之间相互隔离。
- D代表持久性(Durability),指一旦事务提交,其对数据的修改应该是永久性的,即使系统发生故障或崩溃也不会丢失。
这些属性保证了数据库系统的可靠性和稳定性,使得数据库可以被广泛应用于各种应用程序中。
索引在什么情况下会失效?
-
针对索引使用函数
-
索引列算数运算
-
索引列隐式转换
-
!= 和NULL判断
-
LIKE “%_”百分号在前
Mysql中主键默认是索引么?
在MySQL中,主键默认是索引。
当创建一个新的表时,如果没有显式地指定主键,MySQL会自动为每个非空的列定义一个名为“PRIMARY”的主键索引。例如,如果创建了一个包含三个非空列的表,MySQL会自动为这三个列创建一个名为“PRIMARY”的主键索引。
需要注意的是,虽然主键默认是索引,但这并不意味着所有的主键都是必要的。如果某个主键列没有被频繁地查询或更新,那么将其设置为主键可能会增加插入、更新和删除操作的开销。因此,应该根据具体情况来决定是否需要将某个列设置为主键。
Mysql锁你了解哪些?
MySQL中常见的锁包括:
- 行级锁(Row-level Locking):也称为共享锁(Shared Lock),它允许事务读取一行数据,但不允许其他事务修改该行数据。行级锁适用于读多写少的场景。
- 表级锁(Table-level Locking):也称为排他锁(Exclusive Lock),它允许事务独占整个表,防止其他事务对表进行任何操作。表级锁适用于写操作频繁的场景。
- 页面锁(Page Locking):它是一种特殊的锁,用于锁定数据库中的页面(通常为4KB)。页面锁可以防止其他事务修改同一页上的数据,从而提高并发性能。
- InnoDB引擎的行级锁和事务隔离级别:InnoDB是MySQL中最常用的存储引擎之一,它支持多种事务隔离级别,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。不同的隔离级别会影响到InnoDB的锁机制,例如在可重复读隔离级别下,所有写操作都需要获取行级锁,而在串行化隔离级别下,所有写操作都需要获取表级锁。
除了上述常见的锁之外,还有一些其他的锁机制,如记录级锁、间隙锁等。不同的锁机制适用于不同的场景,需要根据具体情况来选择合适的锁策略。
10.Mysql的事务隔离级别★★★
InnoDB是MySQL中最常用的存储引擎之一,它支持多种事务隔离级别,包括:
1. 读未提交(Read Uncommitted):允许事务读取未提交的数据,其他事务可以对这些数据进行修改或删除,存在脏读、不可重复读和幻读等问题。
2. 读已提交(Read Committed):只允许事务读取已提交的数据,对其他事务修改或删除的数据不产生影响,解决了脏读问题,但仍存在不可重复读和幻读等问题。
3. 可重复读(Repeatable Read):要求事务在整个执行期间都能够读取相同的数据,即保证每个事务都看到相同的数据快照。这种隔离级别可以避免不可重复读的问题,但仍存在幻读问题。
4. 串行化(Serializable):强制所有事务以串行的方式执行,即每个事务必须在前一个事务完成之前才能开始执行。这种隔离级别可以解决所有的并发问题,但会导致性能下降。
在InnoDB中,默认的事务隔离级别为可重复读(Repeatable Read),可以通过以下语句进行设置:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
或者使用以下语句将事务隔离级别设置为可重复读:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
需要注意的是,不同的隔离级别适用于不同的场景,需要根据具体情况来选择合适的隔离级别。例如,在高并发写入操作的场景下,可以选择可重复读隔离级别来保证数据的一致性;而在读取操作较多的场景下,可以选择读已提交隔离级别来提高性能。
什么是脏读、幻读、和不可重复读?
脏读(Dirty Read)、幻读(Phantom Read)和不可重复读(Non-repeatable Read)是并发事务中常见的问题,这些问题通常是由于事务隔离级别不当导致的。
1. 脏读(Dirty Read):指一个事务读取了另一个事务尚未提交的数据,这个数据在后续的事务执行中可能会被修改或删除。例如,在一个事务中读取一个行,而另一个事务在这个行上插入了新数据,那么第一个事务仍然会读取到旧的数据而不是新数据。
2. 幻读(Phantom Read):指一个事务在执行时,看到了一个不存在的记录。这可能是由于其他事务插入了新的记录,但是当前事务还没有来得及读取这些记录。
3. 不可重复读(Non-repeatable Read):指一个事务在执行时,多次读取同一个数据的结果不一致。例如,在一个事务中读取一个行,然后另一个事务在这个行上插入了新数据,那么第一个事务再次读取这个行时,可能会得到不同的结果。
这些问题通常是由于事务隔离级别不当导致的。在可重复读(Repeatable Read)隔离级别下,可以避免脏读和不可重复读的问题,但仍可能存在幻读问题。在更高级别的隔离级别下,如串行化(Serializable),可以解决所有的并发问题,但会导致性能下降。因此,需要根据具体的应用场景来选择合适的事务隔离级别。
什么是悲观锁和乐观锁
悲观锁和乐观锁是并发控制机制的两种不同方式。
悲观锁(Pessimistic Locking):是一种保守的并发控制方式,它认为并发访问可能会导致数据不一致,因此在任何时候都会对共享资源进行加锁,保证数据的一致性和完整性。当一个事务要对共享资源进行修改时,需要先获取锁,其他事务无法获得该锁,直到该事务完成修改并释放锁。悲观锁的优点是实现简单、可靠性高,但缺点是会影响并发性能,因为每次访问共享资源都需要获取锁,会阻塞其他事务的执行。
乐观锁(Optimistic Locking):是一种较为灵活的并发控制方式,它认为并发访问不会导致数据不一致,因此在读取共享资源时不会加锁,而是在提交更新之前先检查共享资源是否被其他事务修改过,如果没有则更新该资源,否则回滚操作。乐观锁的优点是可以提高并发性能,因为不需要每次访问共享资源都加锁,但缺点是实现相对复杂,需要考虑多版本并发控制等问题。
SQL优化你了解哪些?★★★
SQL优化是提高数据库性能的重要手段。以下是一些常见的SQL优化技巧:
1. `避免全表扫描`:全表扫描是指在没有索引的情况下,对整个表进行扫描以查找所需数据。这会导致性能下降。因此,应该使用索引来加速查询。
2. 避免使用`SELECT *`:只选择需要的列可以减少数据传输量和查询时间。如果不需要所有列,可以使用SELECT列名的方式来指定需要的列。
3. 避免使用子查询:子查询会增加数据库的负担,导致性能下降。如果可能的话,应该尽量避免使用子查询。
4. `使用JOIN代替子查询`:JOIN可以将多个查询合并为一个查询,从而减少数据库的负担。如果可能的话,应该尽量使用JOIN代替子查询。
5. 避免使用WHERE子句中的函数:WHERE子句中的函数会对整个表进行计算,这会导致性能下降。如果可能的话,应该尽量避免使用WHERE子句中的函数。
6. 避免使用ORDER BY中的函数:ORDER BY子句中的函数会对整个结果集进行计算,这会导致性能下降。如果可能的话,应该尽量避免使用ORDER BY子句中的函数。
7. 使用`EXPLAIN`命令分析查询计划:使用EXPLAIN命令可以查看查询执行计划,从而确定哪些部分需要优化。根据EXPLAIN命令的结果,可以调整查询语句以提高性能。
总之,SQL优化是一个综合性的过程,需要综合考虑多个因素。通过合理的SQL编写和优化,可以提高数据库的性能和效率。
关于mysql的索引,你觉得他的优点是什么?
-
提高查询效率:索引可以加快数据库的查询速度,特别是在大量数据的情况下。
-
改善排序性能:通过创建合适的索引,可以提高对数据的排序性能。
-
优化分组操作:索引可以加速对数据的分组操作,从而提高查询效率。
-
支持范围查询:索引可以支持基于范围的查询,如大于、小于等操作。
说说char和varchar的区别?
在MySQL中,CHAR和VARCHAR都是用来存储字符串类型的数据。它们的区别在于:
-
存储方式不同:CHAR是固定长度的字符串类型,它会根据定义的长度来自动截断多余的字符;而VARCHAR是可变长度的字符串类型,它会根据实际存储的数据长度来占用空间。
-
索引效率不同:由于CHAR是固定长度的,所以在创建索引时,只需要索引部分字符即可,因此它的索引效率比VARCHAR高。
-
存储容量不同:由于CHAR是固定长度的,所以它的存储容量相对较小,适合存储较短的字符串;而VARCHAR是可变长度的,所以它的存储容量相对较大,适合存储较长的字符串。
-
安全性不同:由于CHAR是固定长度的,所以它不能有效地存储特殊符号或中文等非ASCII字符,容易导致安全漏洞;而VARCHAR可以有效地存储这些字符,提高了数据的安全性。
综上所述,CHAR适合用于存储较短、不需要进行分词或全文搜索等操作的字符串类型数据,而VARCHAR适合用于存储较长、需要进行分词或全文搜索等操作的字符串类型数据。
如何设计Mysql索引?
设计MySQL索引是一个非常重要的数据库管理任务,它可以显著提高查询性能。以下是一些设计MySQL索引的基本原则:
- 首先,需要对表中的列进行分析,确定哪些列是最经常用于查询和排序的。这些列通常是索引的好候选。
- 对于数值类型的列,应该选择适当的数据类型,如整数或浮点数。对于字符类型的列,应该选择适当的长度,以避免截断或浪费空间。
- 对于经常用于连接的列,应该创建索引。例如,如果两个表之间经常有连接操作,那么在这两个表之间的连接列上创建索引是非常重要的。
- 对于经常用于排序的列,也应该创建索引。这可以大大提高排序操作的效率。
- 对于经常用于分组的列,也应该创建索引。这可以大大提高分组操作的效率。
- 在创建索引时,应该避免使用过多的索引。过多的索引会降低写入性能,并且会增加维护成本。一般来说,每个表最好不要超过10个索引。
- 在创建索引时,应该选择合适的索引类型。MySQL支持多种索引类型,包括B树索引、哈希索引、全文索引等。不同的索引类型适用于不同的场景,需要根据具体情况进行选择。
- 在修改表结构时,应该谨慎地添加或删除索引。这可能会影响到查询性能,需要进行测试和评估。
总之,设计MySQL索引需要综合考虑多个因素,包括数据类型、连接操作、排序操作、分组操作等。需要根据具体情况进行选择和优化,以达到最佳的查询性能。
Mysql日志你了解哪些,有什么作用?
MySQL有多种类型的日志,包括二进制日志和文本日志等。
1. 二进制日志(Binary Log):MySQL的二进制日志是一种重载的、归档的日志文件,记录了所有对MySQL数据库进行修改操作的信息,如增删改表、更新数据等等。二进制日志可以用于主从复制、数据备份和恢复等场景。在主从复制中,主服务器会将所有的binlog写入磁盘,然后通过异步的方式将binlog发送给从服务器,从服务器再将binlog应用到自己的本地数据库中。在数据备份和恢复中,二进制日志可以用于还原数据库到指定时间点的状态。
2. 慢查询日志(Slow Query Log):MySQL的慢查询日志可以记录执行时间超过指定阈值的SQL语句,可以帮助DBA或者开发人员找出性能瓶颈所在。慢查询日志可以通过设置阈值来控制记录频率,也可以通过配置参数来调整记录长度和保存天数等。
3. 错误日志(Error Log):MySQL的错误日志可以记录MySQL运行时发生的错误信息,例如连接问题、权限问题等等。错误日志可以帮助DBA或者开发人员快速定位和解决问题。
这些日志都可以提供有用的信息,帮助DBA或者开发人员更好地管理和维护MySQL数据库。
针对一条慢 SQL,通常会怎样去优化它?
针对一条慢 SQL,通常可以采取以下几种优化方式:
1. 优化SQL语句:检查SQL语句的执行计划,优化查询条件、表连接方式、索引使用等,以提高SQL语句的执行效率。可以使用MySQL自带的EXPLAIN语句来分析SQL语句的执行计划,找出性能瓶颈所在。
2. 添加索引:对经常被查询的列建立索引,可以大大提高查询效率。但是需要注意的是,过多的索引会降低写入性能,并且会增加维护成本。需要根据具体情况进行选择和优化。
3. 分页查询:对于数据量较大的表,可以使用分页查询的方式来避免一次性查询所有数据,从而减少查询时间。
4. 缓存结果集:对于一些计算复杂的SQL语句,可以将查询结果缓存起来,避免重复计算。可以使用MySQL自带的查询缓存或者第三方缓存框架来实现。
5. 调整服务器配置:如果以上方法无法解决慢 SQL 的问题,可以考虑对服务器进行调整,例如增加内存、优化硬盘读写等方式来提高数据库性能。
需要注意的是,在进行SQL语句优化时,需要综合考虑多个因素,包括数据量、查询频率、硬件配置等等。需要根据具体情况进行选择和优化,以达到最佳的查询性能。
什么是B+树
B+树是一种多路搜索树,常用于数据库和文件系统中的索引结构。它是一种自平衡的树形数据结构,其中每个节点最多只有M个子节点,且所有叶子节点都位于同一层。B+树有以下特点:
1. 每个节点存储M个关键字(或者称为记录),可以存储较多的数据。
2. 所有非叶子节点都有指向子节点的指针,这些指针形成了一棵树状结构。
3. 根节点、中间节点和叶子节点都是独立的节点,它们之间通过指针相互连接。
4. 在插入和删除操作时,只需要调整少量的节点指针,就可以改变大量数据的顺序。
由于B+树具有高度平衡、磁盘读写性能好、查询效率高等优点,因此被广泛应用于数据库和文件系统中的索引结构中。
常用关键字总结
(1)SELECT 语句用于从数据库中选取数据,结果被存储在一个结果表中,称为结果集。
(2)SELECT DISTINCT
语句用于返回唯一不同的值
(3)WHERE 子句用于提取那些满足指定条件的记录
(4) AND & OR 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条 记录
(5)ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字
(6)INSERT INTO 语句用于向表中插入新记录
(7)UPDATE 语句用于更新表中已存在的记录
(8)DELETE 语句用于删除表中的行
(9)SQL通配符
通配符 | 描述 |
---|---|
% | 替代 0 个或多个字符 |
_ | 替代一个字符 |
(10)IN 操作符允许您在 WHERE 子句中规定多个值
(11)BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期
常用函数有哪些?★★★
(1)AVG() 函数返回数值列的平均值。
(2)COUNT() 函数返回匹配指定条件的行数
(3)FIRST() 函数返回指定的列中第一个记录的值
(4)LAST() 函数返回指定的列中最后一个记录的值。
(5)MAX() 函数返回指定列的最大值。
(6)MIN() 函数返回指定列的最小值。
(7)SUM() 函数返回数值列的总数。
(8)GROUP BY 语句可结合一些聚合函数来使用
(9)HAVING 子句可以让我们筛选分组后的各组数据
(10)EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False
(11)UCASE() 函数把字段的值转换为大写
(12)LCASE() 函数把字段的值转换为小写
(13)LEN() 函数返回文本字段中值的长度
(14)日期函数
函数 | 描述 |
---|---|
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE() | 提取日期或日期/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间的单独部分 |
DATE_ADD() | 向日期添加指定的时间间隔 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
连接查询操作有哪些?
INNER JOIN 关键字
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
INNER JOIN 关键字在表中存在至少一个匹配时返回行
LEFT JOIN 关键字
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL
RIGHT JOIN 关键字
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL
FULL OUTER JOIN 关键字
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.
31.视图
视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
-
视图不能加快查询速度
-
MySql没有物化视图。 通过触发器,比如当我们有新增数据的时候,触发该数据插入到一张虚拟的物化视图表中。
为什么使用视图
1、重用sql语句
2、简化复杂的sql操作。在编写查询后,可以很方便的重用他,而不必知道他的基本查询细节。
3、使用表的组成部分而不是整个表。
4、保护数据。可以给用户授予表的特定部分的访问权限。
5、更改数据的格式和表示。视图可返回与底层表的表示与格式不同的数据。
性能注意:因为视图不包含数据,所以每次使用它时,都必须处理查询执行时所需的任一个检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能下降的很厉害。因此在部署大量的视图应用之前,需要对视图的性能做测试。
视图的规则和限制
下面是对于视图的创建和使用的一些最常见的规则与限制:
1、与表一样视图必须唯一命名。(不能给视图取和别的视图或者是表相同的名字)
2、对于可以创建的视图个数是没有限制的。
3、为了创建视图,必须有足够的权限,这些权限是有数据库管理员授予的。
4、视图可以嵌套,即可以利用从其他视图中检索数据的查询来构建一视图。
5、ORDER BY可以使用在视图上,但是如果从该视图中检索数据的SELECT中如果也包含ORDER BY 语句,则视图中的ORDER 将会被覆盖。
6、视图不能过索引,也不能有关联的触发器或默认值。
7、视图可以和表一起使用。例如,编写一条连接视图与表的SELECT语句。