第3章 关系数据库标准语言.

Slides:



Advertisements
Similar presentations
第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
Advertisements

计算机软件技术基础计算机软件技术基础 数据库系统( 3 ). 第 2 页 4.3 关系数据库语言 SQL 关系数据库 SQL ( Structured Query Language )语言是关系 数据库的标准语言,对关系模型的发展和商用 DBMS 的研制起 着重要的作用。 SQL 发展历史  1986.
数据查询 单表查询 连接查询 嵌套查询 集合查询.
目 录 第 1 章 数据库技术基础 第 2 章 SQL Server基础 第 3 章 数据库管理 第 4 章 查询和视图
第5章 关系数据库标准语言SQL 主讲:张丽芳.
第2章 SQL语言初步 2.1 SQL的基本概念 2.2 基本表、索引的创建、删除和修改操作 2.3 SQL的查询语句——SELECT
数据库系统概论 华中科技大学能源与动力工程学院
第三章 关系数据库标准语言SQL 3.1 SQL概述 3.2 学生课程数据库 3.3 数据定义 3.4 数据查询 3.5 数据更新
数据库及应用 授课教师:岳静 教学网站: Tel:
An Introduction to Database System
第2讲 Transact-SQL语言.
数据库原理 Database Principles 第三章 关系数据库标准语言SQL(续1).
第三章 关系数据库标准语言SQL 3.1 SQL概述 3.2 学生课程数据库 3.3 数据定义 3.4 数据查询 3.5 数据更新
An Introduction to Database System An Introduction to Database System
An Introduction to Database System
第5章 索引及视图操作 数据库原理应用与实践 SQL SERver2014(第2版) 主编 贾铁军 科学出版社 编著 陈国秦 万程 邢一鸣
数据库技术 实践.
高等院校计算机教材系列 数据库原理与应用(第2版) 任课教师:刘雅莉
Chap 11 SQL基本查詢指令.
数据库技术及应用 ——SQL Server 任课教师: 毕丛娣 电话: 年3月.
第3章 SQL语言初步 2017/3/14.
数据库原理及应用 《数据库原理及应用》课程组 荆楚理工学院.
第4章 关系数据库标准语言SQL 4.1 SQL语言概述 4.2 SQL数据查询功能 4.3 SQL数据操作功能 4.4 SQL数据定义功能.
第3章 SQL的基础知识 数据库管理及应用 3.1 SQL简介 3.2 SQL的数据模型 3.3 标识符 3.4 使用SQL语句管理数据库
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
数据库原理及设计 --作业.
文科计算机小公共课规划教材 Access 程序设计.
第三章 管理信息系统的技术基础 主要内容: 数据处理 数据组织 数据库技术 4. 计算机网络.
软件设计师培训.
计算机应用基础 上海大学计算中心.
数据库原理 Database Principles 第五章 数据库完整性 Database Principles.
请写出下列查询语句并给出结果 1、列出student表中所有记录的sname、sex和class列。
第6章 数据库系统及其应用.
9 SELECT敘述的進階查詢 9-1 SQL的多資料表查詢 9-2 合併查詢 9-3 集合運算查詢 9-4 子查詢
課程名稱:資料庫系統 授課老師:李春雄 博士
数据库技术 第三章 关系数据库标准语言SQL 中国科学技术大学网络学院 阚卫华.
汤 娜 中山大学计算机科学系 数 据 库 基 础 第三章 SQL语言 汤 娜 中山大学计算机科学系
An Introduction to Database System
第4章 SQL语言基础及数据库定义 4.1 基本概念 4.2 SQL Server 提供的主要数据类型 4.3 数据定义.
2、掌握SQL中各种查询方法和数据更新方法 3、掌握SQL中视图的定义方法和用法 4、掌握SQL的授权机制
Chap 10 SQL定義、操作與控制指令.
胡鹏 王慧锋 TEL: 数据库系统原理课程设计 实验环节1 胡鹏 王慧锋 TEL:
An Introduction to Database System An Introduction to Database System
教 师:曾晓东 电 话: 数据库技术 教 师:曾晓东 电 话:
国家“十一五”规划教材 数据库原理与应用教程.
国家“十一五”规划教材 数据库原理与应用教程(第3版).
SQL SERVER 一些经典语句 1.
SPARQL若干问题的解释 刘颖颖
数据库基础 1.
段磊 王慧锋 TEL: qq群: 数据库系统原理课程设计 实验环节2 段磊 王慧锋 TEL: qq群:
第三章 关系数据库标准语言SQL SQL(Structured Query Language)语言是1974年由Boyce和Chamberlin提出的。 1975年~1979年IBM公司San Jose Research Laboratory研制了著名的关系数据库管理系统原型System R并实现了这种语言。
实验二讲评 … 张榆….
数据库技术.
第18章 SQL結構化查詢語言 18-1 SQL語言的基礎 18-2 SQL的查詢指令 18-3 SQL子查詢與合併查詢.
SQL 范引娣.
教 师:曾晓东 电 话: 数据库技术 教 师:曾晓东 电 话:
3. SQL语言的应用 3.1 SQL历史和优点 3.2 数据查询 3.3 数据操纵.
查询与视图 蔡海洋.
SQL查询语句 蔡海洋.
VB与Access数据库的连接.
第三章 SQL Server数据管理.
第4章 Excel电子表格制作软件 4.4 函数(一).
国家“十一五”规划教材 数据库原理与应用教程(第3版).
第八讲 SQL语言之数据查询(2) 第三讲 SQL Server 2000 数据库技术.
1.把下面的关系模式转化为E-R图 1)系(系号,系名,电话) 2)教师(工号,姓名,性别,年龄,系号)
11 檢視表的建立 11-1 檢視表的基礎 11-2 建立檢視表 11-3 修改與刪除檢視表 11-4 編輯檢視表的內容.
基于列存储的RDF数据管理 朱敏
VB与Access数据库的连接.
第4章 数据查询.
Chapter 14 Databases.
Presentation transcript:

