#夏日挑战赛#数据库学霸笔记,考试/面试快速复习~

古人已用三冬足,年少今开万卷余。这篇文章主要讲述#夏日挑战赛#数据库学霸笔记,考试/面试快速复习~相关的知识,希望能为你提供帮助。
  ??本文正在参加星光计划3.0–夏日挑战赛??数据库系统概论 四个基本概念
数据:数据库中存储的基本对象,描述一个事物的符号记录,数据和其语义不可分开说
数据库(DB):是长期储存在计算机内、有组织的、可共享的大量数据的集合。
数据库管理系统:一个管理数据的软件
主要功能:
数据定义功能:
(1)提供数据定义语言(DDL):创建表(CREATE),修改表(ALTER),删除表(DROP);
(2)定义数据库中的数据对象


操纵功能:
提供数据操纵语言(DML,即增删改查的操作),实现对数据库的基本操作 (查询、插入、删除和修改)


事务管理和运行管理:
数据库由DBMS统一管理和控制保证数据的安全,完整性、多用户对数据的并发使用、发生故障后的系统恢复
建立和维护功能:(1)数据库初始数据装载转换;(2)数据库转储;(3)介质故障恢复;(4)数据库的重组织;(5)性能监视分析等
数据库系统:由数据库、数据库管理系统应用程序和数据库管理员(DBA)等组成的存储、管理、处理和维护数据的系统。
数据模型 两类数据模型
    概念模型:第一次抽象,用于数据库设计
    逻辑模型和物理模型:第二次抽象
    1)逻辑模型主要包括网状模型、层次模型、关系模型、面向对象模型等,按计算机系统的观点对数据建模,用于DBMS实现
    2)物理模型是对数据最底层的抽象,描述数据在系统内部的表示方式和存取方法,在磁盘或磁带上的存储方式和存取方法
数据模型的组成要素
    数据结构
    1)描述数据库的组成对象,以及对象之间的联系
    2)描述与数据之间联系有关的对象
    3)是对系统静态特性的描述
    4)分类:(1)非关系型:网状,层次;(2)关系型;(3)面向对象型
    数据操作
    1)对数据库中各种对象(型)的实例(值)允许执行的操作及有关的操作规则
    2)增删改查
    3)是对系统动态特性的描述
    数据的完整性约束条件
    1)一组完整性规则的集合
    2)完整性规则:给定的数据模型中数据及其联系所具有的制约和储存规则
    3)用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效、相容
    实体完整性:具体的数据的属性信息是否完整
    参照完整性:该属性对应的值存在
    用户定义完整性:看心情
关系模型
    基本概念:
    1)关系(Relation):一个关系对应通常说的一张表
    2)元组(Tuple):表中的一行即为一个元组
    3)属性(Attribute):表中的一列即为一个属性,给每一个属性起一个名称即属性名
    4)码(Key) :唯一确定一个元组的属性或属性组
    5)域(Domain) :是一组具有相同数据类型的值的集合
    6)分量:元组中的一个属性值
    7)关系模式:对关系的描述,一般表示为
    关系名(属性1,属性2,……,属性n)
    学生(学号,姓名,年龄,性别,系,年级)
    8)注意规范:不能出现大表套小表。
    数据操作:增删改查,对若干元组操作的集合
    数据的完整性约束条件:
    1)实体完整性
    2)参照完整性
    3)用户定义完整性
数据库系统结构数据库系统模式的概念
    型:对某一类数据的结构和属性的说明,(学号,姓名,性别,系别,年龄,籍贯)
    值:是型的一个具体赋值,(201315130,李明,男,计算机,19,江苏)
    模式:数据库逻辑结构和特征的描述,是型的描述,反映的是数据的结构及其联系,模式是相对稳定的,即属性名的集合
    实例:模式的一个具体值,反映数据库某一时刻的状态,同一个模式可以有很多实例,实例随数据库中的数据的更新而变动
    如果是一个成绩单:那么科目那一行表示的是模式(不仅仅只是这些,还包括其他的信息),每一个人的成绩一行表示的是一个实例
