什么是存储过程?有哪些优缺点?

什么是存储过程?有哪些优缺点?

存储过程就像咱们编程语言中的函数一样,封装了咱们的代码(PLSQL、T-SQL)

存储过程的长处:

  • 可能将代码封装起来
  • 保留在数据库之中
  • 让编程语言进行调用
  • 存储过程是一个预编译的代码块,执行效率比拟高
  • 一个存储过程代替大量T_SQL语句 ,能够升高网络通信量,进步通信速率

存储过程的毛病:

  • 每个数据库的存储过程语法简直都不一样,非常难以保护(不通用)
  • 业务逻辑放在数据库上,难以迭代
作为浏览福利小编整顿了数据库相干的面试题+外围知识点,须要的点击此处

三个范式是什么

三个范式是什么

第一范式(1NF):数据库表中的字段都是繁多属性的,不可再分。这个繁多属性由根本类型形成,包含整型、实数、字符型、逻辑型、日期型等。 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的局部函数依赖(局部函数依赖指的是存在组合关键字中的某些字段决定非关键字段的状况),也即所有非关键字段都齐全依赖于任意一组候选关键字。
第三范式(3NF):在第二范式的根底上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则合乎第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因而,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段x → 非关键字段y

下面的文字咱们必定是看不懂的,也不违心看上来的。接下来我就总结一下:

  • 首先要明确的是:满足着第三范式,那么就肯定满足第二范式、满足着第二范式就肯定满足第一范式
  • 第一范式:字段是最小的的单元不可再分

    • 学生信息组成学生信息表,有年龄、性别、学号等信息组成。这些字段都不可再分,所以它是满足第一范式的
  • 第二范式:满足第一范式,表中的字段必须齐全依赖于全副主键而非局部主键。

    • 其余字段组成的这行记录和主键示意的是同一个货色,而主键是惟一的,它们只须要依赖于主键,也就成了惟一的
    • 学号为1024的同学,姓名为Java3y,年龄是22岁。姓名和年龄字段都依赖着学号主键。
  • 第三范式:满足第二范式,非主键外的所有字段必须互不依赖

    • 就是数据只在一个中央存储,不反复呈现在多张表中,能够认为就是打消传递依赖
    • 比方,咱们大学分了很多系(中文系、英语系、计算机系……),这个系别治理表信息有以下字段组成:系编号,系主任,系简介,系架构。那咱们能不能在学生信息表增加系编号,系主任,系简介,系架构字段呢?不行的,因为这样就冗余了,非主键外的字段造成了依赖关系(依赖到学生信息表了)!正确的做法是:学生表就只能减少一个系编号字段。

什么是视图?以及视图的应用场景有哪些?

什么是视图?以及视图的应用场景有哪些?

视图是一种基于数据表的一种虚表

  • (1)视图是一种虚表
  • (2)视图建设在已有表的根底上, 视图赖以建设的这些表称为基表
  • (3)向视图提供数据内容的语句为 SELECT 语句,能够将视图了解为存储起来的 SELECT 语句
  • (4)视图向用户提供基表数据的另一种表现形式
  • (5)视图没有存储真正的数据,真正的数据还是存储在基表中
  • (6)程序员尽管操作的是视图,但最终视图还会转成操作基表
  • (7)一个基表能够有0个或多个视图

有的时候,咱们可能只关系一张数据表中的某些字段,而另外的一些人只关系同一张数据表的某些字段...

那么把全副的字段都都显示给他们看,这是不合理的。

咱们应该做到:他们想看到什么样的数据,咱们就给他们什么样的数据...一方面就可能让他们只关注本人的数据,另一方面,咱们也保障数据表一些窃密的数据不会泄露进去...

咱们在查问数据的时候,经常须要编写十分长的SQL语句,简直每次都要写很长很长....下面曾经说了,视图就是基于查问的一种虚表,也就是说,视图能够将查问进去的数据进行封装。。。那么咱们在应用的时候就会变得十分不便...

