关系型数据库之SQL

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‘开头的字符串 

猜你喜欢

转载自blog.csdn.net/zyhmz/article/details/80908050