数据库系统的三级模式结构     模式:数据库中全体数据的逻辑结构和特征的描述,所有用户的公共数据视图,综合了所有用户的需求,一个数据库只有一个模式,模式是相对稳定的,但是实体是相对变动的
    地位:1)是数据库系统模式结构的中间层;2)与数据的物理存储细节和硬件环境无关;3)与具体的应用程序、开发工具及高级程序设计语言无关
    定义:1)数据的逻辑结构(数据项的名字、类型、取值范围等);2)数据之间的联系;3)数据有关的安全性、完整性要求
    外模式:模式的子集,一个数据库可以有多个,是数据库中局部数据的逻辑结构和特征的描述
    内模式:1)是数据物理结构和存储方式的描述;2)是数据在数据库内部的表示方式
    一个数据库只有一个内模式。
数据库的二级映像功能与数据的独立性
    外模式/模式映像:保证了数据的逻辑独立性。不唯一
    1)当模式改变时,数据库管理员修改有关的外模式/模式映象,使外模式保持不变
    2)应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
    模式/内模式映像:保证了数据的物理独立性。唯一
    1)当数据库的存储结构改变了(例如选用了另一种存储结构),数据库管理员修改模式/内模式映象,使模式保持不变,进而外模式也不发生改变
    2)应用程序不受影响。保证了数据与程序的物理独立性,简称数据的物理独立性
    数据的存取由DBMS管理的好处:
    1)用户不必考虑存取路径等细节
    2)简化了应用程序的编制
    3)大大减少了应用程序的维护和修改
数据库系统的组成
硬件,操作系统,数据库设计人员,数据库管理人员,数据库管理系统,用户等等。
关系     域:一组具有相同数据类型的值的集合(即取值范围)
    笛卡尔积:域上的一种集合运算。结果为一个集合,集合的每一个元素是一个元组,元组的每一个分量来自不同的域。
    基数:一个域允许的不同取值个数。
    笛卡尔积的基数:每个域不同取值的个数的乘积,或者说元组的个数
    关系:域的笛卡尔积的子集叫做在域上的关系,域的个数叫做关系的目或度。(即列数,属性的数目),注意广义上的笛卡尔积一般不能称为关系,因为存在无效的数据。
    关系:表
    列:属性
    行:元组
    候选码:某一属性组的值能唯一地标示一个元组,而其子集不能,则称该属性组为候选码
    主属性:候选码中的属性都称为主属性,注意:主属性非空。
    主属性:候选码之外的属性称为非主属性
    全码:关系模式的所有属性是这个关系模式的候选码
    主码:从候选码中选取一组能唯一确定一个元组的属性组作为主码。
    三类关系:
    1)基本关系:实际存在的表,是实际存储数据的逻辑表示
    2)查询表:查询结果对应的表
    3)视图表:由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据。
    注意:关系数据模型中的关系必须是有限集合。
    关系的每一个列必须附加一个属性名,属性名不能重名,这种方法取消了关系属性的有序性。
    ① 列是同质的(Homogeneous):每一列中的分量来自同一个域,是同一类型的数据
    ② 不同的列可出自同一个域
        其中的每一列称为一个属性
        不同的属性要给予不同的属性名
    ③ 列的顺序无所谓, 列的次序可以任意交换
    ④ 任意两个元组的候选码不能相同:相同就不是候选码了
    ⑤ 行的顺序无所谓,行的次序可以任意交换
    ⑥ 分量必须取原子值(不允许表中套表)
