精华内容
下载资源
问答
  • 知识点:数据库表的相关概念、创建数据库表的方法、设计数据库表、向数据库表中插入数据、建立不同数据库表之间的关系、...肯定是把学生的数据信息抽象出来,把一些重要信息以文字或数字的形式保存到数据库中去。 ...

    知识点:数据库表的相关概念、创建数据库表的方法、设计数据库表、向数据库表中插入数据、建立不同数据库表之间的关系、删除数据库表。

     

    1、数据表相关的一些概念

     

    1.1 数据库里的数据是如何保存的?

            数据库到底是怎么存储数据的?比如要把学生信息存储到数据库里,能把学生塞进数据库吗?肯定是把学生的数据信息抽象出来,把一些重要信息以文字或数字的形式保存到数据库中去。

           具体是怎么保存的,有点类似于excel,是用一张二维表的形式来进行数据保存的。这里有两个名词需要注意,行(称之为记录),列(称之为字段)。表中一条记录表示现实中的一个实体(学生)。所以以后的重点就是围绕这个表来进行设计,设计他的列。这个就是存储数据的概念。

     

     

    • 记录:数据库中存储的数据表格,每一“行”(Row)实际上对应一个实体(如每一行都对应一个名人),在数据库中,通常叫作一条“记录”(Record)。
    • 字段:表格中的每一个“列”,如编号、姓名、性别、职业、代表角色/作品等,在数据库中,通常称之为“字段”。

     

    1.2  数据冗余

     

    数据冗余:在一个数据集合重复的数据称为数据冗余

            在数据库系统中,数据冗余是指数据之间的重复(比如上面学生信息表中,3条记录中都出现了“演影视剧表演”),也可以说是同一数据存储在不同数据文件中的现象(比如还有一个表,学生成绩表(该表的字段有姓名、专业、成绩),那么可以看到专业这个字段出现在两个表中,并且等同于它在其本来所属表的意义表示,那么这个字段就是一个冗余字段)。

     

    减少数据冗余最常见的方法是分类存储

           比如,对上面的学生信息表进行调整,先制作一个专业编码表,然后再制作一个学生信息统计表。

     

           通过这样的方法,可以减少数据冗余,但是会增加查找数据的复杂性。比如,要查找专业为“主持人”的学生信息,原来只需要查找一个表就可以了。而现在则需要先在“专业编码表”里查询,专业为“主持人”的编码是多少,然后再到学生信息表里查到对应的人。这样一来,就增加了查找的复杂性,降低了效率。因此,在数据库中,通常允许有必要的冗余

     

    1.3 数据完整性

           数据完整性是指数据库中数据的准确性,如果多个表互相关联,那么只要修改其中一个表,与之相关的所有表都要做出相应的修改。否则数据将不再准确,也就失去完整性。(比如上面的职业编码表,将计算机专业对应的编码改为5,那么对应的学生信息表里的信息也要对应发生变化,否则就会出问题。)

            数据准确性是通过数据库表的设计和约束来实现的。例如在“学生信息表”中,如果不对表中存储的年龄信息加以限制(约束),那么学生的年龄可能会出现负数(录入错误等原因),这样的数据就不具备完整性。

             为了实现数据完整性,SQLServer提供了四种类型的约束:实体完整性约束、域完整性约束、引用完整性约束、自定义完整性约束。

    (1)实体完整性约束

    实体的概念:数据库表中的每一行数据都是一个实体。

    什么是实体完整性?实体完整性是指数据库表中行的完整性,即要求每一行数据都是唯一的不重复的。

    如何保证实体完整性?(后面详细讲解)

    • 设置主键约束:每个数据库表有且仅有一个主键,每一个主键值必须唯一,而且不允许为“空”(NULL)或重复。
    • 设置唯一键约束:唯一键在一张表中可以有多个,并且唯一键允许字段数据为NULL。
    • 设置标识列属性:标识列又称标识符列,习惯上又叫自增列。(保证了不会重复且不会为空)

     

    (2)域完整性约束

    域的概念:域就是字段,数据库表中的每一列都是一个域/字段。

    什么是域完整性?域完整性指的是必须保证字段的值是合理的。即数据库表中的列必须满足某种特定的数据类型或约束。其中约束又包括取值范围、精度等规定。

    如何保证域完整性?可以使用CHECK约束、UNIQUE约束、default默认值、identity自增、not null/null保证列的值域的完整性。

     

    (3)引用完整性

    引用的概念:一个表中的某个字段引用另一个表中的字段,被引用的表称为主表,引用表称为从表或外键表。

    什么是引用完整性?引用完整性也叫参照完整性,引用完整性指被主表中的主关键字和从表中的外部主关键字之间的关系。引用完整性是保证从表中外键列不会出现主表中对应主键列没有的项。

     

           举例:上面两张表“专业编码表”和“学生信息表”,观察他们有什么关系?“学生信息表中”的专业字段所对应的编号,引用自“专业编码表”中的专业编码字段。这时候这两张表之间就有了引用和被引用的关系。

    • 被引用的表“专业编码表”   ——主表。(用来约束其他表
    • 引用数据的表“学生信息表”——从表(或外键表)。(被主表约束
    • 建立主外键联系的字段之间的类型和意义必须一致(主表中的专业编码字段和从表中的专业字段,类型和意义必须一致)。
    • 主表中建立关系的字段必须是主键或者唯一键。
    • 删除主表数据:从表如果没有引用所要删除的主表数据,则可以删除。否则会报错。(先删除从表相关记录,再删除主表数据)

     

    (4)自定义完整性

    自定义的概念:用户自己定义规则。

    什么是自定义完整性?自定义完整性,也称域完整性规则,是对数据表中字段属性的约束。包括字段的值域、字段的类型和字段的有效规则(如小数位数)等约束,是由确定关系结构时所定义的字段的属性决定的。如,百分制成绩的取值范围在0~100之间等。再比如输入性别信息时,只允许输入“男”或“女”。

     

    1.4 主键(Primary Key)

            如果在表中存储了很多行数据,就会引发这样的问题:如何判断表中没有重复的数据行?这时就需要有一个列,这一列的值能够唯一标识表中的每一行(即一条记录),用来强制实现表的实体完整性,这样的列称之为表的“主键”。

     

            数据库主键:指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性。主键主要是用于和其他表的外键关联,以及本表记录的修改与删除。

    比如:
    学生表(学号,姓名,性别,班级)
    其中每个学生的学号是唯一的,学号就是一个主键

    专业表(专业编码,专业)
    其中课程编号是唯一的,课程编号就是一个主键

    注意:

    • 一个表只能有一个主键,并且主键列不允许出现空值(NULL),尽管有的表中允许没有主键,但是通常情况下,建议为表设置一列为主键。
    • 如果两列或多列组合起来唯一地标识表中的每一行,则该主键也叫作“复合主键”。
    • 在同一张表中,如果有多个列可以用来当做主键,在选择哪个列做为主键时,需要考虑两个原则:最少性和稳定性

     

     

    1.5 外键(Foreign Key)

            外键是实施引用完整性的约束,外键涉及到两个以上的表。如果一张表中的某一列是引用另一张表中的主键,那么这列就成为外键。比如学生信息表里的列“专业”,不是学生信息表的主键,但是它和专业编码表里的列“专业编码”对应,并且“专业编码”列是专业编码表的主键。因此,学生信息表里的列“专业”,是该表的外键。一个表可以有多个外键。

     

    1.6 列的数据类型

           在创建数据库表时,必须为表中的每列指派一种数据类型。

    • 文本数据类型选择:

    Unicode编码:(统一码、万国码、单一码)是一种在计算机上使用的字符集。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

    Char、Varchar、Text储存的字符是基于ASCII编码格式,是国际化通用与标准。对于其他编码格式的字符可能会造成存储问题。Unicode字符集(万国码)就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。

    Nchar、 Nvarchar、Ntext存储的正是Unicode编码格式的字符。所以一般来说,如果含有中文字符,用Nchar、Nvarchar、Ntext, 如果只含英文字符,就用Char、Varchar、Text。

    Char性能好;Varchar节省空间。选择方法:10个字节以上的用Varchar。N类型的占用空间大,性能低,如果不准备存中文或中亚文字则尽量避免使用。

    • 整数类型选择:首先int,空间占用合适,运算速度快。如果非常在意空间的话,考虑tinyint,   超大应用场合,考虑bigint。

     

    2、创建数据库表

            数据表(或称表)是数据库最重要的组成部分之一。数据库只是一个框架,数据表才是其实质内容。如“教学管理系统”中,教学管理”数据库包 含分别围绕特定主题的6个数据表:“教师”表、“课程”表、“成绩”表、“学生”表、“班级”表和 “授课”表,用来管理教学过程中学生、教师、课程等信息。这些各自独立的数据表通过建立关系被联接起来,成为可以交叉查阅、一目了然的数据库。

    创建数据库表的前提:已经在SSMS中建立了数据库,这里已经提前创建好数据库SchoolDB.

    2.1 在SSMS中建立数据库表

    第一步:在对象资源管理器中,点击数据库SchoolDB前面的“+”号,展开数据库,展开表,单击数据右键,点击【表】

    第二步:系统会创建一个空白表,在右侧区域定义表的列名和数据类型、是否允许Null值以及其他属性

    第三步:对表进行设计,这里先设计一个学生信息表。(列名不允许中文,数据类型根据该列的值选中适合的数据类型。)

    第四步:设置表的主键,这里设置MajorNumber为主键。设置方法:选中第一列,单击数据右键,在弹出的下拉菜单中单击【设置主键】即可。

    主键设置成功以后,会在改列的左侧出现一个钥匙符号,代表该列是主键。

     

    2.2 保存数据库表

    第五步:保存数据库表。方法:单击工具栏上的保存按钮,或者快捷键Ctrl+S,进行保存。初次保存时会弹出保存对话框,按照提示给表起个名称,然后单击确定即可。这里给表起名Student。

    刷新对象资源管理器,可以看到新创建的表。

     

    2.3 完善表的设计结构

    1、是否允许为空值

           数据库表的列是否允许为空,也是一种约束。如果该列允许为空,那么在输入数据行的时候,这一列的值可以不输入。比如注册账号的时候,一些非必填项,用户可以不填写。

     

    2、建立主键

           确定了列的名称、数据类型和是否允许为空后,表的基本框架就完成了。建立主键的方法在上面第四步已经详细说明,这里不再重复。

    思考几个问题:设置为主键的列,可以允许为空吗?一个表的主键可以由多列组成吗?列设置好以后,怎么调整顺序?

     

    3、默认值

            为了存储数据的方便,在设计表的时候,可以对一些列设置默认值。比如同一个学校的学生,地址如果不填写,默认值可以是学校地址,比如教师的级别如果不输入,默认值可以是“讲师”。

           表的默认值能够未某一列定义一个值,当用户没有在某一列中输入数据时,则将定义的值赋值给这一列。

           举例,在表中新添加一列,Address,设置数据类型,允许为空,并在表的下方设置默认值。

     

    4、标识列

           在很多情况下,存储的信息中很难找到不重复的信息作为表的主键。比如一个学生信息表,如果用姓名作为主键,那么在存储数据的时候,就不允许同一个班级、甚至同一个学校存在重名的学生。这样显然比较麻烦。SQL Sererver提供了一个“标识列”,来解决这样的en问题。

           标识列本身没有具体的意义,不反映诸如地址、性别这样的信息,只是用来区别不同的学生。设置标识列的方法:举例新增加一列Id,int类型,在表的下方列属性里点击“标识规范”,在(是标识)选项中点选“是”。

    注意:

    • 如果一列的数据属于数字类型(如整数),那么可以把该列定义为标识列。
    • 定义成标识列之后,还需要分别指定“标识种子”和“标识增量”,默认值都是 1。
    • 定义了标识列之后,在以后每次输入数据的时候,该列随数据行的增加而自动增加数值,并且不会重复,第一次的数字就是“标识种子”值,以后每次按照“标识增量”增加数值。
    • 标识列通常也被定义为主键,通常所说的“自动编号”就是指标识列的数字自动增加。
    • 标识列中的数据是自动生成的,不能在该列上输入数据。

    思考:标识列可以是字符串吗? 标识列可以允许空吗? 

    测试:如果标识列的标识种子是2,标识增量是3,先添加三行数据,然后删除,接着再向表中添加数据时,标识列的值会是多少?

     

     

    2.4 向表中插入数据

            数据库表设计好以后,就需要往表中添加数据了。

    方法:选择要添加数据的表,单击鼠标右键,在弹出的下拉菜单中选择【编辑前200行】

    在SSMS右侧出现添加数据,按照自己的设计添加数据就可以了。

    这里先添加两条数据,注意观察默认值和标识列、非空属性的应用。

    数据添加完成以后,要保持,在空白地方单击鼠标右键,点击【执行SQL】即可。

     

    2.5 建立表之间的关系

    准备工作:

    1、在SchoolDB数据库中新创建一个Major表。专业编号和专业名称,其中专业编号是主键。

    2、在Major表中添加专业信息(添加4条记录)

    两个表之间的关系:Student表中的Major列,引用Major表中的MajorNumber列。因此,Student表是从表,Major表是主表。

    建立两个表之间的关系:

    第一步:选中Student表中的Major列,单击数据右键,单击【关系】

    第二步:弹出一个【外键关系】对话框,点击【添加】

    第三步:点击【添加】以后,默认添加一个【关系】

    第四步:在右侧【表和列规范】后面的输入框里单击一下数据左键,出现一个按钮,单击该按钮。

    第五步:弹出一个【表和列】窗口,这个窗口是用来对关系进行设置的。这里要分清楚两个表,谁是主表、谁是从表。点击选择设置主键表是Major里的MajorNumber列,外键吧是Student里的Major列。然后单击【确定】

    单击确定后【表和列】窗口会关闭,直接在【外键关系】窗口单击【关闭】即可。

    第六步:由于刚才的Student表已经有了改动,单击保存,在弹出的【保存】窗口中,单击【是】。

    此时两个表之间已经建立了关系。

    思考:向Student表中插入数据,测试如果Major列输入数字5,是否可以?实际演练一下看看结果。

     

     

    2.6 建立数据库关系图

            要查看表之间的关系,可以在 SQL Server Management Studio 中展开该数据库(SchoolDB),右击“数据库关系图”,在弹出的快捷菜单中选择“新建数据库关系图”选项,然后根据提示信息新建数据库关系图,在向导中选择要显示关系的表。

    第一步:选择【数据库关系图】,单击鼠标右键,选择【新建数据库关系图】。

    第二步:弹出提示框,选择【是】。

    第三步:在弹出的【添加表】窗口中,将有关系的表全部选中,然后点击【添加】

    第四步:系统创建数据库表关系图。(注意观察不同符号)

    第五步:保存数据库关系图,单击工具栏保存按钮,弹出【选择名称】窗口,起个名字,然后单击【确定】即可。

    此时可以看到关系图文件已经保存

     

     

    2.7 建立检查约束

             检査约束也叫作 CHECK 约束,用于定义列中可接受的数据值或者格式,在设计表的时候,在快捷菜单中选择“CHECK 约束”选项,然后在弹出的“CHECK 约束”对话框中单击“添加”按钮,将添加一个新的约束。

    举例:设置Student表中Age列的值为18~30

    设置方法:

    第一步:重新设计Student表。在SchoolDB数据库中找到Student表,单击鼠标右键,选择【设计】

    第二步:选中Age列,单击鼠标右键,选择【CHECK约束】

    第三步:弹出【检查约束】窗口,在窗口上点击【添加】按钮

    第四步:系统新添加一个约束,点击右侧表达式后面的输入框,然后点击最右侧的按钮

    第五步:在弹出的【CHECK约束表达式】窗口中,添加对应的表达式,然后点击【确定】

    第六步:点击【检查约束】窗口上的【关闭】按钮

    第七步:保存Student表,单击工具栏保存按钮即可。

    第八步:验证CHECK约束。方法:选中Student数据表表单击右键选择【编辑前200行】,添加一行数据,如第三行,在填写Age列的值是填写16,全部填写完成要进入下一行填写时,提示错误,错误提示与CHECK约束起冲突。

     

     

    2.8 删除数据库表

            对于不再使用的数据库表,可以删除以释放磁盘空间,右击该表,在弹出的快捷菜单中选择“删除”选项可以把该表直接删除。对于建立主外键关系的表,若要删除主表,则首先要删除相关的从表以保证数据的引用完整性。

    举例:直接删除Major表时,提示删除失败,因为有外键约束。

     

     

     

     

    =================这里是结束分割线======================

    展开全文
  • 1.首先查看你的models.py中是否存在这个数据库中不存在表的类,有的话就删除 ... 重复执行这个步骤,删除model中的逻辑关系 ...以后删除在这个models.py之间注释这个关系类,让django帮你删除逻辑关系数据库中表。

    1.首先查看你的models.py中是否存在这个数据库中不存在表的类,有的话就删除

    2.参考这个http://stackoverflow.com/questions/27583744/django-table-doesnt-exist

    重复执行这个步骤,删除model中的逻辑关系



    以后删除在这个models.py之间注释这个关系类,让django帮你删除逻辑关系和数据库中表。。。。不要不要自己做,交给程序做。

    展开全文
  • SQL集数据定义语言DDL、数据操作语言DML、数据控制语言DCL的功能与一体,语言风格统一,可以独立完成数据库生命周期的全部活动。 2.高度非过程化 SQL进行数据操作,只要提出“做什么”,而无须指明“怎么做”。 ...

    本文参考自网络,由作者编辑整理,侵删歉。

    SQL的特点

    1.综合统一
    SQL集数据定义语言DDL、数据操作语言DML、数据控制语言DCL的功能与一体,语言风格统一,可以独立完成数据库生命周期中的全部活动。
    2.高度非过程化
    SQL进行数据操作,只要提出“做什么”,而无须指明“怎么做”。
    3.面向集合的操作方式
    查询、插入、删除、修改的操作对象及结果都是集合。
    4.以同一种语法结构提供两种使用方法
    可交互式和嵌入式使用。
    5.以简捷的自然语言作为操作语言
    定义了少量的关键字实现对数据库的定义、操纵和控制功能。

    SQL的动词

    数据查询:SELECT
    数据定义:CREATE,DROP,ALTER
    数据操纵:INSERT,UPDATE,DELETE
    数据控制:GRANT,REVOKE,COMMIT,ROLLBACK

    数据定义概述

    SQL提供了专门的语言用来定义数据库、表、索引等数据库对象,这些语言被称作数据定义语言(Data Definition Language,DDL)。
    SQL的数据定义语句

    SQL中的数据类型

    在这里插入图片描述

    创建基本表

    格式:
    CREATE TABLE <表名>
    ( <列名> <数据类型>[ <列级完整性约束条件> ]
    [,<列名> <数据类型>[ <列级完整性约束条件>] ] …
    [,<表级完整性约束条件> ] );



    说明:
    <表名>:所要定义的基本表的名字
    <列名>:组成该表的各个属性(列)
    <列级完整性约束条件>:涉及相应属性列的完整性约束条件
    <表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件

    常用完整性约束

    (1) 主码约束: PRIMARY KEY
    (2) 唯一性约束:UNIQUE(不能取相同值但允许多个空值)(3) 非空值约束:NOT NULL
    (4) 参照完整性约束:FOREIGN KEY (<列名>) REFERENCES <表名>(<列名>)
    (5) CHECK约束:CHECK ( <谓词>)
    (6) 断言(Assertion)约束

    例:建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性构成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。
    CREATE TABLE Student
    ( Sno CHAR(5) NOT NULL UNIQUE ,
    Sname CHAR(20) UNIQUE ,
    Ssex CHAR(1) CHECK (Ssex IN (‘M’,’F’)),
    Sage INT,
    Sdept CHAR(15) ) ;

    主码的三种指定方式

    (1) 用NOT NULL UNIQUE 作为列级约束指定
    (2) 用PRIMARY KEY 作为列级约束指定
    (3) 用PRIMARY KEY (<主码>) 作为表级约束指定

    例:建立一个“学生选课”表SC,它由学号Sno、课程号Cno,修课成绩Grade组成,其中(Sno, Cno)为主码。
    CREATE TABLE SC (
    Sno CHAR(5) ,
    Cno CHAR(3) ,
    Grade INT CHECK (Grade >=0 AND Grade <=100 ),
    PRIMARY KEY (Sno, Cno) ,
    FOREIGN KEY (Sno) REFERENCES S(Sno) ,
    FOREIGN KEY (Cno) REFERENCES C(Cno) ) ;

    约束的指定方式

    直接指定约束
    命名约束

    例:
    CREATE TABLE Student
    ( Sno CHAR(5),
    Sname CHAR(20) UNIQUE ,
    Ssex CHAR(1)
    CONSTRAINT chk_ssex CHECK (Ssex IN (‘M’,’F’)),
    Sage INT,
    Sdept CHAR(15)
    CONSTRAINT pk_sno PRIMARY KEY (Sno) ) ;

    删除基本表

    DROP TABLE <表名> ;
    删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述。基本表删除后,表里的数据、表上的索引都会被删除,表上的视图往往仍然保留,但无法引用。

    修改基本表

    ALTER TABLE <表名>
    [ ADD <新列名> <数据类型> [ 完整性约束 ] ]
    [ DROP <完整性约束名> <列名>]
    [ ALTER <列名> <数据类型> ];


    说明:
    <表名>:要修改的基本表
    ADD子句:增加新列和新的完整性约束条件
    DROP子句:删除指定的完整性约束条件
    ALTER子句:用于修改列名和数据类型

    例:
    1.向Student表增加“入学时间”列,其数据类型为日期型。
    ALTER TABLE Student ADD Senroll DATE ;
    注:不论基本表中原来是否已有数据,新增加的列一律为空值。
    2.将年龄的数据类型改为半字长整数。
    ALTER TABLE Student ALTER Sage SMALLINT ;
    注:修改原有的列定义有可能会破坏已有数据
    3.删除学生姓名必须取唯一值的约束。
    ALTER TABLE Student DROP UNIQUE(Sname) ;

    删除属性列

    间接删除(由DBA或表的Owner操作)
    1.把表中要保留的列及其内容复制到一个新表中
    2.删除原表
    3.再将新表重命名为原表名


    直接删除(SQL-99)
    例:ALTER TABLE Student Drop Senroll ;

    索引

    在这里插入图片描述
    Search-key项常用的组织方式是顺序或Hash排列。
    单一索引(Unique Index):每一个索引值只对应唯一的数据记录。
    聚簇索引(Cluster Index):索引项顺序与表中数据记录的物理顺序一致。
    普通索引:允许一个Search-key项对应多条存储记录。

    创建索引

    格式:
    CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON  <表名>(<列名>[<次序>][,<列名>[<次序>] ]…) ;


    说明:
    <表名>:指定要建索引的基本表名字,索引可以建立在该表的一列或多列上,各列名之间用逗号分隔
    <次序>:指定索引值的排列次序。升序:ASC,降序:DESC,缺省值:ASC
    UNIQUE:表明此索引的每一个索引值只对应唯一的数据记录
    CLUSTER:表示要建立的索引是聚簇索引

    例:
    1.为学生-课程数据库中的Student,Course,SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。
    CREATE UNIQUE INDEX Stusno ON Student(Sno) ;
    CREATE UNIQUE INDEX Coucno ON Course(Cno) ;
    CREATE UNIQUE INDEX SCno
    ON SC(Sno ASC , Cno DESC) ;
    2.在Student表的Sname(姓名)列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放。
    CREATE CLUSTER INDEX Stusname
    ON Student(Sname) ;

    删除索引

    DROP INDEX <索引名> ;
    注:删除索引时,系统会从数据字典中删去有关该索引的描述。SQL标准中没有定义对索引的修改功能,而采用删除后重新定义索引的方式实现。

    例:删除Student表的Stusname索引。
    DROP INDEX Stusname ;

    单一索引

    对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束。当建立单一索引后,基本表中的索引项不可以再插入已有值,但可以插入多个空值(空值不相等) ,如果待索引项存在相同值则不能建立。

    聚簇索引

    建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致。在一个基本表上最多只能建立一个聚簇索引。SQL中不提供基本表的排序功能,而通过建立聚簇索引来实现。


    聚簇索引的适用范围(与其特点相关)
    · 很少对基本表进行增删操作
    · 很少对基本表的聚簇索引列进行修改操作
    · 很少对基本表中的变长列进行修改操作

    查询

    格式:
    SELECT [ ALL | DISTINCT ] <目标列表达式1> [, <目标列表达式2>] …
    FROM <表名或视图名1> [, <表名或视图名2> ] …
    [ WHERE <条件表达式> ]
    [ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
    [ ORDER BY <列名2> [ ASC | DESC ] ] ;


    说明:
    SELECT子句:指定要显示的属性
    FROM子句:指定查询对象(基本表或视图)
    WHERE子句:指定查询条件
    GROUP BY子句:对查询结果按指定列分组,列值相同的记录为一组,通常再在该组上施加集函数运算
    HAVING短语:筛选出只有满足指定条件的组
    ORDER BY子句:对查询结果按指定列值升序或降序排序

    例:查询全体学生的详细记录。
    SELECT Sno, Sname, Ssex, Sage, Sdept
    FROM Student ;

    SELECT *
    FROM Student ;

    选择表中的若干列

    目标列(SELECT子句)为表达式的查询:
    目标列形式:算术表达式、字符串常量、函数、列别名等。

    例:
    1.查全体学生的姓名及其出生年份。
    SELECT Sname, 1996 - Sage
    FROM Student ;
    2.查询全体学生的姓名、出生年份和所在系,在“出生年份”前加入常数列“Year of Birth:”,用小写字母表示所有系名,并将输出字段依次更名为:NAME、BIRTH、BIRTHYEAR、DEPARTMENT。
    SELECT Sname NAME, ‘Year of Birth:’ BIRTH,
    1996 - Sage BIRTHYEAR,
    ISLOWER ( Sdept ) DEPARTMENT
    FROM Student ;
    3.消除结果中取值重复的行。
    SELECT DISTINCT Sno
    FROM SC ;

    选择表中的若干元组

    使用where子句
    在这里插入图片描述

    例:
    1.使用比较运算符确定元组
    查询所有年龄在20岁以下的学生姓名及其年龄。
    SELECT Sname , Sage
    FROM Student
    WHERE Sage < 20 ;

    SELECT Sname , Sage
    FROM Student
    WHERE NOT Sage >= 20 ;
    2.确定范围
    查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。
    SELECT Sname , Sdept , Sage
    FROM Student
    WHERE Sage BETWEEN 20 AND 23 ;
    3.确定集合
    查询不是信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
    SELECT Sname , Ssex
    FROM Student
    WHERE Sdept NOT IN ( ‘IS’, ‘MA’, ‘CS’ ) ;
    4.涉及空值的查询
    某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
    SELECT Sno , Cno
    FROM SC
    WHERE Grade IS NULL ;
    5.多重条件查询
    查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
    SELECT Sname , Ssex
    FROM Student
    WHERE Sdept = ‘IS’ OR Sdept = ‘MA’ OR Sdept = ‘CS’ ;
    如果建立了WHERE子句中的属性列的索引,[NOT] BETWEEN … AND … 和 [NOT] IN将不会利用索引提高查询效率,应改为多重条件查询。

    字符串匹配
    [NOT] LIKE ‘<匹配模板>’ [ESCAPE ‘<换码字符>’]
    匹配模板:固定字符串或含通配符的字符串。
    通配符:
    % (百分号):代表任意长度(可以为0)的字符串。
    例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串。
    _ (下横线):代表任意单个字符。
    例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串。
    当要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘<换码字符>’ 短语对通配符进行转义。

    例:
    1.查询学号为95001的学生的详细情况。
    SELECT *
    FROM Student
    WHERE Sno LIKE ‘95001’ ; //不建议这样写
    等价于:
    SELECT *
    FROM Student
    WHERE Sno = ‘95001’ ;
    2.查询所有姓刘学生的姓名、学号和性别。
    SELECT Sname , Sno , Ssex
    FROM Student
    WHERE Sname LIKE ‘刘%’ ;
    3.查询姓名中第3个字为"阳"字的学生姓名和学号。
    SELECT Sname , Sno
    FROM Student
    WHERE Sname LIKE ‘_ _ _ _阳%’ ;
    4.查询DB_Design课程的课程号和学分。
    SELECT Cno , Ccredit
    FROM Course
    WHERE Cname LIKE ‘DB_Design’ ESCAPE ‘’ ;
    转义符‘\’表示模板中出现在其后的第一个字符不再是通配符,而是字符本身。

    对查询结果排序

    使用ORDER BY子句
    可以按一个或多个属性列排序
    升序:ASC;
    降序:DESC;
    缺省值为升序
    当排序列含空值时
    ASC:排序列为空值的元组最后显示
    DESC:排序列为空值的元组最先显示
    (将空值作为最大值来理解)

    例:
    查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
    SELECT *
    FROM Student
    ORDER BY Sdept , Sage DESC ;

    展开全文
  • 当我们只是需要删除数据库中的一个table的时候,往往会因为tables之间的依赖关系,而导致删除失败,那到底要怎么删除有依赖关系的table呢?   这类的删除出错,我是这样解决的: 错误操作:mysql> delete from ...

    当我们只是需要删除数据库中的一个table的时候,往往会因为tables之间的依赖关系,而导致删除失败,那到底要怎么删除有依赖关系的table呢?

     

    这类的删除出错,我是这样解决的:

    错误操作:mysql> delete from instances where id = 7;


    错误提示: ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`nova`.`security_group_instance_association`, CONSTRAINT `security_group_instance_association_ibfk_2` FOREIGN KEY (`instance_id`) REFERENCES `instances` (`id`))

    解决方案:
    mysql> delete from security_group_instance_association where id=7;
     Query OK, 1 row affected (0.06 sec)
     
    mysql> delete from instance_info_caches where id=7;
     Query OK, 1 row affected (0.06 sec)
     
    mysql> delete from instances where id = 7;
     Query OK, 1 row affected (0.05 sec)

    展开全文
  • 数据库怎么没作用呢,索引中的数据也是要从数据库中读过去的... 首先要把数据库中的数据建立一个索引, 以后操作中,增加,删除,修改都得相应的操作索引文件 查询的话就只在索引中查了,而不通过数据库。
  • 关系模式设计的问题关系数据库设计要解决的主要问题 什么样的数据库模式才合理? 怎么分解才能满足要求? 衡量的标准是什么? 理论基础是什么? 如何进行实现? 关于好的数据库模式好的数据库模式是不会发生插入...
  • 数据库基础知识

    2021-05-17 13:50:24
    数据库是以一定方式存储在一起、能与多个用户共享,可视为电子化的文件柜,存储电子文件的处所,用户可以对文件的数据进行新增、查询、更新、删除等操作。 什么是关系数据库关系数据库是建立在关系模型基础...
  • 比如一个学生属于一个班级,班级和学生的关系是一对多,如果你删除了一个班级,那么这个班级的学生肯定得跟着删除,不然就会产生一群无组织的学生。以往做项目的时候,外键是肯定得用的,不用外键是万万不可能的。...
  • 忘掉数据库

    千次阅读 2004-08-25 10:27:00
    在进行面向对象设计的时候彻彻底底的忘掉数据库吧,不要老想着怎么把数据存放到数据库中,怎么更新数据库,怎么删除数据。这些东西只会把你带入歧途,做出面向过程的程序。而不是面向对象。将所有设计做完以后再考虑...
  • 数据库设计

    2021-03-02 10:55:30
    在函数依赖关系中,假设A->B,B->C, 还有A->C,那么此时A->...那么多对多的情况下呢,转换成函数依赖关系怎么样的,多是不能确定多的确定关系,举个例子,一个学校里面有许多班级,一个班级有许多学
  • 数据库之范式篇

    2020-04-02 20:58:41
    关系模式设计的问题 关系数据库设计要解决的主要问题 怎么样的数据库模式才合理? 怎么分解才能满足要求? 好的数据库模式 由于存在函数依赖的关系模型会存在数据冗余、更新异常、插入异常、删除异常的问 题。...
  • 之前我建了一个student表,但是无法保存,所以我就删除了,之后我新建了一个表,然后我想建立一个数据库关系图,就出了上面的问题怎么解决这个问题?
  • Neo4J是什么? ...Neo4J中怎么删除与某个节点有关系的节点? 1. 查找到目标节点所有关系 2. 开启一个事务,删除所有关系的start node或end node 3. 遍历所有找到的node并删除相关的RelationS...
  • 数据库快照删除语句 第章数据查询语句和全文检索语句 单表查询 简单查询 带条件查询 集函数 情况表达式 连接查询 子查询 标量子查询 表子查询 派生表子查询 定量比较 带 谓词的子查询 多列表子查询 ...
  • 假设你有下面所示的具有级联删除关系数据库表结构: 这里的级联删除规则是,当删除Category的时候,应当级联删除与之相关联的Products。 如果你根据上面的数据表结构生成相应的EF模型,像下面这样,看上去没有什么...
  • 文章目录非关系性数据库:MongoMongo介绍操作连接数据库查看所有数据库切换数据库展示数据库中的集合展示集合中的所有文档删除集合中的所有文档举个栗子:教学Mongoose 插件建立文档结构 Schema操作添加数据删除数据...
  • 在对数据库中的数据进行删除的时候,因为关联比较复杂总是报错,例如:我在删除数据行A的时候,A是从表 B是主表,要级联删除数据B表的数据,删除B的数据时它又和其他表进行了关联,在删除数据的时候表之间总是多关联...
  • (4)持续性(Durability ):指一个事务一旦提交,它对数据库中数据的改变就应该是永久的。接下来的其他操作或故障不应该对其执行结果有任何影响。 39、起始结束标志:通常是以BEGIN TRANSACTION开始,以COMMIT或...
  • 内容主要集中在大多数企业常见的问题之上,如安装和升级到oracle database 11g数据库软件、创建数据库、导出和导入数据、数据库的备份与恢复、性能调优,等等。  本书还提供了dba完成本职工作必备的基本的uniix...
  • Influxdb 的更新,删除怎么搞。

    千次阅读 2018-11-26 10:59:35
    对于你的业务出现 Influxdb 的更新和删除 我只能说最好不要去搞!!!  查看官网得知InfluxDB 虽然提供了和SQL 类似的数据库语句,但是对于更新数据和删除数据是不支持的。这里说的不支持是SQL 不支持。举个例子你...
  • 1请你谈一谈在项目中数据库设计遇到的难点,并且你是怎么解决的? 1可以从范式的角度谈谈:关系模式一定要设计的合理,如果设计的不合理的话,会出现4个问题:1数据冗余太大,浪费大量的存储空间;2更新异常,数据...
  • 数据库课程设计(基于B/S)

    热门讨论 2008-12-28 15:28:06
    (2)录入新信息功能:对于管理员,包括新用户信息和新报刊信息的录入功能,信息一旦提交就存入到后台数据库中;普通用户自行注册进行可以修改个人信息。 (3)订阅功能:用户可以订阅报刊,系统自动计算所需金额,...
  • 数据库实验遇到的一些问题总结 ...但是很多同学刚开始用不知道怎么修改,以为删除原来错误的表,再重新输入一次就行了。可是,在数据库系统,你第一次错误的表是被保存了的,你删了重来,表名就不能用原表名了,得再
  • 外键和表关系 ...类定义为class ForeignKey(to,on_delete,**options),第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段应该怎么处理,比如有CASCADE、SET_NUL...
  •  本书由多位工作在数据库维护一线的工程师合著而成,包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及oracle典型错误的分析和诊断,各种sql优化方法(包括调整索引,处理表碎片,优化分页查询,改善...
  • hibernate 级联删除的问题

    千次阅读 2009-06-15 10:57:00
    在只使用id删除时:不管hibernate怎么配置主键所在表,如果在数据库层面没有设置关系为级联删除的话,而只是在hibernate配置cascade="all" 或 cascade="delete-orph",结果都只是假删除,只是将主键表的记录删除,而...
  • 数据库中,表与表之间可能存在多种联系,比如,一对多,多对多的关系。当我们使用逻辑外键在数据库建立两张表之间的关系的时候,我们使用EF实体框架 必然也会将这种关系映射到我们的实体关系中来。所以,在我们做...
  • 如何删除指定邮件

    2009-01-19 10:43:21
    大家都知道Outlook有邮件撤回功能,但是说实话 不怎么好用。经常会出现撤不回。... 在Exchange 2003 环境下通过使用Exmerge工具可以在邮箱数据库中删除指定主题的邮件。在此不详细介绍,现在大多用的是2007。将主...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 167
精华内容 66
关键字:

数据库中怎么删除关系