第3章 关系数据库标准语言

关系数据库语言 - SQL SQL(Structured Query Language)结构化查询语言,1974年Boyce和Chamberlin提出,首先在IBM 公司的关系数据库系统System R上实现。 特点:功能丰富、使用方便、灵活、语言简洁易学,应用系统范围广,统一标准。 1986年,ANSI数据库委员会X3H2批准了SQL作为数据库语言的美国标准,ISO随后也提出了同样的决定。

SQL概述 标准化 现状 有关组织 有关标准 大部分DBMS产品都支持SQL,成为操作数据库的标准语言 有方言,支持程度不同 ANSI(American Natural Standard Institute) ISO(International Organization for Standardization) 有关标准 SQL-86:“数据库语言SQL” SQL-89:“具有完整性增强的数据库语言SQL”,增加了对完整性约束的支持。 SQL-92:“数据库语言SQL”,是SQL-89的超集,增加了许多新特性,如新的数据类型,更丰富的数据操作,更强的完整性、安全性支持等。 SQL-3:正在讨论中的新的标准,将增加对面向对象模型的支持。 现状 大部分DBMS产品都支持SQL,成为操作数据库的标准语言 有方言,支持程度不同

INSERT,UPDATE,DELETE SQL概述 主要特点: 1. 语言简洁、易学易用:核心功能只有9个动词,语法简单,接近英语。 SQL功能 操作符 数据查询 SELECT 数据定义 CREATE,ALTER ,DROP 数据操纵 INSERT,UPDATE,DELETE 数据控制 GRANT,REVOKE

SQL概述 主要特点: 2. 高度非过程化的语言:用户只需提出“干什么”,至于“怎么干”由DBMS解决;用户只需要早查询语句中提出需要什么,DBMS即可按路径存取,并把结果返回给用户。 3. 面向集合的语言:每一个SQL的操作对象是一个或多个关系,操作的结果也是一个关系。 4. 即可独立使用,又可嵌入到宿主语言中使用,具有自主型和宿主型两种特点。

SQL概述 5. 具有查询、操作、定义和控制四种语言一体化的特点。它只向用户提供一种语言,但该语言具有上述多种功能,且每中操作只需一种操作符。

SQL语言支持的关系数据库的三级模式结构 用户 View V1 View V2 外模式 Base Table B1 Base Table B2 Base Table B3 Base Table B4 模式 Stored File S1 Stored File S1 Stored File S1 Stored File S1 内模式 SQL语言支持的关系数据库的三级模式结构

SQL的功能 一、数据定义(DDL) 二、数据操纵(DML) 三、数据控制(DCL) 定义、删除、修改关系模式(基本表) 定义、删除视图(View) 定义、删除索引(Index) 二、数据操纵(DML) 数据查询 数据增、删、改 三、数据控制(DCL) 用户访问权限的授予、收回

一、SQL的数据定义(DDL) 数据定义语言(Data Definition Language) Create、Drop、Alter 定义一组关系(基本表)、说明各关系的信息 各关系的模式 各属性的值域 完整性约束 索引 安全性和权限 各关系在磁盘上的物理存储结构

1. 模式的创建和撤销 1.SQL模式的创建 模式定义为基本表的集合。定义模式实际上定义了一个命名空间,在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。 SQL模式由模式名和模式拥有者的用户名或帐号来确定 Create schema <模式名> authorization <用户名> 注意:在大多数DBMS中,采用creat database来代替SCHEMA。即创建数据库。

1. 模式的创建和撤销 [例1]:创建“学生-课程”模式(数据库) [例2]:创建一个名为“book”的数据库,其中文件均存储在D盘根目录 create database 学生_课程 [例2]:创建一个名为“book”的数据库,其中文件均存储在D盘根目录 Create Database book On(Name=book, FileName='d:\book.mdf') Log on(name=book_log, FileName='d:\book_log.ldf');

1.模式的创建和撤销 2.SQL模式的撤消(删除) 撤消SQL模式或数据库所属的基本表、视图等元素 drop schema <模式名> [cascade|restrict] Cascade(级联式方式):执行drop语句时,把SQL模式下的基本表、视图、索引等所有元素全部撤消 Restrict(约束式方式):执行drop语句时,只有当SQL模式中没有任何下属元素时,才能撤消模式,否则,拒绝执行 drop语句。 drop database <模式名> [cascade|restrit]