关系模式
    关系模式:对关系的描述,是静态的、稳定的
    关系:是关系模式在某一时刻的状态或内容,是动态的、随时间不断变化的,指后边的那个关系
    关系模式的形式化表示:
    //关系模式
    R(U, D, DOM, F)
    R       关系名
    U       组成该关系的属性名集合
    D       属性组U中属性所来自的域
    DOM   属性向域的映象集合
    F       属性间的数据依赖关系集合      
    //可以简记为
    R (U)     或     R (A1,A2,…,An)
    R: 关系名
    A1,A2,…,An   : 属性名
    注:域名及属性向域的映象常常直接说明为属性的类型、长度
关系数据库
    在一个给定的应用领域中,所有关系的集合构成一个关系数据库
    关系数据库的型与值,不是关系的型与值
    1)关系数据库的型也称关系数据库模式,是对关系数据库的描述
    2)关系数据库的值是关系模式在某一时刻对应的关系的集合,简称为关系数据库
基本的关系操作     常用的基本操作:
【#夏日挑战赛#数据库学霸笔记,考试/面试快速复习~】     **查询:**选择、投影、连接、除、并、交、差
    **数据更新:**插入、删除、修改
    **5种基本操作:**选择、投影、并、差、笛卡尔积 注意:不算交
    关系操作的特点:
    集合操作方式:操作的对象和结果都是集合,一次一集合的方式,操作对象是集合,操作结果亦为集合。
关系的完整性
实体完整性(即主属性非空)
    若属性A是基本关系R的主属性,则属性A不能取空值
参照完整性
    关系间的引用:关系与关系之间存在着联系
    外码:设F是基本关系R的一个或一组属性,但不是关系R的主码,Ks是基本关系S的主码。如果F与Ks相对应,则称F是基本关系R的外码,外码所在的基本关系叫做参照关系,Ks所在的关系叫做被参照关系。
    注:
    1)R、S不一定是不同的关系。
    2)目标关系S的主码Ks 和参照关系的外码F必须定义在同一个(或一组)域上
    3)外码并不一定要与相应的主码同名,当外码与相应的主码属于不同关系时,往往取相同的名字,以便于识别
    4)外码的取值:如果外码是参照关系的主属性,则不能为空(实体完整性),只能为被参照关系中主码的取值。如果外码不是参照关系的主属性,则可以取空或者被参照关系主码的取值
    两个不变性:指实体完整性和参照完整性
用户定义完整性
    针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求
    关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不要由应用程序承担这一功能
关系代数
传统的集合运算
    传统的关系运算:
    并、交、差、笛卡尔积

    操作对象关系:
    操作方式:同数学中的并、交、差、笛卡尔积。只不过操作对象的元素是元组。另外需要注意能进行运算所需要满足的条件。
    对于并、交、差需要满足的关系:1)属性的数目相同;2)相应的属性取自同一个域
专门的关系运算
常见的关系运算有选择、投影、连接、除
选择:
在关系R中选择满足给定条件的诸元组。
表达式:$\\sigma_F(R) = t | t \\in R \\and F(t) = true$
F:为选择条件,是一个逻辑表达式,基本形式为:$X_1 \\theta Y_1$,其中$\\theta$为大于、小于、等于、不等于等。
举例:

投影:
从R中选择出若干属性列组成新的关系
表达式:$\\prod_A (R)= t[A] | t\\in R$
A为属性列,即从R中选择A中属性列的元组,当然选择之后可能会删掉一些元组,因为避免重复。
举例:还是上方的关系,经过投影$\\prod_Sname, Sdept(Student)$,结果如下:

