【数据库原理及应用教程】第三章 SQL 您所在的位置:网站首页 模糊数学原理及应用第五版第二章课后答案 【数据库原理及应用教程】第三章 SQL

【数据库原理及应用教程】第三章 SQL

2024-07-06 02:47| 来源: 网络整理| 查看: 265

文章目录 重点难点建立数据库创建数据库选择元组select多表查询子查询 追加元组 insert嵌套子查询 元组删除命令 deleteUpdate命令结果计算聚集函数分组查询和分组过滤分组过滤 修正与撤销数据库SQL-DDL撤销与修改撤销基本表指定数据库关闭数据库 视图定义视图

重点难点 SQL-SELECT:In | Not In, Some, all, exists | not existsSQL-SELECT:聚集函数,Group By, Having视图及其应用 建立数据库

学生选课数据库SCT

学生表:Student(SNo char(8), Sname char(10), Ssex char(2), Sage integer, DNo, char(2), Sclass char(6))

院系表:Dept(DNo char(2), Dname char(10), Dean char(10))

课程表:Course(CNo char(3), Cname char(12), Chourse integer, Credit float(1), TNo char(3))

教师表:Teacher(TNo char(3), Tname char(10), DNo char(2), Slaary float(2))

选课表:SC(SNo char(8), CNo char(3), Score float(1))

建立数据库包括:定义数据库和表(使用DDL),向表中追加元组(DML),两件事。

DDL:创建database,创建table,定义.约束.View.Index…;删除,drop;更改,Alter。 DML:insert, delete, select, update DCL:授权/取消授权,Grant, Revoke

DDL通常由DBA使用,也可以DBA授权之后的程序

创建数据库

表达式:

Create database 数据库名

示例:创建SCT

Create database SCT

定义数据库的同时,也可以定义很多物理特性,这里指介绍最简单的定义。然后可以创建表。 表达式:

Create table 表名(列名 数据类型[primary key|unique][Not null] [列名 数据类型],...)

定义表的时候,最少要有一列

Primary Key每个表只能创建一个主键约束Unique唯一性约束(候选键),可以有多个Not null非空约束。该列不允许出现空值其它 示例:定义学生表Student Create Student(SNo char(10) not null, Sname char(8), Ssex char(2), Sage integer, DNo char(2), Sclass char(6)); 选择元组select

表达式

Select 列名 (子句) From 表明 (子句) Where 检索条件 (子句)

此操作就相当于对一个关系,进行条件查找后再进行投影。 示例:检索学生表中所有学生的信息

Select * From Student;

示例:检索学生表中所有学生的姓名及年龄

Select Sname, Sage From Student

示例:检索学生表中所有年龄大于等于19岁的学生的年龄及姓名

Select Sage, Sname From Student Where Sage >= 19;

关键:检索条件书写 not, and, or运算优先级

示例:检索教师表中所有工资少于1500元或者工资大于2000元 并且是03系的教师姓名

Select Tname From Teacher Where (Salary 2000) and DNo = '03'; #注意 not, and, or 的运算优先级

示例:求或者学过001号课程,或者学过002号课程学生的学号

Select From SC Where CNo='001' or CNo = '002';

示例:求既学过001课程,又学过002课程学生的学号

Select SNo From SC as SC1, SC as SC2 Where SC1.SNo=SC2.SNo and SC1.CNo = '001' and SC2.CNo = '002'; #下面的查询结果是空,也就是select语句书写有问题 Select SNo # 检索结果为空 From SC Where CNo='001' and CN0='002'; # 不可能既等于001,又等于002

结果唯一性问题

关系模型不允许出现重复的元组,但是现实的DMBS中,允许出现重复元组在Table中,要求无重复元组是通过Primary Key或Unique保证在检索结果中,要求无重复元组,通过DISTINCT保留字实现 示例:在选课表中,检索成绩大于80分的所有学号 Select DISTINCT SNo From SC Where Score > 80;

