DBMS第四篇(上):SQL 查询语言 (第三章)——SQL的组成、基本模式定义、查询基本结构

1. SQL查询语言概述

“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.”


标准是企业竞争的制高点

1.1 SQL的组成部分

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 标准设计的,和具体的DBMS软件中的语法有所区别

1.2 Data Definition Language 数据定义语言

SQL DDL, 不只可以指定关系(relations)集,还可以指定每个关系的详细细信息

  • The schema for each relation.定义模式
  • The types of values associated with each attribute. 属性数据类型
  • The integrity constraints. 完整性约束
  • The set of indices to be maintained for each relation 索引
  • Security and authorization information for each relation.安全,授权
  • The physical storage structure of each relation on disk.物理存储

1.2.1 Basic Types基本类型

类型 说明
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:
每种类型都可以包含。
表示可能存在,但未知,或根本不存在的缺失值。
在某些情况下,我们可能希望禁止输入空值


1.2.2 如何为表中属性选择恰当的数据类型

一般原则

  • 判断数据的种类,需要存储的数据的大小和最大长度
    对于数字数据类型还要考虑精度和小数位数
  • 在所用的DBMS找得到可用的数据类型,够用即可;
  • 权衡存储空间和查询效率
    • 数据类型的长度越小,存储大量数据所需要存储空间就越小
      分配的页面就越少一次读取到内存中的数据记录就会越多
      操作数据的效率就会提高很多

1.3 Basic Schema Definition基本模式定义

1.create table

在数据库中创建一个关系部门

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

  • not null
  • primary key (A1, …, An )
  • foreign key (Am, …, An ) references r
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) );

主键声明可以与属性声明相结合


2.insert into

新创建的关系最初是空的。
可以使用insert命令将数据加载到关系中。

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

3.delete from

使用delete命令从关系中删除元组

delete from student;

4.drop table

用来从数据库中删除 所被删除关系的所有信息。
这个所有信息包括表本身
比 delete更加猛烈(drastic)

drop table r;

所以,drop r后, 除非用create table命令重新创建,否则不能将元组插入到r中

5.alter table

向现有关系添加属性

alter table r add A D;

6.alter table … drop …

从关系r中删除属性A

alter table r drop A;

许多数据库系统不支持删除属性,但允许删除整个表

1.4 Basic Structure of SQL Queries查询基本结构

	select name
	from instructor
	where dept name = ’Comp. Sci.’ and salary > 70000;

查询将from子句中列出的关系作为输入
可以多个关系作为输入,

按照where和select子句中指定的方式对它们进行操作
在where子句中,可以使用逻辑连接词和and、或or、和否not
同样,比较运算符 <, <=, >, >=, =, <>
where 子句还有很多用法。逐步介绍…

然后生成一个关系作为结果

The select Clause 选择子句(投影)

1.select distinct

找到所有有教员的系名,并删除重复的

select distinct dept_name 
from instructor

默认是不去重的。所以select语句没有distinct关键字,默认不去重
那之所所以默认不去重,
是因为: 去重操作消耗系统资源、用户或许需要看到重复信息

2.select all

关键字all指定不删除重复的。(当然,不用all也是等效的)

select all dept_name 
from instructor

3.select salary * 1.1

select子句还可以包含算术表达式: + - * /

select ID, name, dept name, salary * 1.1
from instructor;

这显示了如果我们给每位教师加薪10%的结果;
注意,它不会导致任何改变教员关系


4.select *

星号 * (asterisk),代表所有属性

select *
from instructor

The where Clause

  • where子句指定了结果必须满足的条件
  • 对应于关系代数的选择谓词
  • 比较结果可以使用逻辑连接词组合: and, or, and not
  • 比较可以应用于算术表达式的结果

1.Example

下图是关系Sailors
DBMS第四篇(上):SQL 查询语言 (第三章)——SQL的组成、基本模式定义、查询基本结构
选择rating > 8的元组
DBMS第四篇(上):SQL 查询语言 (第三章)——SQL的组成、基本模式定义、查询基本结构
DBMS第四篇(上):SQL 查询语言 (第三章)——SQL的组成、基本模式定义、查询基本结构

2. between

SQL中,有若干类似英语自然语言的保留字
人性化,改善用户界面,
为自然语言查询作的伏笔.
这是SQL在竞争中获胜的原因之一。

如下,列出loan表中,amount在90000到100000之间的loan-number

select loan-number 
from loan
where amount between 90000 and 100000  -- 闭区间[90000,100000]

The from clause

“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

  • 具有来自from子句中所有关系的所有属性。
  • 比如from instructor,teaches
    (instructor.ID, instructor.name, instructor.dept name, instructor.salary
    teaches.ID, teaches.course id, teaches.sec id, teaches.semester, teaches.year)
    若二表相同属性,加上prefix: 表名字. (上篇文章提到了)
  • 在实践中(In practice),SQL可以将表达式转换为可以更有效地处理的等效形式

1.Example

查找计算机科学系教师的教师姓名和课程标识符

select name, course id
from instructor, teaches
where instructor.ID= teaches.ID and instructor.dept name = ’Comp. Sci.’;

执行顺序如下:

  1. 生成from子句中列出的关系的笛卡儿积
  2. 对步骤1的结果应用where子句中指定的谓词(predicates)。
  3. 对于步骤2结果中的每个元组,输出select子句中指定的属性(或表达式的结果)。

此外,如果忽略/注释了where子句,那么返回一个from的两个表的笛卡尔积表,
很大哟

上一篇:oracle插入随机数据


下一篇:Oracle cols_as_rows 比对数据