连接
1)**一般连接:**从两个关系的笛卡尔积中选取属性间满足一定条件的元组
(1)表达式:$R\\bowtie_ A \\theta B S = t_r^ \\frown t_s | t_r \\in R \\and t_s \\in S \\and t_r[A] \\theta t_s[B] $
(2)A和B:分别为R和S上度数相等且可比的属性组
(3)$\\theta$表示比较运算符,
(4)连接运算从R和S的广义笛卡尔积R×S中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较关系θ的元组
2)**等值连接:**当上述的运算符为等于号的时候
(1)含义:从关系R与S的广义笛卡尔积中选取A、B属性值相等的那些元组,即等值连接为:
(2)表达式:$R\\bowtie_ A = B S = t_r^ \\frown t_s | t_r \\in R \\and t_s \\in S \\and t_r[A] = t_s[B] $
(3)仍然是从行的角度进行运算,而不涉及列
(4)属性组可以不同
3)**自然连接:**一种特殊的等值连接
(1)与等值连接的不同:两个关系R和S必须具有相同的属性组
(2)将结果中相同的属性列去掉
(3)表达式:$R\\bowtie S = t_r^ \\frown t_s | t_r \\in R \\and t_s \\in S \\and t_r[A] = t_s[B] $
4)由自然连接所引发的一系列问题:
(1)悬浮元组:在做自然连接的时候被舍弃的元组
(2)外连接:如果把舍弃的元组也保存在结果关系中,而在其他属性上填空值(Null),这种连接就叫做外连接,外连接 = 左外连接 + 右外连接
(3)左外连接:如果只把左边关系R中要舍弃的元组保留就叫做左外连接
(4)右外连接:如果只把右边关系S中要舍弃的元组保留就叫做右外连接

1)除运算的意义:
(1)假设关系R,S,RS,R关系拥有的属性是姓名,S关系拥有的属性是课程,RS关系拥有的属性是姓名和课程的联系,则RS/S表示选出所有至少选了表S中所列课程的学生的元组。
(2)如下图:

注:RS/S得到的关系:张三和李四构成的表,表示选修了全部课程的同学的集合。
举例:
R:
A B C
a1 b1 c2
a2 b3 c7
a3 b4 c6
a1 b2 c3
a4 b6 c6
a2 b2 c3
a1 b2 c1
S:
B C D
b1 c2 d1
b2 c1 d1
b2 c3 d2
R÷S
A
a1
    (1) 找S与R的共同属性,即公式中的Y属性
    (2)计算R中每个X属性的象集,如果某个象集包含S在Y属性上的投影,则该属为R/S结果中的一个值。
解答如下:
在关系R中,A可以取四个值a1,a2,a3,a4,其中:
a1的象集为:(b1,c2),(b2,c3),(b2,c1)
a2的象集为:(b3,c7),(b2,c3)
a3的象集为:(b4,c6)
a4的象集为:(b6,c6)
S在(B,C)上的投影为(b1,c2),(b2,c3),(b2,c1)。
显然只有R的象集a1包含S在(B,C)属性组上的投影,所以R÷S=a1。
数据类型大总结  整数类型:

实数类型:
定点数:DECIMAL和NUMERIC类型在mysql中视为相同的类型。它们用于保存必须为确切精度的值。
DECIMAL(M,D),其中M表示十进制数字总的个数,D表示小数点后面数字的位数。
    如果存储时,整数部分超出了范围(如上面的例子中,添加数值为1000.01),MySql就会报错,不允许存这样的值。
    如果存储时,小数点部分若超出范围,就分以下情况:
    若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存。如999.994实际被保存为999.99。
    若四舍五入后,整数部分超出范围,则MySql报错,并拒绝处理。如999.995和-999.995都会报错。
