精华内容
下载资源
问答
  • 第6章 保护数据的完整性 228 6.1 最佳实践 229 6.2 自动数据保护 231 6.2.1 声明性数据保护 231 6.2.2 基本语法 233 6.2.3 基于简单表达式的CHECK约束 235 6.2.4 基于函数的CHECK约束 237 6.2.5 约束引起的...
  • oricle----参照完整性

    2019-12-04 22:36:54
    下面例子说明,参照完整性规则关系如何实现 学生关系 S(学号,姓名,性别),pk(学号) 学习关系(学号,课程号,成绩)pk(学号,课程号),fk1(学号),fk2(课程号),据规则要求关系sc中“”学号“”,应该在...
    现实世界中实体之间往往存在某在联系,在关系模型中实体及及实体间的联系都是用关系来描述的。这样就自然存在着关系的引用。
        下面例子说明,参照完整性规则在关系中如何实现
         学生关系 S(学号,姓名,性别),pk(学号)
         学习关系(学号,课程号,成绩)pk(学号,课程号),fk1(学号),fk2(课程号),据规则要求关系sc中的“”学号“”,应该在关系S中出现,如果关系sc中有一个元祖(s07,c04,80),而学号S07却在关系S中找不到,那么就认为在关系sc中引用了一个不存在的学生实体,这就违反了参照完整性的规则。另外,在关系sc中,“学号”不仅是外键,也是主键的一部分,因此这里的学号值不允许为空。
    
    展开全文
  • 属于表间规则,用来保持表之间的关系,确保插入到表中数据是有效。 可以使用外键***foreign key*** 来实现 创建外键 问题:如果不加约束,学生表,课程表,成绩表是独立,很可能造成数据不一致情况,如何...

    数据完整性

    数据完整性包括
    实体完整性约束
    域完整性约束
    参照完整性约束(外键约束(Foreign key))
    用户定义完整性约束

    参照完整性

    属于表间规则,用来保持表之间的关系,确保插入到表中的数据是有效的。
    可以使用外键***foreign key*** 来实现

    创建外键

    问题:如果不加约束,学生表,课程表,成绩表是独立的,很可能造成数据不一致的情况,如何解决这一问题呢?

    我们可以为成绩表设置2个外键,学号和课程号。

    为成绩表设置外键:
    1.添加第一个外键sno
    在成绩表的表设计器左侧右击,选择关系,打开外键关系对话框,表和列规范

    在这里插入图片描述
    在这里插入图片描述

    点击保存-是(因为表中有数据)

    2.添加第二个外键cno
    在这里插入图片描述

    3.验证外键的作用
    TO BEGIN WITH(学生表中有五名学生)
    在这里插入图片描述
    FUTHEREMORE(课程表中有三门课程)
    在这里插入图片描述
    LAST (验证外键:修改学号/课程号 为不存在的 比如将01改为09) 提示错误
    在这里插入图片描述
    打开学生表,选中某学生,右击删除(删除失败)
    在这里插入图片描述
    在这里插入图片描述
    删除失败(因为在成绩表中,有对应的成绩,如果想要删除01好学生,则需要删除其对应的成绩)

    设置级联 删除与更新(需要修改外键的设置)

    打开成绩表中的外键 - 表设计其器(学号外键和课程号外键同理操作)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    保存 - 是

    验证级联删除和更新
    再来删除01号学生,右击删除,删除成功
    在这里插入图片描述

    刷新成绩表(即可看到01号学生的成绩被删除)
    在这里插入图片描述

    外键特点

    1.必须先为表创建主键,才能创建外键

    2.一个表可以有多个外键

    展开全文
  • 解决的主要问题——确定数据的完整性和所有者 网上下载了一个程序,如何确定它确实是某某公司开发的? 如何确定黑客没有将程序修改过? 某公司或人发来一个文件,后来他不承认发过这个文件怎么办? 主要内容 第四章起...
  • 数据库关系是由数据库模型决定,而数据模型抓住了数据基础和参照完整性规则。要理解这是如何实现的,就要理解构建数据模型需要基础步骤,这些步骤将生成数据定义语言语句,用这些语句才能真正创建存放数据...

        数据库关系是由数据库模型决定的,而数据模型抓住了数据的基础和参照完整性规则。要理解这是如何实现的,就要理解构建数据模型需要的基础步骤,这些步骤将生成数据定义语言的语句,用这些语句才能真正创建存放数据的物理结构,也就是数据库表和列。虽然数据建模流程中有很多变体,但对于关系模型来说,第一步通常是定义实体。

             在网站建设中,实体可以是独立存在的任何东西,如物理对象,事件或概念。实体之间可以存在关系,实体和关系都可以具有描述它们的属性。打个比方,实体就是名词,关系就是动词,修饰实体的属性就是形容词,修饰关系的属性就是副词。

             实体可以是某个事物的实例,例如客户订单,可以具有订单ID和价格这样的属性。把同种类型的实体集合起来就形成了实体集合。在网站建设项目的数据库中,实体相当于表中的一行,而实体集合相当于表。描述实体特有的属性是表的主键。主键通过唯一标识实体的实例实现了实体完整性。外键描述实体间关系的特有属性。外键把不同实体集中的两个实体关联在一起,从而实现了引用完整性。最常用的实体,关系和属性的图解表示法是实体关系图 – ERD。ERD展示了实体集间的基本关系,是一对一,一对多还是多对多。

    深圳网站建设

             一旦我们为网站制作项目中的数据建模,定义和映射了实体,关系和属性,设计数据模型就剩下最后一步了:规范化。规范化网站建设项目中的数据模型的主要目的是,确保存储数据的方式允许在保证数据完整性的前提下对数据进行CRUD操作。不规范的数据模型具有高度的数据冗余,这意味着数据完整性的风险更大。规范是逐级构建的,这意味着满足第二范式的数据库也必须满足第一范式。如果一个数据库至少满足第三范式,就可以认为它是规范的。

             你可能已经想到,实体间的关系会对数据存储,提取和更新的有效性产生巨大影响。由于这些关系定义了如何分割和共享数据库,所以它们在扩展中也扮演着重要的角色。假设我们想在网站制作中实现根据订单确认服务对数据库进行纵向分割,那么如果订单实体与其它实体关系紧密,那么这种分割几乎是不可能的。在分割之后再试图理清这种关系就更加困难了。在网站设计阶段多花费点时间,那么在之后的数据库分割时就只需要花费原来的1/10甚至1/100的精力。

             对于网站建设项目的扩展性来说,数据关系的最后一个关键点是在查询中如何连接表。当然,这不仅是由数据模型决定的,也是由在网站中创建报表和新页面的网站制作人员定义的。而且新的查询都应该由有经验的DBA审查,在把它们投入到生产环境之前,必须对数据查询性能,查询语句及语法做严格地审查,确保没有性能方面的问题。

             在通过规范化提高数据完整性的愿望和在数据库中使用关系的程度之间是有密切联系的。采用的范式越高,在创建表时的关系就越多。而在网站设计数据库方面,几年前被当作原则使用的东西,现在在一些大型网站建设项目中进行设计时,都要进行权衡了。这种权衡与风险和成本,成本和质量,时间和成本等之间的权衡是相似的,也就是一方的下降通常会导致另一方的上升,是一个此消彼长的过程。通常,要提高网站的可扩展性,我们会适当牺牲数据库设计时采用的范式等级。

             因为要连接表,所以SQL查询会耗时,可以采用下面几种方式解决。

    1. 首先对查询进行调优;
    2. 创建视图,物化视图,摘要表等,可以对连接进行预处理;
    3. 不要在查询中进行连接,而是把数据集读到应用层,在应用层内存进行连接,现在asp.net 2.0以后的版本已经加入了Linq语法,可以很好的支持内存中的join操作。虽然这种方法比较复杂,但在数据库中进行连接通常是最难扩展的,而在应用层进行连接的方法将连接移出了数据库,放在应用层服务器上,那么用更多的商业硬件进行负载均衡扩展会更容易实现;
    4. 最后一种方法要追溯到业务需求上,通常我们的业务合作伙伴会提出不同的解决方案,在解释时会说,现有的查询方法需要增加10%的硬件成本,而删除一行会减少查询的复杂度,而得到的业务价值基本是相同的。

    最近了解了几家较大型的深圳网站建设公司,发现大多数网站建设公司在网站制作时并没有太过于注重数据库的查询分析,至少在前期没有,也许是因为开发成本的考虑。但是最后了解到的事实是,当网站访问量上去后,这些深圳网站建设公司最后还是要花很高的成本去对数据模型做大修改以满足对网站进行负载扩展的需求,所以如何在当初多花点时间在数据库模型设计上,也许总的成本算下来可能还是“磨刀不误砍柴工”来得更划算一些。

    转载于:https://www.cnblogs.com/iNc0ming/p/3442160.html

    展开全文
  • (g − 2)μ,包括对任意分波的the性关系的详细讨论。 我们表明获得不受非物理螺旋部分波的最终表达是一个微妙的问题,我们对此进行了充分的阐明。 作为副产品,我们获得了一组求和规则,可用于约束将来对γ∗γ∗...
  • SQL Server 2008数据库设计与实现

    热门讨论 2012-02-28 18:55:34
    第6章 保护数据的完整性  6.1 最佳实践  6.2 自动数据保护  6.2.1 声明性数据保护  6.2.2 基本语法  6.2.3 基于简单表达式的CHECK约束  6.2.4 基于函数的CHECK约束  6.2.5 约束引起的错误  6.2.6 ...
  • 《自己动手设计数据库》主要讲述数据库设计,讨论了如何建立表结构、确定主键、设置字段说明、建立表关系、确立业务规则、建立视图和各层次数据完整性,以及如何避免不好设计等问题。《自己动手设计数据库》...
  • 的完整性。如果校验器在完成四遍校验后未返回出错信息,则下列各点可被保证 类符合JWⅦM规范的类文件格式 无访问限制异常 代码木引起操作数栈上溢或下溢 所有操作代码的参数类型将总是正确的 无非法数据转换发生,如将...
  • 并且进一步阐述MFC核心概念之一:状态(模块状态、线程状态、模块线程状态),揭示MFC对多线程支持机制,MFC实现规则DLL和扩展DLL内幕。 第十章,阐述MFC下调试手段。 第十一章,讨论CFile类,主要分析了...
  • ● 高效数据访问:一组.NET组件,统称为ADO.NET,提供了对关系数据库和各种数据源高效访问。这些组件也可用于访问文件系统和目录。尤其是,.NET内置了XML支持,可以处理从非Windows平台导入或导出数据。 ● ...
  • DaZeng:深入浅出SQL

    2020-12-06 20:02:22
    SQL语句:SQL的使用创建和使用数据库数据库命名规则数据类型char和varchar的区别注意创建表删除表实体完整性,域完整性,引用完整性,用户自定义完整性实体完整性域完整性为什么要保证数据的完整性如何控制?引用...

    数据库

    分类

    层次模型、网状模型、关系模型、对象模型。

    • 传统的缺点:应用程序基于该数据库已定义好的实现,数据库结构必须硬编码到应用程序的编程语言中。如果数据库发生变化,应用程序就必须变化。

    • 关系型数据库的特点:独立于应用程序的。更改数据库设计,而不会影响应用程序成为可能。表的行和列这种结构,来替换父子框架。使用关系模型,我们可以克服早期模型的缺陷,在表之间定义复杂的关系。

    什么是关系模型

    关系模型的理论是1970年由IBM的Codd博士提出的。由实体(Entity)和联系(Relationship)组成的。所谓实体就是指在现实世界中客观存在并可相互区别的事物。
    实体所具有的某一特性称为属性(Attribute)。实体可以通过若干属性来描述。

    以关系模型来创建的数据库称为关系型数据库(Relational Database)。相类似的实体被存入表中。表(table)是关系型数据库的核心单元,它是数据存储的地方。

    表中,一行就是一条数据(记录);它由多个列(字段)的属性构成;而列当中,会有一个属性列是一个实体的唯一标志,一般这种列叫主键。

    表与表之间建立关系,一般都是通过主键、外键的链接来建立关系的。

    表和表的关系

    一对一关系 1:1,一对多关系 1:M,多对多关系 M:N。

    一对一关系:是比较少见的关系类型。很多数据库也很少包含一对一关系。
    我们碰到的最常用的关系类型是一对多关系。

    一对多关系:
    A 表中的一行可以匹配 B 表中的多行,但是 B 表中的一行只能匹配 A 表中的一行。
    只有当一个相关列是一个主键或具有唯一约束时,才能创建一对多关系。

    多对多关系 M:N
    A 表中的一行可以匹配 B 表中的多行,反之亦然。
    要创建这种关系,需要定义第三个表,称为结合表,它的主键由 A 表和 B 表的主键组成。

    数据库服务器管理系统 RDBMS

    将数据组织为相关的行和列的系统
    管理关系数据库的计算机软件就是关系数据库管理系统
    常用的数据库软件有Oracle、SQL Server等。

    DBMSs include MySQL, PostgreSQL, Microsoft SQL Server, Oracle, Sybase and IBM DB2.

    现今流行新的数据库:NoSQL,如mongeDB. 理解为对象型 数据库。

    SQL

    什么是SQL?

    SQL是结构化查询语言(Structured Query Language)

    一种用于管理关系型数据库,与数据库中的数据进行通讯的计算机标准语言。RDBMS 是SQL 的基础,同样也是所有现代数据库系统的基础。定义数据库的结构、存储数据、操纵数据、获取数据、控制对数据的访问以及确保数据的完整性。

    不能用来开发应用程序。

    SQL语句:

    数据定义语言(DDL):Data Definition Language,承担责任数据的模式定义与数据的物理存取构建,CREATE,TRUNCATE ,DROP,ALTER

    数据查询语言(DQL):Data Query Language ,查询数据。SELECT。

    数据操作语言(DML):Data Manipulation Language,承担责任数据的操纵,包括增、删、改变等操作,INSERT、UPDATE、DELETE.

    数据控制语言(DCL):Data Control Language, 用于将相应数据库操纵权限的授予用户和从用户回收相应的权限。grant、revoke 等
    CREATE,TRUNCATE ,DROP、
    SELECT、INSERT、UPDATE、DELETE

    SQL的使用

    创建和使用数据库

    在大多数RDBMS中,我们都可以使用如下简单的SQL语句,创建整个数据库:

    CREATE DATABASE 数据库名;
    -- CREATE DATABASE 数据库名;
    -- 创建一个学生表, 以分号来表示一条Sql命令的结束;
    -- create database stu;
    -- 创建一个数据库后,手动去修改一下字符集,都设置为utf-8; 
    -- 避免表中出现乱的中文字符;
    
    -- 删除数据库:
    -- DROP DATABASE 数据库名;
    -- drop database stu;
    
    -- 连接、使用数据库:
    -- use 数据库名;
    
    -- 创建并连接到stu库;
    CREATE DATABASE stu;
    USE stu;
    

    数据库命名规则

    1. 其中,数据库名在服务器中必须是唯一的,并且符合标识符规则。所谓标识符规则指:
      第一个字符必须是下列字符之一:
      Unicode 标准 3.0 所定义的字母(Unicode 中定义的字母包括拉丁字母 a-z 和 A-Z,以及来自其它语言的字母字符)。
      下划线 (_)、at 符号 (@) 或者数字符号 (#)。
      后续字符可以是:
      Unicode 标准 3.0 所定义的字母。
      来自基本拉丁字母或其它国家/地区脚本的十进制数字。
      at符号(@)、美元符号 ($)、数字符号或下划线。
      标识符不能是所用RDBMS的保留字。
      不允许嵌入空格或其它特殊字符。

    2. 表名在一个数据库中必须是唯一的,并且符合标识符规则。
      列名在一个表内必须是唯一的,并且符合标识符规则。
      列的数据类型决定了什么样的数据可以存储在列中,
      而列的约束定义了创建列时的限制条件。

    数据类型

    1. 整数数据类型:
    • int 大整数: -21亿~ 21亿
    • TINYINT 0-255,小型的整数。
    1. 浮点数据类型:
    • 类型 大小 范围 精度 用途

    • FLOAT 4字节 (-3.40E-38,3.40E+38) 7位小数 单精度浮点数

    • DOUBLE 8字节 (–1.7976931348623157E+308,
      -2.2250738585072014E-308) 15位小数 双精度浮点数

    • DECIMAL(M,D) 17字节 (-10的38次方-1 ,
      10的38次方-1) 30位小数 大浮点数
      decimal(4,3)==> 1.000

      注意:M为总位数,D为小数位,M必须大于D.小数点和(负数)的‘-’符号不包括在M中。

    1. 字符串数据类型
      类型 大小 范围 用途
      CHAR(N) N 0-255 字符型
      VARCHAR(N) N 0-65535 字符型

    2. 日期数据类型
      类型 大小 格式 范围
      DATE 3字节 YYYY-MM-DD 1000-01-01 - 9999-12-31
      DATATIME 8字节 YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 - 9999-12-31 23:59:59

    char和varchar的区别

    char(30),存储时,就占30个字符长度;固定长度;“hello”,它仍然是点用30个字符长度的空间。

    varchar(30),存储时,最大是30时,当少于30时,按实际数量存储。非固定长度;“hello” 就只点用5个字符长度的空间。字符串类型()中的数字,表示当前列可存储的的字符数量最大长度是多少。

    注意

    定义int,TINYINT,float,double,date,datetime时,不需要写长度,char(n),varchar(n), decimal(m,d) 需要写长度。

    创建表

    -- create table s_studentInfo(
    --  s_id int,-- 学号,  列和列之间,用“,”分隔,不能是中文的逗号!
    --  s_name char(30),-- 学生姓名
    --  s_age tinyint, -- 年龄
    --  s_sex char(1),-- 性别
    --  s_date date-- 入学日期,最后一个列不能加"," 
    -- );
    

    删除表

    -- 删除表:drop  table 表名
    -- drop table s_studentinfo;
    

    实体完整性,域完整性,引用完整性,用户自定义完整性

    保证一行数据是有效的,保证一列数据是有效的,保证引用的编号是有效的,保证自定义规则。

    实体完整性

    表中的一行数据如果与它所代表的实体完全一致,则具备实体完整性,这就是实体完整性。

    目的:保证每行所代表的实体能互相区别。

    方法:
    (1)主键约束(PRIMARY KEY)
    主键是表中的一到多个列,”主键列不能为空,也不能重复“。

    (2)唯一约束(UNIQUE)
    唯一约束是指给定列的所有值必须唯一,该列在表中每一行的值必须唯一。它和主键约束的区别在于该列可以为空,并且可以在一张表中给多个列设置唯一约束。

    域完整性

    为什么要域完整性
    保证指定列的数据的有效性

    什么叫域完整性
    域完整性是指定列的输入有效性

    实现方法
    非空约束:Not Null
    默认约束:Default
    MYSQL没有检查约束:check(age > 18 and age < 30)

    为什么要保证数据的完整性?如何控制?

    为了防止垃圾数据的产生,从而影响数据库的执行效率。
    通过控制数据的可靠性, 准确性,就可以控制数据的完整性。
    通过表的约束,来控制。

    CREATE TABLE s_studentInfo(
     s_id INT PRIMARY KEY,-- 添加主键约束  PRIMARY KEY,不能为null,不能重复。
     s_name CHAR(30) NOT NULL,-- 学生姓名,不能为NULL,必须输入。
     s_age TINYINT, -- 年龄
     s_sex CHAR(1) DEFAULT "男",-- 性别,默认为"男"、"1"
     s_date DATE,-- 入学日期,最后一个列不能加"," 
     s_qq VARCHAR(15) UNIQUE -- 添加一个唯一的约束,因为一个QQ号,不可能归属于多个。允许为null。
    );
    

    引用完整性约束

    为什么要引用完整性约束
    例如,在录入学生成绩时,所使用的学号必须是在学生表中作为主键存在的编号。

    什么叫引用完整性
    参照(引用)完整性是指分布在两个表中的列所满足的具有主、从性质的约束关系。

    方法:
    外键约束

    CREATE TABLE s_score(
      s_scoreid INT AUTO_INCREMENT PRIMARY KEY , -- 成绩的编号,AUTO_INCREMENT 自动增长1;必须int类型;
      s_html DECIMAL(5,2) NOT NULL,
      s_js DECIMAL(5,2) NOT NULL,
      
      -- 外键:关联主表主键,表示这条数据是哪一个学生的成绩;
      s_id INT, -- s_id,做外键,因此它类型必须和主表中的主键的类型一致。
      --  CONSTRAINT 【约束名】 FOREIGN KEY (从表中的外键名) REFERENCES 主表(主键名)
      CONSTRAINT FOREIGN KEY (s_id) REFERENCES s_studentInfo(s_id)
    );
    

    外键是指从表的某列与主表的某列存在依附关系。
    比如学生表与成绩表,学生表中有一列为学号,此列与成绩表的学号相对应。

    此关系是设计这两张表时根据业务而建立的,此时我们可以认为成绩表有一个外键与学生表的主键相关联,但是此关系并没有强制性依赖。

    外键约束是指在外键关联主键上强制加上一个约束,如果违反该约束,则不允许该条数据的修改。

    注意:
    有外键约束表,必须要先创建主表,再创建从表;
    当主表被外键约束时,是不能直接删除的。
    从表插入、修改的外键数据,必须是主表主键列中有的数据;
    主表当有外键约束时,主键列的数据,不能修改和删除。

    插入

    -- INSERT INTO <表名> (<列名列表>) 
    -- VALUES (<值列表>)
    
    -- 插入一条数据:
    -- 1.全字段插入:
    INSERT INTO `s_studentinfo` (`s_id`,`s_name`,`s_age`,`s_sex`,`s_date`,`s_qq`)
    VALUES (2, '李四',20,'女', '2020-12-4','1231231');
    
    -- 针对自动增长(null)和默认值(default)以及允许为NULL的字段(null)进行插入;
    INSERT INTO `s_studentinfo` (`s_id`,`s_name`,`s_age`,`s_sex`,`s_date`,`s_qq`)
    VALUES (3, '李四',20,DEFAULT, '2020-12-4',NULL);
    -- 主键不能为空。虽然也是自增长,但不能使用Null.
    
    -- 2. 全字段插入时的简写:
    INSERT INTO s_studentinfo 
    VALUE (4, '王二',18, DEFAULT, '2020-10-10', NULL);-- 必须在括号中,写上所有列的值。
    
    -- 3. 指定字段的插入:默认、为空的可以不出现在字段列表中,
    INSERT INTO s_studentinfo (s_id,s_name, s_age,s_date)
    VALUES (5,'aaa', 34, '1999-9-9');
    
    INSERT INTO s_studentinfo (s_name, s_age,s_date)
    VALUES ('aaa', 34, '1999-9-9');
    
    -- 4 自增长也可以不出现在字段列表中。
    CREATE TABLE t_temp(
    	s_id INT AUTO_INCREMENT PRIMARY KEY,
    	s_name VARCHAR(50) NOT NULL,
    	s_age INT,
    	s_sex CHAR(2)
    	);
    -- 自增长也可以不出现在字段列表中。
    INSERT INTO t_temp (s_name, s_age)
    VALUE('aaa',23);
    -- 自增长列,可以使用null来替换。
    INSERT INTO t_temp
    VALUES(NULL,"aaaaaa",22,"男");
    
    -- 自增长的列,默认的列,允许为NULL的列,可以不出现在指定的列表名中。
    
    -- 5. 同时插入多行数据:
    INSERT INTO t_temp
    VALUES
    (NULL,"bbb",22,NULL),
    (NULL,"ccc",25,'女'),
    (NULL,"ddd",23,NULL);
    

    更新

    -- update : 更新、修改数据:
    -- UPDATE 表名 SET 列1=值1,列2=值2,... WHERE 条件表达式
    -- 如果没有where,就是修改所有的行的数据;
    -- 如果有,就是修改满足条件的行的数据。
    
    -- 1. 无条件的:
    UPDATE `t_temp` SET `s_age`=10;
    -- 2. 有条件的修改:
    UPDATE `t_temp` SET `s_age`=20 WHERE s_sex ='男';
    
    -- 3.多列更新
     UPDATE t_temp
     SET s_name = "张三", s_age = 20 
     WHERE  s_sex ='女';
    
    UPDATE t_temp
     SET s_age = s_age + 10  -- 进行简单的表达式计算
     WHERE  s_sex ='女';
    

    删除

     -- 删除一列的值;
     -- 如果要删除某列的值,只需要将该列设置为NULL即可。当然,这样做的前提是该列允许为空,即没有非空约束。
    
     UPDATE t_temp
     SET s_sex = NULL
     WHERE s_name = '张三';
    
    delete 删除表中的数据,不是删除表结构。
    语法: DELETE FROM 表名 [WHERE 条件表达式]
    1 无条件时,删除所有数据;
     DELETE FROM t_temp;  -- 一般可以有一个日志的回滚。
     
    2 有条件的删除:
    -- 删除qq=1231231的学生信息
    
    DELETE	FROM `s_studentinfo`
    WHERE s_qq = '1231231';
    
    3 条件的够成: 列1= 值2 and 列2 > 值2 or 列3 != 值3;  >,<,=,!=,>=,<=,between...and
    
    4. 删除表中所有数据:
    -- 语法:TRUNCATE TABLE 表名
    -- 有外键约束时,不能直接把主表的所有数据都删除!
    -- 先删除从表的数据
    TRUNCATE TABLE `s_score`;
    -- 再删除主表的数据,或者 先删除外键约束,再删除主表数据。
    TRUNCATE TABLE `s_studentinfo`;
    
    

    delete vs truncate

    DELETE会记录日志,意味着删除后的数据还可以恢复,但是效率低。
    TRUNCATE不会记录日志,删除后的数据不能恢复,但是效率高。
    TRUNCATE不能用于有外键约束引用的表。

    drop table,是直接把表结构和表中的数据全部删除。

    查询

    1. 投影操作
    2. 选择操作
    3. 排序操作
    
    标准SELECT查询由SELECT子句、FROM子句、WHERE子句、ORDER BY子句组成。
    SELECT	[DISTINCT]	{* | 列名 [别名], …}
    FROM	表名
    [WHERE	过滤条件]
    [ORDER BY 列1,列2…]
    
    /*
    -- [{ `province`:“北京市”,`city`:"北京市",`conunty`:"北京市"},
    -- { `province`:“北京市”,`city`:"北京市",`conunty`:"北京市"},......]
    */
    
    -- 全字段投影:
    -- 查看`chinacity`所有数据;
    SELECT * FROM `chinacity`;
    SELECT * FROM `users`;
    
    -- 查看`province`,city, conunty;
    SELECT `province`,`city`,`conunty`
    FROM `chinacity`;
    
    -- 表前缀: 一般在多表联合查询时,会使用表前缀
    -- 通过前缀指明是哪张表的列
    
    select `chinacity`.`city`  
    -- 表示投影的数据,来自于`chinacity`表;多表查询时,如果该字段名有重复,就可以指定数据的来源。
    from `chinacity`;
    
    -- 查询每个订单的详细地址:
    -- 对投影的列,取别名,要求用引用引起来。
    select `chinacity`.`province`  as '省', `city` as 市, `conunty` '县 (区)'
    from `chinacity`;
    
    -- 投影时简单的计算
    select longitudo, latitude + 10
    from `chinacity`;
    SELECT longitudo+ latitude
    FROM `chinacity`;
    
    -- 字符串拼接的函数:  
    -- 多了解一下日期,时间的函数;
    select concat(`province`,`city`,`conunty`) as '详细地址'
    from `chinacity`;
    
    
    -- 去掉重复的行的数据
    -- 查看全国有多少省、直辖市、自治区时;就需要去掉重复的值。
    select distinct province 
    from chinacity;
    
    -- 投影指定的行数的数据  limit  起始位置,  长度;
    
    -- 第1页,每页10条
    select * from chinacity
    limit 0,10;
    
    -- 第2页,每页10条
    SELECT * FROM chinacity
    LIMIT 10,10;
    
    -- 第3页,每页10条
    SELECT * FROM chinacity
    LIMIT 20,10;
    
    -- 数据库中分页:
    -- limit start=(当前页-1)*每页数量, 每页数量;
    -- 前端需要把查询第几页,每页显示几条的数据传递给后台。
    -- 后端返回: 总条数,当前第几页,第页显示几天,查询的结果。
    
    -- 1. 复制表结构和数据
    CREATE TABLE `shop_jb_bak`
    SELECT * FROM `shop_jb`;
    -- 2. 只复制表的结构
    CREATE TABLE `shop_jb_bak2`
    SELECT * FROM `shop_jb` WHERE 1=0;
    
    -- 三、选择操作
    -- 1. 了解 select,from, where的执行顺序;
    -- 2. 简单的条件过滤;
    /*
    运算符	含义
    =	用于检测值是否于另一个值相等
    !=	用于检测值是否不等于另一个值
    ^=	与!=类似
    <>	与!=类似
    >	如果第一个操作数大于第二个操作数则为真
    >=	用于检测第一个操作数是否大于或者等于第二个操作数
    <	如果第一个操作数小于第二个操作数则为真
    <=	用于检测第一个操作数是否小于或者等于第二个操作数
    */
    
    -- `student2`查看年龄=22学生信息;
    SELECT * FROM `student2`
    WHERE sage = 22;
    SELECT * FROM `student2`
    WHERE sage != 22;
    SELECT * FROM `student2`
    WHERE sage >= 22;
    -- 查看年龄在21-24之间的学生信息
    SELECT * FROM `student2`
    WHERE sage >=21 AND sage <= 24;
    -- and,or 多条件的应用;
    SELECT * FROM student2
    WHERE sage BETWEEN 21 AND 24;  -- 等于 WHERE sage >=21 AND sage <= 24;
    -- 查看学历是小学、初中、中专的所有学生;
    SELECT * FROM student2
    WHERE `seducation` = '小学' OR `seducation` = '初中'
     OR `seducation` = '中专';
     -- 判断一个集合: where 列名 in(值1,值2,。。。): 
     -- 表示列的值等于()中任何一个值时,条件就为真;条件为真时,就投影该行数据
     -- 全都不等于,就为假,为假时,过滤掉当前行的数据。
     SELECT * FROM student2
    WHERE `seducation` IN ('小学','初中','中专'); 
    
    -- 查看学历不是小学、初中、中专的所有学生;
    -- not in(小学、初中、中专),全都不等于时,为真,为真时就保留这个数据;
    -- 反之,等于其中之一时,为假,为假就过滤掉这行数据。
    SELECT * FROM `student2`
    WHERE `seducation` NOT IN('小学','初中','中专');
    
    -- 模糊查询(LIKE)
    -- 通配符
    -- “_”通配符  表示任何单个字符
    -- “%”通配符   表示包含零个或多个任意字符
    
    -- 查询以A开头的学生名称的所有数据
    SELECT * FROM `student2`
    WHERE `sname` LIKE 'A%';
    -- 查询学历中以“小”开头的,只有2个字符的数据;
    SELECT * FROM `student2`
    WHERE `seducation` LIKE '小_';
    
    -- 查询名字是三个字的,包括一个张字的学生信息
    
    SELECT * FROM student2
    WHERE sname LIKE '张__' OR sname LIKE '_张_' OR sname LIKE '__张';
    
    -- 只要限制了数量,就必须使用“_”; 
    -- 没有数量限制时,就使用"%".
    
    -- 查询名字中包含了“五”的学生信息;
    SELECT * FROM student2
    WHERE sname LIKE '%五%';
    
    -- 查询名字中,第二个字是"李"的学生的信息;
    SELECT * FROM student2
    WHERE sname LIKE '_李%';
    
    -- 显示没有电话的学生信息;
    SELECT * FROM student2
    WHERE stel  IS NULL; -- 是空值;
     -- 显示电话不为空的学生的信息;
     SELECT * FROM student2
     WHERE stel IS NOT NULL; -- 是非空的值;
     
     -- - 四、排序操作
    /*
    排序操作是指当查询的结果投影出来后通过ORDER BY关键词决定以哪一列或及列的顺序进行排列。
    如果不指定则以数据库默认顺序排列
    1. 单列排序
    SELECT 列A, 列B, 列C FROM 表 ORDER BY 列A
    2. 多列排序:
    SELECT 列A, 列B, 列C FROM 表 ORDER BY 列A, 列B, 列C...
    3. 升序 (默认) ASC
    
    4. 降序 DESC
    
    */
    
    -- 按年龄从小到大的显示所有学生的信息
    SELECT * FROM `student2`
    ORDER BY sage ASC;
    
    -- 降序显示
    SELECT * FROM `student2`
    ORDER BY sage DESC;
    
    -- 多列排序,先按第1列来排序,如果第1列中有相同的值时,按第2列的要求来排序;如果第
    -- 2列有相同的值时,按第3列的要求来排序,以此类推。
    -- 按年龄的降序和生日的降序显示学生信息;
    SELECT * FROM `student2`
    ORDER BY sage DESC,sbirthday DESC;
    
    -- 业务表
    -- 按中文拼音的先后顺序来显示员工信息 : CONVERT(列名 USING 编码名)
    -- 编码名: gbk, gb2312; 
    SELECT * FROM `shop_yw`
    ORDER BY  CONVERT(yw_name USING gbk) DESC;
    
    
    /*
    SQL操作顺序
    第一步:执行FROM
    第二步:WHERE条件过滤
    第三步:执行SELECT投影列
    第四步:执行ORDER BY 排序
    
    */
    

    分组

    --  当需要分别统计某个表的数据时,就要使用分组;
    -- group by 列名;
    
    -- 按性别来查看员工的人数;
    /*
    男 10
    女 1
    */
    SELECT yw_sex , COUNT(*) AS COUNT
    FROM shop_yw
    GROUP BY yw_sex;
    
    -- 按地区来显示每个地域业务员的工资总和;
    
    SELECT yw_address , SUM(ALL yw_salary)
    FROM shop_yw
    GROUP BY yw_address;
    
    -- 分组时,一定要保证投影的结果是有效的!
    -- 1.聚合函数所在列;
    --  2.group by后面的列名,必须出现在select子句面;
    -- 3. 其它都属于无关列,即无效的数据。
    
    -- 多个分组的列: 多个列的条件同时满足的,分在一组,再对这一组数据进行统计。
    /*
      成都 男 10
      成都 女 0
      重庆 男 1
      重庆 女 0
    */
    
    -- 按业务员所在地和性别显示业务员的总人数。
    SELECT yw_address,yw_sex,COUNT(*)AS COUNT
    FROM shop_yw
    GROUP BY yw_address,yw_sex;
    
    -- having 应用于分组、统计后的数据进行过滤;
    
    -- 显示各地区每个性别人数在2人以上的数据;
    SELECT yw_address,yw_sex,COUNT(*) AS COUNT
    FROM shop_yw
    GROUP BY yw_address,yw_sex
    HAVING COUNT >=2;
    
    -- where 是在GROUP BY前进行过滤;
    -- having 是GROUP BY后进行过滤;
    
    -- 只显示成都地区的业务员每个性别 的数量,数量大于2的;
    
    SELECT yw_sex, COUNT(*) AS COUNT FROM  shop_yw
    WHERE yw_address = '成都'  -- 分组前过滤
    GROUP BY yw_sex
    HAVING COUNT > 2; -- 只能用于group by 子句后;分组之后使用。
    
    
    /*
    SQL语句执行顺序
    	select avg(mark)				-- 4
    		from score				-- 1
    		where mark>60				-- 2
    		group by id 				-- 3
    		having avg(mark)>70			-- 5
    		order by avg(mar) desc			-- 6
    		limit 1, 5;				-- 7
    
    */
    
    -- 显示业务员工资 最高的前三名员工的信息
    SELECT * FROM shop_yw
    ORDER BY yw_salary DESC
    LIMIT 0, 3;
    
    -- 按业务员所在地和性别显示业务员的总人数
    SELECT yw_address,yw_sex,COUNT(*)AS COUNT
    FROM shop_yw
    GROUP BY yw_address,yw_sex
    ORDER BY COUNT DESC -- ,(按人数的降序显示)
    LIMIT 0,1; -- 只显示人数最的地区的一个性别的人数;
    
    

    聚合函数

    -- 如果要做统计的操作,就必须使用聚合函数:
    /*聚合函数的分类
    COUNT:统计行数量
    SUM:获取单个列的合计值
    AVG:计算某个列的平均值
    MAX:计算列的最大值
    MIN:计算列的最小值
    
    count(计算规范:*,all ,distinct)
    *: 所有行,包括有Null值的行; count(*)
    all: 所有非空值的行数。  count(all 列名), all可以省略
    distinct: 不统计空值的行;去掉重复的数据行;返回唯一值的行的数量; count(distinct 列名)
    
    
    sum(all 列名): 所有非空值的行中列的数据的总和;
    sum(distinct 列名);所有非空值的行中,去掉重复的列的数据的总和;
    
    avg(all 列名): 所有非空值的行中列的数据的平均值;
    avg(distinct 列名):所有非空值的行中,去掉重复的列的数据的平均值;
    
    max(),min():MAX/MIN没有ALL、DISTINCT、*这些规范
    
    */
    
    -- 统计公司有多少业务员?
    SELECT COUNT(*) AS 人数
    FROM `shop_yw`; -- 11条
    
    -- 根据工资 来统计人数;注意有一个是Null.
    SELECT COUNT(ALL yw_salary) AS 人数
    FROM `shop_yw`;   -- 10条
    
    --  显示业务来自几个地方?求数量
    -- 先去掉重复的数据,再统计数量。
    SELECT  DISTINCT yw_address AS  数量
    FROM shop_yw;
    
    -- 显示工资是3000的人数
    SELECT COUNT(yw_salary) FROM shop_yw WHERE yw_salary = 3000;
    SELECT COUNT(yw_salary) FROM shop_yw WHERE yw_salary = 4500;
    SELECT COUNT(yw_salary) FROM shop_yw WHERE yw_salary = 5000;
    
    -- 如果是多个SQL语句,同时执行,后端返回的是一个二维数组: 
    -- [[4],[1],[1]]  => [0][0]=4; [1][0]=1,[2][0]=1, ==>  双循环来处理二维数组。
    
    SELECT  COUNT(DISTINCT yw_address) AS  数量
    FROM shop_yw;
    
    
    -- 查看工资 有几个等级?
    SELECT COUNT(DISTINCT yw_salary)
    FROM shop_yw;
    
    -- 显示公司每个月要支付的工资总额;
    SELECT SUM(ALL yw_salary) AS '总工资' FROM shop_yw;
    
    
    -- 显示公司中每个工资等级金额的总和;
    SELECT SUM(DISTINCT yw_salary) FROM shop_yw;
    
    
    -- 统计公司员工中的平均工资 ; -- 对非空值进行求平均;
    SELECT AVG(ALL yw_salary)
    FROM  shop_yw;
    
    -- 显示公司中每个工资等级金额的平均工资; -- 20200/7=2885.71
    -- ROUND(number,小数点后几位)
    SELECT  ROUND(AVG(DISTINCT yw_salary),2)
    FROM shop_yw;
    
    
    -- 显示最高的工资,最低的工资
    SELECT MAX(yw_salary) AS MAX,MIN(yw_salary) AS MIN
    FROM shop_yw;
    
    
    -- 可以同时执行多个聚合函数,把结果投影出来;
    -- 显示所有男业务员的总人数,总工资,平均工资,最高工资,最低工资 。
    
    SELECT  COUNT(*) AS 总人数, SUM(yw_salary) AS 总工资,
    AVG(yw_salary) AS 平均工资,MAX(yw_salary) AS 最高工资,MIN(yw_salary) AS 最低工资
    FROM shop_yw
    WHERE yw_sex = '男';
    

    多表查询

    -- 查看所有学生的姓名和所在班级的名称
    SELECT s.`SNAME`, c.`c_name` 
    FROM student AS s JOIN class c 
    ON s.class = c.c_id;
    
    
    -- 表联接分类
    
    -- 内联接: 表1 inner join 表2 on 表1.列1 = 表2.列2 inner join 表3 on 表2.列1 = 表3.列1
    -- inner这个关键可以省略;
    -- 内联接,只保留条件为真的行的数据;条件为假的行的数据都过滤掉。
    
    -- 外联接
    -- 自联接(内联接的一种)
    
    -- 显示每个学生的名称、所学课程的名称和考试成绩
    
    SELECT sname, cname,degree FROM
    student st JOIN score sc ON st.`SNO`= sc.`SNO`
    JOIN course c ON sc.`CNO` = c.`CNO`;
    --  join teacher t on c.`TNO`= t.`TNO`;
    
    -- 内联接的另一种简单的语法:
    -- 显示每个学生的名称、所学课程的名称和考试成绩
    
    SELECT sname, cname, degree 
    FROM student st, score sc, course c
    WHERE st.`SNO` = sc.`SNO` AND sc.`CNO` = c.`CNO`;
    
    -- 显示每个学生的名称、所学课程的名称和考试成绩,以及该课程授课老师的名称
    -- 内联接的一种简写:
    SELECT sname, cname, degree ,tname
    FROM student st, score sc, course c,teacher t
    WHERE st.`SNO` = sc.`SNO` AND sc.`CNO` = c.`CNO` AND c.`TNO` = t.`TNO`;
    
    /*
    定义
    外联接是指不管有没有匹配,被定义了外联接的表数据都要出现在结果中。
    比如左外联接,那么在left JOIN左边的表就被定义为外联接表,那么此表中所有数据都会出现在
    查询结果中。
    右外联接则是right JOIN右边的表定义为外联接表。那么此表中所有数据都会出现在
    查询结果中。
    全外联接就是JOIN左右两张表都是外联接表。两张表的数据都要出现
    分类
    左外联接
    用法:LEFT OUTER JOIN 或 LEFT JOIN
    右外联接
    用法:RIGHT OUTER JOIN 或 RIGHT JOIN
    全外联接
    用法:FULL OUTER JOIN 或 FULL JOIN
    注意:MYSQL不支持全外联接 
    
    */
    
    -- 显示所有商品的名称和它们的类型
    -- 内联接表
    SELECT * FROM `goods` g,`category` c
    WHERE g.`cat_id` = c.`cat_id`;
    
    -- 显示所有类型和它们的商品信息
    -- SELECT cat_name, goods_name FROM c
    -- WHERE g.`cat_id` = c.`cat_id`;
    
    --  没有商品的类型,没有显示出来?怎么解决这个问题呢?
    
    -- 外联接;
    SELECT * 
    FROM `category` c  LEFT JOIN `goods` g
    ON g.`cat_id` = c.`cat_id`;
    
    -- 哪个类别下,没有进货?
    SELECT cat_name, COUNT(ALL goods_id)AS COUNT
    FROM `category` c  LEFT JOIN `goods` g
    ON g.`cat_id` = c.`cat_id`
    -- 在表联接后,加 group by , having.
    GROUP BY cat_name
    HAVING COUNT = 0;
    
    -- 右外联接:
    SELECT cat_name, COUNT(goods_id) AS  COUNT 
    FROM  `goods` g RIGHT JOIN `category` c
    ON g.`cat_id` = c.`cat_id` 
    GROUP BY cat_name
    HAVING COUNT = 0;
    
    SELECT * 
    FROM  `goods` g RIGHT JOIN `category` c
    ON g.`cat_id` = c.`cat_id`;
    
    -- 到底是把哪一张表的数据都投影(查询)出来?那么这张表,就是外联接表;
    -- 如果你用Left join来联接表,这张就应该放在左边;
    -- 如果你用的right join 来联接表,这张就应该放在右边;
    -- 才可以保证该表所有的数据都投影出来。
    
    -- 内联接表和外联接表的区别?
    
    -- 1.内联接时,只投影出满足条件的数据行;
    -- 2. 外联接时,不仅投影出满足条件的数据行;还要把被指定为外联接表的不满足的数据行
    -- 全部投影出来;在投影结果中,其它列以null值来表示。
    
    
    -- 自联接表: 是内联接一种: 同一张表自己连接自己;
    -- 查询每一个员工的姓名和他直接上级的姓名
    -- 同一张表,必须取别名;
    SELECT ygb.`ename` AS 员工姓名, gly.`ename` AS 主管姓名 FROM emp AS ygb ,emp  AS gly
    WHERE ygb.`mgr` = gly.empno;
    
    
    /*
    内联接: inner join .. on,  简写, 自联接
    外联接:left join ..on,  right join ..on, full join ..on
    都是横向联接
    */
    
    -- 纵向联接: UNION 参与联接查询的表,列数要相同;
    
    SELECT * FROM `category`
    UNION
    SELECT * FROM `class`;
    -- union
    -- SELECT * FROM  `emp`;
    
    展开全文
  • visual c# 2010新增了大量可圈可点丰富特性,本书围绕着基础知识和这些新特性全面介绍了如何利用visual studio 2010和.net framework 4.0编写应用程序。书中沿袭深受读者欢迎step by step风格,通过丰富练习...
  • 5.2.4 实体完整性、参照完整性和外码 104 5.2.5 其他类型约束 106 5.3 更新操作、事务和处理违例约束 107 5.3.1 插入操作 107 5.3.2 删除操作 108 5.3.3 更新操作 109 5.3.4 事务...
  •  本书是一本讲述数据库系统原理经典教材,重点强调了数据库设计与实现。全书分为4部分。第一部分讲述事务处理概念、并发控制技术和数据库恢复技术;第二部分讲述面向数据库概念、语言、设计及对象-关系和...
  • 导出SQL功能还使您可以完全控制最终SQL脚本,并允许您生成模型各个部分,参照完整性规则,注释,字符集等,从而可以节省数百小时工作时间。 标准设计工具 添加顶点,图层,图像,形状和注释/标签,对齐/...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 126
精华内容 50
关键字:

关系的完整性规则如何实现