author:QYX
数据定义语言(DDL):提供定义关系模式,删除关系,修改关系模式的命令
数据操纵语言(DML):SQL DML提供从数据库中查询信息,插入元组,删除元组,修改元组的能力
完整性:DDL包括定义完整性约束的能力,保存在数据库的数据必须满足所定义的完整性约束。破坏完整性约束的更新是不允许存在的
视图:DDL包括定义视图的命令
事务控制:SQL包括定义事务开始和结束的命令
嵌入式SQL和动态SQL:嵌入式SQL和动态SQL定义SQL语句如何嵌入到通用编程语言中
授权:DDL包括定义对关系和视图访问权限的命令
DDL能定义每个关系的信息:
1 每个关系的模式
2 每个属性的取值类型
3 完整性约束
4 每个关系维护的索引集合
5 每个关系的安全性和权限信息
6 每个关系在磁盘上的物理存储结构
基本类型
SQL定义了多种固有的数据类型
char 固定长度的字符串
varchar 可变长度的字符串
int 整数类型
smallint 小整数类型
numeric(p,d) 定点数 这个数有p位数字(加上一个符号位),其中d位数字在小数点右边
real,double precision 浮点数与双精度浮点数,精度与机器相关
float(n) 精度至少为n位的浮点数
空值:缺失的值,该值可能存在但并不为人知,或者根本可能不存在,我们应该避免空值的使用
char存放固定长度的字符串,例:属性A的类型是char(10),如果我们为该属性存入一个"AAA",那么该字符串会在后面追加7个空格来使其达到10个字符的长度
varchar相反,他不会追加
SQL也提供nvarchar类型来存放Unicode表示的多语言数据,很多数据库也允许varchar类型存放Unicode(采用UTF-8表示)
基本模式定义
create table 建表定义
primary key 主键,主码必须非空且唯一
foreign key 外键,外键声明表示关系中任意元组在属性(A1,A2,..)上的取值必须对应于关系s中某元组在主码上的取值 foreign key (xxx) references xxx(xxx)
not null 非空约束
unique 唯一约束
SQL禁止破坏完整性约束的任何数据库的更新
常用命令
delete from xxx
从表中删除数据
drop table xxx
删除表
alter table add A D alter table r drop A
更改表结构
A 为属性名,D为属性的域
SQL查询的基本结构
select from where 查询输入是在from子句中列出的关系
distinct 去除重复
select distinct dept_name from dept
all可以使用all来显式指定不去除重复(sql默认不去除重复)
select all dept_name from dept
where子句允许我们只选出那些在from子句的结果关系中满足特定谓词的元组
SQL允许在where子句中使用and or not,<= >= > <>
多关系查询
例
select name,dept.dept_name.age
from dept,department
where dept.ID=department.ID
为何我没在name和age中加入前缀呢
因为name和age都是只出现在一个关系中,因此不需要区分
select子句 where子句 from子句的作用如下
select子句用于列出查询结果中所需要的属性
from 子句是一个查询求值中需要访问的关系列表
where子句是一个作用在from子句中关系的属性上的谓词
执行顺序 from where select
笛卡尔积连接
select name,course_id
from dept,course
这种笛卡尔积会包含来自from子句中所有关系的所有属性,两个表的所有元组都要进行组合,这种笛卡尔积没有任何意义
一般我们使用where子句来限制笛卡尔积所建立的集合
select name,course_id
from dept,course
where deot,ID=course.ID
通常来说,一个SQL查询的含义可以理解为
1 为from子句中列出的关系产生笛卡尔积
2 在1的结果上应用where子句中指定的谓词
3 对于2结果中的每个元组,输出select子句中指定的属性
上述只是让各位明白一个SQL查询的结果应该是什么样的,而不是这个结果是这样被执行的,在SQL的实际实现中不会执行这种形式的查询,它会通过(尽可能)只产生满足where字符谓词的笛卡尔积元素来进行优化执行
自然连接
自然连接运算作用于两个关系,并产生一个关系为结果
自然连接只考虑属性相同且取值相同的元组对
select name,.course_id
from dept,course
where dept.ID=course.ID
可以使用自然连接改变为
select name,.course_id
from dept natural join course using (ID)
在实际中如果去掉using那么将考虑dept,course中所有属性相同且取值相同的元组对
而using指定了只需要匹配那些属性的取值即可
附加运算
更名运算
select name as new_name from dept
或
select name,.course_id
from dept as D,course as C
where D.ID=C.ID
字符串运算
SQL使用一对单引号来标示字符串,如果单引号是字符串的一部分,那么就用两个单引号来标示,如字符串"it' s right"可表示为"it '' s right" (注意不是双引号是两个单引号)
SQL标准中,字符串严格区分大小写(比如oracle),如oracle,'my'='MY'的结果是假的(false),但在一些数据库中(mysql或者sqlserver)则对于大小写的区分没有这么严格
SQL允许多种字符串函数,如|| 串联,upper(s) 转换大写 lower(s) 转换小写
like 匹配字符串
% 匹配任意字符串
_ 匹配任意一个字符
select name,.age
from dept
where dept_name like 'A%'
匹配dept_name以A开头的名字和年龄
如果%或者_也要运用要匹配中,则可以使用escape关键字来定义转义字符
select name,.age
from dept
where dept_name like 'A\%C%' escapes '\'
匹配dept_name以A%C开头的名字和年龄,使用escape定义\为转义字符
排列元组显示次序
order by asc(升序,默认) desc(降序)
select name
from dept
where dept_name='ADC'
order by name desc
between 关键字
select name
from dept
where age between 20 and 30
等价于
select name
from dept
where age <=20 and age >= 30
类似可以使用not between
集合运算
并运算
union intersect except,并 交 差(三者都是自动去重)
(select name
from dept
where dept_name='AAA')
union
(select name
from dept
where dept_name='BBB')
输出结果就是保护AAA和BBB的信息,union自动去重,如果想要保留就是要union all
(select name
from dept
where dept_name='AAA')
union all
(select name
from dept
where dept_name='BBB')
交运算
比如我们要找出2009和2010年同时开设的所有课程
(select course_id
from course
where course_year=2009)
intersect
(select course_id
from course
where course_year=2010)
结果就是2009 2010年都开设的课程
intersect也是自动去重,如果要保留重复数据,可以使用intersect all
(select course_id
from course
where course_year=2009)
intersect all
(select course_id
from course
where course_year=2010)
差运算
找出2009开课但2010没开的课程
(select course_id
from course
where course_year=2009)
except
(select course_id
from course
where course_year=2010)
except也是自动去重,如果要保留重复数据,可以使用except all
(select course_id
from course
where course_year=2009)
except all
(select course_id
from course
where course_year=2010)
空值
涉及空值的任何比较运算的结果视为unknown
null的运算
and
true and unknown 结果是unknown false and unknown结果是false unknown and unknown结果是unknown
or
true or unknown 结果是true false or unknown结果是unknown unknown or unknown结果是unknown
not
not unknowen结果为unknown
所以例如 1<null not(1<A)的结果都是unknown
判断是否为空值
is null is not null
select distinct时两个元组的属性都是空或者非空且值相同例如(1,null)和(1,null)则两个元组是相同的
注意这里的区分和上述的谓词中对待空值的处理不同,在谓词中null=null是unknown,而不是true
来源:https://www.cnblogs.com/qyx66/p/12235275.html