值得注意的是:应用视图能够让咱们专一与逻辑,但不进步查问效率

drop、delete与truncate别离在什么场景之下应用?

drop、delete与truncate别离在什么场景之下应用?

咱们来比照一下他们的区别:

drop table

  • 1)属于DDL
  • 2)不可回滚
  • 3)不可带where
  • 4)表内容和构造删除
  • 5)删除速度快

truncate table

  • 1)属于DDL
  • 2)不可回滚
  • 3)不可带where
  • 4)表内容删除
  • 5)删除速度快

delete from

  • 1)属于DML
  • 2)可回滚
  • 3)可带where
  • 4)表构造在,表内容要看where执行的状况
  • 5)删除速度慢,须要逐行删除
  • 不再须要一张表的时候,用drop
  • 想删除局部数据行时候,用delete,并且带上where子句
  • 保留表而删除所有数据的时候用truncate

索引是什么?有什么作用以及优缺点?

索引是什么?有什么作用以及优缺点?

什么是索引【Index】

  • (1)是一种疾速查问表中内容的机制,相似于新华字典的目录
  • (2)使用在表中某个些字段上,但存储时,独立于表之外

索引表把数据变成是有序的....

疾速定位到硬盘中的数据文件...


rowid特点

rowid的特点

  • (1)位于每个表中,但外表上看不见,例如:desc emp是看不见的
  • (2)只有在select中,显示写出rowid,方可看见
  • (3)它与每个表绑定在一起,表亡,该表的rowid亡,二张表rownum能够雷同,但rowid必须是惟一的
  • (4)rowid是18位大小写加数字混淆体,惟一表代该条记录在DBF文件中的地位
  • (5)rowid能够参加=/like比拟时,用''单引号将rowid的值包起来,且辨别大小写
  • (6)rowid是分割表与DBF文件的桥梁

索引特点

索引的特点

  • (1)索引一旦建设, Oracle管理系统会对其进行主动保护, 而且由Oracle管理系统决定何时应用索引
  • (2)用户不必在查问语句中指定应用哪个索引
  • (3)在定义primary key或unique束缚后零碎主动在相应的列上创立索引
  • (4)用户也能按本人的需要,对指定单个字段或多个字段,增加索引

须要留神的是:Oracle是主动帮咱们治理索引的,并且如果咱们指定了primary key或者unique束缚,零碎会主动在对应的列上创立索引..

什么时候【要】创立索引

  • (1)表常常进行 SELECT 操作
  • (2)表很大(记录超多),记录内容散布范畴很广
  • (3)列名常常在 WHERE 子句或连贯条件中呈现

什么时候【不要】创立索引

  • (1)表常常进行 INSERT/UPDATE/DELETE 操作
  • (2)表很小(记录超少)
  • (3)列名不常常作为连贯条件或呈现在 WHERE 子句中

索引优缺点:

  • 索引放慢数据库的检索速度
  • 索引升高了插入、删除、批改等保护工作的速度(尽管索引能够进步查问速度,然而它们也会导致数据库系统更新数据的性能降落,因为大部分数据更新须要同时更新索引)
  • 惟一索引能够确保每一行数据的唯一性,通过应用索引,能够在查问的过程中应用优化暗藏器,进步零碎的性能
  • 索引须要占物理和数据空间

索引分类:

  • 惟一索引:惟一索引不容许两行具备雷同的索引值
  • 主键索引:为表定义一个主键将主动创立主键索引,主键索引是惟一索引的非凡类型。主键索引要求主键中的每个值是惟一的,并且不能为空
  • 汇集索引(Clustered):表中各行的物理程序与键值的逻辑(索引)程序雷同,每个表只能有一个
  • 非汇集索引(Non-clustered):非汇集索引指定表的逻辑程序。数据存储在一个地位,索引存储在另一个地位,索引中蕴含指向数据存储地位的指针。能够有多个,小于249个

