数据库和SQL面试题基础知识(持续更新)

数据库方面基础知识复习

常问小问题;

一、like查询大小写问题:

      sql查询结果去重 SELECT distinct name FROM 表;平均数avg

一、like查询大小写问题:

  ①用binary 区分大小写

    select * from blacklist where binary name = 'zhangsan' ;

  ②在建表的时候,设置好区分大小的。加以标识

    create  table  table_name(  

         a varchar (20) binary

    ) 

二、like查询引用索引问题:

      ①like'王%' 用到索引

   ②like'%%' 没用到索引

   ③like'%%' 没用到索引

三、数据库的默认隔离级别(可重复读(repeatable-read))

  读未提交(read-uncommitted)脏读

  不可重复读(read-committed)幻读

  可重复读(repeatable-read)   幻读

  串行化(serializable)  

四、数据库中having使用

  HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。

  HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。

五、数据库中exists使用(一般和in作对比)

  in只有一个字段去匹配,exist返回多个字段匹配??

  例如:select * from A where id in(select id from B)  当B表比较小时候用in

  select * from A where id exist (select id from B)  当B表比较小时候用in

六、

 

七、

 

1、数据库优化

在数据库中查询语句速度很慢,如何优化?

1.建索引 2.减少表之间的关联 3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据 量大的表排在前面 4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据 5.尽量用PreparedStatement来查询,不要用Statement,6.对字段类型用到适当,状态类型(性别)可以用tinyint varchar减少内存

 

2、触发器的作用?

触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

3、什么是存储过程?用什么来调用?

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。 调用: 1)可以用一个命令对象来调用存储过程。 2)可以供外部程序调用,比如:java程序。

4、存储过程的优缺点?

优点: 1)存储过程是预编译过的,执行效率高。 2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。 3)安全性高,执行存储过程需要有一定权限的用户。 4)存储过程可以重复使用,可减少数据库开发人员的工作量。 缺点:移植性差

5、存储过程与函数的区别

 

存储过程 函数
用于在数据库中完成特定的操作或者任务(如插入、删除等) 用于特定的数据(如选择)
程序头部声明用procedure 程序头部声明用function
程序头部声明时不需描述返回类型 程序头部声明时要描述返回类型,而且PL/SQL块中至少要包括一个有效的return语句
可以使用in/out/in out 三种模式的参数 可以使用in/out/in out 三种模式的参数
可作为一个独立的PL/SQL语句来执行 不能独立执行,必须作为表达式的一部分调用
可以通过out/in out 返回零个或多个值 通过return语句返回一个值,且改值要与声明部分一致,也可以是通过out类型的参数带出的变量
SQL语句(DML 或SELECT)中不可调用存储过程 SQL语句(DML 或SELECT)中可以调用函数

 

6、函数的创建和使用

语法:

Create function 函数名(参数)

Returns 返回值数据类型

as

begin

SQL语句(必须有return 变量或值)

End

直接执行函数  SELECT dbo.函数名('aa') AS result;sql中同样使用

 

常用系统存储过程:

exec sp_databases; --查看数据库
exec sp_tables; --查看表
exec sp_columns student;--查看列
exec sp_helpIndex student;--查看索引
exec sp_helpConstraint student;--约束
exec sp_stored_procedures;
exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句
exec sp_rename student, stuInfo;--修改表、索引、列的名称
exec sp_renamedb myTempDB, myDB;--更改数据库名称
exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库
exec sp_helpdb;--数据库帮助,查询数据库信息
exec sp_helpdb master;

系统存储过程使用
--重命名索引 exec sp_rename N'student.idx_cid', N'idx_cidd', N'index'; exec sp_help 'student';
--自定义存储过程
create proc | procedure pro_name
    [{@参数数据类型} [=默认值] [output],
     {@参数数据类型} [=默认值] [output],
     ....
    ]
as
    SQL_statements


7、内外连接

1.左外左边主表右边辅表(或者说左边不受限制)(实际结果是A表所有数据,B表对应),select * from A Left JOIN B ON A.Aid=B.Bnameid 0

2.右外连接右表是主表(或者说右表不受限制)(实际结果是B表所有数据,A表对应)select * from A Right JOIN B ON A.Aid=B.Bnameid  

3.内连接:内连接获取两表的公共部分的记录(实际结果关联字段为基础俩表的数据)Select * from A JOIN B ON A.Aid=B.Bnameid

4.意义不大(实际结果 两张表联合没有条件情况下,条数 = 图1 * 图2)或者数据行数等于 第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

 

select * from A where id in(select id from B)

posted @ 2018-11-02 10:45  老年痴呆  阅读(3238)  评论(0编辑  收藏  举报