SQL数据定义
数据库中的关系集合必须由数据定义语言(DDL)指定给系统。SQL的DDL不仅能够定义一组关系,还能够定义每个关系的信息,包括:
- 每个关系的模式
- 每个属性的取值类型
- 完整性约束
- 每个关系维护的索引集合
- 每个关系的安全性和权限信息
- 每个关系在磁盘上的物理存储结构
基本类型
- cahr(n):固定长度字符串,用户指定长度n,全称character
- varchar(n):可变长度的字符串,用户指定最大长度n,全称character varying
- int:整数类型,取值-2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647),全称integer
- smallint:取值-2^15 (-32,768) 到 2^15 – 1 (32,767) ,小整数类型
- numeric(p,d):定点数,精度由用户指定。有p位数字(一位符号位),d位数字在小数点右边
- real:浮点数
- double precision:双精度浮点数
- float(n):精度至少为n位的浮点数
- …
当比较两个char类型的值时长度不相同,会在比较之前自动在短值后面加上额外的空格保证长度一致
基本模式定义
定义SQL关系
用create table命令定义SQL关系
create table user
(id int,
name varchar(20) not null,
password varchar(20),
primary key(id));
foreign key(name) reference service);
部分完整性约束:
primary key(A1,A2…):构成关系主码
foreign key(A1,A2…)reference tableB:构成关系外码
not null:该属性上不允许出现空值
插入语句
如果关系中一调新插入或修改的元组在任意一个主码属性上有空值,或与其他元组相同,则SQL会标记一个错误,并阻止更新。
insert into user values(12345678,'zhangsan','123456')
删除元组或关系
从user中删除所有元组delete from r;
从数据库中去掉一个关系drop table r;
两者并不相同,前者仅是删除所有元组,而关系表还在,只是为空
修改属性语句
为已有的关系增加属性
r是现有关系的名字,A是待添加属性的名字,D是待添加属性的域
alter table r add A D;
为已有的关系删除属性
alter table r drop A;
SQL查询的基本结构
查询的基本结构由:select、from、where组成
- select子句用于列出查询结果中所需要的属性
- from子句是一个查询求职中需要访问的关系列表
- where子句是一个作用在from子句中关系的属性上的谓词
单关系查询
查找关系表中单个属性构成的关系select A from r;
- distinct:去除重复
select distinct A from r;
- all:显式指明不去除重复
select all A from r;
- 运算符:select子句可带有+、-、*、/运算符的算术表达式,运算对象可以是常数或元组的属性
select A*1.1,B,C from r;//属性A会是原来的1.1倍
- where:where子句允许使用逻辑连词and、or和not。逻辑连词的运算对象可以是包含比较运算符<、≤、>、≥、=和<>表达式
select A from r where B>100 and C=0;
- 查询所有的信息
select * from c;
- 查询满足条件的元组
(1)比较:
select * from sc
where not grade>90;
(2)确定范围:between
、not between
select * from sc
where grade between 60 and 100;
select * from sc
where grade not between 60 and 100;
(3)确定集合in
、not in
:
select * from sc
where grade in (60,70,80,90,100);
select * from sc
where grade not in (60,70,80,90,100);
(4)字符匹配:
查找指定的属性列值与<匹配串>相匹配的元组,可以是一个完整的字符,也可以含有通配符%和_。
通配符%:代表任意≥0的长度
比如a%b:代表以a开头,以b结尾的任意长度的字符串
通配符_:代表任意单个字符
比如a%b:代表以a开头,以b结尾的任意长度为3的字符串
select * from s
where sname like '李%';
(5)涉及空值的查询is null
、is not null
select sno,cno from sc
where grade is null;
(6)多重条件查询
用逻辑符号and
和or
来联结多个查询条件,and的优先级高于or,可以用括号改变优先级
select * from sc
where grade >=60 and grade<=100;
(7)对查询结果排序
使用order by
,升序:asc,降序:desc
排序值为空时asc:最后显示,desc:最先显示
select sno,grade from sc
where cno='003'
order by grade desc;
多关系查询
一个典型的SQL查询具有如下形式:
通常查询需要从多个关系中获取信息
select A1,A2,A3,...,An
from r1,r2,r3,...,rn
where P
通常来说,一个SQL查询的含义可以理解如下:
- 为from子句中列出的关系产生笛卡尔积
- 在步骤1的结果上应用where子句中指定的谓词
- 对于步骤2结果中的每个元组,输出select子句中指定的属性
示例:
用instruct与department两个关系表中dept
_name的取值作为匹配关系,查询instruct表中name=与department表中buliding的信息。
属性name和building只存在于一个关系中,不需要加前缀,而dept_name存在于两个关系表中,所以需要加前缀。
select name,instructor.dept_name,building
from instruct,department
where instruct.dept_name = department.dept_name;
需要小心设置合适的where子句条件,如果在上述例子中省略where子句条件,就会输出笛卡尔积,那是一个巨大的关系,且失去了对应关系一般并无意义。
参考书目
数据库系统概念(第六版)
译者:杨冬青 / 李红燕 / 唐世渭
出版社:机械工业出版社