结果排序问题 在select语句中增加order by子句实现排序功能,asc表示升序,desc表示降序 示例:按学号由小到大的顺序显示出所有学生的学号及姓名

Select SNo, SName From Student Order By SNo asc, Sname asc

示例:检索002号课程大于80分的所有同学学号并按成绩由高到低排序

Select SNo From SC Where Score > 80 and DNo = ='002' Order By Score desc;

模糊查询问题 %:匹配0个或多个字符 _:匹配任意单一字符 ****:转义字符。比如只想检索百分号,而不是百分号当作通配符使用。

多表查询

多表查询通过连接运算完成,连接运算通过笛卡尔积完成。将连接条件放到Where子句中即可完成。 示例:按“001”号课程成绩由高到低顺序显示所有写上姓名(两表)

Select Student.SName From SC, Student Where SC.SNo=Student.SNo and SC.CNo='001' Order By SC.CNo desc;

示例:按‘数据库’课程成绩由高到低顺序显示所有同学姓名(三表)

Select Student.SName From Course, SC, Student Where Course.CNo=SC.CNo and SC.SNo=Student.SNo and Course.CName='数据库' Order By SC.Score;

对同一个表进行连接操作:对同一个表,(From子句中)使用不同的别名进行处理 示例:求有薪水差额的任意两位教师

Select T1.TName, T2.TName From Teacher T1, Teacher T2 Where T1.Salary > T2.Salary;

示例:求‘001’号课程有成绩差的任意两位同学

Select S1.SName, S2.SName From SC as SC1, SC as SC2, Student as S1, Student as S2 Where S1.SNo=SC1.SNo and S2.SNo=SC2.SNo and SC1.Score > SC2.Score

示例:求既学过’001’号课又学过‘002’号课的所有学生的学号

Select S1.SNo From SC as S1, SC as S2 Where S1.SNo=S2.SNo and S1.CNO='001' and S2.CNo='002';

示例:列出没学过李明老师教授课程的所有同学姓名?

Select Student.SName From Student, Teacher, Course, SC Where Course.CNo = Teacher.CNo and Course.CNo=SC.CNo and Course.SNo = Student.SNo and (not Teacher.TName='李明') 子查询

为什么需要子查询? 1、集合成员资格查询:某一元素是否是某一个集合成员 2、集合之间比较:两个集合之间进行比较 3、集合基测试:测试集合是否为空、测试集合是否存在重复元组?

子查询:出现在Where子句中的Select语句被称为子查询。子查询返回一个集合。 三种类型子查询:In | Not In , ⊝-Some | ⊝-ALL, Exists | Not Exists 1、【In | Not In】 子查询

表达式 [not] in (子查询)

判断某一表达式的值是否在子查询的结果中 示例:列出张三、王三同学的所有信息

Select * From Student Where SName="张三" or SName ="王三"; Where SName in ("张三", "王三");

示例:列出选修001号课程的学生的学号和姓名

Select SNo, SName From Student Where SNo in (select S# From SC Where CNo = '0001');

示例:求既学过001号课程,又学过002号课程的学生学号

Select SNo From SC Where CNo ='002' and SNo in # 依旧使用SNo进行连接查询 (Select SNo From SC Where CNo == '002);

同一种查询多种书写方式:用户书写更灵活。

示例:列出没学过李明老师讲授课程的所有同学的姓名?

错误示范 Select SName From Student Where DNo not in (Select DNo From Teacher Where TName = '李明') 正确示范 Select SName From Student Where SNo not in (Select SNo From SC, Student, Teacher Where SC.SNo=Student.SNo and SC.TNo=Teacher.TNo and Teacher.name = '李明');

子查询分为内层查询和外层查询,同样受到定义域约束,将子查询分为两个部分: (1)非相关子查询:内层查询中,不使用外层查询的变量 (2)相关子查询:内层查询需要依靠外层查询的变量(只能由外层查询向内层传递参数,不能内层向外层传递参数)

2、【⊝-some 和⊝-all】子查询 语法中,⊝表示比较运算符:, >=,



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有