《数据库系统概念》读书笔记——概念、SQL、JDBC、ER、范式等

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指定连接的字段/属性

扫描二维码关注公众号,回复: 52795 查看本文章

   (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一定是候选码

猜你喜欢

转载自blog.csdn.net/weixin_39420024/article/details/80031281