数据库-面试题(持续更新)

来自牛客网的汇总

1. MySQL查询时,只有满足联接条件的记录才包含在查询结果,这种联接是(内联接)。

内联接:典型的联接运算,使用像 = 或 <> 之类的比较运算符。包括相等联接和自然联接。内联接使用比较运算符根据每一表共有的列的值匹配两个表中的行。例如,检索 students 和 courses 表中学生标识号相同的所有行。

外联接:外联接可以是左向外联接、右向外联接或完整外部联接。
在FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:

LEFT JOIN 或 LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表均为空值。

RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

FULL JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

交叉联接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称笛卡尔积。

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

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

ACID,指数据库事务正确执行的四个基本要素的缩写。
包含:原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)

一个支持事务(Transaction)中的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易。

原子性:一个事务(Transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的默认规则,这包含资料的精准度、串联新以及后续数据库可以自发性地完成预定的工作。

隔离性:当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的互相关系。事务隔离分为不同的级别,包括读为提交(Read uncommitted)、读提交(Read committed)、可重复读(Repeatable read)和串行化(Serializable)。

持久性:在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,而且是完全的。

由于一项操作通常会包含许多子操作,而这些子操作可能会因为硬件的损坏或其他因素产生问题,要正确实现ACID并不容易。ACID建议数据库将所有需要更新以及修改的资料一次操作完毕,但实际上并不可行。

目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式。第二种是Shadow paging。

Write ahead logging(预写日志):
1. 事务所引起的所有改动都要记录在日志中,在事务提交完成之前,所有的这些记录必须被写入硬盘;
2. 一个数据库的缓冲页直到被记入日志后才能发生修改。直到缓冲页对应的日志被写入键盘后,该缓冲页才会存入键盘;
3. 当缓冲页被修改和日志被更新修改时,必须加上互斥锁,以保证改动被记录到日志中的顺序与它发生的顺序是一致的。

以上规则的结果:

  1. 如果一条日志记录未被存入硬盘,则它可以被忽略,因为该日志中包含的改动一定属于未提交的事务。此外,这样的日志不能反映已持久化在数据库中的改动;
  2. 日志记录按顺序记录系统的改动。加锁协议(latch protocol)保证如果有对于同一页改动的两条日志记录,则两条记录的顺序反映对页发生改变的顺序。

MySQL的操作

  1. 如何登陆mysql数据库:
MySQL -u username -p
  1. 如何开启/关闭mysql服务
service mysql start/stop
  1. 查看mysql的状态
service mysql status
  1. 如何显示所有数据库
show databases;
  1. 进入数据库
use db_name;
  1. 显示所有表
show tables;
  1. 获取表内所有字段对象名称和类型
desc table_name;
  1. MySQL支持事务吗?

在缺省模式下,MySQL是autocommit模式的,所有的数据库更新操作都会及时提交,所以在缺省情况下,mysql是不支持事务的。

但是如果你的mysql表类型是使用InnoDB Tables 或 BDB tables的话,你的MySQL就可以使用事务处理,使用SET AUTOCOMMIT = 0就可以使MySQL允许在非autocommit模式下,你必须使用commit来提交你的更改,或者有ROLLBACK来回滚你的更改。

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1; 
UPDATE table2 SET summmary=@A WHERE type=1; 
COMMIT;

你可能感兴趣的:(sql,数据库,面试题)