3.1简介
1. SQL是由IBM开发的,原名Sequel,是20世纪70年代IBM的System R项目的一部分。SQL——StructuredQuery Language
2. 86年ANSI 和ISO发布了SQL-86,后面又有SQL-89SQL-92,SQL:1999,SQL:2003,SQL:2006, SQL:2008.
3. SQL由如下几部分组成:
a) DDL
b) DML
c) Integrity ,用于定义引用完整性约束。
d) 视图定义命令
e) 事务控制命令
f) 嵌入式SQL或者动态SQL
g) 授权命令
3.2DDL
4. DDL可用于定义关系及其相关属性:
a) 关系的方案
b) 各个属性的类型
c) 约束
d) 索引
e) 安全信息和授权、认证信息
f) 各个关系在磁盘上的物理存储结构
3.2.1常用类型
5. char(n), varchar(n),int,smallint,numeric(p,d),real,double,float(n),nvarchar
6. char长度不足时会补空白,进行字符串比较时不方便。尽量使用varchar
3.2.2常用方案定义语句
7. createtable r
(A1 D1,
A2 D2,
. . . ,
An
Dn
,
integrity-constraint1,
. . . ,
integrity-constraintk);
8. 常用约束:primary key ,foreign key , not null
9. createtable instructor
(ID varchar (5),
name varchar (20) not null,
dept name varchar (20),
salary numeric (8,2),
primary key (ID),
foreign key (dept name) references department)
10. insert intoinstructor
values (10211, ’Smith’, ’Biology’, 66000);
11. delete fromstudent;
12. drop table r;
13. 增、删属性
alter table r add A D; alter table r drop A;
3.3基本的查询语法
14. 查询由三部分组成:
15. Select、from、where
16. 显式地不去重的查询用all
17. select all dept name
from instructor;
18. SQL语句的结构:
19. select A1, A2, . . . , An
from r1, r2, . . ., rm
where P;
20. Ai 是属性名,ri是关系名,P是谓词,如果省略where子句,则谓词默认为true
21. 理解SQL语句可按照这个顺序:from where select
22. From子句会对列出的关系求笛卡尔积,得到的关系中包含输入的关系中的全部属性,多个关系中同名的属性用关系名区分。求笛卡尔积时,一个关系中的元组会与另一个关系中的全部元组进行连接。
23. 理解SQL语句得到结果的过程:
a) 对from子句中列出的关系求笛卡尔积
b) 使用where子句中的谓语过滤第一步求得的关系
c) 对第二步得到的每一个元组,输出select子句中列出的属性。
24. 上面的顺序不是SQL语句真正的执行顺序。真正执行的时候会进行优化,只对那些能满足Where条件的元素求笛卡尔积。
25. 写查询语句时如果不写where条件,会直接输出整个笛卡尔积。如果两个关系各有100个元组,他们的笛卡尔积就有10000个元组。
3.3.3自然连接
26. 连接两个关系的方式有许多种,一种是前面提到的先求笛卡尔积,然后使用谓词进行过滤,另一种较为常用的是自然连接:如果两个关系中有同名属性,则只有两个元组的同名属性的值相同时才会连接。
27. 在笛卡尔积中同名属性会出现两次,分别以两个关系名前辍,自然连接中同名属性只出现一次。
28. 同一个查询分别用笛卡尔积连接和用自然连接实现
29. select name, course id
from instructor, teaches
where instructor.ID= teaches.ID;
30. select name, course id
from instructor naturaljoin teaches;
31. 自然连接可以串起来用
32. from r1 natural join r2 natural join . . . naturaljoin rm
33. 对特定属性作自然连接 :
34. select name, title
from (instructor natural join teaches) join course using (course id);