校招面试系列之数据库(上篇)

数据库(上篇:操作)

重点部分:数据库设计范式、多表关系、事务、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操作数据库的具体实现流程
  1. 导入驱动jar包;

  2. 注册驱动(内部实现是加载DriverManager类里面的静态代码块,其中包含一个registerDriver()方法);

    Class.forname("com.mySQL.jdbc.Driver");
  3. 建立数据库连接;

    DriverManager.getConnection("jdbc:mysql://ipaddress:端口/数据库名称");
  4. 定义sql语句(字符串形式);

  5. 创建执行sql的Statement对象<通过Connection对象的方法创建>(sql注入问题),采用PreparedStatement对象,传参防止sql注入导致的安全问题;

  6. 执行sql,返回ResultSet;

    excuteUpdate();    //执行增删改操作
    excuteQuery();    //执行查操作
  7. 释放资源,Statement以及Connection对象。

    JDBC管理事务

    通过Connection对象方法设置事务的开启、提交以及回滚:

    setAutoCommit(boolean autoCommit);    //设置为false开启事务
    commit();    //提交事务
    rollback();    //回滚事务

数据库连接池

存放Connection对象的容器,其优点是避免频繁地申请释放连接资源,导致性能低效。目前著名的有两种,C3P0以及Druid,此处的Connection.close()方法是归还连接对象,而不是释放连接。

Spring JDBC Template

省去开发人员自己申请连接,释放连接,开发人员只需要关注数据库本身的具体操作即可。

全部评论

相关推荐

点赞 2 评论
分享
牛客网
牛客企业服务