数据库

请问什么是数据库事物

参考回答:
数据库事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。一个数据库事务通常包含了一个序列的对数据库的读/写操作。

它的存在包含有以下两个目的

1.为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。

2.当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

数据库事务拥有以下四个特性,被称之为ACID特性:

原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

● 请你说一下数据库连接泄露的含义

参考回答:
数据库连接泄露指的是如果在某次使用或者某段程序中没有正确地关闭 Connection、Statement和ResultSet资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用不能得到重新使用,因此就造成了数据库连接的泄漏。数据库连接的资源是宝贵而且是有限的,如果在某段使用频率很高的代码中出现这种泄漏,那么数据库连接资源将被耗尽,影响系统的正常运转。

● 请你写一下mysql删除语句

参考回答:
1.drop语句。可以用来删除数据库和表。
用drop语句来删除数据库:drop database db;

用drop语句来删除表:drop table tb;

2.delete语句。用来删除表中的字段。

delete from tb where id=1;

如果delete语句中没有加入where就会把表中的所有记录全部删除:

3.用truncate来删除表中的所有字段:

truncate table tb;

● 请你说一下数据库mysql中CHAR和VCHAR的区别

参考回答:
1、char(n)类型
char类型是定长的类型,即当定义的是char(10),输入的是"abc"这三个字符时,它们占的空间一样是10个字节,包括7个空字节。当输入的字符长度超过指定的数时,char会截取超出的字符。而且,当存储char值时,MySQL是自动删除输入字符串末尾的空格。 char是适合存储很短的、一般固定长度的字符串。例如,char非常适合存储密码的MD5值,因为这是一个定长的值。对于非常短的列,char比varchar在存储空间上也更有效率。取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要。

2、varchar(n)类型

varchar(n)类型用于存储可变长的,长度为n个字节的可变长度且非Unicode的字符数据。n必须是介于1和8000之间的数值,存储大小为输入数据的字节的实际长度+1/2. 比如varchar(10), 然后输入abc三个字符,那么实际存储大小为3个字节。除此之外,varchar还需要使用1或2个额外字节记录字符串的长度,如果列的最大长度小于等于255字节(是定义的最长长度,不是实际长度),则使用1个字节表示长度,否则使用2个字节来表示。取数据的时候,不需要去掉多余的空格

● 请你写两个sql语句,统计XX人数、选出课程编号不为XX的学生学号

参考回答:
select sClass 班级,count() 班级学生总人数,
SELECT count(
)
FROM SClass
SELECT 学号,

FROM S

WHERE NOT EXISTS (SELECT *

FROM SC

WHERE SC.课程号 = ‘XX’

AND S.学号 = SC.学号);

● 请你说一下SQL左连接以及使用场景

参考回答:
left join(左连接) 返回包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
使用场景:可以保持左表完整加入另一表中的数据。

● 请你写一下SQL查询、更新的某一列语句

参考回答:
SELECT 要查询的数据类型 FROM 表名 WHERE 条件
UPDATE 表名 SET 列名=更新的值 WHERE 条件

● 请你写一下SQL语句的多表查询

参考回答:
例如:按照department_id 查询 employees(员工表)和 departments(部门表) 的信息。
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id

● 请你说说redis

参考回答:
redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis 支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

● 请你写一些基本的SQL语句

参考回答:
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)

删除:delete from table1 where 范围

更新:update table1 set field1=value1 where 范围

查找:select * from table1 where field1 like ‘%value1%’ —like的语法很精妙,查资料!

排序:select * from table1 order by field1,field2 [desc]

总数:select count as totalcount from table1

求和:select sum(field1) as sumvalue from table1

平均:select avg(field1) as avgvalue from table1

最大:select max(field1) as maxvalue from table1

最小:select min(field1) as minvalue from table1

● 某个表格中有10条一模一样的数据,现在要删掉其中的9条,请你写一下sql语句

参考回答:
1
delete * from table_name limit 9 (只取9条时)

● 某个表格存着s_name subject score 三个字段,比如某一行是 张三 数学 76,现在要选取出所有科目成绩都大于80分的学生名字,请写出sql语句

参考回答:

select s_name
from table_name s1
where s_name not in (select s_name
from table_name s2
where s1.s_name == s2.s_name and score <80)

● 请你说一说数据库中的聚类查询

参考回答:
聚集索引中键值的逻辑顺序决定了表中相应行的物理顺序。聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。当索引值唯一时,使用聚集索引查找特定的行也很有效率。例如,使用唯一雇员ID 列 emp_id 查找特定雇员的最快速的方法,是在 emp_id 列上创建聚集索引或 PRIMARY KEY 约束。
如果不创建索引,系统会自动创建一个隐含列作为表的聚集索引。

1.创建表的时候指定主键(注意:SQL Sever默认主键为聚集索引,也可以指定为非聚集索引,而MySQL里主键就是聚集索引)

create table t1(
id int primary key,
name nvarchar(255)
)
2.创建表后添加聚集索引

1
2
3
4
SQL Server:
create clustered index clustered_index on table_name(colum_name)
MySQL:
alter table table_name add primary key(colum_name)

