校招面试系列之数据库(上篇)
数据库(上篇:操作)
重点部分:数据库设计范式、多表关系、事务、java操作数据库等
数据库,存储和管理数据的仓库,它是一个文件系统,可以持久化存储数据,它采用统一的操作方式管理数据(SQL)。
Structure Query Language(SQL)
一种操作所有关系型数据库的语言,由DDL(操作数据库、表)、DML(增删改表中数据)、DQL(查表中数据)、QCL(权限管理)四类构成。
表查询(SELECT * FROM 表名)
排序查询
ORDER BY '字段' ASC/DESC;
ASC
代表升序,DESC
代表降序,可重复选择多个字段,字段越靠前,优先级越高。参考:
SELECT * FROM student ORDER BY math ASC, Chinese DESC;
聚合函数
五大聚合函数
COUNT(); MAX(); MIN(); SUM(); AVG();
分组查询
GROUP BY '字段';
此时,SELECT
后必须是分组字段或者聚合函数。参考:
SELECT sex FROM student GROUP BY sex;
这里分组之前可以加WHERE条件
,WHERE中不可以有聚合函数,分组之后可以加HAVING条件
。参考:
SELECT AVG(math) FROM student WHERE math > 60 GROUP BY sex HAVING(math) > 70;
分页查询
LIMIT a, b;
a
代表从第a条开始,b
代表查询b条记录。
模糊条件查询
WHERE name LIKE "%化%"; --以及"_化_"
%
指代多个字符,_
指代单个任意字符。
汇总
SELECT 字段列表 FROM 表名 WHERE 条件列表 GROUP BY 分组字段 WHERE 分组之后的条件 ORDER BY 排序字段 ASC / DESC LIMIT 开始条号,几条;
约束
用于对表中数据进行限定(创建表时约束)
非空约束
NOT NULL;
唯一约束
UNIQUE;
主键约束非空且唯一
PRIMARY KEY;
一张表只能有一个主键,主键是表中记录的唯一标识,主键可以设定为自动增长模式。
外键约束
FOREIGN KEY;
数据库有冗余,需要拆分表,拆开的表用外键关联,参考员工与部门。外键语法:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY 外键列名称 REFERENCE 主表名称(主表列名称) ON UPDATE / DELETE CASCASE;
尾部用于表征级联更新与级联删除(慎用)。
多表之间的关系
一对一
通常是一张表,或者在任一方添加外键,并让外键唯一。
多以一(一对多)
通过外键级联,在多的一方添加外键。举例:博客n->分类1
多对多
添加中间表,其至少包含两个字段,左外键与右外键,二者构成联合主键。举例:博客n->标签m
设计范式
越高的范式对应的数据库冗余越小。
第一范式
每一列都是不可分割的原子项
第二范式
在第一范式的基础上,消除非码属性对于码属性的部分依赖
码属性是指表中的一个属性组,给其它属性完全依赖
第三范式
在第二范式的基础上,消除非主属性之间的相互依赖,即消除传递依赖
数据库的备份与还原
mysqldump -u*** -p*** db1 >备份路径; source .sql文件;
多表查询
SELECT * FROM emp, dept;
笛卡尔积,集合A与B的所有元素组合。
内连接查询(交集)
SELECT * FROM emp t1 (INNER) JOIN dep t2 on t1.** = t2.**;
外连接查询(左/右表+交集)
* FROM emp t1 (INNER) left / right JOIN dep t2 on t1.** = t2.**;
子查询
查询中嵌套查询(sql查询语句的结果集ResultSet)。
事务
并发环境下,事务的隔离性很难保证,出现并发一致性问题。
脏读,不可重复读,幻影读。
JDBC(Java database connectivity)
JDBC是一套Java接口,定义了操作所有关系型数据库的规范,由各数据库厂商来提供驱动jar包,即接口实现类。
java操作数据库的具体实现流程
导入驱动jar包;
注册驱动(内部实现是加载DriverManager类里面的静态代码块,其中包含一个registerDriver()方法);
Class.forname("com.mySQL.jdbc.Driver");
建立数据库连接;
DriverManager.getConnection("jdbc:mysql://ipaddress:端口/数据库名称");
定义sql语句(字符串形式);
创建执行sql的Statement对象<通过Connection对象的方法创建>(sql注入问题),采用PreparedStatement对象,传参防止sql注入导致的安全问题;
执行sql,返回ResultSet;
excuteUpdate(); //执行增删改操作 excuteQuery(); //执行查操作
释放资源,Statement以及Connection对象。
JDBC管理事务
通过Connection对象方法设置事务的开启、提交以及回滚:
setAutoCommit(boolean autoCommit); //设置为false开启事务 commit(); //提交事务 rollback(); //回滚事务
数据库连接池
存放Connection对象的容器,其优点是避免频繁地申请释放连接资源,导致性能低效。目前著名的有两种,C3P0以及Druid,此处的Connection.close()方法是归还连接对象,而不是释放连接。
Spring JDBC Template
省去开发人员自己申请连接,释放连接,开发人员只需要关注数据库本身的具体操作即可。