什么是事务?

什么是事务?

事务简略来说:一个Session中所进行所有的操作,要么同时胜利,要么同时失败

ACID — 数据库事务正确执行的四个基本要素

  • 蕴含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

一个反对事务(Transaction)中的数据库系统,必须要具备这四种个性,否则在事务过程(Transaction processing)当中无奈保证数据的正确性,交易过程极可能达不到交易。

举个例子:A向B转账,转账这个流程中如果呈现问题,事务能够让数据恢复成原来一样【A账户的钱没变,B账户的钱也没变】。

事例阐明:

        /*        * 咱们来模仿A向B账号转账的场景        *   A和B账户都有1000块,当初我让A账户向B账号转500块钱        *        * */            //JDBC默认的状况下是敞开事务的,上面咱们看看敞开事务去操作转账操作有什么问题            //A账户减去500块            String sql = "UPDATE a SET money=money-500 ";            preparedStatement = connection.prepareStatement(sql);            preparedStatement.executeUpdate();            //B账户多了500块            String sql2 = "UPDATE b SET money=money+500";            preparedStatement = connection.prepareStatement(sql2);            preparedStatement.executeUpdate();

从下面看,咱们确实能够发现A向B转账,胜利了。可是如果A向B转账的过程中呈现了问题呢?上面模仿一下

            //A账户减去500块            String sql = "UPDATE a SET money=money-500 ";            preparedStatement = connection.prepareStatement(sql);            preparedStatement.executeUpdate();            //这里模仿呈现问题            int a = 3 / 0;            String sql2 = "UPDATE b SET money=money+500";            preparedStatement = connection.prepareStatement(sql2);            preparedStatement.executeUpdate();

显然,下面代码是会抛出异样的,咱们再来查问一下数据。A账户少了500块钱,B账户的钱没有减少这显著是不合理的


咱们能够通过事务来解决下面呈现的问题

            //开启事务,对数据的操作就不会立刻失效。            connection.setAutoCommit(false);            //A账户减去500块            String sql = "UPDATE a SET money=money-500 ";            preparedStatement = connection.prepareStatement(sql);            preparedStatement.executeUpdate();            //在转账过程中呈现问题            int a = 3 / 0;            //B账户多500块            String sql2 = "UPDATE b SET money=money+500";            preparedStatement = connection.prepareStatement(sql2);            preparedStatement.executeUpdate();            //如果程序能执行到这里,没有抛出异样,咱们就提交数据            connection.commit();            //敞开事务【主动提交】            connection.setAutoCommit(true);        } catch (SQLException e) {            try {                //如果呈现了异样,就会进到这里来,咱们就把事务回滚【将数据变成原来那样】                connection.rollback();                //敞开事务【主动提交】                connection.setAutoCommit(true);            } catch (SQLException e1) {                e1.printStackTrace();            }

下面的程序也一样抛出了异样,A账户钱没有缩小,B账户的钱也没有减少。

留神:当Connection遇到一个未解决的SQLException时,零碎会非正常退出,事务也会主动回滚,但如果程序捕捉到了异样,是须要在catch中显式回滚事务的。

事务隔离级别

数据库定义了4个隔离级别:

  1. Serializable【可防止脏读,不可反复读,虚读】
  2. Repeatable read【可防止脏读,不可反复读】
  3. Read committed【可防止脏读】
  4. Read uncommitted【级别最低,什么都防止不了】

别离对应Connection类中的4个常量

  1. TRANSACTION_READ_UNCOMMITTED
  2. TRANSACTION_READ_COMMITTED
  3. TRANSACTION_REPEATABLE_READ
  4. TRANSACTION_SERIALIZABLE
    • *

脏读:一个事务读取到另外一个事务未提交的数据

例子:A向B转账,A执行了转账语句,但A还没有提交事务,B读取数据,发现自己账户钱变多了!B跟A说,我曾经收到钱了。A回滚事务【rollback】,等B再查看账户的钱时,发现钱并没有多。


