夜间模式暗黑模式
字体
阴影
滤镜
圆角
主题色
数据库学习笔记(二)SQL初级

SQL(Structured Query Language 结构化查询语言)共分为四大类:

  1. DQL(数据查询语言)
  • SELECT FROM WHERE
  1. DML(数据操纵语言)

    • 插入:INSERT
    • 更新:UPDATE
    • 删除:DELETE
  2. DDL(数据定义语言)

    创建数据库中的各种对象

    • CREATE TABLE/VIEW/INDEX/SYN/CLUSTER 创建表/视频/索引/同义词/聚簇
  3. DCL(数据控制语言)

    设置数据库权限、控制数据库操纵事务发生的时间及效果等

    • 授权:GRANT
    • 回滚:ROLLBACK
    • 提交:COMMIT

DDL

这里我们只讨论对的定义,即CREATE TALBE。这其中包括:每个关系的模式,每个属性的取值类型,完整性约束,每个关系维护的索引集合,每个关系的安全性和权限信息等。

数据类型

  • char(n):定长字符串,不足补空格
  • varchar(n):变长字符串(最大长度为n)
  • int:整型
  • smallint:小整型
  • numeric(p,d):定点数,保存p位数字,其中n位小数
  • real, double precision:浮点数与双精度浮点数
  • null:所有数据类型的缺省值

CREATE TABLE示例

create table 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);

DML

INSERT

将元组添加到关系中

insert into instructor
values (10211, ’Smith’, ’Biology’, 66000);

insert into instructor
select from where -- 查询后插入

DELETE

将元组从关系中删除

delete from r where P -- P是谓词
delete from instructor -- 删除instructor中所有元组

DROP

将关系从数据库中删除

drop table instructor

ALTER

为已有关系增加属性

alter table instructor add A D -- A为待添加属性的名字,D为属性的域

UPDATE

改变部分属性的值

update instructor
set salary = salary * 1.05
where salary < 70000

DQL

基本结构

select attribute(s)
from table(s)
where condition(s)
  • 去重查询:select distinct ...

  • select子句可带有含四则运算的算术表达式,如select salary*1.1

  • from子句中的多个表为这些表的笛卡尔积

  • where 子句可使用逻辑连接词and,or,not以及=,<,<=,>=,>,<>以及between ... and ...

  • *表示选择所有的属性

  • 可以使用A as B将属性A更名为B(临时性的),便于区分不同表中的同名属性

NATURAL JOIN

自然连接不同于笛卡尔积,它只考虑在相同属性上取值相同的元组对进行连接

select name
from instructor natural join teaches

JOIN … USING

natrual join的一种改进,指定取值必须相同的属性

select name
from instructor join course using (course_id)

字符串

  • 字符串使用引号表示
  • %:匹配任意子串;_:匹配单个字符;\:转义字符
where building like '%Watson%'

集合运算

集合运算的对象为关系

  • union:并(自动去重);union all:并(不去重)
  • intersect:交(自动去重);intersect all:交(不去重)
  • except:差(自动去重);except all:差(不去重)
(select course id
from section
where semester = ’Fall’ and year= 2009)
union
(select course id
from section
where semester = ’Spring’ and year= 2010)

关于null

  • null做算术运算结果为null
  • null做比较运算结果为unknown
  • null做布尔运算结果为true,falseunknown

聚集函数

输入集合,输出单个值。

  • 包含avg,min,max,sum,count
select avg(salary)
from instructor
  • 除了count(*)所有的聚集函数均忽略null;除了count(*)所有的聚集函数在空集时输出null。
分组聚集—-group by

将聚集函数作用在一组元组集上而非单个元组集上。

  • 任何没有出现在group by子句中的属性如果出现在select子句中,则它只能出现在聚集函数内部
select dept_name, avg(salary) as avg_salary
from instructor
group by dept_name
having

对分组限定条件。

select dept_name, avg(salary) as avg_salary
from insttrctor
group by dept_name
having avg(salary) > 42000

嵌套查询

in

测试元组在关系中的成员资格。

select distinct course_id
from section
where semester = ’Fall’ and year= 2009 and
course_id not in 
(select course_id
from section
where semester = ’Spring’ and year= 2010)
select distinct name
from instructor
where name not in (’Mozart’, ’Einstein’);
集合的比较
  • < some, <= some, >= some, = some, and <> some
  • < all, <= all, >= all, = all, and <> all
select name
from instructor
where salary > some 
(select salary
from instructor
where dept_name = ’Biology’);
空关系测试

exist测试子查询的结果是否为空,非空则返回true值。还有not exist

select course_id
from section as S
where semester = ’Fall’ and year= 2009 and
exists 
(select *
from section as T
where semester = ’Spring’ and year= 2010 and
S.course_id= T.course_id)
重复元素测试

unique测试子查询中是否存在重复元素,不存在则返回true

select T.course_id
from course as T
where unique 
(select R.course_id
from section as R
where T.course_id= R.course_id and
R.year = 2009)
from中子查询
select dept_name, avg_salary
from (select dept_name, avg (salary)
from instructor
group by dept_name)
as dept_avg (dept_name, avg_salary)
where avg_salary > 42000;
with

提供定义临时关系的方法。

with max_budget (value) as
(select max(budget)
from department)
select budget
from department, max_budget
where department.budget = max_budget.value;
暂无评论

发送评论 编辑评论


				
上一篇
下一篇