M的默认取值为10,D默认取值为0。如果创建表时,某字段定义为decimal类型不带任何参数,等同于decimal(10,0)。带一个参数时,D取默认值。
M的取值范围为1~65,取0时会被设为默认值,超出范围会报错。
D的取值范围为0~30,而且必须< =M,超出范围会报错。
所以,很显然,当M=65,D=0时,可以取得最大和最小值。
浮点数类型
:float,double和real。他们定义方式为:FLOAT(M,D) 、 REAL(M,D) 、 DOUBLE PRECISION(M,D)。   “(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面
FLOAT和DOUBLE中的M和D的取值默认都为0,即除了最大最小值,不限制位数。
M取值范围为0~255。FLOAT只保证6位有效数字的准确性,所以FLOAT(M,D)中,M< =6时,数字通常是准确的。如果M和D都有明确定义,其超出范围后的处理同decimal。
D取值范围为0~30,同时必须< =M。double只保证16位有效数字的准确性,所以DOUBLE(M,D)中,M< =16时,数字通常是准确的。如果M和D都有明确定义,其超出范围后的处理同decimal。
内存中,FLOAT占4-byte(1位符号位 8位表示指数 23位表示尾数),DOUBLE占8-byte(1位符号位 11位表示指数 52位表示尾数)
浮点数比定点数类型存储空间少,计算速度快,但是不够精确。
因为需要计算额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时 才使用DECIMAL。但在数据量比较大的情况下,可以考虑使用BIGINT代替DECIMAL,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。
BIT数据类型
可用来保存位字段值。BIT(M)类型允许存储M位值。M范围为1~64,默认为1。
BIT其实就是存入二进制的值,类似010110。
如果存入一个BIT类型的值,位数少于M值,则左补0.
如果存入一个BIT类型的值,位数多于M值,MySQL的操作取决于此时有效的SQL模式:
如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值。
如果模式设置为traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据SQL标准插入会失败。
MySQL把BIT当做字符串类型,而非数字类型。                                               
字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
CHAR & VARCHAR  
CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如,CHAR(30)可以占用30个字符。默认长度都为255。
CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉,所以,我们在存储时字符串右边不能有空格,即使有,查询出来后也会被删除。在存储或检索过程中不进行大小写转换。
所以当char类型的字段为唯一值时,添加的值是否已经存在以不包含末尾空格(可能有多个空格)的值确定,比较时会在末尾补满空格后与现已存在的值比较。
VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值(实际可指定的最大长度与编码和其他字段有关,比如,MySql使用utf-8编码格式,大小为标准格式大小的2倍,仅有一个varchar字段时实测最大值仅21844,如果添加一个char(3),则最大取值减少3。整体最大长度是65,532字节)。
同CHAR对比,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。
VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。
如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。
BINARY & VARBINARY
BINARY和VARBINARY类型类似于CHAR和VARCHAR类型,但是不同的是,它们存储的不是字符串,而是二进制串。所以它们没有编码格式,并且排序和比较基于列值字节的数值值。
当保存BINARY值时,在它们右边填充0x00(零字节)值以达到指定长度。取值时不删除尾部的字节。比较时所有字节很重要(因为空格和0x00是不同的,0x00< 空格),包括ORDER BY和DISTINCT操作。比如插入a 会变成a \\0。
对于VARBINARY,插入时不填充字符,选择时不裁剪字节。比较时所有字节很重要。
BLOB & TEXT
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。
BLOB列被视为二进制字符串。TEXT列被视为字符字符串,类似BINARY和CHAR。
在TEXT或BLOB列的存储或检索过程中,不存在大小写转换。
未运行在严格模式时,如果你为BLOB或TEXT列分配一个超过该列类型的最大长度的值,值被截取以保证适合。如果截掉的字符不是空格,将会产生一条警告。使用严格SQL模式,会产生错误,并且值将被拒绝而不是截取并给出警告。
在大多数方面,可以将BLOB列视为能够足够大的VARBINARY列。同样,可以将TEXT列视为VARCHAR列。
BLOB和TEXT在以下几个方面不同于VARBINARY和VARCHAR:
当保存或检索BLOB和TEXT列的值时不删除尾部空格。(这与VARBINARY和VARCHAR列相同)。
比较时将用空格对TEXT进行扩充以适合比较的对象,正如CHAR和VARCHAR。
对于BLOB和TEXT列的索引,必须指定索引前缀的长度。对于CHAR和VARCHAR,前缀长度是可选的。
BLOB和TEXT列不能有默认值。
BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。你可以通过更改max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序。
每个BLOB或TEXT值分别由内部分配的对象表示。
它们(TEXT和BLOB同)的长度:
Tiny:最大长度255个字符(2^8-1)
BLOB或TEXT:最大长度65535个字符(2^16-1)
Medium:最大长度16777215个字符(2^24-1)
LongText 最大长度4294967295个字符(2^32-1)
实际长度与编码有关,比如utf-8的会减半。


 


当BLOB和TEXT值太大时,InnoDB会使用专门的外部存储区域来进行存储,此时单个值在行内需要1~4个字节存储一个指针,然后在外部存储区域存储实际的值。


MySQL会BLOB和TEXT进行排序与其他类型是不同的:它只对每个类的最前max_sort_length字节而不是整个字符串进行排序。


MySQL不能将BLOB和TEXT列全部长度的字符串进行索引,也不能使用这些索引消除排序。


 
ENUM 使用枚举代替字符串类型


MySQL在存储枚举时非常紧凑,会根据列表值的数量压缩到一个或两个字节中。MySQL在内部将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数组——字符串”映射关系的查找表。


枚举字段是按照内部存储的整数而不是定义的字符串进行排序的;


由于MySQL把每个枚举值都保存为整数,并且必须通过查找才能转换为字符串,所以枚举列有一定开销。在特定情况下,把CHAR/VARCHAR列与枚举列进行JOIN可能会比直接关联CHAR/VARCHAR更慢。


时间和日期类型


DATE, DATETIME, 和TIMESTAMP类型 这三者其实是关联的,都用来表示日期或时间。


当你需要同时包含日期和时间信息的值时则使用DATETIME类型。MySQL以YYYY-MM-DD HH:MM:SS格式检索和显示DATETIME值。支持的范围为1000-01-01 00:00:00到9999-12-31 23:59:59。


当你只需要日期值而不需要时间部分时应使用DATE类型。MySQL用YYYY-MM-DD格式检索和显示DATE值。支持的范围是1000-01-01到 9999-12-31。


 


TIMESTAMP类型同样包含日期和时间,范围从1970-01-01 00:00:01 UTC 到2038-01-19 03:14:07 UTC。


TIME值的范围可以从-838:59:59到838:59:59。小时部分会因此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可能为某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,或者甚至为负)


 


