1、关系型数据库
列:字段/属性 行:元组/记录
关系:笛卡尔积中符合某种关系的元组(笛卡尔积是从两个关系中合并元组)
超码是可以唯一标识元组的属性组合,候选码是最小的超码,主码是被选中的候选码
2、SQL
有char(n),varchar(n),int,smallint,numeric(p, d),float(n),date,time,timestamp,blob(二进制字符串),text(字符字符串)等类型。
char是定长字符串,varchar不定长。
int(11)中11表示显示宽度,不影响int的大小(32位),当数值位数未达到显示宽度时在前面补0。
语法:(1)foreign key(user_id) references user(id);
(2)自然连接:select t1.A, t2.B from t1 natural join t2;只考虑t1和t2在共同属性上相同的元组,等价于select t1.A, t2.B from t1, t2 where t1.x = t2.x;可以用join ... using指定连接的字段/属性
(3)like ... escape '\':模式匹配,%表示任意子串,_表示任意一个字符,escape可以定义转义字符,例如like ‘ab\%cd%’escape '\'可以匹配所有以abcd开头的字符串
(4)order by ... desc
(5)元组相等:where (a1, a2) = (b1, b2)
(6)集合运算:union,自动去重,全部保留的话可以用union all
intersect(all) 交集,A∩B except 差集,A-B
(7)null 用is (not) null判断是否为空,其他对null运算的结果视为unknown,如果所有属性相等,有null元组也视为相等
(8)聚集函数:avg,min,max,sum,count等,可以单独使用也可以放在group by ... having ...里的having后,忽略空值
(9)嵌套子查询:(not) in,some/all, (not) exists,unique等
例如select ... where salary > some ( select ...)
(10)外连接
left outer join ... on ... 保留左边的元组,如果右边没有和左边对应的元组则为null;如果左边一个元祖对应多个右边的元组则全部保留,重复左边的元组
right outer join ... on ... 右外连接,保留右边的元组
full outer join ... on ... 全外连接,全部保留
(11)alter table t add/drop/modify:修改表
(12)select ... for update:加排他锁,仅用于InnoDB事务块中
3、视图
create view v as ( select ...);
并不预先计算,只是存储定义,视图随表的变化而变化。视图一般不允许修改,例如insert时,不在视图中的列在表中就会为null,会产生问题。
4、完整性约束
not null,unique,check (A>B),foreign key (user_id) references user(id)等
外键约束可以定义级联删除
5、JDBC连接数据库
public static void main(String[] args) throws Exception {
Connection conn = null;
String sql;
// MySQL的JDBC URL编写方式:jdbc:mysql://主机名称:连接端口/数据库的名称?参数=值
// 避免中文乱码要指定useUnicode和characterEncoding
String url = "jdbc:mysql://localhost:3306/mydb?"
+ "user=root&password=123456&useUnicode=true&characterEncoding=UTF8";
try {
// 可以通过Class.forName把它加载进去,也可以通过初始化来驱动起来,下面三种形式都可以
Class.forName("com.mysql.jdbc.Driver");
// or:
// com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
// or:
// new com.mysql.jdbc.Driver();
System.out.println("成功加载MySQL驱动程序");
// 一个Connection代表一个数据库连接
conn = DriverManager.getConnection(url);
// Statement里面带有很多方法,比如executeUpdate可以实现插入,更新和删除等
Statement stmt = conn.createStatement();
sql = "create table student(NO char(20),name varchar(20),primary key(NO))";
int result = stmt.executeUpdate(sql);// executeUpdate语句会返回一个受影响的行数,如果返回-1就没有成功
}
} catch (SQLException e) {
System.out.println("MySQL操作错误");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
conn.close();
}
}
可以使用PreparedStatement,防止sql注入,输入的字符串会被插入转义字符
6、E-R图,实体-联系图
长方形表示实体,椭圆表示属性,菱形表示联系;1:n表示一对多,m:n表示多对多
7、范式
主属性:候选码中的属性
传递依赖:如果X→Y,Y→Z,且X不包含Y,Y!→X(Y不能决定X), (X∪Y)∩Z = ∅,则Z传递依赖于X
1NF:属性不可分
2NF:完全依赖主键
3NF:非主属性字段互不依赖(消除了非主属性对主属性的传递依赖)
BCNF:消除了所有属性对主属性的传递依赖,如果表中有X→Y,则X一定是候选码