[例2] DROP database 学生_课程 CASCADE; 删除模式学生_课程 同时该模式中定义的表也被删除 1.模式的创建和撤销 [例2] DROP database 学生_课程 CASCADE; 删除模式学生_课程 同时该模式中定义的表也被删除

SQLServer提供的基本数据类型 类型 数据类型 描述 存储长度 统一编码字符型 Char(n) 1——8000字符 varchar text 1——231字符 Nchar(n) 字符型数据,可识别4000个字符 Ntext 字符型数据,可识别10亿个字符 日期时间型 datetime 1753-1-1——9999-12-31期间日期和时间 smalldatetime 1900-1-1 ——2079-6-6期间的日期和时间 int/interger -231——231之间的整数 4Byte smallint -215——215之间的整数(-32768——32767) 2Byte tinyint 0——255之间的整数 1Byte Bigint -9223372036854775808——9223372036854775807 8Byte 整形 bit 0、1或NULL,用于描述类似yes或No 精确数值型 decimal -1038-1——1038-1范围内数值型数据,必须指定范围和精度 numberic 同decimal 货币型 money -9229亿——9229亿之间的货币,精确到货币单位的万分之一 8 Byte 近似数值型 Float(n) 近似数值类型。-1.79E308——1.79E308 Real 近似数值类型。-3.4E38——3.4E38 二进制数据类型 Binary[(n)] 长度可达8000Byte的定长二进制数据 image 存储变长二进制数据。最大可达20亿字节 特殊数据类型 timestamp 用于创建一个数据库范围内的唯一数码 uniqueidentifier 用于存储一个全局唯一标识

2.基本表的创建、修改和撤销 1、基本表的创建 create table 表名( 列名 数据类型 [default 缺省值] [not null] [,列名 数据类型 [default 缺省值] [not null]] …… [,primary key(列名 [,列名] …)] [,foreign key (列名 [,列名] …) references 表名 (列名 [,列名] …)] [,check(条件)])

Student表 学 号 Sno 姓 名 Sname 性 别 Ssex 年 龄 Sage 所 在 系 Sdept 200215121 学 号 Sno 姓 名 Sname 性 别 Ssex 年 龄 Sage 所 在 系 Sdept 200215121 200215122 200215123 200515125 李勇 刘晨 王敏 张立 男 女 20 19 18 CS MA IS

Course表 课程号 Cno 课程名 Cname 先行课 Cpno 学分 Ccredit 1 2 3 4 5 6 7 数据库 数学 信息系统 操作系统 数据结构 数据处理 PASCAL语言

SC表 学 号 Sno 课程号 Cno 成绩 Grade 200215121 200215122 1 2 3 92 85 88 90 80

[例3] 建立“学生”表Student,学号是主码,姓名取值唯一。 2.基本表的创建、修改和撤销 [例3] 建立“学生”表Student,学号是主码,姓名取值唯一。 CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) UNIQUE, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) );

( Cno CHAR(4) PRIMARY KEY, Cname CHAR(40), Cpno CHAR(4), 2.基本表的创建、修改和撤销 [例4] 建立一个“课程”表Course CREATE TABLE Course ( Cno CHAR(4) PRIMARY KEY, Cname CHAR(40), Cpno CHAR(4), Ccredit SMALLINT, FOREIGN KEY (Cpno) REFERENCES Course(Cno) );

2.基本表的创建、修改和撤销 [例5] 建立一个“学生选课”表SC CREATE TABLE SC (Sno CHAR(9), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY (Sno,Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno) );

3.修改基本表 alter table 表名 [add 列名 类型] /* 增加新列*/ [drop 列名[cascade|restrict]] /*删除*/列 [modify 列名 类型] /*修改列定义*/ cascade:该列的视图和约束也要一起删除 restrict:没有视图和约束才能删除

3.修改基本表 [例6]向Student表增加“入学时间”列,其数据类型为日期型。 ALTER TABLE Student ADD S_entrance DATE; 不论基本表中原来是否已有数据,新增加的列一律为空值。  [例7]将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。 ALTER TABLE Student ALTER COLUMN Sage INT; [例8]增加课程名称必须取唯一值的约束条件。 ALTER TABLE Course ADD UNIQUE(Cname);

DROP TABLE <表名>[RESTRICT| CASCADE]; RESTRICT:删除表是有限制的。 4.删除基本表 DROP TABLE <表名>[RESTRICT| CASCADE]; RESTRICT:删除表是有限制的。 欲删除的基本表不能被其他表的约束所引用 如果存在依赖该表的对象,则此表不能被删除 CASCADE:删除该表没有限制。 在删除基本表的同时,相关的依赖对象一起删除

4.删除基本表 [例9] 删除Student表 DROP TABLE Student CASCADE ; 基本表定义被删除,数据被删除 表上建立的索引、视图、触发器等一般也将被删除

SQL的功能 一、数据定义(DDL) 二、数据操纵(DML) 三、数据控制(DCL) 定义、删除、修改关系模式(基本表) 定义、删除视图(View) 定义、删除索引(Index) 二、数据操纵(DML) 数据查询 数据增、删、改 三、数据控制(DCL) 用户访问权限的授予、收回

二、数据操纵(DML) 数据查询 数据增、删、改

查询的类型 1、单表查询 2、连接查询 3、嵌套查询

1.SQL的数据查询 二、数据操纵(DML) 基本句型 select A1 , A2 , … , An from R1 , R2 , … , Rm where F  ∏A1 , A2 , … , An(p(r1  r2  …  rm))

1.SQL的数据查询 语句格式 [,<目标列表达式>] … SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] … FROM <表名或视图名>[, <表名或视图名> ] … [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <列名2> [ ASC|DESC ] ];