两者的存储方式不一样


对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。


而对于DATETIME,不做任何改变,基本上是原样输入和输出。


 


YEAR类型是一个单字节类型用于表示年。


MySQL以YYYY格式检索和显示YEAR值。范围是1901到2155。


关系数据库标准语言SQL
基本概念


    SQL语言是一个功能极强的关系数据库语言。同时也是一种介于关系代数与关系演算之间的结构化查询语言(Structured Query Language),其功能包括数据定义、数据查询、数据操纵和数据控制。


    SQL的特点:


    1)综合统一:集数据定义、数据查询、数据操纵和数据控制等多种功能于一体。


    2)高度非过程化 :面对象的设计


    3)面向集合的操作方式 :操作对象是集合,并且操作结果也是集合


    4)两种使用方式,统一的语法结构 :既是一种独立的语言,又是一种嵌入式的语言,(嵌入式是指嵌入别的高级语言)。


    5)简洁易学


数据库的创建与基本概念


一、创建数据库:


代码:


    create database Student;         --创建数据库
    use Student;                     --使用数据库
    drop database Student;           --删除数据库


注意:


1)两种注释方式:(1)两个减号--,注释单行 (2)/* */注释多行


2)不能再当前数据库删除当前数据库


数据类型:


201902279


注意:


1)一个属性采用何种数据类型由两部分决定:(1)该属性的取值范围;(2)该属性做何种运算。
模式的创建与删除


模式,一个独立于数据库用户的非重复命名空间,在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。


代码:


    /** 创建模式zhang,下键表student*/
    create schema zhang
    create table student
    (
      Sno char(9) primary key,
      Sname varchar(20) unique,
      Ssex char(4) not   null,
      Sage smallint,
      Sdept varchar(5)  
    );
     
    /** 删除模式中的表*/
    drop table zhang.student;
     
    /** 删除模式*/
    drop schema zhang;     --注意前提该模式下无对象


