【Java面试题】SQL篇

文章介绍了数据库设计的三范式,强调了索引在提升查询效率中的作用,以及何时使用索引。还讨论了MySQL中的分页方法,如LIMIT和OFFSET,以及INNERJOIN和LEFTJOIN的区别。此外,提到了MySQL的存储引擎,如InnoDB和MyISAM,以及数据库事务的ACID属性和隔离级别。最后,文章涵盖了SQL优化、索引失效的情况以及如何优化慢查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


如果需要了解常用SQL语句可以通过下面链接进行学习!

推荐在牛客网进行刷题:https://www.nowcoder.com/exam/oj?page=1&tab=SQL%E7%AF%87&topicId=199

数据库表设计的三范式

​ 数据库表设计的三范式是指关系数据库中,每个表必须满足三个规范化条件,以确保数据的完整性、一致性和可维护性。这三个规范化条件分别是:

  1. 第一范式(1NF):每个属性都是原子性的,即不可再分。这意味着每个属性只能包含一个值,不能有多个值或者组合值。例如,一个订单表应该只包含订单编号、客户编号、订单日期等不可再分的属性。
  2. 第二范式(2NF):每个非主键属性都完全依赖于码(主键),即不存在部分依赖的情况。这意味着如果一个属性只依赖于主键的一部分,那么它应该被分解成多个表来存储。例如,一个学生表应该包含学生编号、姓名、年龄等完全依赖于码的属性。
  3. 第三范式(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中常用的两种连接查询方式,它们的区别如下:

  1. INNER JOIN返回匹配的行:INNER JOIN只会返回两个表中都存在的匹配行。如果一个表中有数据而另一个表中没有,则不会返回该行。
  2. LEFT JOIN返回左表中的所有行,包括NULL值:LEFT JOIN会返回左表中的所有行,即使右表中没有匹配的行。如果右表中的一列有NULL值,则左表中对应列的值也会是NULL。
  3. RIGHT JOIN返回右表中的所有行,包括NULL值:RIGHT JOIN会返回右表中的所有行,即使左表中没有匹配的行。如果左表中的一列有NULL值,则右表中对应列的值也会是NULL。
  4. INNER JOIN比LEFT JOIN更精确:由于INNER JOIN只返回匹配的行,所以它比LEFT JOIN更精确。在某些情况下,使用INNER JOIN可以避免不必要的数据传输和处理。
  5. 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中常见的锁包括:

  1. 行级锁(Row-level Locking):也称为共享锁(Shared Lock),它允许事务读取一行数据,但不允许其他事务修改该行数据。行级锁适用于读多写少的场景。
  2. 表级锁(Table-level Locking):也称为排他锁(Exclusive Lock),它允许事务独占整个表,防止其他事务对表进行任何操作。表级锁适用于写操作频繁的场景。
  3. 页面锁(Page Locking):它是一种特殊的锁,用于锁定数据库中的页面(通常为4KB)。页面锁可以防止其他事务修改同一页上的数据,从而提高并发性能。
  4. 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的索引,你觉得他的优点是什么?

  1. 提高查询效率:索引可以加快数据库的查询速度,特别是在大量数据的情况下。

  2. 改善排序性能:通过创建合适的索引,可以提高对数据的排序性能。

  3. 优化分组操作:索引可以加速对数据的分组操作,从而提高查询效率。

  4. 支持范围查询:索引可以支持基于范围的查询,如大于、小于等操作。

说说char和varchar的区别?

在MySQL中,CHAR和VARCHAR都是用来存储字符串类型的数据。它们的区别在于:

  1. 存储方式不同:CHAR是固定长度的字符串类型,它会根据定义的长度来自动截断多余的字符;而VARCHAR是可变长度的字符串类型,它会根据实际存储的数据长度来占用空间。

  2. 索引效率不同:由于CHAR是固定长度的,所以在创建索引时,只需要索引部分字符即可,因此它的索引效率比VARCHAR高。

  3. 存储容量不同:由于CHAR是固定长度的,所以它的存储容量相对较小,适合存储较短的字符串;而VARCHAR是可变长度的,所以它的存储容量相对较大,适合存储较长的字符串。

  4. 安全性不同:由于CHAR是固定长度的,所以它不能有效地存储特殊符号或中文等非ASCII字符,容易导致安全漏洞;而VARCHAR可以有效地存储这些字符,提高了数据的安全性。

综上所述,CHAR适合用于存储较短、不需要进行分词或全文搜索等操作的字符串类型数据,而VARCHAR适合用于存储较长、需要进行分词或全文搜索等操作的字符串类型数据。

如何设计Mysql索引?

设计MySQL索引是一个非常重要的数据库管理任务,它可以显著提高查询性能。以下是一些设计MySQL索引的基本原则:

  1. 首先,需要对表中的列进行分析,确定哪些列是最经常用于查询和排序的。这些列通常是索引的好候选。
  2. 对于数值类型的列,应该选择适当的数据类型,如整数或浮点数。对于字符类型的列,应该选择适当的长度,以避免截断或浪费空间。
  3. 对于经常用于连接的列,应该创建索引。例如,如果两个表之间经常有连接操作,那么在这两个表之间的连接列上创建索引是非常重要的。
  4. 对于经常用于排序的列,也应该创建索引。这可以大大提高排序操作的效率。
  5. 对于经常用于分组的列,也应该创建索引。这可以大大提高分组操作的效率。
  6. 在创建索引时,应该避免使用过多的索引。过多的索引会降低写入性能,并且会增加维护成本。一般来说,每个表最好不要超过10个索引。
  7. 在创建索引时,应该选择合适的索引类型。MySQL支持多种索引类型,包括B树索引、哈希索引、全文索引等。不同的索引类型适用于不同的场景,需要根据具体情况进行选择。
  8. 在修改表结构时,应该谨慎地添加或删除索引。这可能会影响到查询性能,需要进行测试和评估。

总之,设计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语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wei *

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值