“In 1986, the American National Standards Institute (ANSI) and the International Organization for Standardization (ISO) published an SQL standard, calledSQL-86. ANSI published an extended standard for SQL, SQL-89, in 1989.
The next version of the standard was SQL-92 standard, followed by SQL:1999, SQL:2003, SQL:2006,and most recently SQL:2008.
The bibliographic notes provide references to these standards.”
标准是企业竞争的制高点
Data-definition language ——DDL | 数据定义(描述)语言。提供了定义关系模式、删除关系和修改关系模式的命令。 |
---|---|
Data-manipulation Language ——DML | 数据操作语言,提供了从数据库:查询、插入元组、删除和修改元组的功能 |
Integrity | 完整性,The SQL DDL包括了用于指定存储在数据库中的数据必满足完整性约束的命令。不允许违反完整性约束的更新。 |
View definition | SQL DDL包括用于定义视图的命令 |
---|---|
Transaction control | 事务控制,指定事务的开始和结束。 |
Embedded SQL and dynamic SQL | 嵌入式和动态SQL定义了如何在通用编程语言(如C、c++和Java)中嵌入SQL语句 |
Authorization | SQL DDL包括用于指定对关系和视图的访问权限的命令 |
SQL DDL, 不只可以指定关系(relations)集,还可以指定每个关系的详细细信息 :
类型 | 说明 |
---|---|
char(n) | 用户指定长度为n的固定长度(fixed-length)字符串,若输入不足n个字符,会用空格补全。所以char(n)类型的变量,长度永远是n |
varchar(n) | 一个由用户指定的最大长度n的 可变长度(variable-length) 字符串,若输入不足n个字符,无碍。不会像上面的类型用空格补全。 |
int | 一个整数(依赖于机器的整数的有限子集)。 |
smallint | 短整型 |
numeric(p, d) | p代表整数位加小数位的总位数, d代表小数位数 |
real, double precision | 双精度实数,浮点数和双精度浮点数与机器相关的精度 |
float(n) | 一种精度至少为n位的浮点数 |
… |
空值NULL:
每种类型都可以包含。
表示可能存在,但未知,或根本不存在的缺失值。
在某些情况下,我们可能希望禁止输入空值
一般原则
在数据库中创建一个关系部门
create table department (dept name varchar (20), building varchar (15), budget numeric (12,2), primary key (dept name));
create table命令的一般形式
create table r (A1 D1, A2 D2, ..., An Dn, (integrity-constraint1), ..., (integrity-constraintk )); /* r is the name of the relation n each Ai is an attribute name in the schema of relation r n Di is the data type of values in the domain of attribute */
和c/c++语言类似,分号; 表示一条语句的结束
Integrity Constraints in Create Table
create table instructor ( ID char(5), name varchar(20) not null, dept_name varchar(20), salary numeric(8,2), primary key (ID), foreign key (dept_name) references department);
primary key declaration on an attribute automatically ensures not null
属性上的主键声明自动确保不为空
create table course ( course_id varchar(8) primary key, title varchar(50), dept_name varchar(20), credits numeric(2,0), foreign key (dept_name) references department) );
主键声明可以与属性声明相结合
新创建的关系最初是空的。
可以使用insert命令将数据加载到关系中。
insert into instructor values (10211, ’Smith’, ’Biology’, 66000);
使用delete命令从关系中删除元组
delete from student;
用来从数据库中删除 所被删除关系的所有信息。
这个所有信息,包括表本身。
比 delete更加猛烈(drastic)
drop table r;
所以,drop r后, 除非用create table命令重新创建,否则不能将元组插入到r中
向现有关系添加属性
alter table r add A D;
从关系r中删除属性A
alter table r drop A;
许多数据库系统不支持删除属性,但允许删除整个表
select name from instructor where dept name = ’Comp. Sci.’ and salary > 70000;
查询将from子句中列出的关系作为输入,
可以多个关系作为输入,
按照where和select子句中指定的方式对它们进行操作,
在where子句中,可以使用逻辑连接词和and、或or、和否not
同样,比较运算符 <, <=, >, >=, =, <>
where 子句还有很多用法。逐步介绍…
然后生成一个关系作为结果
找到所有有教员的系名,并删除重复的
select distinct dept_name from instructor
默认是不去重的。所以select语句没有distinct关键字,默认不去重
那之所所以默认不去重,
是因为: 去重操作消耗系统资源、用户或许需要看到重复信息
关键字all指定不删除重复的。(当然,不用all也是等效的)
select all dept_name from instructor
select子句还可以包含算术表达式: + - * /
select ID, name, dept name, salary * 1.1 from instructor;
这显示了如果我们给每位教师加薪10%的结果;
注意,它不会导致任何改变教员关系
星号 * (asterisk),代表所有属性
select * from instructor
下图是关系Sailors
选择rating > 8的元组
SQL中,有若干类似英语自然语言的保留字,
人性化,改善用户界面,
为自然语言查询作的伏笔.
这是SQL在竞争中获胜的原因之一。
如下,列出loan表中,amount在90000到100000之间的loan-number
select loan-number from loan where amount between 90000 and 100000 -- 闭区间[90000,100000]
“The from clause by itself defines a Cartesian product of the relations listed in the clause.
It is defined formally in terms of set theory, but is perhaps best understood as an iterative process that generates tuples for the result relation ofthe from clause”
可以简单的把from理解成一个迭代的过程,一个循环
from 子句的伪码解释:
for each tuple t1 in relation r1 for each tuple t2 in relation r2 ... for each tuple tm in relation rm Concatenate t1, t2,..., tm into a single tuple t Add t into the result relation
对于上面伪码最后得到的result relation
查找计算机科学系教师的教师姓名和课程标识符
select name, course id from instructor, teaches where instructor.ID= teaches.ID and instructor.dept name = ’Comp. Sci.’;
执行顺序如下:
- 生成from子句中列出的关系的笛卡儿积
- 对步骤1的结果应用where子句中指定的谓词(predicates)。
- 对于步骤2结果中的每个元组,输出select子句中指定的属性(或表达式的结果)。
此外,如果忽略/注释了where子句,那么返回一个from的两个表的笛卡尔积表,
很大哟