注意:


1)删除模式的时候首先应当将模式下的所有对象删除,才能删除该模式


2)在删除某个非dbo模式下的表时,需要加模式名


3)该模式不是三级模式两级映像中的模式,而是相当于一个命名空间(主要可以解决重名的问题)


4)CASCADE(级联):删除模式的同时把该模式中所有的数据库对象全部删除(SQL Server不支持)


5)RESTRICT(限制):只有当该模式中没有任何下属的对象时才能执行
表的定义、删除与修改


一、创建表(三张):(1)学生表(Student)(2)课程表(Course)(3)学生课程表(SC)


1)学生表(Student)


代码:


    /** 未添加数据*/
    create table student
    (
    Sno char(9) primary key,           --primary key   指示主码
    Sname varchar(20) unique,         --unique         指示值唯一,
    Ssex char(4) not   null,           --not null       该值非空
    Sage smallint,
    Sdept varchar(5)  
    );


2)课程表(Course)


201903132


代码:


    /** 创建课程表*/
    create table Course
    (
    Cno char(2) primary key,
    Cname varchar(10) unique,
    Cpno char(2),                 --Cpno是外码,参照的是自身的Cno
    Ccredit smallint,
    foreign key (Cpno) references Course(Cno)     --外码
    );


3)学生-课程表


 


代码:


    /** 创建学生-课程表*/
    create table SC
    (
    Sno char(9),
    Cno char(2),
    Grade int,
    primary key(Sno, Cno),             --多个属性列构成主码,写在最后
    foreign key(Sno) references student(Sno),     --外码, 每个外码写一行
    foreign key(Cno) references Course(Cno)
    );


注意:


1)创建表的时候需要考虑三个完整性约束条件:实体完整性,参照完整性,用户自定义完整性


2)两种完整性约束条件的定义方式:


    列级完整性约束条件:涉及相应属性列的完整性约束条件,在属性列的后边定义。


    表级完整性约束条件:涉及一个或多个属性列的完整性约束条件 ,在将属性列完之后定义。


3)外码要和所参照的主码类型相同。表级完整性约束的时候属性列需要加括号。


二、修改表


增加列


    alter table student add graduation date;
    /*
    1. 指定要修改的表
    2. add关键字
    3. 新增列的属性名
    4. 新增列的数据类型
    */


删除列


alter table student drop column graduation;


修改列的数据类型


alter table student alter column graduation varchar(20);  


增加约束


    /*这种增加约束的方法不容易从左边的框框(键)中看出来*/
    alter table student add unique(graduation);
     
    /*给增加的约束自定义了一个别名,容易区分*/
    alter table student add constraint S_un unique(graduation);
     
    /*注意*/
    --1. 不可以使用增加not null约束,想要添加只可以在设计中将勾去掉
    --虽然以下的方式看似添加了not null约束,但是不起任何作用
    alter table student add constraint cc check(sname is not null);
     
    --2. 给某一属性列添加主键,需要保证该属性列不允许为空,刚建的新表在未加约束的情况下,默认属性列允许为空值
    alter   table   student   add primary key(sno,cno);
     
    --3. 添加外键,需要保证外码和被参照表的主属性的数据类型保持一致
    alter   table   student   add foreign key (sno) references student(sno);


删除约束


    /*通过指定的约束名字删除指定的约束*/
    alter table student drop constraint S_un;
     
    /*在左边单机右键删除*/


三、删除表


    /*删除表的时候必须先将参照表干掉,再删除被参照表*/
    drop table student;


索引的建立与删除


    建立索引的目的是加快数据查询的速度。DBA或者表的属主可以根据需要建立表的索引;但是有些DBMS可以自动建立以下索引,1)PRIMARY KEY索引(聚簇索引)2)UNIQUE索引(唯一性索引)


