• 数据库(SQL sever)


    本博客将主要讲述数据库(SQL sever)

    1.数据库解决的数据问题:

    Data redundancy and inconsistency(数据冗余和不一致)

    Difficulty in accessing data

    Data isolation (数据孤立)

    Integrity problems (完整性问题)

    Atomicity of updates (更新操作的原子性)

    Concurrent access by multiple users (多用户并发访问)

    Security problems (安全性问题)

    2.SQL语句大致分两种:

    Data-Manipulation Language, DML (数据操纵语言)  查询

    Data-Definition Language, DDL(数据定义语言)   定义

    3.SQL数据库中往往用表来储存数据

    元组(Tuple表中的一行被称为元组,代表了一个实体的一组属性值。又名:记录、行

    属性(Attribute表中的一列被称为属性,代表了实体的一个特定属性。又名;字段、列

    关系模式(Relation Schema: 定义了表的结构,包括表名、属性名以及属性的数据类型。

    关键字(Key: 一个或一组属性,用于唯一标识元组。关键字在确保数据唯一性和完整性方面起着重要作用

    每个属性的值、元素的集合又称:属性的域(domain)

    元组中的属性是无序的。

    元组在关系中出现的顺序是无关的。

    笛卡尔积(Cartesian Product)

    在数据库中,笛卡尔积(Cartesian Product)是指两个表的每一行都与另一个表的每一行组合在一起的结果集。这种组合会生成一个新的表,其中的每一行都包含两个表中对应行的所有列的值。

    假设有两个表A和B,它们分别包含m和n行记录。那么这两个表的笛卡尔积将包含m * n行。在结果中,每一行都是表A的一行与表B的所有行的组合。

    用数学符号表示,如果A表有a1, a2, ..., am列,B表有b1, b2, ..., bn列,那么它们的笛卡尔积可以表示为:

    [ A \times B = {(a1, a2, ..., am, b1, b2, ..., bn) \mid a1 \in A, a2 \in A, ..., am \in A, b1 \in B, b2 \in B, ..., bn \in B} ]

    在SQL中,可以使用CROSS JOIN  (交叉连接,又称自然连接)来获得两个表的笛卡尔积。例如,如果有两个表A和B,可以使用以下语句:

    select * from A  cross join B;

    SELECT * FROM A CROSS JOIN B;

    需要注意的是,笛卡尔积的结果集可能非常大,尤其是当参与的表具有大量记录时。因此,在实际使用中,通常需要谨慎使用笛卡尔积,以避免性能问题。

    原子域(Atomic Domain)

    原子域指的是一个字段(列)中的数据应该是不可再分的最小单位。换句话说,一个字段中的数据应该是不可再分的单一数值或原子值。例如,在一个“姓名”字段中,如果将“姓”和“名”合并在同一个字段中,这就违反了原子性,因为“姓名”不再是不可再分的最小单位。

    保持原子性有助于确保数据的一致性和规范性,同时也方便了数据库查询和维护。

    第一范数(First Normal Form,1NF)

    第一范数是关系数据库中的规范化的第一个步骤。一个关系被认为满足第一范数,如果它的所有属性都是原子的,即每个属性中的数据都是不可再分的。

    在第一范数中,每个列都包含了有意义的原子数据,不存在重复的组合数据或集合数据。这有助于避免数据冗余和确保数据的一致性。

    为了使关系满足第一范数,通常需要对表结构进行调整,将包含复合数据或集合数据的字段拆分成独立的原子属性。

    举例说明,假设有一个包含学生信息的表格,其中有一个字段是“联系方式”,包含了多个电话号码。如果将电话号码放在一个字段中,就违反了原子性和第一范数。正确的做法是将每个电话号码拆分成独立的字段,以确保每个属性都是原子的。

    在数据库设计中,满足第一范数是规范化的基本要求,而规范化则是一种设计技术,旨在通过消除冗余和依赖性,提高数据库的性能、一致性和可维护性。

    几个常见重要的键

    1.超码(Super Key)

    超码是能够唯一标识元组的属性集合,它可以包含主码,也可以是不包含主码的属性集合

    换句话说,超码是可以唯一标识元组的最小属性集合。它可能包含冗余属性,但是至少能够唯一地标识元组。

    例如:学生表(学号、姓名、年龄)中,超码可以是{学号},也可以是{学号,姓名},也可以是{姓名,年龄}也可以是{学号,年龄}{学号,姓名,年龄}

    候选键和主码都是超码: 所有的候选键和主码都是超码,因为它们都能确保唯一性。

    主码是超码的特例,因为它是最小的超码

    超码可以是一个或者多个

    2.候选码(Candidate Key)

    候选键是能够唯一标识关系表中每个元组的属性集合。候选码是最小的超码

    与主码(Primary Key)类似,候选键的目的是确保表中的每行都有一个唯一标识符。在关系数据库设计中,可以从候选键中选择一个作为主码,而其他的候选键则可以作为备选键。

    候选键具有以下特性:

    唯一性: 候选键的属性集合能够唯一标识表中的每个元组,确保没有两行具有相同的候选键值。

    最小性: 候选键是最小的,意味着如果从候选键中移除任何一个属性,就不能保证唯一性。候选键是最小超码。

    不可包含冗余属性: 候选键中的每个属性都是必需的,没有冗余。移除任何属性都会破坏唯一性。

    在关系数据库设计中,通常会有多个候选键可供选择。设计者需要根据具体的业务需求和数据特性选择一个候选键作为主码。其他未选择的候选键可以作为备选键,或者在实际应用中充当唯一性约束的附加手段。

    考虑一个学生表的例子,可能存在学生ID、学生邮箱、和学生手机号这三个属性都能唯一标识每个学生。这三个属性都可以作为候选键,但最终只能选择其中一个作为主码。

    候选码可以是一个或者多个

    3.主码(Primary Key):

    主码是用于唯一标识关系表中每个元组(行)的一组属性(列)。它确保了表中的每行都具有唯一性,没有两行具有相同的主码值。

    主码在关系模型中是至关重要的,因为它能够确保数据的唯一性和完整性。常见的主码包括学生ID、订单号、账户号等,用于唯一标识每个实体或记录。

    主码只能唯一且非空

    4.外码(Foreign Key)

    外码是一个或一组属性,它们在一个表中创建引用另一个表的主码外码建立了表之间的关联,允许在不同表之间建立引用完整性(Referential Integrity)。

    外码通常用于确保在进行表之间的关联查询时,参考的值在相关表中确实存在。它创建了表与表之间的关联性,使得数据之间可以进行连接和关联查询

    外码可为空,可以有一个或者多个

    DDL语句

    1.创建表

    use 数据库名

    create table department

    (dept_name varchar (20),

     building varchar (15) not null,   --非空

    budget numeric (12,2) check(budget>0),

    primary key (dept_name),      --设置主码(在最后和定义时均可)

    check(budget>0)),              --检查数据(在最后和定义时均可)

    foreign key (dept_name) references instructor;   --设置外码

    2.删除表

    drop table 表名;

    3.表的更新

    3.1.添加列

    alter table <表名>

            add column <列的定义>;

    --例

    alter table product

            add column product_name varchar(100);

    3.2.删除列:

    alter table <表名>

            drop column <列名>;

    --例

    alter table product

            drop column product_name;

    3.3.插入行数据:

    begin transaction;

    insert into <表名>

            values ('T恤衫','衣服','0001',1000,500,'2009-02-05';

    insert into <表名>

            values ('0002', '菜刀', '厨房用具', 2000,50,'2022-01-01');

    commit;

    3.4.更新数据:

    update department

            set budget= budget*1.05;

    3.5变更表名:

    exec sp_rename '旧表名','新表名';

    3.6.变更列名:

    exec sp_rename '表名.旧字段名','新字段名','column';

    3.7.修改列类型:

    alter table <表名>

            alter column <列名> varchar(100);

    常见问题 

    AS的用法,as可以省略

    查找顺序是 from  where  select

    Null的比较都是null

    Null+C常数=null

    Join(连接)

    交并补

    聚集函数

    Avg、Min、Max、Sum、Count,以上函数count不会忽视null,其他的都忽视null

    Group by分组

    Having过滤元组

    Having用于组形成后,where用于组形成前

    嵌套子查询

    In

    Not in

    Someanyall

    Exist和 no exist

    Delete

    Add

    Update

    Set case when then end

    以上本次博客图片均来自于大连理工大学数据库教学PPT,如有侵权请联系删除。


    这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助❤
    欢迎各位点赞,收藏和关注哦❤
    如果有疑问或有不同见解,欢迎在评论区留言❤
    后续会继续更新大连理工大学相关课程和有关数据库的内容
    点赞加关注,学习不迷路,好,本次的学习就到这里啦

  • 相关阅读:
    Spring boot + MyBatis-Plus3
    cocoeval 解析
    经典面试题---【第一档】
    QT+OSG/osgEarth编译之五十一:osgShadow+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5工具库osgShadow)
    git 删除某一次的提交(commit)
    JVM 配置GC日志
    链表面试题(图文详解)
    潮玩宇宙:大逃杀模式的利与弊
    无人机无线Mesh自组网,CV5200远距离WiFi模组,实时通信传输技术
    win11 右键关闭显示更多选项 修改右键菜单
  • 原文地址:https://blog.csdn.net/b19839356939/article/details/136568793