不可反复读:一个事务读取到另外一个事务曾经提交的数据,也就是说一个事务能够看到其余事务所做的批改

注:A查询数据库失去数据,B去批改数据库的数据,导致A屡次查询数据库的后果都不一样【危害:A每次查问的后果都是受B的影响的,那么A查问进去的信息就没有意思了】


虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不统一。

注:和不可反复读相似,但虚读(幻读)会读到其余事务的插入的数据,导致前后读取不统一


简略总结:脏读是不可容忍的,不可反复读和虚读在肯定的状况下是能够的【做统计的必定就不行】

数据库的乐观锁和乐观锁是什么?

数据库的乐观锁和乐观锁是什么?

确保在多个事务同时存取数据库中同一数据时不毁坏事务的隔离性和统一性以及数据库的统一性,乐观锁和乐观锁是并发管制次要采纳的技术手段。

  • 乐观锁:假设会产生并发抵触,屏蔽所有可能违反数据完整性的操作

    • 在查问完数据的时候就把事务锁起来,直到提交事务
    • 实现形式:应用数据库中的锁机制
  • 乐观锁:假如不会产生并发抵触,只在提交操作时查看是否违反数据完整性。

    • 在批改数据的时候把事务锁起来,通过version的形式来进行锁定
    • 实现形式:应用version版本或者工夫戳

乐观锁:

乐观锁:

超键、候选键、主键、外键别离是什么?

超键、候选键、主键、外键别离是什么?
  • 超键:在关系中能惟一标识元组的属性集称为关系模式的超键。一个属性能够为作为一个超键,多个属性组合在一起也能够作为一个超键。超键蕴含候选键和主键
  • 候选键(候选码):是最小超键,即没有冗余元素的超键
  • 主键(主码):数据库表中对贮存数据对象予以惟一和残缺标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
  • 外键:在一个表中存在的另一个表的主键称此表的外键

候选码和主码:

例子:邮寄地址(城市名,街道名,邮政编码,单位名,收件人)

  • 它有两个候选键:{城市名,街道名} 和 {街道名,邮政编码}
  • 如果我选取{城市名,街道名}作为惟一标识实体的属性,那么{城市名,街道名} 就是主码(主键)

SQL 束缚有哪几种?

SQL 束缚有哪几种?
  • NOT NULL: 用于管制字段的内容肯定不能为空(NULL)。
  • UNIQUE: 控件字段内容不能反复,一个表容许有多个 Unique 束缚。
  • PRIMARY KEY: 也是用于控件字段内容不能反复,但它在一个表只容许呈现一个。
  • FOREIGN KEY: 用于预防毁坏表之间连贯的动作,也能避免非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
  • CHECK: 用于管制字段的值范畴。

数据库运行于哪种状态下能够避免数据的失落?

数据库运行于哪种状态下能够避免数据的失落?

在archivelog mode(归档模式)只有其归档日志文件不失落,就能够无效地避免数据失落。

Mysql存储引擎

Mysql的存储引擎有以下几种:

我的是5.7.15版本,默认应用的是Innodb版本!

罕用的存储引擎有以下:

  • Innodb引擎,Innodb引擎提供了对数据库ACID事务的反对。并且还提供了行级锁和外键的束缚。它的设计的指标就是解决大数据容量的数据库系统。
  • MyIASM引擎(本来Mysql的默认引擎),不提供事务的反对,也不反对行级锁和外键。
  • MEMORY引擎:所有的数据都在内存中,数据的处理速度快,然而安全性不高。

同一个数据库也能够应用多种存储引擎的表。如果一个表批改要求比拟高的事务处理,能够抉择InnoDB。这个数据库中能够将查问要求比拟高的表抉择MyISAM存储。如果该数据库须要一个用于查问的长期表,能够抉择MEMORY存储引擎

MyIASM和Innodb两种引擎所应用的索引的数据结构是什么?