一、创建索引


    /*创建唯一性索引*/
    /*
    * stu为索引名字,创建索引必须要有一个索引名
    * 列名后面紧跟排序类型,ASC为升序,DESC为降序,默认为ASC,可以有多个列,用逗号隔开。
    * 对于已经包含重复值的属性列不可以增加唯一性索引
    */
    create unique index S_nn on student(graduation asc);
     
    /*创建聚簇索引(聚集)*/
    Create   clustered index stu on student(sage desc);
    /*
    * 聚簇索引的关键字为clustered,不是书上有误,而是sqlserver是这样
    * 同样,列名后面紧跟排序类型,可以有多个列,用逗号隔开。
    * 聚簇索引严格按照物理存储位置来排序。
    * 不可以在有主键的表中创建索引
    * 一个表只能创建一个聚簇索引
    */


二、删除索引


    /*注意:删除索引必须为表名+索引名*/
    drop   index   student.stu


sql查询


单表查询


简单的查询操作:


    --投影,select后边指明所选的列,from指明所访问的表
    select sno, sname, sdept
    from student;
     
    --选择指定的列,可以加算术表达式,并且为其添加新的属性名
    select sno, 2019-sage as birthday
    from student;
     
    --投影后,修改属性名
    select sno num, 2019-sage birthday
    from student;
     
    --*代表选中所有列
    select *
    from student;
     
    --除了int,smallint,其余的数据类型需要单引号
    select sname,2017 year
    from student;
     
    --字符串的拼接
    --5)查询全体学生的姓名、联系电话,并在前面加上字符串‘联系方式’
    select sname, 联系方式+tel
    from student;
     
    --select后加函数
    --count函数空值不计,重复值重复计
    --当count函数作用在全部列上时以元组计数
    select COUNT(sno)
    from student;
     
    --COUNT的含义是计数,*表示所有列,COUNT(*)表示元组数,某个或部分属性列为空值不影响count统计结果
    select COUNT(*)  
    from student;
     
    --去重,distinct作用域是整个元组,是所有指定列组成的元组的去重
    select distinct sno, cno
    from sc;
     
    --查询性别为女的学生的学号,姓名
    select sno, sname
    from student
    where ssex = 女;
     
    --查询学分为4学分的课程的名字
    select cname
    from course
    where ccredit = 4;
     
    --查询成绩在85分以上的学生的学号(学号不重)
    select distinct sno
    from sc
    where grade > 85;
     
    --查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。
    SELECT Sname,Sdept,Sage  
    FROM Student
    WHERE Sage BETWEEN 20 AND 23;
     
    --不能写成sdept=CS,IS,MA
    select sname,ssex
    from student
    where sdept=CS or sdept=IS or sdept = MA;
     
    --IS NULL, IS NOT NULL空值:只能用“is”,不能用“=”
    --WHERE NOT Sage > = 20;not必须在 sage前边,而不是> =前边
     
    select sname,ssex
    from student
    where sdept in (CS,IS,MA);
     
    --模糊查询
    --%任意长度,_单个字符,__表示两个或两个以内
    --转义字符\\,需要加escape \\标注
    select *
    from student
    where sname like 刘__;
     
    select * --如果字符中本身带有下划线,用任意字符当转义字符
    from Course
    where Cname like DB\\_%i_ _ escape \\;


order by子句:


    --order by子句
    --选择sno列,从sc表中,cno为3,按成绩降序给出
    --desc表示降序排列,asc表示升序排列,当缺省的时候表示asc
    --在SqlServer中当排序的属性列中存在空值的时候,升序排列默认空值在元组最先显示,desc(降序)空值元组在最后显示
    select sno
    from sc
    where cno = 3
    order by grade desc;
     
    --多属性列排序,首先按ccredit进行升序排列,当ccredit相等的时候,按cpno进行降序排列
    select *
  &n

    推荐阅读