Select语句的含义 结果集 1、SELECT子句 根据 Select 子句中的属性列表,对上述结果作投影(π)操作 对 From 子句中的各关系,作笛卡儿积(×) 对 Where 子句中的逻辑表达式进行选择(σ)运算,找出符合条件的元组 结果集 查询操作的对象是关系,结果还是一个关系,是一个结果集,是一个动态数据集

对应于关系代数的投影运算,用以列出查询结果集中的期望属性 目标列形式:可以为列名,* ,算术表达式,聚合函数。 1、SELECT子句 说明: 对应于关系代数的投影运算,用以列出查询结果集中的期望属性 目标列形式:可以为列名,* ,算术表达式,聚合函数。 (1) “*”:表示“所有的属性”。 示例:检索学生的姓名,年龄和性别 SELECT Sno,Sage,Ssex FROM Student; (SELECT * FROM Student ;)

(2)、select中有含,, , 的算术表达式 关系定义为:TEACHER(TNO,TNAME,SAL,EDEPT) 示例:给出所有老师的姓名及税后工资额。 select TNAME,SAL  0.95 from TEACHER

1、SELECT子句 重复元组的处理 语法约束:缺省为保留重复元组,也可用关键字all显式指明。若要去掉重复元组,可用关键字distinct或unique指明。 示例:找出所有选修了课程的学生。 select distinct sno from SC

格式old_name as new_name 1、SELECT子句 列的改名操作 格式old_name as new_name 为关系和属性重新命名,可出现在select和from子句中。 为结果集中的某个属性改名 使结果集更具可读性 例1: Select sno as 学号,cno as 课程号,grade as 成绩 From SC 例2: Select sno,sname,year(getdate())-Sage as birthday From Student

WHERE子句 说明:查询满足指定条件的元组可以通过WHERE子句实现。WHERE子句常用的查询条件如表所示。 查询条件 比较 确定范围 确定集合 字符匹配 空值 多重条件 谓词 =,>,<,>=,<=,!=,!<,NOT+上述比较运算 BETWEEN… AND Not BETWEEN AND IN,NOT IN LIKE,NOT LIKE IS NULL,IS NOT NULL AND,OR

WHERE子句 (1) 比较 示例:查IS系全体学生的名单 SELECT Sname FROM Student WHERE Sdept=‘IS' 查所有年龄在20岁以下的学生姓名及其年龄 SELECT sname, Sage FROM Student WHERE Sage <20

WHERE子句 (2)确定范围 查询年龄在18至23岁之间的学生的姓名、系别、和年龄 SELECT sname, Sdept, Sage FROM Studenr WHERE Sage BETWEEN 18 AND 23 与BETWEEN...AND...相对的谓词是 NOT BETWEEN...AND...

WHERE子句 (3) 确定集合 (谓词:IN <值表>, NOT IN <值表> ) 查物理系(WL)、数学系(XS)和计算机系(JSJ)的学生的姓名和性别 SELECT Sname,Ssex,Sdept FROM Student WHERE Sdept IN ('WL','SX','JSJ') [例 ]查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。 SELECT Sname,Ssex FROM Student Where Sdept not IN ('IS','Ma')

WHERE子句 (4)多重条件查询 逻辑运算符AND和OR可用来联结多个查询条件。如果这两个运算符同时出现在同一个WHERE条件子句中,则AND的优先级高于OR,但用户可以用括号改变优先级。 [例23] 查询计算机系年龄在20岁以下的学生姓名。 SELECT Sname FROM Student WHERE Sdept= 'CS' AND Sage<20;

WHERE子句 谓词: IS NULL 或 IS NOT NULL “IS” 不能用 “=” 代替 [例21] 某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NULL [例22] 查所有有成绩的学生学号和课程号。 WHERE Grade IS NOT NULL;

WHERE子句 (6) 字符串的匹配操作like like:找出满足给定匹配条件的字符串。 格式:列名 [not] like “字符串” 匹配规则: “%” :匹配零个或多个字符。 “_”:匹配任意单个字符。 escape :定义转义字符,以去掉特殊字符的特定含义,使其被作为普通字符看待。如escape “\”,是定义了 \ 作为转义字符,则可用\%去匹配%,用\_去匹配_,用\ \去匹配 \ 。 大小写敏感

