ch3-SQL

基本关系模式定义

create table命令定义SQL关系:

  create table r( A1 D1 , 
                    ..., 
                    An Dn,
                <完整性约束1>,
                    ...,
                <完整性约束k>);(分号结束)

r 是关系名,Ai是关系r模式中的一个属性名,Di是属性 Ai的域(即取值类型、范围)

SQL禁止破坏完整性约束的数据库更新,例如:

· 新插入的元组主码属性为空值、或取值与关系中的另一元组主码属性相同

· 新插入的student元组所在的dept_name未出现在department关系中,破坏外码约束

删除和修改表
Ø drop table student
//删除表和其中内容
Ø delete from student
//删除表里的内容,保留表(关系模式)
Ø alter table 增加、删除属性
    alter table r add A D
    • 其中A是要被添加到关系r的属性的名称,并且D是A的域
    • 关系中所有元组使用null作为新的属性值
    alter table r drop A 
    • 其中,A是关系r的属性的名称
    • 许多数据库都不支持删除属性,但是支持drop整个表
select子句
select * from instructor;
//选择所有内容
select distinct dept_name from instructor;
//消除重复内容,找出所有教师所在的系名,并且结果中没有重复的名字
select all dept_name from instructor;
//不消除重复,选择所有教师的系名
自然连接

自然连接结果=共同属性+第一个关系属性+第二个关系属性

例如:select * from instructor natural join teaches;

更名运算

例:找出满足下面条件的所有教师的姓名,他们至少比某一个Comp.Sci.系教师的工资要高

select distinct T.name
from instructor as T,instructor as S
where T.salary > S.salary and S.dept_name =‘Comp. Sci.’

关键字as是可选的,可以省去 instructor as Tinstructor T

字符串运算

like运算符可实现模式匹配,模式匹配用两个特殊的字符来表示:

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

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

SQL字符串用单引号;关系代数字符串用双引号

select name
from instructor
where name like ‘%dar%’;

当匹配模式中含有特殊字符(如”%”、”_”、”\”)时,须使用转义字符(通过escape定义)

like ‘100\%%’ escape ‘\’;
//匹配“100%”开头的字符串
排列元组的显示次序

使用order by,可以用 desc 表示降序,使用 asc 表示升序;默认使用升序,排序可以在多个属性上进行

集合运算

或:union

(select course_id  from section where sem = ‘Fall’ and year = 2009)
union
(select course_id  from section where sem = ‘Spring’ and year = 2010)
//找出在2009年秋季开课,或者在2010年春季开课或两个学期都开课的所有课程id号

与:intersect

(select course_id  from section where sem = ‘Fall’ and year = 2009)
intersect
(select course_id  from section where sem = ‘Spring’ and year = 2010)
//找出在2009年秋季和2010年春季同时开课的所有课程id号

非:except

(select course_id  from section where sem = ‘Fall’ and year = 2009)
except
(select course_id  from section where sem = ‘Spring’ and year = 2010)
//找出在2009年秋季学期开课但不在2010年春季学期开课的所有课程id号

以上三种运算将自动消除冗余,如果要保留需要使用union all, intersect allexcept all

空值

涉及空值的任何比较运算的结果返回unknown

在count时空值按0计算

分组聚集

having子句中的谓词在形成分组之后才起作用,因此可以使用聚集函数

select dept_name, avg (salary)
from instructor
group by dept_name
having avg (salary) > 42000;
//找出所有教师平均工资超过 42000 美元的系的名字和平均工资
嵌套子查询

select,from,where后面可以跟子查询

innot in后面跟select子句

数据库的修改

删除:delete

delete from instructor
where dept_name in (select dept_name
        from department
        where  building =‘Watson’);
//删除所有在位于Watson大楼的系工作的教师
delete from instructor
where salary < (select avg (salary) 
           from instructor);
//删除工资低于大学平均工资的教师记录

当删除时涉及计算,会因为元组被删除导致计算结果出现问题

SQL解决方案:

1.首先,计算平均工资,找出并标记需删除的元组

2.然后,删除需删除的元组 (无需重新计算平均值或重新测试元组)

插入:insert into values

更新:update

update instructor
    set salary = case
        when salary <= 100000 then salary * 1.05
        else salary * 1.03
    end
//给工资超过$100,000的教师涨3%的工资,其余教师涨5% 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值