SQL最早的版本是由IBM开发的,它最初被称为Sequel。Sequel发展至今,其名称已经变为SQL(结构化查询语句)。现在的关系型数据库产品基本支持SQL语言,SQL已经明显地确立了自己在作为标准的关系型数据库语言的地位。
完整性约束
create table department
( dept_name varchar(20),
building varchar(20),
budget numberic(12,2),
primary key(dept_name));
)
所以create_table 命令的通用形式是:
create_table table:
(
A1,D1,
A2, D2,
......
An, Dn,
<完整性约束1>,
......
<完整性约束2>
);
SQL支持许多不同的完整性约束,我们来看看其中几种简单的约束,主键约束,外键约束,非空约束:
primary key(A1,A2,A3,A4,A5): primary-key 声明表示属性A1,A2,A3,A4,A5构成关系的主码。主码属性必须非空且唯一,也就是说没有一个在主码属性上取空值,关系中也没有两个元组在所有主码属性上取值相同。
foreign key(A1, A2, A3, A4, A5)reference: foreign key 声明表示关系中任意元组在属性(A1, A2, A3, A4, A5)上的取值必须对应于关系s中某元组在主码属性上的取值。
not null: 一个属性上的not null约束表明在该属性上不允许空值。换句话说,此约束把空值排除在该属性域之外。
insert,delete,drop,alter
首相看看insert的用法,这个命令可帮助我们将书数据加载到关系中,比如:
inster into instructor
values (10211,‘paul‘ ‘math‘,40000 )
其次是drop和delete的区别
drop table r , 这个语句是从数据库中删除掉r的所有信息,包括逻辑设计
delete table r,这个语句保留了关系r,但是删除全部的元组
其次是alter命令, 这个指令为已有的关系增加属性,:
alter table r add A D;
alter table drop A;
但是很多数据库系统并不支持去掉属性,尽管它们允许去掉整个表。
单关系查询
先来一个最简单的查询,那就是从关系中找出所有的名字:
select name
from instructor
但是某些名字是重复的,我们想去重,我们可以将上述查询语句重写为:
select distinct name
from instructor;
select还可以带含有加减乘除等算术表达式,算术的对象可以是常数或者是元组的属性,但是这并不会导致我们instructor关系的任何改变。
select ID,name,dept_name,salary * 1.1
from instructor;
where子句允许我们只选出那些在from子句的结果关系中满足特定谓词的元组。我们考虑查询“所有在Computer Science 系并且工资超过70000美元的教师的名字“,该SQL语句可以写为:
select name
from instructor
where dept_name = 'Comp.Sci' and salary > 70000;
SQL允许在where子句中使用逻辑连词and, or 和 not。逻辑连词的运算对象可以是包含比较运算符 <, <=, >, >=, = 和 <>的表达式。
多关系查询
在我们前面的示例中,我都是只对单关系表进行查询。但是在我们日常对工作中,通常需要对多表进行查询。比如说:找出所有教师的姓名,以及他们所在系的名称和系所在建筑的名称。
select name, instructor.dept_name,builiding
from instructor, building
where instructor.dept_name = department.dept_name
在instructor中,其外键是dept_name, 被参照关系为department。
所以在这里,我们要可以一种更通识的方式去记忆:
1. 为from子句中列出的关系产生笛卡尔积。什么是笛卡尔积呢?通俗一点讲,就是将两张关系的全部元组遍历合并为一张大表。
2. 在步骤1的结果上应用where子句中指定的逻辑。
3. 对于步骤2结果中的每个元组,输出select子句中指定的属性(或者表示式的结果)
自然连接
自然桥接的运算也是作用于两个关系,并产生一个关系作为结果。在笛卡尔积上,是将第一个关系的每一个元组和第二个关系的所有元组都进行连接,但是自然连接只是考虑那些在两个关系模式上中都出现的的属性,并且其属性的值都相同的元组对。自然连接可以帮助我写出更简洁的sql语句:
select name, course_id
from instructor, teaches
where instructor.ID = teaches.ID
自然连接可以帮助简化语言:
select name, course_id
from instructor natural join teaches;
更名运算
有时候,我们可以想用instructor_name来代替属性名name:
select name as instructor_name, course_id
from instructor, teaches
where instructor.ID = teaches.ID
as 子句有时候在重命名关系中特别有用,重命名关系的一个原因是把一个长的关系名替换为一个短的,这在查询的其他地方使用起来就更加方便了,我们来写一个查询“对于大学中 所有讲授课程的的教师,找出他们的姓名以及所讲述的的所有课程标示“:
select T.name , S.course_id
from instructor as T, teaches as S
where T.ID = S.ID
字符串运算
字符串串联拼接:s || a
字符串大小写转换:uppper(s), lower(s)
去掉字符串后的空格: trim(s)
使用like操作符实现模式匹配:
- 百分号(%)可以匹配任意字符串
- 下划线(_) 匹配任意一个字符
这些运算符号可以进行一些组合,达到我们所期望的模式匹配,下面来举一些例子
‘Intro%‘ 可以匹配任意以Intro打头的子串
‘%Comp%‘可以匹配任何以包含‘Comp‘子串的字符串
‘__‘匹配只含三个字符的字符串
‘_%‘匹配至少含三个字符的字符串
在SQL中我们可以用运算比较符like来表达模式,我们可以考虑‘找出所有建筑名称中包含子串‘Waston‘的所有系名‘:
select dept_name
from department
where building like '%Waston'
我们还会在like比较运算符中使用escape关键词来定义转义字符:
like 'ab\%cd%' escape '\' 匹配所有以‘ab%cd‘开头的字符串