WHERE子句 示例:列出姓刘的学生的学号、姓名。 Select sno,sname From Student Where sname LIKE ‘刘%’ Sname Sno Sage Ssex Sdept 刘勇 95001 22 男 Cs 张新 95002 21 女 刘晨 95003 If 李立 95004 23 if Sname Sno Sage Ssex Sdept 刘勇 95001 22 男 Cs 刘晨 95003 女 If

WHERE子句 示例 例:列出张姓且单名的学生的学号、姓名。 Select sno,sname From Student Where sname LIKE ‘张_ ’

WHERE子句 查以”DB_”开头,且倒数第三个字符为i的课程的详细情况 SELECT * FROM Course WHERE Cname LIKE ’DB\_%i__’ ESCAPE ’\’; 注意这里的匹配字符串’DB\_%i__’。第一个_前面有换码字符\,所以它被转义为普通的_字符。而%、第二个_和第三个_前面均没有换码字符\,所以它们仍作为通配符。其执行结果为: Cno Cname Ccredit ------- ------- ------- ------ 8 DB_Design 4 10 DB_Programing 2 13  DB_DBMS Design 4

WHERE子句 转义符: escape 例:列出课程名称中带有‘_’的课号及课名。 Select cno,cname From Course Where cname LIKE ‘%\_%’ escape ‘\’ 列出名称中含有4个字符以上,且倒数第3个字符是d,倒数第2个字符是_的课程的所有信息。 select * from c where CNAME like “% _d \_ _”

聚合函数 为了进一步方便用户,增强检索功能,SQL提供了许多聚合函数,主要包括: COUNT([DISTINCT|ALL] *) 统计元组个数 COUNT([DISTINCT|ALL] <列名>) 统计一列中值的个数 SUM([DISTINCT|ALL] <列名>) 计算一列值的总和(此列必须是数值型) AVG([DISTINCT|ALL] <列名>) 计算一列值的平均值(此列必须是数值型) MAX([DISTINCT|ALL] <列名>) 求一列值中的最大值 MIN([DISTINCT|ALL] <列名>) 求一列值中的最小值

聚合函数 1、求男学生的总人数和平均年龄 举例:统计选修了课程的学生人数 SELECT COUNT(*),AVG(SAGE) FROM Student WHERE SSEX=‘男’ 举例:统计选修了课程的学生人数 SELECT COUNT(DISTINCT S#) FROM SC 举例:如果有一个grade值为空下面的结果相同吗? SELECT count(grade) as 成绩人数, count(*) as 总人数 , avg(grade) as 平均分数 from sc

聚合函数 示例 列出老师的最高、最低、平均工资。 select DNO,max(SAL),min(SAL),avg(SAL) from TEACHER

聚合函数 Null在聚集函数中的角色 Count 为 0 其余均忽略 Null Sum:不将其计入 Avg:具有 Null 的元组不参与 Max / Min:不参与 举例: SELECT count(sno),count(sname) from s

Group By字句 GROUP BY子句可以将查询结果表的各行按一列或多列取值相等的原则进行分组。    对查询结果分组的目的是为了细化集合函数的作用对象。如果未对查询结果分组,集合函数将作用于整个查询结果,即整个查询结果只有一个函数值。如果用GROUP分了组,集合函数将作用于每一个组,即每一组都有一个函数值。

Group By字句 查询各个课程号以及相应的选课人数 GROUP BY举例: 该SELECT语句对SC表按Cno的取值进行分组,所有具有相同Cno值的元组为一组,然后对每一组作用集函数COUNT以求得该组的学生人数。 查询为: SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno

Having 可以针对聚合函数的结果值进行筛选,它是作用于分组计算的结果集 跟在Group By子句的后面,有GROUP BY 才有HAVING 例:列出选修两门(含)以上课程的学生的学号 SELECT sno FROM SC GROUP BY sno HAVING COUNT(cno)>=2

Having 例:列出具有两门(含)以上不及格的学生的学号、不及格的课目数。 Select sno,count(cno) From SC 只选出有不及格的学生 Select sno,count(cno) From SC Where grade < 60 Group By sno Having count(cno) >= 2

Having 列出及格的学生的平均成绩。 select SNO,avg(GRADE) from SC group by SNO having min(GRADE) >= 60

Having Having 与 Where的区别 Where 决定哪些元组被选择参加运算,作用于关系中的元组

命令order by 列名 [asc | desc] 示例 SELECT Sno,GRADE FROM SC WHERE Cno='C1' ORDER BY GRADE DESC,Sno; ORDER BY 子句表示结果要排序,它必须在所有其它子句之后作为最后一个子句出现

练习: 查询男生和女生的平均年龄 统计各系部学生的人数 Select Ssex,AVG(sage) as 平均年龄 From Student Group By Ssex select Sdept,count(sno) as 系部人数 from student group by Sdept

查询的类型 1、单表查询 2、连接查询 3、嵌套查询

select student.sno,sname from student,sc,course 连接查询 在查询中,同时涉及两个或两个以上的表,要根据表中数据的情况作连接。 示例:查询学习课程名为‘MATHS’的学生学号和姓名。 select student.sno,sname from student,sc,course where student.sno=sc.sno and sc.cno=course.cno and cname='MATHS'

等值连接和自然连接 例:查询所有学生的选课情况 等值连接: 去除重复的列 内连接 查看连接查询执行过程 SELECT * FROM Student,SC where (Student.Sno=SC.Sno); 去除重复的列 SELECT student.sno,sname,cno,grade FROM Student,SC where (Student.Sno=SC.Sno); 内连接 FROM Student inner join SC on (Student.Sno=SC.Sno);

自身连接 SELECT FIRST.Cno,SECOND.Cpno 自身连接:一个表与其自己进行连接 需要给表起别名以示区别 由于所有属性名都是同名属性,因此必须使用别名前缀 [例35]查询每一门课的间接先修课(即先修课的先修课) SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno = SECOND.Cno;

[例]查询每一门课的间接先修课(即先修课的先修课) 自身连接 [例]查询每一门课的间接先修课(即先修课的先修课) SECOND表(Course表) FIRST表(Course表) Cno Cname Cpno Ccredit 1 数据库 5 4 2 数学   3 信息系统 操作系统 6 数据结构 7 数据处理 PASCAL语言 Cno Cname Cpno Ccredit 1 数据库 5 4 2 数学   3 信息系统 操作系统 6 数据结构 7 数据处理 PASCAL语言

自身连接 SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno = SECOND.Cno; 查询结果:

外连接 外连接与普通连接的区别 普通连接操作只输出满足连接条件的元组 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出

外连接 在SQLServer中执行如下命令:左外连接 SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);

