1,sql概述与数据库定义
其中,grant为授权,revork为撤销授权.
这里的n表示的是字节数.
一般一个汉字,占两个字节.所以用char(2)表示性别.
这里的表名,就是前面说的S表(学生表之类),列名就是说,其中的一个属性.
实体完整性约束,就是主键.有两种方式定义主键.
上图为第一种,直接在一个属性后面写上primary key.(使用列级完整性约束)
第二种是,使用表级完整性约束.使用如下形式
这里还可以看到,sql语句中一句话结束是用;表示,在一句话中的多个属性是用,隔开.
参照完整性约束,就是指这个属性的值只能来自于对应外表的属性域(1到100),这个属性的取值就不能是101.
这里对于sc(sno,cno,grade)表,sno,cno为外码
我们可以写成create sc(sno char(10) references s(sno)
如果用表级约束条件就在最后写
foreign key(sno) references s(sno)
foreign key(cno) references c(cno)
这里使用mysql来测试简单的命令.首先需要在服务中打开mysql的服务项.
也可以用cmd命令来做.最上面一行为登录命令.下面先来介绍mysql的基本操作.
首先配置,大多数的编码都是用utf-8的形式,只有保持一致才会不出现乱码
所以需要将配置文件(my.int)中的gbk,改为utf8
在此路径下,D:\Program Files\MySQL\MySQL Server 5.5,
添加这两句.
重启服务之后,就都为utf-8了
启动mysql服务,用net srart mysql,可能因为权限不够,无法启动.登录mysql,会发现前面的-u后的root其实是用户名.-p是密码
-h是服务器名称,
exit,quit,\q都可以用来退出
这里的–prompt是命令提示符.
这里的on delete cascade表示如果删除了s表中的3003,那么sc表中的3003也会被删除.
ondelete set null,表示不删除,但是将参照关系的相应属性置为空值.
这里的说的都是限制条件,与主码与外码在同一位置(数据结构后面),并且not null unique 可以等同于主键的效果.
这里对于check函数,我们可以规定一个属性的取值范围,将他放在列级完整性约束条件位置.
我们还可以规定两个属性之间的关系,这时候就需要在表级完整性约束条件位置,添加check命令.
这就是代码实现过程.
前面两个没有问题.第三个是关系表.是一个多对多关系,这里用复合主键,注意复合主键只有如上一种规定模式.还要规定其外码.
numeric(6,2)整数位为6,小数位2.这里我们如果设置s表与sp表中sno长度不一样,可以运行,但是会有问题.
注意,外键也可以如上形式写在,逗号前,就不需要foreign key.这个例子就将很多东西联系在一起.
我们用表如何来存储实体,还有用表如何来存储实体之间的联系.
如上图例子,这里需要注意,首先属性名是不需要加’ ‘的,表示汉字的值的时候才要加’ ’ 如性别=’ 男’,这时候要加.
其次,check前应该要加个,逗号.
这里介绍三种修改表的操作,
(1)添加一列,需要指明增加的属性的数据类型,和约束条件.
(2)丢弃掉完整性约束,如第三句话,就为check约束取名为c_cno
(3)修改某一属性的数据类型.删除表操作,表示删除了基本表,就是不再是数据库模式的一部分了.
需要清楚,建立索引是在物理上进行,改变的是内模式.
cluster 一个索引可能对应一个组.
注意select语句后的横线上的属性组,需要与视图名()内的属性组相同.
另外注意前面用as来连接两部分.这里的子查询中(select)一般不包含order by和distinct
第二条,表示检查更新.
第三条,意思是视图名后面的()可以省略,省略之后由select语句的主属性来决定,但是考试中还是写着吧.
这里编写程序的时候注意,cs需要’cs’,表示值.另外视图名后的括号别省略.
视图对应于外模式.
所以说,表,索引,视图就表示三级结构,所以删除他们都用drop.都是大层面上的删除.
这道题的允许员工在多家公司工作,意思是员工与公司是多对多关系,这时候,我们就需要将两者联系,放在一张表中存储.
如果是员工只在一家公司工作.那么员工就决定公司了,也就不需要cno这个属性来作为主码了,只需要将他作为外码.
但是有了这句话,就需要(sno,cno)作为主码.
这里主键只能在最后定义,并且一定要加(),另外这里check后面salary也要写出来.不能光写>=1500
这里可以看到,视图后面的()中不需要加来自哪张表,这里决定的是视图的属性名是什么.
下面的select语句,如果在from后面的表中有重名属性,就需要指定,重名属性来自哪张表.2,数据操作
首先有all,和distinct(不同值)可选,
目标列表达式是指,sno(直接一列),或者(基本工资+奖金)形式
会发现,现在好像还缺少向表中插入数据行的指令.前面的alter table ()add 语句一般为空白列.
group by选项在做的事情如:按学号分组,来求一个学生的平均分,按课程号分组,来求一个课程的每个学生的平均分.
having作用是对分组之后的数据进行筛选,如:求平均分为85分以上的学生.
order by关键字是排序.asc为升序(默认),desc为降序.
注意不等于写为<>
这里的select相当于投影,而where相当于选择.
注意这里的重命名操作,对列和对整个表都重命名.注意,需要用重命名之后的名称,不能用s,sc了.这里很有可能select语句结果不会改变基本表.
这才是改变基本表名称的操作.
这里是连接查询操作.
对于select * from s,sc;这一语句其实是做s,sc的笛卡尔积.
题上(1)的这两句,实际上是笛卡尔积再进行投影.最后加上where进行选择,实现连接过程.会发现它并不是自然连接.这里(2)是多张表进行连接
(3)是自己与自己进行连接.
这些本质上都不是自然连接,但是经过了投影选择,所以结果相当于自然连接.
这里我们将前面的多个查询,分解为子查询.
这里in后面的语句,返回的是一个集合.然后去查看sno是否在这个集合中.注意这里将in后面的select sno改成select *
就查找不到,因为sno当然不在结果集合中.
这个不存在和not in 相似,区别在于not exists前面没有属性名,它是在让where后面的表达式为真.这道题中就是让(select语句结果为空.)当cno值为c4,c5,c6,c7时,后面的查询语句结果为空.notexists就为真.
简单来说,就是子查询的结果不存在.关键在子查询中的表达式.
可以看到这两个函数非常相似.区别只在语句中.通俗来说,in用属性值来决定是否取这一行,而exist 用true来决定,是否取这一行.
如何判断用in还是exist?
首先,前面的属性值一个有一个没有
其次,子查询中如果是 星号,那么就是exist.当然exist的子查询也可以是属性.
这里注意count(*),与count(列名)的区别(不计算空值),以及其中的all和distinct参数表示是否计算重复的值.
需要这样用聚集函数.
这里的聚集函数需要加在属性前,不可以像all一样加在选出来的列前.