MyIASM和Innodb两种引擎所应用的索引的数据结构是什么?

答案:都是B+树!

MyIASM引擎,B+树的数据结构中存储的内容实际上是理论数据的地址值。也就是说它的索引和理论数据是离开的,只不过应用索引指向了理论数据。这种索引的模式被称为非汇集索引。

Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是理论的数据,这种索引有被称为汇集索引

varchar和char的区别

varchar和char的区别

Char是一种固定长度的类型,varchar是一种可变长度的类型

mysql无关权限的表都有哪几个

mysql无关权限的表都有哪几个

MySQL服务器通过权限表来管制用户对数据库的拜访,权限表寄存在mysql数据库里,由mysql_install_db脚本初始化。这些权限表别离user,db,table_priv,columns_priv和host。上面别离介绍一下这些表的构造和内容:

  • user权限表:记录容许连贯到服务器的用户帐号信息,外面的权限是全局级的。
  • db权限表:记录各个帐号在各个数据库上的操作权限。
  • table_priv权限表:记录数据表级的操作权限。
  • columns_priv权限表:记录数据列级的操作权限。
  • host权限表:配合db权限表对给定主机上数据库级操作权限作更粗疏的管制。这个权限表不受GRANT和REVOKE语句的影响。

数据表损坏的修复形式有哪些?

数据表损坏的修复形式有哪些?