列出左边关系(如本例Student)中所有的元组 右外连接 列出右边关系中所有的元组 左外连接 列出左边关系(如本例Student)中所有的元组 右外连接 列出右边关系中所有的元组 请大家 写出查询命令来完成如下右外连接 SELECT sc.sno,Grade,course.cno,course.Cname,course.Ccredit FROM SC right OUTER JOIN course ON (sc.Cno=Course.Cno);

查询的类型 1、单表查询 2、连接查询 3、嵌套查询

嵌套查询 嵌套查询 一个SELECT-FROM-WHERE语句称为一个查询块 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询

带有IN谓词的子查询 例 检索学习课程号为2的学生姓名 SELECT Sname /*外层查询/父查询*/ FROM Student 例 检索学习课程号为2的学生姓名 SELECT Sname /*外层查询/父查询*/ FROM Student WHERE Sno IN (SELECT Sno /*内层查询/子查询*/ FROM SC WHERE Cno= ' 2 ');

带有IN谓词的子查询 [例 ]查询选修了课程名为“信息系统”的学生学号和姓名 SELECT Sno,Sname ③ 最后在Student关系中 FROM Student 取出Sno和Sname WHERE Sno IN (SELECT Sno ② 然后在SC关系中找出选 FROM SC 修了3号课程的学生学号 WHERE Cno IN (SELECT Cno ① 首先在Course关系中找出 FROM Course “信息系统”的课程号,为3号 WHERE Cname= ‘信息系统’ ) );

带有IN谓词的子查询 练习2: 列出同时选修了1号和2号课程的学生的学号 练习1:查询没有选修课程的所有学生的学号和姓名 Select sno,sname From student Where sno NOT IN ( select distinct s# From sc) 练习2: 列出同时选修了1号和2号课程的学生的学号 select SNO from SC where SC.CNO = '1‘  and  SNO   in (select SNO from SC where  CNO = '2')

不相关子查询: 子查询的查询条件不依赖于父查询 由里向外 逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。 上述带有in的子查询都属于不相关子查询

带有比较运算符的子查询 当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。 与ANY或ALL谓词配合使用  谓词语义 ANY:任意一个值 ALL:所有值

假设一个学生只可能在一个系学习,并且必须属于一个系,则在[例]可以用 = 代替IN : 带有比较运算符的子查询 假设一个学生只可能在一个系学习,并且必须属于一个系,则在[例]可以用 = 代替IN : = 例:查询和刘晨在同一个系学习的学生学号姓名和系部。 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept in (SELECT Sdept WHERE Sname= ‘刘晨’);

带有比较运算符的子查询 [例 ]找出每个学生超过他自己选修课程平均成绩的课程号。 SELECT Sno, Cno FROM SC x WHERE Grade >=(SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno); 相关子查询 in后的子查询与外层查询无关,每个子查询执行一次,称之为无关子查询,而这里的子查询与外层查询有关,需要执行多次,称之为相关子查询

带有ANY(SOME)或ALL谓词的子查询 是比较运算符 表达式的值至少与子查询结果中的一个值相比满足比较运算符 表达式  all (子查询) 表达式的值与子查询结果中的所有的值相比都满足比较运算符

带有ANY(SOME)或ALL谓词的子查询 前面所学in可以等效与=some 例 :检索学习课程号为2的学生学号与姓名 Select sno,sname from Student where sno in (select sno from sc where cno=‘2’) Select sno,sname from Student where sno =some (select sno from sc where cno=‘2’)

带有ANY(SOME)或ALL谓词的子查询 例 :检索至少有一门成绩超过学生200215121一门成绩的学生学号 select distinct sno from sc where grade >some (select grade from sc where sno=‘200215121’) 例 :检索不学2号课程的学生姓名 可以用not in Select sname from student where sno<>all (select sno from sc where cno='2')

带有ANY(SOME)或ALL谓词的子查询 例 :找出平均成绩最高的学生号 select SNO,avg( Grade) from SC group by SNO having avg( Grade) >= all (select avg(Grade) from SC group by SNO) 求出每个人的均分

带有EXISTS谓词的子查询 1. EXISTS谓词 存在量词 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 若内层查询结果非空,则外层的WHERE子句返回真值 若内层查询结果为空,则外层的WHERE子句返回假值 由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义 2. NOT EXISTS谓词 若内层查询结果非空,则外层的WHERE子句返回假值 若内层查询结果为空,则外层的WHERE子句返回真值

例:查询和“刘晨”同学在同一个系部的 学生的学号、姓名、系部 SELECT Sno,Sname,Sdept FROM Student S1 带有EXISTS谓词的子查询 例:查询和“刘晨”同学在同一个系部的 学生的学号、姓名、系部 SELECT Sno,Sname,Sdept FROM Student S1 WHERE EXISTS (SELECT * FROM Student S2 WHERE S1.Sdept=S2. Sdept AND S2.Sname= ‘ 刘晨 '); 动画演示

带有EXISTS谓词的子查询 [例 ]查询所有选修了1号课程的学生姓名。 思路分析: 本查询涉及Student和SC关系 在Student中依次取每个元组的Sno值,用此值去检查SC关系 若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= '1',则取此Student.Sname送入结果关系

带有EXISTS谓词的子查询 用嵌套查询 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= ' 1 ');

带有EXISTS谓词的子查询 [例 ] 查询选修了全部课程的学生姓名。 在表Student中找学生,在Course中不存在一门课,该学生没有学。 SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM Course (SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno ) ); 请思考还有没有别的实现思路?