● 请问如果mysql中用户密码丢了怎么办,建一个数据库表,授权命令是什么

参考回答:
对于普通用户的密码丢失,直接用root超级管理员登录修改密码即可
若是root密码丢失,可通过mysqlld_saft方式找回

1、停止mysql:service mysqld stop

2、安全模式启动:mysql_safe-skip-grant-tables&

3、无密码回车键登录:mysql –uroot –p;

4、重置密码:use mysql update user set password=password(“)where user=’root’ and host=’localhost’;flush privileges

5、正常启动:service mysql restart

6、再使用mysqladmin:mysqladmin password ‘123456’

Mysql创建数据库

Create database demodb default character set utf8 collate utf8_general_ci;

授权

Grant all privileges on demodb. * [用户名称]@’%’

立即启动修改

Flush privileges

● 写出sql语句:数据库统计总成绩取前十名的学生

参考回答:
SELECT * FROM (
select T.*,ROW_NUMBER()OVER(PARTITION BY 班级 order by 成绩 desc) RN
FROM T
)WHERE RN<=10

● 请你说一下数据库事务、主键与外键的区别?

参考回答:
数据库的事务:事务即用户定义的一个数据库操作序列,这些操作要么全做要全不做,是一个不可分割的工作单位,它具有四个特性,ACID,原子性,一致性,隔离性,持续性
主键和外键的区别:
1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。

身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
2.外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性

● 请问对缓存技术了解吗

参考回答:
Redis可以实现缓存机制, Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、 list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,当前 Redis的应用已经非常广泛,国内像新浪、淘宝,国外像 Flickr、Github等均在使用Redis的缓存服务。

Redis 工作方式分析
Redis作为一个高性能的key-value数据库具有以下特征:

1、多样的数据模型

2、持久化

3、主从同步

Redis支持丰富的数据类型,最为常用的数据类型主要由五种:String、Hash、List、Set和Sorted Set。Redis通常将数据存储于内存中,或被配置为使用虚拟内存。Redis有一个很重要的特点就是它可以实现持久化数据,通过两种方式可以实现数据持久化:使用RDB快照的方式,将内存中的数据不断写入磁盘;或使用类似MySQL的AOF日志方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。 Redis支持将数据同步到多台从数据库上,这种特性对提高读取性能非常有益。

● 请问count和sum的区别,以及count(*)和count(列名)的区别
参考回答:
Count和sum区别:求和用累加sum(),求行的个数用累计count
Count(*)包括了所有的行,在统计结果的时候不会忽略列值为null

Count(列名)只包括列名那一项,会忽略列值为空的计数

● 请问你数据库是用的MySQL吗?平常数据库的语句都是怎么写的? join作用,想删除一行怎么做

参考回答:
Mysql和oracle都用过,mysql为主,join作用是连接两个表,假设有2个表——Student表和SC表(选课表):
内连接(自然连接):当使用内连接时,如果Student中某些学生没有选课,则在SC中没有相应元组。最终查询结果舍弃了这些学生的信息

外连接:如果想以Student表为主体列出每个学生的基本情况及其选课情况。即使某个学生没有选课,依然在查询结果中显示(SC表的属性上填空值)。就需要使用外连接

例子:

//内连接:查询每个学生及其选修课程的情况(没选课的学生不会列出)
SELECT Student., SC.
FROM Student , SC
WHERE Student.Sno=SC.Sno;

//外连接:查询每个学生及其选修课程的情况(没选课的学生也会列出)

SELECT Student., SC.
FROM Student LEFT JOIN SC ON(Student.Sno=SC.Sno);

● 请问如何对数据库作优化

参考回答:
1、调整数据结构的设计,对于经常访问的数据库表建立索引
2、调整SQL语句, ORACLE公司推荐使用ORACLE语句优化器(Oracle Optimizer)和行锁管理器(row-level manager)来调整优化SQL语句。

3、调整服务器内存分配。内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小。

4、调整硬盘I/O,DBA可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。

● 请问什么是幻读

参考回答:
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,但是还没有来得及提交到数据库中,这时,另一个事务也访问这个数据,然后使用了这个数据

● 请你说一下MyBatis有什么优势,他如何做事务管理

参考回答:
MyBatis优点:
1.易于上手和掌握

  1. sql写在xml里,便于统一管理和优化。

  2. 解除sql与程序代码的耦合。

  3. 提供映射标签,支持对象与数据库的orm字段关系映射

  4. 提供对象关系映射标签,支持对象关系组建维护

  5. 提供xml标签,支持编写动态sql。

Mybatis管理事务是分为两种方式:

(1)使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交

(2)使用MANAGED的事务管理机制,这种机制mybatis自身不会去实现事务管理,而是让程序的容器(JBOSS,WebLogic)来实现对事务的管理

● 请你说一下事务的隔离级别,以及你一般使用的事务是哪种

参考回答:
事务的隔离性及时同一时间只允许一个事务请求同一数据,不同事物之间彼此没有任何干扰,
事务隔离级别如下:
数据库_第1张图片

你可能感兴趣的:(软件测试)