精华内容
下载资源
问答
  • 删除表中的一个名字段出现如下情况: [IBM][CLI Driver][DB2/NT] SQL0443N 例程 "SYSPROC.ALTOBJ"(特定名称 "ALTOBJ")返回了带诊断文本 "DBA7904, DBAD" 的错误 SQLSTATE。  SQLSTATE=38553请指教 ...

    删除一列的时候出现了:

    删除中的一个列名字段表出现如下情况:
    [IBM][CLI Driver][DB2/NT] SQL0443N  例程 "SYSPROC.ALTOBJ"(特定名称
    "ALTOBJ")返回了带诊断文本 "DBA7904, DBAD" 的错误 SQLSTATE。  
    SQLSTATE=38553请指教

    DB2 v9.1以后才提供了alter table中通过DROP COLUMN删除列的功能,你的数据库版本是什么?删列语句是怎么写的?而且删除列以后,需要对表进行重组才可以进行访问。当然,你也可以有用导出数据-重建表-导入数据来完成。
    参考资料:
    V9.1 新增内容:ALTER TABLE 语句增强功能
    现在可使用 ALTER TABLE 语句执行下列操作:
    使用新的 DROP COLUMN 子句删除列
    使用 ALTER COLUMN SET DATA TYPE 子句来将列类型更改为更多种数据类型
    使用 SET NOT NULL 或 DROP NOT NULL 子句更改列的可空性属性
    在使用 SQL 更改这些表属性时,不再需要废弃表然后重新创建它,不然如果存在对象依赖关系的话,处理起来就会很复杂,需要花费很多时间。
    影响数据的行格式的表变更被称为建议重组操作,需要先对该表进行重组,然后才能对该表执行其他许多后续操作。

     

     

    最终的代码:

    C:\Documents and Settings\Administrator>db2 alter table autek.tempmainbak drop
    olumn flag2
    DB20000I  SQL 命令成功完成。

    C:\Documents and Settings\Administrator>

     

    展开全文
  • 数据库关系建模(ER图设计关系表)

    万次阅读 多人点赞 2018-11-21 20:22:46
    目录   一、概述 ...4. 关系表 VS 一般的 5. 主码(主键primary key)  6. 实体完整性约束(entity integrity constraint) 7. 外码(外键foreign key) 8. 参照完整性约束(reference integrity c...

    目录

     

    一、概述

    二、基本概念

     1. 关系(relation)

     2. 列(column)

     3. 行(row)

    4. 关系表 VS 一般的表

    5. 主码(主键primary key)

     6. 实体完整性约束(entity integrity constraint)

    7. 外码(外键foreign key)

    8. 参照完整性约束(reference integrity constraints)

    三、ER模型到关系表的映射

     1. 将常规实体映射为关系

      2. 将具有复合属性的实体映射为关系

      3. 将具有唯一复合属性的实体映射为关系

    4. 将具有可选属性的实体映射为关系

    5. 一对多(1:M)联系的映射

    6. 多对多(M:N)联系映射

    7. 一对一(1:1)联系的映射

    8. 将具有若干候选码的实体映射为关系

    9. 将具有多值属性的实体映射为关系

    10. 将具有派生属性的实体映射为关系

    11. 一对多(1:M)一元联系的映射

    12. 多对多(M:N)一元联系的映射

    13. 一对一(1:1)一元联系的映射

    14. 将弱实体映射为关系

     15. 将关联实体映射为关系

     16. 三元联系的映射


    一、概述

     ER建模环节完成后,需求就被描述成了ER图。之后,便可根据这个ER图设计相应的关系表了。

            但从ER图到具体关系表的建立还需要经过两个步骤:1. 逻辑模型设计 2. 物理模型设计。其中前者将ER图映射为逻辑意义上的关系表,后者则映射为物理意义上的关系表。逻辑意义上的关系表可以理解为单纯意义上的关系表,它不涉及到表中字段数据类型,索引信息,触发器等等细节信息。

            本文将详细介绍前者。确切来说,也就是ER模型到逻辑关系表的映射是如何完成的。

    二、基本概念

     1. 关系(relation)

            关系就是在数据库中存在的,包含行和列的一张表。也常被称为关系表,或者表。注意只有在确保不会引起混乱的时候使用最后一种称呼,因为关系表和一般意义上的表有很大区别(下文会分析)。

     2. 列(column)

            列就是字面意义上表的列。但是它也有时被称作属性,或者域。

     3. 行(row)

            行就是字面意义上表的行。但是它也有时被称作元祖,或者记录。

    4. 关系表 VS 一般的表

            关系表有以下几个基本约束:

                    a. 一个列只能有一个名称;

                    b. 不能出现完全一样的行;

                    c. 表中每个值都必须为单值;

                    d. 同一列中的所有值都必须属于同一个域;

                    e. 行/列顺序无关

    5. 主码(主键primary key)

            每个关系必须要有一个主码(可含多列),用来唯一标识表中各行记录。

     6. 实体完整性约束(entity integrity constraint)

            指所有主码必须非空。

    7. 外码(外键foreign key)

            外码是某关系中的一列,而这一列恰恰又是另一个关系的主码。

    8. 参照完整性约束(reference integrity constraints)

            外码取值要么为空,要么为其参照关系中的主码取值。

     

    三、ER模型到关系表的映射

     1. 将常规实体映射为关系

            对常规实体来说,每个常规属性对应到关系表中的一列,而某单值且唯一的列则映射为主码,标记下划线。

            如下实体:

    将映射为关系:

      2. 将具有复合属性的实体映射为关系

            这类映射中,复合属性的各子属性会映射到的新的关系中,但是复合属性名本身不会。

            如下实体:

    将映射为关系:

    虽然关系中没有出现符合属性名,但数据库上层的前端应用可能会利用到复合属性名。也就是ER图在各个阶段都有可能用到,不是说映射为关系后就没啥事了。

      3. 将具有唯一复合属性的实体映射为关系

            这类映射中,将会形成一个复合主码,其成员为复合属性的各子属性。

            如下实体:

    一个building有很多roomnumber,不同的building可能有相同的roomnumber,比如不同的building可能都有101号房间号,只有building和roomnumber一起才能确定classroom。

    将映射为关系:

    4. 将具有可选属性的实体映射为关系

            这类映射中,需要将可选属性对应的列标记一个(O)。

            如下实体:

    bonus奖金,可能有也可能没有,所以是可选的

    将映射为关系:

    5. 一对多(1:M)联系的映射

            这类映射的规则为:在由1:M联系中属于M侧的实体所映射得到的关系中设置一个外码,这个外码对应于由1侧的实体映射得到的关系中的主码。

            如下ER模型:

    将映射为关系:

    注意,外码命名不一定要和它对应的主码一致,应根据实际情况决定。

    6. 多对多(M:N)联系映射

            这类映射的规则为:除了具有多对多联系的两个实体之外,联系本身也需要映射为关系。联系对应的关系中将有两个外码,分别对应两个实体的主码,同时这两个外码构成新关系的主码。

            比如下面这个ER模型:

    将映射为关系:

    7. 一对一(1:1)联系的映射

            这类映射和1:M的很相似。原则上外键设在任何一个实体的关系中都OK,但如果一对一联系中的基数约束是强制单个和可选单个这种类型,则最好将外键设置在可选多的一侧。因为这样可以保证关系中不会出现太多空值。

            比如下面这个ER模型:

    将映射为关系:

    8. 将具有若干候选码的实体映射为关系

            这类映射中,主码依然标记划线,而非主码唯一属性则标记(U)。

            如下实体:

     将映射为关系:

    9. 将具有多值属性的实体映射为关系

            这类映射中,需要为多值属性创建一个新的关系。新的关系中包含一个外码,对应到主实体的主码。同时属性值和外码构成新的关系的复合主码。

            如下实体:

    将映射为关系:

    10. 将具有派生属性的实体映射为关系

            派生属性不需要做什么特别处理,为前端的事情。

    11. 一对多(1:M)一元联系的映射

            这类映射的规则为:实体映射得到的关系中包含一个外码,对应到关系自身的主码。

            如下ER模型:

     将映射为关系

    需要注意的是,该映射中外键名和主键名是不同的,以区分它和主码。事实上关系中也不允许出现名称相同的两列。

    12. 多对多(M:N)一元联系的映射

            这类映射的规则为:除了实体本身需要映射为关系之外,多对多联系需要映射为另一个关系。新的关系中将有两个外码,它们均对应到实体主码。且这两个外码又组合为新关系的复合主码。

            如下ER模型:

     将映射为关系:

    这里同样要注意外键名要避免和主键名重复。

    13. 一对一(1:1)一元联系的映射

            和上面第11条讲的一对多的一元联系映射规则完全相同,此处不再举例说明。

    14. 将弱实体映射为关系

            弱实体映射和常规一对多联系映射一样需要在弱实体(M侧实体)中建立一个对应到属主实体(1侧实体)的外码。然而区别是弱实体中的主码是弱实体自身的部分码+外码构成的复合主码,而后者的主码仅是M侧实体自己的主码。

            如下ER模型:

     将映射为关系:

    当然,如果联系是一对一,则弱实体的主码就是那个对应到其属主实体的外码而没有部分码了。

            如下ER模型:

         将映射为关系:

     15. 将关联实体映射为关系

            关联实体本身就是联系,因此它的映射规则和联系是一样的。联系的映射在前文已经完成讲解,此处不再累述了。

     16. 三元联系的映射

            这类映射和多对多联系的映射比较相似。如下ER模型:

     可映射为:

    这里提示下,三元联系的情况,联系肯定是多对多对多的。因为如果这三元中有一个为一,那么三元联系就应转成两个二元的一对多联系。

     

            概念模型建模和ER建模,需求可视化表达的是一个意思。在这个环节中,数据开发人员绘制ER图,并和项目各方人员协同需求,达成一致。由于这部分的工作涉及到的人员开发能力比较薄弱,甚至不懂开发,因此ER图必须清晰明了,不能涉及到过多的技术细节。在ER图绘制完毕之后,才开始将它映射为关系表。这个映射的过程,就叫做逻辑模型建模或者关系建模。

            有人会说,ER图不是可以直接映射到关系吗,而且已经有了相应的映射工具了,为什么还要绘制ER图多此一举呢?针对这个问题前文已经回答了。ER图是拿出去和别人谈需求的,要求各方人员都能看得懂。而关系表设计到了过多实现细节,比如:要给多对多联系/多值属性等多建一张表,要设置外码,各种复合主码等。这些东西不应该在谈需求的时候出现,它们应当对非开发人员透明。而且ER图中每个属性只会出现一次,减少了蕴含的信息量,是更好的交流和文档化工具。

            还有,ER模型所蕴含的信息,也没有全部被逻辑模型包含。比如联系的自定义基数约束,比如实体的复合属性,派生属性,用户的自定义约束等等。因此ER模型在整个开发流程(如物理模型建模,甚至前端开发)中是都会用到的,不能认为ER模型转换到逻辑模型后就可以扔一边了。

     

     

    展开全文
  • 数据库的数据之间的关系

    万次阅读 2012-12-14 16:56:16
    一个主键是唯一识别一个的每一行记录,但这只是其作用的一疗分,主键的主要作用是将记录和存放在其他中的数据进行关联,在这一点上,主键是不同表中各记录间的简单指针,主键约整就是确定中的每一条记录,主键...

    主键:能够唯一表示数据表中的每个记录的字段或者字段的组合就称为主键。一个主键是唯一识别一个表的每一行记录,但这只是其作用的一疗分,主键的主要作用是将记录和存放在其他表中的数据进行关联,在这一点上,主键是不同表中各记录间的简单指针,主键约整就是确定表中的每一条记录,主键不能是空值,唯一约束是用于指定一个或多个列的组合值具有唯一性,以防止在列中输入重复的值,所以,主键的值对用户而言是没有什么意义,并且和它赋予的值也没有什么特别联系。

    外键:

    若有两个表A,B,C是A的主键,而B中也有C字段,则C就是表B的外键,外键约束主要用来维护两个表之间数据的一致性。

    A为基本表,B为信息表。

    在数据库中,常常不只是一个表,这些表之间也不是相互独立的,不同的表之间需要建立一种关系,才能将它们的数据相互沟通,而在这个沟通过程中,就需要表中有一个字段作为标志,不同的记录对应的字段取值不能相同,也不能是空白的,通过这个字段中不同的值可以区别各条记录,就像我们区别不同的人,每个人都有名字,但它却不能作为主键,因为人名很容易出现重复,而身份证号是每个人都不同的,所以可以根据它来区别不同的人,数据库的表中作为主键的段段就要像人的身份证号一样,必须是每个记录的值都不同,这才能根据主键的值来确定不同的记录。

    关系:外键一定是另外某个表的主键。

     

    表关系
    可以在数据库关系图中的表间创建关系以显示某个表中的列如何链接到另一表中的列

    在关系数据库中,关系能防止冗余的数据。例如,如果正在设计一个数据库来跟踪有关书的信息,而每本书的信息(如书名、出版日期和出版商)都保存在一个名为 titles 的表中。同时还有一些想保存的有关出版商的信息,例如出版商的电话号码、地址和邮政编码。如果将所有这些信息都保存在 titles 表中,则对于某个出版商出版的每本书,出版商的电话号码将是重复的。

    一个更好的解决方案是,单独在一个名为 publishers 的表中只保存一次出版商信息。然后在 titles 表中设置指针,以引用 publishers 表中的项。

    若要确保数据同步,可以在 titles 表和 publishers 表之间强制引用完整性。引用完整性关系能确保某个表中的信息与另一个表中的信息相匹配。例如,titles 表中的每个书名必须和 publishers 表的特定出版商相关联。不能在数据库中添加数据库中不存在的出版商的书名。

    为更好地理解表关系,请参见:

    表关系类型


    引用完整性概述
    表关系类型
    关系是通过匹配键列中的数据而工作的,而键列通常是两个表中具有相同名称的列。在大多数情况下,关系将一个表中为每个行提供唯一标识符的主键与另一个表中外键内的项相匹配。例如,通过在 titles 表的 title_id 列(主键)和 sales 表的 title_id 列(外键)之间创建一个关系,可以使销售额与特定的销售书名相关联。

    表与表之间存在三种类型的关系。所创建的关系类型取决于相关联的列是如何定义的。

    一对多关系


    多对多关系


    一对一关系
    一对多关系
    一对多关系是最常见的关系类型。在这种关系类型中,表 A 中的行可以在表 B 中有许多匹配行,但是表 B 中的行只能在表 A 中有一个匹配行。例如,publishers 表和 titles 表是一对多的关系:每一个出版商可出版许多书,但每一本书只能有一个出版商。

    如果在相关列中只有一列是主键或具有唯一约束,则创建的是一对多关系。

    一对多关系中的主键方由一个键 符号表示。关系中的外键方由一个无穷大 符号表示。

    多对多关系
    在多对多关系中,表 A 中的一行可与表 B 中的多行相匹配,反之亦然。通过定义称为连接表的第三方表创建这样的关系,该连接表的主键包括表 A 和表 B 中的外键。例如,authors 表和 titles 表是多对多关系,该关系通过从这些表中的每个表与 titleauthors 表的一对多关系定义。titleauthors 表的主键由 au_id 列(authors 表的主键)和 title_id 列(titles 表的主键)组成。

    一对一关系
    在一对一关系中,表 A 中的一行最多只能与表 B 中的一行相匹配,反之亦然。如果两个相关列都是主键或具有唯一约束,则创建的是一对一关系。

    这种关系不常见,因为这种方式的大部分相关信息都在一个表中。使用一对一关系可以是为了:

    分割一个含有许多列的表。


    出于安全考虑而隔离表的某一部分。


    存储可以很容易删除的临时数据,只需删除表即可删除这些数据。


    存储只应用于主表子集的信息。
    一对一关系的主键方由键 符号表示。外键方也由键 符号表示。


    候选键 (candidate key)
    对于表中的每一行具有唯一值的一个列或一组列。每个候选键值唯一标识表中的一个行。表可以具有多个候选键。表中的一个候选键由数据库设计器指定为表的主键,其它候选键称作备用键。



    ---以上内容摘自SQL SERVER 2000的联机帮助。

    若想得到有关更详细的内容,请参见帮助!

    展开全文
  • 本篇博客讲解(子查询)非相关子查询/相关子查询,一对一,一对多,多对一,多对的的关系!准备:首先我们创建一sex。再为部分行设置好值0(女)或者1(男);delete from stud where age=26; 删除年龄为26的行。 ...

    本篇博客讲解(子查询)非相关子查询/相关子查询,一对一,一对多,多对一,多对的的关系!

    准备:

    首先我们创建一列sex。再为部分行设置好值0(女)或者1(男);

    delete from stud where age=26;
    删除年龄为26的行。

     update stud set sex='1' where saddress like '湖南%';

    将地址中湖南开头的人的的sex修改为1。

    update stud set sex='0' where age>=30 and sex is null;

    将年龄大于等于30的,且性别为null的人的sex设置为0.

    case-when then else end 语句.

    现在要做这样一件事,查询显示的时候sex不显示0,1和null,我们让它0的就显示女,1的就显示男,null就显示未知。
    这时我们需要用到:
    case-when then else end 语句.

    修改 * 当 * 时候 修改成 * 否则修改成 * END
    when then 可以写多句

    select sno,sname,age,saddress,(case sex when '0' then '女' when '1' then '男' else '未知' end) as 性别 from stud;

    有人可能会有疑问,不是定义了sex只能有一个字符嘛,为什么还能用‘未知’啊,因为这里只是显示的,并不是存储到数据库中的数据,只是相当于输出字符。

    子查询:

    子查询:嵌套在其它查询中的查询语句。(又称为内部查询)

    主查询:包含其它子查询的查询称为主查询。(又称外部查询)

    非相关子查询:

    在主查询中,子查询只需要执行一次,子查询结果不再变化,供主查询使用,这种查询方式称为非相关子查询。
    也可以这么理解:
    非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。

    现在我们来对这个表做一个查询:
    查询具有年龄相同的人在2人及以上的,他们的年龄分别是多少。

    select age from stud group by age having count(age)>=2;

    count(age)在这里只是作为供主查询使用的条件。

    相关子查询:

    相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。
    也可以这么理解:
    执行查询的时候先取得外部查询的一个属性值,然后执行与此属性值相关的子查询,执行完毕后再取得外部父查询的下一个值,依次再来重复执行子查询;

    我们先把表格增加一列sex并设置好值。

    接下来:
    查询不但具有年龄相同的人在2人及以上的,而且性别是1的那些人的年龄。

    SELECT age,sex FROM stud GROUP BY age,sex HAVING COUNT(age)>=2 AND sex='1';

    表与表之间的关系:

    一对一:

    需要两个表。当然做项目时为了省空间,通常只建一个表,如果要实现一对一的查询,可以建立两个视图。示例如下:
    1)先建物理表,初始化数据、

    create table person(
        id int,
        name varchar(10),
        sex char(1),
        wife int,
        husband int
    );
    insert into person values(1,'小花','0',1,3);
    insert into person values(2,'玉芳','0',0,4);
    insert into person values(3,'张三','1',1,0);
    insert into person values(4,'李四','1',2,0);
    insert into person values(5,'王五','1',0,0);

    2)建立两个视图

    create view women as select * from person where sex='0';
    create view men as select * from person where sex='1';

    3)查询夫妻信息
    92年以前是这样查询的:

    select women.name as 妻子,men.name as 丈夫 from women,men where women.husband=men.id and women.id=men.wife;

    一对多/多对一:

    数据库设计分析:
    案例:一个人可以拥有多辆汽车,要求查询出某人所拥有的所有汽车。

    方案一:(差的设计-用一张表存储–数据冗余太严重)

    编号   姓名  性别   年龄   汽车编号   车型  排量  价格
    P001  Jack   男     25     C001     BMW    12L   80w
    P001  Jack   男     25     C002     Benz   12L   100w
    P001  Jack   男     25     C003     Benz   12L   100w
    P002  Tom    男     25     C004     BMW    12L   80w
    P002  Tom    男     25     C005     Benz   12L   100w
    P003  Rose   女     25     C006     Benz   12L   100w

    方案二(好的设计):
    1)把一方单独建个表

    编号   姓名  性别   年龄
    P001  Jack   男     25
    P002  Tom    男     25
    P003  Rose   女     25

    2)把多方也建个表(依赖一方,通过外键–补一个字段)
    外键:位于依赖一方,它是被依赖一方是主键

    汽车编号   车型  排量  价格    车主
     C001     BMW    12L   80w    P001
     C002     Benz   12L   100w   P001
     C003     Benz   12L   120w   P001
     C004     BMW    12L   80w    P002
     C005     Benz   12L   100w   P002
     C006     Benz   12L   100w   P003

    3)代码实现:

    create table person2(
        id varchar(32) primary key,
        sname varchar(30),
        sex char(1),
        age int
    );
    insert into person2 values('P1001','Jack','0',25);
    insert into person2 values('P1002','Tom','1',22);
    insert into person2 values('P1003','Rose','1',24);
    insert into person2 values('P1004','张三','0',25);
    
    create table car(
        id varchar(32) primary key,
        sname varchar(30),
        price numeric(10,2),
        /*numeric(a,b),a表示一共多少位数,b表示带有几位小数*/
        pid varchar(32),
        /*为字段pid定义一个外键约束(来自person2表的字段id)*/
        constraint car_fk foreign key(pid) references person2(id)
    );
    
    insert into car values('C001','BMW',80.5,'P1001');
    insert into car values('C002','Benz',100,'P1001');
    insert into car values('C003','BMW',120.05,'P1001');
    insert into car values('C004','Benz',88.5,'P1002');
    insert into car values('C005','QQ',8.5,'P1002');
    insert into car values('C006','BIKE',0.5,'P1003');

    查询每个人拥有的车辆:
    92年之前的写法:

    select person2.sname as 车主,car.sname as 车辆 from person2,car where car.pid=person2.id;

    现在的内关联写法:

    select person2.sname as 车主 ,car.sname as 车辆 from person2 join car on car.pid=person2.id;

    一对多和多对一是一样的!反过来理解就是了。

    多对多:

    数据库设计分析
    案例:一个人可以选择多门课程,一门课程又可以被多人选择。

    方案一:(差的设计–数据冗余太严重)
    1)学生表

    编号   姓名  性别   年龄  电话 ...
    P001  Jack   男     25
    P002  Tom    男     25
    P003  Rose   女     25

    2)课程表

    编号   名称   教材  学分...  学生
    S001   Java   ...  ......   P001
    S001   Java   ...  ......   P002
    S001   Java   ...  ......   ...
    S002   数据库  ... ......   P001
    S002   数据库  ... ......   P002

    pass。

    方案二(好的设计:两个实体表+一个关系表):
    1)学生表(独立)—实体

    编号   姓名  性别   年龄  电话 ...
    P001  Jack   男     25
    P002  Tom    男     25
    P003  Rose   女     25

    2)课程表(独立)—实体

    编号   名称   教材  学分... 
    S001   Java   ...  ......
    S002   数据库  ... ......
    S003   XML   ... ......

    3)选课表(专为体现多对多的关系而新增的表)–关系

    课程编号  学生编号
    S001      P001
    S001      P002
    ...
    S002      P002
    S002      P003
    ...
    S003      P001
    ...
    --------------
    外键      外键
     |         |
     |         |
      ---------
          |
       联合主键

    4) 代码实现

    create table stud(
        id varchar(32) primary key,
        sname varchar(30),
        age int
    );
    create table ject(
        id varchar(32) primary key,
        sname varchar(30)
    );
    create table sj(
        studid varchar(32),
        jectid varchar(32)
    );
    /*单独添加约束,必须先添加联合主键,再添加外键*/
    /*创建联合主键*/
    alter table sj add constraint pk_sj primary key(studid,jectid);
    /*创建两个外键*/
    alter table sj add constraint fk_stud foreign key(studid) references stud(id);
    alter table sj add constraint fk_ject foreign key(jectid) references ject(id);

    如果需要删除外键

    alter table sj drop foreign key fk_stud;
    alter table sj drop foreign key fk_ject;

    初始化stud表数据

    insert into stud values('P001','小花',25);
    insert into stud values('P002','Jack',23);
    insert into stud values('P003','Tom',24);
    insert into stud values('P004','张三',24);
    insert into stud values('P005','赵子龙',26);

    初始化ject表:

    insert into ject values('S001','Java');
    insert into ject values('S002','JavaEE');
    insert into ject values('S003','XML');
    insert into ject values('S004','数据库');
    insert into ject values('S005','JQuery');

    初始化sj表:

    insert into sj values('P001','S001');
    insert into sj values('P001','S003');
    insert into sj values('P002','S001');
    insert into sj values('P002','S002');
    insert into sj values('P002','S003');
    insert into sj values('P003','S001');
    insert into sj values('P004','S002');
    insert into sj values('P004','S003');

    关联(也称为连接):
    左关联(left join) 右关联(right join) 内关联(inner join)
    mysql不支持: 全关联(full join) 外关联(outter join)

    可以把关联理解成:几个表合成一个新的表,然后在新表中进行查询!

    查询哪些人选了哪些课:

    92年之前是这样查询的:(没有用关联)

    select stud.sname,ject.sname from stud,sj,ject where stud.id=sj.studid and ject.id=sj.jectid;

    用内关联来:

    select stud.sname,ject.sname from
        stud inner join sj on stud.id=sj.studid
             inner join ject on ject.id=sj.jectid;
    

    内关联可以这样来看,以中间的sj表为主表,来合另外2个表。

    查询哪些人没有选课:

    不用关联的写法:

    select stud.sname from stud where stud.id not in(select studid from sj);

    用左关联的写法:

    select stud.sname from
        stud left join sj on stud.id=sj.studid
             left join ject on ject.id=sj.jectid
        where ject.sname is null;
    /*下面这句也可以查询出*/
    select stud.sname from
        stud left join sj on stud.id=sj.studid
             left join ject on ject.id=sj.jectid
        where ject.id is null;
    

    左关联就是把左边的表作为主表,也就是说,stud必须是完整的,可以增加,但不能减少,再按照sj表的关系,来添加ject表的数据。

    查询哪些课程没人选:

    不用关联的写法:

    select ject.sname from ject where ject.id not in(select jectid from sj);

    用左关联的写法:

    select ject.sname from
        ject left join sj on ject.id=sj.jectid
             left join stud on stud.id=sj.studid
        where stud.id is null;

    最后的那里也可以用stud.sname is null来判断。
    但要注意,需要原来的stud表中的那个属性定义了not null。
    否则会出现bug。

    用右关联写:

    select ject.sname from
        stud right join sj on stud.id=sj.studid
             right join ject on ject.id=sj.jectid
        where stud.sname is null;

    左关联和右关联实质上是差不多的。认真的看下上面的左关联和右关联就可以看出来了。

    展开全文
  • 关系模型的一些关键字的定义

    千次阅读 2017-06-08 21:43:03
    属性(Attribute):表中的一即为一个属性,给每一个属性起一个名称即属性名。码(Key):也称为码键。表中的某个属性组,它可以唯一确定一个元组。域(Domain):属性的取值范围。分量:元组的一个属性值。关系模型:对...
  • 关系和外键约束

    千次阅读 2007-06-02 22:16:00
    外键,也称为Foreign Key,它是用于建立和加强两个数据之间的链接的一或多。我们在前面的课程讲到了“主键”这个概念,“外键”与主键虽然不是同一个概念,但是它们之间有着紧密的联系。通过将保存表中主...
  • 式数据库简介

    千次阅读 2020-06-26 21:13:35
    假设您需要根据ID表中的所有名称;而不是遍历所有行,您可以只访问的单个。 以下是数据存储DBMS的一些关键特性。 存储DBMS使用的键空间类似于RDBMS的数据库架构。 存储DBMS具有称为列族的概
  • 知识点:数据库的相关概念、创建数据库的方法、设计数据库、向数据库表中插入数据、建立不同数据库之间的关系、删除数据库。 1、数据相关的一些概念 1.1 数据库里的数据是如何保存的? 数据库...
  • MySQL笔记——关系模型的术语

    千次阅读 2017-07-13 14:31:43
    (3)属性(Attribute):表中的一即为一个属性,给每个属性起一个名称即为属性名,表中任意的属性名不能相同。 (4)主键(Key):表中的某个属性组,它可以唯一确定一个元组。 (5)域(Domain)
  • 关系模型

    千次阅读 2020-07-22 21:53:37
    属性:表中的一即为一个属性,给每一个属性起一个名称即属性名。 码:也称为码键。表中的某个属性组,它可以唯一确定一个元组。 域:域是一组具有相同数据类型的值的集合。属性的取值范围来自某个域。 分量
  • 1 查询指定字段 ...这种查询表中指定字段的操作在关系运算称为投影(Projection) 使用 SELECT 子句进行表示。投影是针对进行的垂直选择,保留需要的字段用于生成新的 投影操作包含一个特殊的操作...
  • MSSQL之三 在表中操纵数据

    千次阅读 2016-05-14 15:47:04
    创建了数据库和之后,下一步是在数据库存储数据。作为一个数据库开发人员,你将需要修改或删除数据。你可以通过使用Transact-SQL的数据操纵语言(DML)语句来完成这些数据操纵。 本章讨论如何使用DML语句来操纵...
  • 外键,也称为Foreign Key,它是用于建立和加强两个数据之间的链接的一或多。我们在前面的课程讲到了“主键”这个概念,“外键”与主键虽然不是同一个概念,但是它们之间有着紧密的联系。通过将保存表中主...
  • 数据表关系模型---- 外键

    千次阅读 2019-08-21 20:05:11
    1.外键 示例:"Students" 学生,"Classes" 班级 Students: Classes: s_id | c_id | name c_id | name 1 1 小明 ...
  • 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。 2) 在系统,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么...
  • 关系数据库关系数据模型关系是一个数学概念。 当把关系的概念引入到数据库系统作为数据模型的数据结构时,既有所限定和也有所扩充。 关系的数学定义例: 课程={离散,C语言…..},学生={张三,李四…..} 笛卡儿积...
  • 对象 1对象是使用对象类型定义表中的一整行,...2)在关系表中提供值语法 create table table_name of type_name; table_name :表名称 type_name:对象类型名称举例 提供的测试数据--创建对象头 create or r
  • 关系数据模型相关概念

    千次阅读 2018-01-29 17:51:21
    关系数据库:基于关系模型,是一个或多个关组成的集合,关系通俗来讲是(由行和构成)。SQL语言用于创建,操作和查询关系数据库,而关系模型是其基础。 关系的每个属性都有一个名称;域:每个属性的取值集合...
  • Oracle数据库、实例、用户、空间、之间的关系

    万次阅读 多人点赞 2015-11-06 16:21:04
    Oracle数据库可以创建多个实例,每个实例可以创建多个空间,每个空间下可以创建多个用户(同时用户也属于空间对应的实例)和数据库文件,用户可以创建多个(每个随机存储在一个或多个数据库文件),如下...
  • 层次数据模型     定义:层次数据模型是用树状<...其实层次数据模型就是的图形表示就是一个倒立生长的树,由基本数据结构的树(或者二叉树)的定义可知,每棵树都有且仅有一个根节点,其余的...
  • 该系列文章主要讲解知识图谱或关系图谱的构建方法,前文介绍了Neo4j图数据库和Jieba、PyLTP的基本用法。本篇文章主要采用Python和Gephi构建中国知网某个领域的作者合作关系和主题词共现的知识图谱,重点阐述了一种可...
  • Oracle数据库的多查询

    万次阅读 多人点赞 2017-10-01 20:25:45
    在日后的开发之,很多人都肯定要接触到许多新的数据库和数据,那么在这种时候有两种做法; 做法一:新人做法,上来就直接输入以下的命令 select * from 表名称; 如果此时数据量较大的话,以上无法浏览数据,...
  • 理解维度数据仓库——事实、维度、聚合

    万次阅读 多人点赞 2019-05-23 21:16:22
    在多维数据仓库,保存度量值的详细值或事实的表称为“事实”。一个按照州、产品和月份划分的销售量和销售额存储的事实有5个,概念上与下面的示例类似。 Sate Product Mouth ...
  • 本文继续介绍JPA ORM的核心注解中和关系映射相关的部分。关系映射的处理绝对是一个JPA应用最为重要的部分之一。关系映射处理的好,不仅仅是建模上的成功,而且在程序性能上也会更胜一筹。关系映射处理的不好很容易...
  • 显示hbase List(出你有哪些) 创建user,包含info、data两个族 create ‘user’, ‘info’, ‘data’ create ‘user’, {NAME =&amp;amp;gt; ‘info’, VERSIONS =&amp;amp;gt;
  • oracle查看外键信息代码

    千次阅读 2018-12-17 17:00:21
    目录 (1)查看数据库外键信息 (2)查询的约束 (3)查询的字段信息 ...所谓外键关系就是一个表中引用了其他表中。例如,products表中的product_type_id引用了 product_types表中的product...
  • 数据库查询连接

    千次阅读 2011-09-12 21:17:36
    1 概述 ...所以,之间做连接操作,无非是的行和与其他的行和之间的关系。 数据库常有交叉连接、内连接、外连接、半连接、反半连接、自然连接等概念,这些连接方式,代表了不同的含义
  • SQL——关系模型

    千次阅读 2019-04-16 14:11:28
    1. 主键 主键是关系表中记录的唯一标识。 主键的选取:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。...在students表中,通过class_id的字段,可以把数据与另一张关联起来,这种列称为...
  • 级别约束条件

    千次阅读 2015-01-25 17:14:04
    关系数据库二维的每一数据除了需要指定数据类型,有时还需要指定一些约束条件,来限制该能够存储哪些数据。关系数据库主要存在五种约束(Constraint):非空、唯一、主键、外键、检查。 约束有两个级别...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,307
精华内容 51,722
关键字:

关系表中各列的名称称为