SQL基础

数据定义语言

基本类型:

    char(n):固定长度的字符串   若属性A类型为char(10),并存入“Avi”,在此字符串后会追加7个空格  ,当比较2个不同长度的char类型的字符串时会在短值后面加空格

    varchar(n):可变长度的字符串,n为指定最大长度,推荐使用

    int:整数类型

    smallint:小整数类型

    numeric(p,d):定点数,这个数有p位数字,小数点后有d位   numeric(3,1)可以 精确存储33.3

    real,double precision:浮点数与双精度浮点数,精度与机器相关

    float(n):精度至少为n位浮点数


完整性约束:

     主码约束primary key(A1,A2,A3...):表示属性A1,A2,A3...构成关系的主码,必须非空且唯一

     外码约束foreign key(A1,A2,A3...) references s:表明关系中任意元组在属性A1,A2,A3...必须对应于关系s中某元组在主码属性上的取值,防止该属性取到不存在的值

      举例: 

    

     非空约束not null:表明在该约束上不允许空值

sql禁止破坏完整性约束的任何更新


delete from student;

删除student关系中的所有元组,仅仅删除元组

drop table student;

从数据库中删除关于被去掉关系的所有信息,不仅删除student中的所有元组,还删除关系

alter table r add A D为已有关系增加属性,关系中所有元组在新属性上的取值被设为null

alter table r drop A从关系中去掉属性

sql查询的基本结构

select distinct dept_name from instructor  

distinct删除重复元组,select语句默认保留重复元组,等同于all


自然连接natural join:只考虑在2个关系模式上都出现的属性上取值相等,则匹配,

输出结果2个关系模式上都出现的属性上只出现一次


当2个关系模式上,都出现的属性有多个的时候可能会产生危险

为避免不必要相等属性带来的危险,sql提供了另一种自然连接的方式join...using

join...using当2个关系模式上,都出现的属性有多个的时候,可以指定那些属性匹配


as子句 更名运算 既可出现在select子句中,也可出现在from语句中



mysql默认在比较字符串时不区分大小写


字符串上可以使用like操作符来实现模糊匹配,模式是大小写敏感的

%:匹配任意字符

_:匹配任意一个字符

‘%comp%’匹配任何包含'comp'子串的字符串



在like比较运算中使用escape关键词定义转义字符,转义字符表示特殊字符被当成普通字符


使用not like比较运算符搜索不匹配项

'*'可以用在select子句中表示所有属性

order by 定义元组的排列顺序,默认升序,desc降序,asc表示升序


where子句谓词

between/not between比较运算符



sql允许我们用记号(v1,v2,v3...,vn)来表示一个分量值v1,v2,v3..的n维元组,在元组上可以运用比较运算符


集合运算

并运算union    交运算intersect      差运算except

集合运算前提是具有相同的属性,属性个数,以及属性对应位置相同  

结果默认去除重复  ,若要保留重复元组,在关键词后 加all


逻辑值分为true,false,unknown  布尔运算and,or,not

如果where子句谓词对一个元组计算出false或unknown,那么该元组不能被加入到结果集中

谓词中对待空值的方式"null=null"会返回unknown,而在元组中当比较2个元组的对应属性时,当2个值都是非空并且值相等或者都是空,那么他们是相同的


聚集函数

是以值的一个集合为输入返回单个值的函数

平均值avg,最小值min,最大值max,总和sum,计数count

使用select cout(*) from course计算元组的个数    cout(*)中不能使用distinct

group by分组聚集,将聚集函数作用到一组元组集上,在group by子句中所有属性上取值相同的元组将被分在一个组中,任何没有出现在group by子句中的属性如果出现在select中,它只能出现在 聚集函数内部


having子句 该条件不针对单个元组,而是针对group by构成的分组,having子句在形成分组后才起作用

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


除了count(*)外所有的聚集函数都忽略输入集合中的空值,但规定空集的count运算为0,而其他所有聚集运算输入为空集时返回一个空集

嵌套子查询

in/not in


也可用于枚举集合


也可用于测试任意关系


=some等于in 然而<>some不等于not in

<>all等于not in 然而=all不等于in


exists可测试一个子查询中是否存在元组



重复性元组存在性测试 unique/not unique


from子查询


子查询的结果属性可以在外层查询中使用

一般from子句中的子查询中不能使用来自from子句其他关系的相关变量,如果子查询用lateral作为前缀则可以访问


with子句

提供定义临时关系的方法,只对包含with子句的查询有效


查出所有工资总额大于所有系平均工资总额的系

标量子查询

该子查询只返回包含单个属性的单个元组


数据库的修改

delete删除,只能删除整个元组,不能只删除某些属性上的值

delete from r where p;首先从r中找出所有使p为真的元组,然后把他们从r中删除,如果省略where,则r中所有元组将被删除


delete首先测试instructor关系中的每一个元组,然后删除所有符合条件的元组


insert 插入

插入单个元组



  在查询结果的基础上插入元组集

在执行插入之前先执行select语句


若待插入元组中只给出了模式中部分属性的值,那么其余属性被赋为空值


update更新


首先检查关系中的所有元组,看他们是否应该被更新,然后才执行更新,省略where将对所有的元组进行更新

case结构,可避免更新次序引发的问题

等同于

case结构




运用标量子查询执行更新操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值