应用 myisamchk 来修复,具体步骤:

  • 1)修复前将mysql服务进行。
  • 2)关上命令行形式,而后进入到mysql的/bin目录。
  • 3)执行myisamchk –recover 数据库所在门路/*.MYI

应用repair table 或者 OPTIMIZE table命令来修复,REPAIR TABLE table_name 修复表 OPTIMIZE TABLE table_name 优化表 REPAIR TABLE 用于修复被毁坏的表。 OPTIMIZE TABLE 用于回收闲置的数据库空间,当表上的数据行被删除时,所占据的磁盘空间并没有立刻被回收,应用了OPTIMIZE TABLE命令后这些空间将被回收,并且对磁盘上的数据行进行重排(留神:是磁盘上,而非数据库)

MySQL中InnoDB引擎的行锁是通过加在什么上实现

MySQL中InnoDB引擎的行锁是通过加在什么上实现

InnoDB是基于索引来实现行锁

例: select * from tab_with_index where id = 1 for update;

for update 能够依据条件来实现行锁锁定,并且 id 是有索引键的列,

如果 id 不是索引键那么InnoDB将实现表锁,,并发将无从谈起

数据库优化的思路

SQL优化

在咱们书写SQL语句的时候,其实书写的程序、策略会影响到SQL的性能,尽管实现的性能是一样的,然而它们的性能会有些许差异。

因而,上面就解说在书写SQL的时候,怎么写比拟好。

①抉择最有效率的表名程序

数据库的解析器依照从右到左的程序解决FROM子句中的表名,FROM子句中写在最初的表将被最先解决

在FROM子句中蕴含多个表的状况下:

  • 如果三个表是齐全无关系的话,将记录和列名起码的表,写在最初,而后顺次类推
  • 也就是说:抉择记录条数起码的表放在最初

如果有3个以上的表连贯查问:

  • 如果三个表是有关系的话,将援用最多的表,放在最初,而后顺次类推
  • 也就是说:被其余表所援用的表放在最初

例如:查问员工的编号,姓名,工资,工资等级,部门名

emp表被援用得最多,记录数也是最多,因而放在form字句的最初面

select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.dnamefrom salgrade,dept,empwhere (emp.deptno = dept.deptno) and (emp.sal between salgrade.losal and salgrade.hisal)          

②WHERE子句中的连贯程序

数据库采纳自右而左的程序解析WHERE子句,依据这个原理,表之间的连贯必须写在其余WHERE条件之左,那些能够过滤掉最大数量记录的条件必须写在WHERE子句的之右

emp.sal能够过滤多条记录,写在WHERE字句的最左边

      select emp.empno,emp.ename,emp.sal,dept.dname      from dept,emp      where (emp.deptno = dept.deptno) and (emp.sal > 1500) 

③SELECT子句中防止应用*号

咱们过后学习的时候,“*”号是能够获取表中全副的字段数据的。

  • 然而它要通过查问数据字典实现的,这意味着将消耗更多的工夫
  • 应用*号写进去的SQL语句也不够直观。
    • *

④用TRUNCATE代替DELETE

这里仅仅是:删除表的全副记录,除了表构造才这样做

DELETE是一条一条记录的删除,而Truncate是将整个表删除,保留表构造,这样比DELETE快

⑤多应用外部函数进步SQL效率

例如应用mysql的concat()函数会比应用||来进行拼接快,因为concat()函数曾经被mysql优化过了。

⑥应用表或列的别名

如果表或列的名称太长了,应用一些简短的别名也能略微进步一些SQL的性能。毕竟要扫描的字符长度就变少了。。。

⑦多应用commit

comiit会开释回滚点...

⑧善用索引

索引就是为了进步咱们的查问数据的,当表的记录量十分大的时候,咱们就能够应用索引了。

⑨SQL写大写

咱们在编写SQL 的时候,官网举荐的是应用大写来写关键字,因为Oracle服务器总是先将小写字母转成大写后,才执行

⑩防止在索引列上应用NOT

因为Oracle服务器遇到NOT后,他就会进行目前的工作,转而执行全表扫描

①①防止在索引列上应用计算

WHERE子句中,如果索引列是函数的一部分,优化器将不应用索引而应用全表扫描,这样会变得变慢

①②用 >= 代替 >

      低效:      SELECT * FROM EMP WHERE DEPTNO > 3         首先定位到DEPTNO=3的记录并且扫描到第一个DEPT大于3的记录      高效:      SELECT * FROM EMP WHERE DEPTNO >= 4        间接跳到第一个DEPT等于4的记录

①③用IN代替OR

      select * from emp where sal = 1500 or sal = 3000 or sal = 800;      select * from emp where sal in (1500,3000,800);

①④总是应用索引的第一个列

如果索引是建设在多个列上,只有在它的第一个列被WHERE子句援用时,优化器才会抉择应用该索引。 当只援用索引的第二个列时,不援用索引的第一个列时,优化器应用了全表扫描而疏忽了索引

      create index emp_sal_job_idex      on emp(sal,job);      ----------------------------------      select *      from emp        where job != 'SALES';          上边就不应用索引了。

数据库构造优化

  • 1)范式优化: 比方打消冗余(节俭空间。。)
  • 2)反范式优化:比方适当加冗余等(缩小join)
  • 3)拆分表: 垂直拆分和程度拆分

服务器硬件优化

这个么多花钱咯!

SQL练习题

根本表构造:

student(sno,sname,sage,ssex)学生表course(cno,cname,tno) 课程表sc(sno,cno,score) 成绩表teacher(tno,tname) 老师表

题目:

101,查问课程1的问题比课程2的问题高的所有学生的学号select a.sno from(select sno,score from sc where cno=1) a,(select sno,score from sc where cno=2) bwhere a.score>b.score and a.sno=b.sno102,查问均匀问题大于60分的同学的学号和均匀问题select a.sno as "学号", avg(a.score) as "均匀问题" from(select sno,score from sc) a group by sno having avg(a.score)>60103,查问所有同学的学号、姓名、选课数、总成绩select a.sno as 学号, b.sname as 姓名,count(a.cno) as 选课数, sum(a.score) as 总成绩from sc a, student bwhere a.sno = b.snogroup by a.sno, b.sname或者:selectstudent.sno as 学号, student.sname as 姓名, count(sc.cno) as 选课数, sum(score) as 总成绩from student left Outer join sc on student.sno = sc.snogroup by student.sno, sname104,查问姓“张”的老师的个数selectcount(distinct(tname)) from teacher where tname like '张%‘或者:select tname as "姓名", count(distinct(tname)) as "人数" from teacher where tname like'张%'group by tname105,查问没学过“张三”老师课的同学的学号、姓名select student.sno,student.sname from studentwhere sno not in (select distinct(sc.sno) from sc,course,teacherwhere sc.cno=course.cno and teacher.tno=course.tno and teacher.tname='张三')106,查问同时学过课程1和课程2的同学的学号、姓名select sno, sname from studentwhere sno in (select sno from sc where sc.cno = 1)and sno in (select sno from sc where sc.cno = 2)或者:selectc.sno, c.sname from(select sno from sc where sc.cno = 1) a,(select sno from sc where sc.cno = 2) b,student cwhere a.sno = b.sno and a.sno = c.sno或者:select student.sno,student.sname from student,sc where student.sno=sc.sno and sc.cno=1and exists( select * from sc as sc_2 where sc_2.sno=sc.sno and sc_2.cno=2)107,查问学过“李四”老师所教所有课程的所有同学的学号、姓名select a.sno, a.sname from student a, sc bwhere a.sno = b.sno and b.cno in(select c.cno from course c, teacher d where c.tno = d.tno and d.tname = '李四')或者:select a.sno, a.sname from student a, sc b,(select c.cno from course c, teacher d where c.tno = d.tno and d.tname = '李四') ewhere a.sno = b.sno and b.cno = e.cno108,查问课程编号1的问题比课程编号2的问题高的所有同学的学号、姓名select a.sno, a.sname from student a,(select sno, score from sc where cno = 1) b,(select sno, score from sc where cno = 2) cwhere b.score > c.score and b.sno = c.sno and a.sno = b.sno109,查问所有课程问题小于60分的同学的学号、姓名select sno,sname from studentwhere sno not in (select distinct sno from sc where score > 60)110,查问至多有一门课程与学号为1的同学所学课程雷同的同学的学号和姓名select distinct a.sno, a.snamefrom student a, sc bwhere a.sno <> 1 and a.sno=b.sno andb.cno in (select cno from sc where sno = 1)或者:select s.sno,s.sname from student s,(select sc.sno from scwhere sc.cno in (select sc1.cno from sc sc1 where sc1.sno=1)and sc.sno<>1group by sc.sno)r1where r1.sno=s.sno111、把“sc”表中“王五”所教课的问题都更改为此课程的均匀问题update sc set score = (select avg(sc_2.score) from sc sc_2 wheresc_2.cno=sc.cno)from course,teacher where course.cno=sc.cno and course.tno=teacher.tno andteacher.tname='王五'112、查问和编号为2的同学学习的课程完全相同的其他同学学号和姓名这一题分两步查:1,select snofrom scwhere sno <> 2group by snohaving sum(cno) = (select sum(cno) from sc where sno = 2)2,select b.sno, b.snamefrom sc a, student bwhere b.sno <> 2 and a.sno = b.snogroup by b.sno, b.snamehaving sum(cno) = (select sum(cno) from sc where sno = 2)113、删除学习“王五”老师课的sc表记录delete sc from course, teacherwhere course.cno = sc.cno and course.tno = teacher.tno and tname = '王五'114、向sc表中插入一些记录,这些记录要求合乎以下条件:将没有课程3问题同学的该问题补齐, 其问题取所有学生的课程2的均匀问题insert sc select sno, 3, (select avg(score) from sc where cno = 2)from studentwhere sno not in (select sno from sc where cno = 3)115、按平平均分从高到低显示所有学生的如下统计报表:-- 学号,企业治理,马克思,UML,数据库,物理,课程数,平均分select sno as 学号,max(case when cno = 1 then score end) AS 企业治理,max(case when cno = 2 then score end) AS 马克思,max(case when cno = 3 then score end) AS UML,max(case when cno = 4 then score end) AS 数据库,max(case when cno = 5 then score end) AS 物理,count(cno) AS 课程数,avg(score) AS 平均分FROM scGROUP by snoORDER by avg(score) DESC116、查问各科问题最高分和最低分:以如下模式显示:课程号,最高分,最低分select cno as 课程号, max(score) as 最高分, min(score) 最低分from sc group by cnoselect  course.cno as '课程号',MAX(score) as '最高分',MIN(score) as '最低分'from sc,coursewhere sc.cno=course.cnogroup by course.cno117、按各科均匀问题从低到高和及格率的百分数从高到低程序SELECT t.cno AS 课程号,max(course.cname)AS 课程名,isnull(AVG(score),0) AS 均匀问题,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/count(1) AS 及格率FROM sc t, coursewhere t.cno = course.cnoGROUP BY t.cnoORDER BY 及格率 desc118、查问如下课程均匀问题和及格率的百分数(用"1行"显示): 企业治理(001),马克思(002),UML (003),数据库(004) select avg(case when cno = 1 then score end) as 平均分1,avg(case when cno = 2 then score end) as 平均分2,avg(case when cno = 3 then score end) as 平均分3,avg(case when cno = 4 then score end) as 平均分4,100 * sum(case when cno = 1 and score > 60 then 1 else 0 end) / sum(casewhen cno = 1 then 1 else 0 end) as 及格率1,100 * sum(case when cno = 2 and score > 60 then 1 else 0 end) / sum(casewhen cno = 2 then 1 else 0 end) as 及格率2,100 * sum(case when cno = 3 and score > 60 then 1 else 0 end) / sum(casewhen cno = 3 then 1 else 0 end) as 及格率3,100 * sum(case when cno = 4 and score > 60 then 1 else 0 end) / sum(casewhen cno = 4 then 1 else 0 end) as 及格率4from sc119、查问不同老师所教不同课程平均分, 从高到低显示select max(c.tname) as 老师, max(b.cname) 课程, avg(a.score) 平均分from sc a, course b, teacher cwhere a.cno = b.cno and b.tno = c.tnogroup by a.cnoorder by 平均分 desc或者:select r.tname as '老师',r.rname as '课程' , AVG(score) as '平均分'from sc,(select  t.tname,c.cno as rcso,c.cname as rnamefrom teacher t ,course cwhere t.tno=c.tno)rwhere sc.cno=r.rcsogroup by sc.cno,r.tname,r.rname order by AVG(score) desc120、查问如下课程问题均在第3名到第6名之间的学生的问题:-- [学生ID],[学生姓名],企业治理,马克思,UML,数据库,均匀问题select top 6 max(a.sno) 学号, max(b.sname) 姓名,max(case when cno = 1 then score end) as 企业治理,max(case when cno = 2 then score end) as 马克思,max(case when cno = 3 then score end) as UML,max(case when cno = 4 then score end) as 数据库,avg(score) as 平均分from sc a, student bwhere a.sno not in (select top 2 sno from sc where cno = 1 order by score desc)  and a.sno not in (select top 2 sno from sc where cno = 2 order by scoredesc)  and a.sno not in (select top 2 sno from sc where cno = 3 order by scoredesc)  and a.sno not in (select top 2 sno from sc where cno = 4 order by scoredesc)  and a.sno = b.snogroup by a.sno

Oracle和Mysql的区别

在Mysql中,一个用户下能够创立多个库

而在Oracle中,Oracle服务器是由两局部组成

  • 数据库实例【了解为对象,看不见的】
  • 数据库【了解为类,看得见的】

一个数据库实例可领有多个用户,一个用户默认领有一个表空间。

表空间是存储咱们数据库表的中央,表空间内能够有多个文件。

当咱们应用Oracle作为咱们数据库时,咱们须要指定用户、表空间来存储咱们所须要的数据

最初

既然都浏览到这里了,就点个赞吧!作为浏览福利小编整顿了数据库相干的面试题+外围知识点,须要的点击此处