本文已参与「新人创作礼」活动,一起开启掘金创作之路。
数据库是软件开发中非常重要的一环,数据是这个时代真正值钱的东西。本期就来讨论关于数据库在面试中会遇到的一些问题,其中包含个人一些理解,由于本人学识有限,难免会有纰漏之处,还望读者能多多包涵。
最麻烦也是最没营养的就是软件的安装和配置。MySQL在企业里大部分是运行在Linux系统之上。服务器用的多的受欢迎的Linux发行版主要是RHEL(RedHat Enterprise Linux),其开源版本是CentOS,相信很多人都用过。那么安装就有3种方式:
- 直接利用RPM包管理器来安装,十分方便。缺点是一台服务器只能安装一个版本的MySQL/MariaDB软件。
- 二进制文件安装。下载后解压即可使用。其实RPM安装也是二进制安装,只是帮你管理了依赖。
- 源码安装。因为下载的是源代码文件,所以需要编译,但比较灵活,可以根据自己需求修改代码,定制属于自己的MySQL。
1、事务隔离级别
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交(Read Uncommitted, RU) | 是 | 是 | 是 |
| 读已提交(Read committed,RC) | 否 | 是 | 是 |
| 可重复读(Repeatable Read,RR) | 否 | 否 | 是 |
| 串行化(Serializable) | 否 | 否 | 否 |
MySQL默认事务隔离级别为RR;Oracle默认为RC。
2、SQL语言
结构化查询语言(Structured Query Language)简称SQL。 SQL的范围包括数据插入(insert)、查询(select)、更新(update)和删除(delete),数据库模式创建和修改,以及数据访问控制。
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。(原本规范要用大写,我图看着舒服,全部用了小写)
- DQL基本结构是由select,from,where组成的查询块。一般一条完整的查询语句如下:
select con1,con2,... from student where age=20 group by 分组字段 having 条件 order by 排序字段
执行顺序:from->where->group by->having->order by->select
- DML主要有三种形式:insert、update和delete。
- DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等。由create、alter、drop和truncate组成。
- DCL用来授予或回收访问数据库的某种特权。简单说就是访问控制权限,这些操作的可以使数据更加地安全。一般有grant:授权,允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限。Revoke语句:可以废除某用户或某组或所有用户访问权限。rollback:回滚,使数据库状态回到上次最后提交的状态。commit:提交,在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。
此外需要注意的是,drop、delete和truncate都用于删除,但略有区别。
- drop直接删掉表;drop table table_name 立刻释放磁盘空间 ,不管是 InnoDB 和 MyISAM;drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index); 依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。
- truncate删除的是表中的数据,再插入数据时自增长的数据id又重新从1开始;
-
truncate:不走事务,原数据不放到 rollback segment 中,操作不触发 trigger。 执行后立即生效,无法找回 执行后立即生效,无法找回 执行后立即生效,无法找回
-
truncate table table_name立刻释放磁盘空间 ,不管是 InnoDB和MyISAM。
-
truncate能够快速清空一个表。并且重置auto_increment的值。
- delete删除表中数据,可以在后面添加where字句。delete from TABLE_NAME where id=1
-
delete只删除数据不删除表的结构,会走事务,执行时会触发trigger;
-
InnoDB引擎中,delete不会真正删除数据,只是把删除的数据标记为已删除,因此delete删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放。但是下次插入数据的时候,仍然可以重用这部分空间(重用 → 覆盖)。
-
DELETE执行时,会先将所删除数据缓存到rollback segement中,事务commit之后生效;
-
delete from table_name删除表的全部数据,对于MyISAM 会立刻释放磁盘空间,InnoDB则不会;
-
对于delete from table_name where xxx 带条件的删除, 不管是InnoDB还是MyISAM都不会释放磁盘空间;
3、关联查询
SQL有五种关联查询
- 交叉连接(CROSS JOIN)
- 内连接(INNER JOIN)
- 外连接(LEFT JOIN/RIGHT JOIN)
- 联合查询(UNION 与 UNION ALL)
- 全连接(FULL JOIN)(MySQL不支持)
select * from Atable inner join Btable on Atable.aid=Btable.bid;
select * from Atable left join Btable on Atable.aid=Btable.bid;
select * from Atable cross join Btable;
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;
ok,本期就到这里,下一期继续讲解数据库方面的知识点,敬请关注。