参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同 集合查询 集合操作的种类 并操作UNION 交操作INTERSECT 差操作EXCEPT 参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同 采用集合的观点,可以多一种解决思路

集合查询 例:查询姓“张”的学生及年龄不大于19岁的学生 Select sno,sname as Name ,age From S Where sname like '张%' Union Select sno,sname,age Where age <=19 Order By age

集合查询 示例 求选修了001或002号课程的学生号。 (select SNO from SC where CNO = 'c1') union where CNO = 'c2')

求选修了001和002号而没有选003号课程的学生号。 集合查询 (select SNO from SC where CNO = ‘C1’ or CNO = ‘C2’ ) except where CNO = ‘C3’)

集合查询 SELECT * FROM Student WHERE Sdept='CS' INTERSECT [例 ] 查询计算机科学系的学生与年龄不大于19岁的学生的交集 SELECT * FROM Student WHERE Sdept='CS' INTERSECT WHERE Sage<=19

二、数据操纵(DML) 数据查询 数据维护: 增 删 改

数据维护——插入数据 1、插入单个元组 插入单个元组的INSERT语句的格式为: INSERT INTO <表名> [(<属性列1>[,<属性列2>...)] VALUES (<常量1> [,<常量2>]...) 如果某些属性列在INTO子句中没有出现,则新记录在这些列上将取空值。但必须注意的是,在表定义时说明了NOT NULL的属性列不能取空值。否则会出错。 如果INTO子句中没有指明任何列名,则新插入的记录必须在每个属性列上均有值。

2、数据维护——插入数据 示例:一次只插入一个元组 按关系模式的属性顺序 按指定的属性顺序,也可以只添加部分属性(非Null属性为必需) Insert Into S Values ('s8','张三',21,'M','JSJ') 按指定的属性顺序,也可以只添加部分属性(非Null属性为必需) Insert Into S( sno, sname, age) Values ('S11','李四', 26 )

数据维护——插入数据 2、插入子查询结果 子查询不仅可以嵌套在SELECT语句中,用以构造父查询的条件,也可以嵌套在INSERT语句中,用以生成要插入的数据。 插入子查询结果的INSERT语句的格式为: INSERT INTO <表名> [(<属性列1> [,<属性列2>...)] 子查询; 其功能是以批量插入,一次将子查询的结果全部插入指定表中。

数据维护——插入数据 首先要在数据库中建立一个新表csstudent ,然后执行 insert into csstudent select * from student where sdept='cs'

2、数据维护——数据删除 删除语句的一般格式为: DELETE FROM <表名> [WHERE <条件>]; DELETE语句的功能是从指定表中删除满足WHERE子句条件的所有元组。如果省略WHERE子句,表示删除表中全部元组,但表的定义仍在字典中。也就是说,DELETE语句删除的是表中的数据,而不是关于表的定义。

2、数据维护——数据删除 以元组为单位删除数据 一般只对一个关系进行操作,若要从多个关系中删除元组,则必须对每个关系分别执行删除命令 Delete From r [ Where P ]

2、数据维护——数据删除 删除单个元组 例:删除学号为S11的学生的选课信息 Delete From SC Where sno = ‘S11’ 删除多个元组 例:删除选课而未参加考试的学生的选课信息 Where grade is null

2、数据维护——数据删除 删除整个关系中的所有数据 例:删除所有学生的选课信息 Delete From SC 例:删除所有比95001年龄小的学生记录 Delete From Student Where sage < (select sage from student where sno = '95001')

2、数据维护——数据删除 删除低于平均工资的老师记录。 delete from PROF where SAL < (select avg(SAL) from PROF)

2、数据维护——数据修改 命令 update 表名 set 列名 = 表达式 | 子查询 列名 = [,表达式 | 子查询]… [where 条件表达式] 指定对哪些列进行更新,以及更新后的值是什么。 其功能是修改指定表中满足WHERE子句条件的元组。其中SET子句用于指定修改方法,即用<表达式>的值取代相应的属性列值。如果省略WHERE子句,则表示要修改表中的所有元组。

2、数据维护——数据修改 针对符合条件的元组,修改其属性值 示例:将S1学生转入HX系 Update S Set dept = 'HX' Where sno = 'S1‘ 示例:所有学生年龄加1 Update Stuudent Set Sage = Sage + 1

例:将选修C1课程的学生的成绩改为该课程的平均成绩 2、数据维护——数据修改 例:将选修C1课程的学生的成绩改为该课程的平均成绩 Update SC Set grade = (Select avg(grade) From SC Where cno = 'C1') Where cno = 'C1' 先计算avg,再做Update

视图 简化用户的操作 不同的用户可从不同的角度看待同一数据 支持一定的逻辑数据独立性 数据的安全性

子查询不允许含有ORDER BY子句和DISTINCT短语 一、建立视图 语句格式(属于DDL,数据定义语言) CREATE VIEW <视图名> [(<列名> [,<列名>]…)] AS <子查询> [WITH CHECK OPTION]; 组成视图的属性列名:全部省略或全部指定 子查询不允许含有ORDER BY子句和DISTINCT短语

一、建立视图 [例1] 建立信息系学生的视图。并要求进行修改和插入操作时仍需保证该视图只有信息系的学生 。 [例1] 建立信息系学生的视图。并要求进行修改和插入操作时仍需保证该视图只有信息系的学生 。 Create View Cs_Student (学号,姓名,年龄,系部) As Select sno,sname,sage,Sdept From Student Where sdept=‘CS‘ WITH CHECK OPTION; Create View Cs_Student As Select sno,sname,sage,Sdept From Student Where Dept=‘CS‘ WITH CHECK OPTION; 若省略视图的列名表,则自动获得Select查询返回的列名

一、建立视图 基于多个基表的视图 [例3] 建立信息系选修了1号课程的学生视图。 [例3] 建立信息系选修了1号课程的学生视图。 CREATE VIEW IS_S1(Sno,Sname,Grade) AS SELECT Student.Sno,Sname,Grade FROM Student,SC WHERE Sdept= 'IS' AND Student.Sno=SC.Sno AND SC.Cno= '1';

DROP VIEW <视图名>; 删除视图 语句的格式: DROP VIEW <视图名>; 该语句从数据字典中删除指定的视图定义 如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除 删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除

查询视图: 与基本表的查询相同 更新视图 对其他类型视图的更新不同系统有不同限制 如果视图是从单个基本表只使用选择、投影操作导出的,并且包含了基本表的主键,那么这样的视图称为“行列子集视图” 不是所有视图都是可更新的 基于联接查询的视图不可更新 使用了函数的视图不可更新 使用了分组操作的视图不可更新 只有“行列子集视图” 才是可更新的 对其他类型视图的更新不同系统有不同限制

索引 对于一个基本表,根据需要建立若干个索引 建立索引的两个主要目的:加快查询速度、保证行的唯一性 1. 建立索引 语法格式: CREATE [UNIQUE] INDEX <索引名> ON <表名>(<列名>[{,<列名>}]) 若指定[UNIQUE]选项,系统将保证基本表中的任意两行记录在索引列上或组合的索引列上具有唯一值 例:为SC表在SID和CID列上建立唯一索引 CREATE UNIQUE INDEX SC1 ON SC(SID,CID);

索引 的 定义和撤销 unique(distinct):唯一性索引,不允许表中不同的行在索引列上取相同值。若已有相同值存在,则系统给出相关信息,不建此索引。系统并拒绝违背唯一性的插入、更新。 asc/desc:索引表中索引值的排序次序,缺省为asc。 示例: create index s-index on S(SID)

索引的定义和撤销 索引的有关说明 2. 删除索引 可以动态地定义索引,即可以随时建立和删除索引。 DROP INDEX <索引名> 索引的有关说明 可以动态地定义索引,即可以随时建立和删除索引。 不允许用户在数据操作中引用索引。索引如何使用完全由系统决定,这支持了数据的物理独立性。 应该在使用频率高的、经常用于连接的列上建索引。 一个表上可建多个索引。索引可以提高查询效率,但索引过多耗费空间,且降低了插入、删除、更新的效率。