五个基本的关系代数操作

并、差、笛卡尔积、选择、投影

数据库语言四大类

DQL(DataQueryLanguage):数据库查询语言。

DDL(DataDefinitionLanguage):数据库定义语言。定义关系模式、删除关系、修改关系模式。

1.关系、属性

DML(DataManipulationLanguage):数据库操纵语言。插入元组、删除元组、修改元组。

2.元组

DCL(DataControlLanguage):数据库控制语言。用来授权或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果。

3.GRANT、revoke

4.commit/rollbackwork

完整性

实体完整性:要求每个关系(表)有且仅有一个主键,每一个主键值必须唯一,而且不允许为“空”(NULL)或重复。

1.主键

参照完整性:对于永久关系的相关表,在更新、插入或删除记录时,如果只改其一,就会影响数据的完整性。如删除父表的某记录后,子表的相应记录未删除,致使这些记录称为孤立记录。对于更新、插入或删除表间数据的完整性。

2.外键

自定义完整性

基础操作

1.创建关系








createtableinstructor2(idchar(5)notnull,namevarchar(20)notnull,dept_namevarchar(20)notnull,salarynumeric(8,2),primarykey(id));

结果如下:(可看出对属性进行了相关定义)

2.插入元祖

insertinto关系名values(每个属性对应的值):







insertintoinstructor2values(00001,'ai','math',2500.37);insertintoinstructor2values(00002,'la','math',3700.89);insertintoinstructor2values(00003,'bi','math',5400.45);insertintoinstructor2values(00004,'ma','english',1450.23);insertintoinstructor2values(00005,'ye','english',3421.34);insertintoinstructor2values(00006,'er','technology',10000.65);

结果如下:

3.删除所有元组

deletefrom关系名;

删除了元组,但关系和属性还存在。

4.删除关系

droptable关系名;

删除了关系,进行select查询时会出现关系名无效的错误。

5.属性操作

altertable关系名add新属性数据类型,新属性数据类型,⋯;


altertableinstructor2addfirstnamevarchar(20),lastnamevarchar(20);

altertable关系名drop属性,⋯⋯;


altertableinstructor2dropfirstname,lastname;

6.查询语句基础结构

select对应投影Π

from对应笛卡尔积

where对应选择σ

含义:

为from子句列出的关系产生笛卡尔积

在(1)的结果上应用where子句中指定的谓词(条件)

对于(2)中的元组,输出select子句中指定的属性




select*(属性1,属性2,)from关系名1,关系名2,where条件1and条件2and;




selectid,name,salaryfrominstructor2wheresalary4000;

结果如下:

7.去重操作(distinct)

对于一些属性来说,在某些元组中存在相同的值,有时我们需要对结果去重,得到正确答案。




selectdistinct属性名from关系名where条件

当我们想要查看系名时,多个老师可能位于同一个系,不去重将产生下列结果:

显然这不是我们想要的答案。我们只需要知道存在哪些系,而无需知道个数:

8.更名操作(as)

(1)优点

方便:长名字变短名字,便于书写语句。

同一关系笛卡尔积:区分属性。

(2)对属性

(3)对关系




select属性as属性别名from关系名where条件




select属性from关系名as关系别名where条件

属性别名




selectnameasinstructor_name,salaryfrominstructor2wheresalary3500;

结果如下:

关系别名




,,=;

结果如下:

9.字符串运算(like)

SQL使用一对单引号来标示字符串,例‘math’。

百分号(%):匹配任意子串

下划线(_):匹配任意一个字符




select属性from关系名where属性like'字符形式';




select*frominstructor2wheresalarylike'%0_.%';

结果如下:

10.显示次序(orderby)

默认升序:asc

降序:desc





select属性from关系名where条件orderby属性升序/降序;




select*frominstructor2orderbysalarydesc;

结果如下:

11.between⋯and⋯

属性值介于某个范围内




select*frominstructor2where属性名betweenand;




select*frominstructor2wheresalarybetween3000and6000;

结果如下:

12.分组聚集(groupby)

聚集函数:平均值(avg)、最小值(min)、最大值(max)、总和(sum)、计数(count)。

出现在select语句中但没有被聚集的属性只能是出现在groupby子句中的属性。

错误查询




selectdept_name,id,avg(salary)frominstructor2groupbydept_name;

结果如下:

13.having子句(出现groupby时使用)

有groupby时,select和having子句中出现的属性有所限制。

任何出现在having子句中,但没有被聚集的属性必须出现在groupby子句中。

正确查询





selectdept_name,avg(salary)asavg_salaryfrominstructor2groupbydept_namehavingavg(salary)3000

结果如下:

14.集合成员资格

in:测试元组是否是集合的成员

notin:测试元组是否不是集合的成员

in和notin操作符用于枚举集合。




select*frominstructor2wherenamenotin('ai','ye','er');

结果如下:







select*frominstructor2wherenamein(selectnamefrominstructor2wheresalary3000);

相当于两层for循环

结果如下:

15.集合的比较

some:至少比某一个要大

all:比所有的都大。

some、some、=some、=some、some

all、all、=all、all、all

=some等价于in,some并不等价于notin。

all等价于notin,=all不等价于in。

查询工资大于3000的教师姓名







select*frominstructor2wherename=some(selectnamefrominstructor2wheresalary3000);

结果如下:

查询工资小于等于3000的教师姓名







select*frominstructor2wherenameall(selectnamefrominstructor2wheresalary3000);

结果如下:

错误查询实例:查询工资小于等于3000的教师姓名







select*frominstructor2wherenamesome(selectnamefrominstructor2wheresalary3000);

结果如下:

分析:内层查询中只要有一条元组的salary3000并且name和外层查询name值不相等即可

查询工资大于3000的教师姓名







select*frominstructor2wherename=all(selectnamefrominstructor2wheresalary3000);

结果如下:

分析:内层查询中满足salary3000的所有元组的name都和外层查询name值相等才可以。

16.空关系测试(exists)

存在exists是相对于某一条元组,因而子查询中是select*。

查询在2009年秋季学期和2010年春季学期同时开课的所有课程








selectcourse_idfromsectionasSwheresemester='Fall'andyear=2009andexists(select*fromsectionasTwheresemester='Spring'andyear=2010_id=_id);

17.删除某些元组

从instructor关系中删除与‘math’系教师有关的所有元组



deletefrominstructorwheredept_name='math';

18.删除所有元组


deletefrominstructor;

19.删除的特殊情况

内层语句只有一条元组。删除工资低于大学平均工资的教师记录。









deletefrominstructor2wheresalary(selectavg(salary)frominstructor2);select*frominstructor2;

结果如下:

20.插入一些元组

insertinto关系名values(⋯);一次只能插入一条元组。

insertinto关系名selec查询语句可一次性插入多条。





insertintoinstructor2selectid,name,dept_name,18000fromstudentwheredept_name='math';

21.更新元组




update关系名set语句where条件;

只给工资低于7000元的教师涨工资。




updateinstructor2setsalary=salary*1.05;wheresalary7000;

给工资低的教师涨5%,大于7000的涨3%。






updateinstructor2setsalary=casewhensalary=7000thensalary*1.05elsesalary*1.03

荐:

【中国风动漫】除了《哪吒》,这些良心国产动画也应该被更多人知道!

声明