文章目录

  • 第三章:SQL
    • 3.2 SQL数据定义
      • 3.2.1 基本类型
      • 3.2.2 基本模式定义
    • 3.3 SQL查询的基本结构
      • 3.3.1 单关系查询
      • 3.3.2 多关系查询
      • 3.3.3 自然连接
    • 3.4 附加的基本运算
      • 3.4.1 更名运算
      • 3.4.2 字符串运算
      • 3.4.4 排列元组的显示次序
      • 3.4.5 where子句谓词
    • 3.5 集合运算
      • 3.5.1 并运算
      • 3.5.2 交,差运算
    • 3.6 空值
    • 3.7 聚集函数
      • 3.7.1 基本聚集
      • 3.7.2 分组聚集
      • 3.7.3 having子句
      • 3.7.4 对空值和布尔值的聚集
    • 3.8 嵌套子查询
    • 3.8.1 集合成员资格
    • 3.8.2 集合的比较
    • 3.8.3 空关系测试
    • 3.8.6 with子句
    • 3.9 数据库的修改
      • 3.9.1 删除
      • 3.9.2 插入
      • 3.9.3 更新

第三章:SQL

3.2 SQL数据定义

3.2.1 基本类型

SQL标准中支持多种固有类型

  • char(n):固定长度的字符串,用户指定长度n
  • varchar(n):可变长度的字符串,用户指定最大长度n(注意在Oracle数据库中写作varchar2(n))
  • int:整数类型
  • smallint:小整数类型
  • numeric(p,d):定点数,这个数有p位数字(加上符号位),其中d位在小数点右边
  • real,double precision:浮点数与双精度浮点数
  • float(n):精度至少为n位的浮点数

注意点:

  1. char类型存储固定长度的字符串,如果存入字符串的长度不够,则会以空格补齐
  2. varchar类型不会补充空格,根据用户填入的字符串长度保存
  3. 定点数numeric(3,1)可以精确存储44.5,但却不能精确存储444.5或0.32这样的数

3.2.2 基本模式定义

使用create table命令定义SQL关系

课本中的大学数据库的部分建表sql语句(MySQL)

create table classroom(building      varchar(15),room_number     varchar(7),capacity     numeric(4,0),primary key (building, room_number));
create table department(dept_name       varchar(20), building       varchar(15), budget             numeric(12,2) check (budget > 0),primary key (dept_name));
create table course(course_id       varchar(8), title           varchar(50), dept_name      varchar(20),credits     numeric(2,0) check (credits > 0),primary key (course_id),foreign key (dept_name) references department(dept_name)on delete set null);
create table instructor(ID          varchar(5), name            varchar(20) not null, dept_name     varchar(20), salary         numeric(8,2) check (salary > 29000),primary key (ID),foreign key (dept_name) references department(dept_name)on delete set null);
  • primary key(A1,A2,A3…):表明属性A1,A2,A3…构成表的主码,主码的属性必须非空且唯一
  • foreign key(A1,A2,A3…) references :声明表中这些属性的取值必须和另一个关系上某些属性的取值对应
  • not null:限制不能为空
  • check:自定义限制,括号中填限制的内容

SQL禁止破坏完整性约束的任何数据库更新

使用alert table可以为已有关系增加属性

alert table r add A D

A是待添加属性的名字,D是属性的数据类型
如果表中原本就有数据,则原有元组在新添加的属性上的值全部为null

补充

1.使用constraint关键字给约束命名


2.表空间(tablespace)

表空间是数据库的逻辑划分,一个表空间只能属于一个数据库,以一个数据库可以拥有多个表空间
表空间分为系统表空间和用户表空间
一个表空间可以包含多张表,一张表只能属于一个表空间

3.表的属主Owner

每个数据库对象都有自己的属主,表也有自己的属主。数据库对象默认属主是创建该对象的用户
属主拥有表的所有权限

属主为user1

4.修改表的定义alter

格式:

例:


5.删除表中的属性或约束


删除表中的约束

3.3 SQL查询的基本结构

3.3.1 单关系查询

单关系查询比较简单,举几个简单的例子即可

1.找出所有教师的名字

select name
from instructor;


2.找出所有教师的系名

select dept_name
from instructor;


3.使用distinct关键字查找教师所在的系名

select distinct dept_name
from instructor;


4.在select中使用算数表达式

select name,salary*1.1
from instructor;

5.找出所有在Comp. Sci.系且工资超过70000美元的老师的姓名

select name
from instructor
where dept_name = 'Comp. Sci.' and salary > 70000;

3.3.2 多关系查询

1.找出所有教师的姓名,所在系,和系所在的建筑

select name,i.dept_name,building
from instructor as i,department as d where i.dept_name = d.dept_name;

3.3.3 自然连接

1.找出教师的姓名和他们所教的课程标识

select name,course_id
from instructor natural join teaches;

2.找出教师的姓名和他们所教的课程名称(三张表自然连接)

select name,title
from instructor natural join teaches natural join course;

3.4 附加的基本运算

3.4.1 更名运算

更名运算使用as关键字

select T.name,S.course_id
from instructor as T,teaches as S
where T.ID = S.ID;

3.4.2 字符串运算

1.字符串的匹配

  • %:匹配任意字符
  • _:匹配一个字符

找出所在建筑名称中包含a的所有系名

select dept_name
from department
where building like '%a%';

3.4.4 排列元组的显示次序

1.order by,asc,desc

select name,salary
from instructor
order by name asc,salary desc;

3.4.5 where子句谓词

1.使用between and简化查询

select name
from instructor
where salary between 90000 and 100000;

3.5 集合运算

3.5.1 并运算

找出在2009年秋季开课,或者在2010年春季开课的课程(使用并运算)

 (select course_id from section where semester = 'Fall' and year = 2009) union (select course_id from section where semester = 'Spring' and year = 2010);

3.5.2 交,差运算

MySQL中不支持交和差运算运算,使用intersect和except会报错

3.6 空值

  • 如果算数表达式的任意输入为空,则该算数表达式(+ , - , * , /等)的结果也为空
  • 1 < null的结果为unknown
  • and:true and unknown的结果为unknown,false and unknown的结果为false,unknown and unknown的结果是unknown
  • or:true or unknown的结果是true,false or unknown的结果是unknown,unknown or unknown的结果是unknown
  • not:not unknown的结果是unknown
select name
from instructor
where salary is null;

3.7 聚集函数

3.7.1 基本聚集

1.找出历史系教师的平均工资

select avg(salary)
from instructor
where dept_name = 'History';

2.找出在2010年春季教授一门课程的教师总数

select count(distinct ID)
from teaches
where semester = 'Spring' and year = 2010;

3.7.2 分组聚集

1.找出每个系的平均工资

select dept_name,avg(salary) as avg_salary
from instructor
group by dept_name;

3.7.3 having子句

1.找出每个系的平均工资且平均工资大于4000的系名

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

3.7.4 对空值和布尔值的聚集

除了count(*)以外的所有聚集函数均忽略输入集合中的空值

3.8 嵌套子查询

3.8.1 集合成员资格

  • 连接词in可以用于测试元组是否是集合中的成员
  • 连接词not in用于测试元组中是否不是集合中的成员

例:找出在2009年秋季和2010年春季学期同时开课的所有课程

select distinct course_id
from section
where semester = 'Fall' and year = 2009 and course_id in
(select course_id
from section
where semester = 'Spring' and year = 2010);

例:找出在2009年秋季开课但不在2010年春季学期开课的所有课程

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

3.8.2 集合的比较

1.>some表示至少比某一个大

例:找出至少比Biology系的某一个教师工资要高的教师姓名

select name
from instructor
where salary >some
(select salary
from instructor
where dept_name = 'Biology');

2.SQL也允许使用<some,<=some,>=some,=some,<>some等的使用

3.与some类似,<all,<=all,>=all,=all,<>all的功能类似

找出平均工资大于所有系平均工资的系

select dept_name
from instructor
group by dept_name
having avg(salary) >=all
(select avg(salary)
from instructor
group by dept_name);

3.8.3 空关系测试

使用exists,当子查询非空时返回true,子查询为空时返回false

例:找出选修了Biology系开设的所有课程的学生

select S.ID,S.name
from student as S
where not exists(
(select course_id
from course
where dept_name='Biology')
except
(select T.course_id
from takes as T
where S.ID = T.ID));

exists的执行逻辑和原理要求完全掌握

3.8.6 with子句

使用with子句可以新建一张临时表

例:找出具有最大运算的系

with max_budget(value) as
(select max(budget)
from department)
select budget
from department
where department.budget = max_budget.value;

3.9 数据库的修改

3.9.1 删除

删除语句的基本语法格式

delete
from 表名
where 条件

没有where时默认删除整张表

3.9.2 插入

1.最基本的插入语句

insert into course
values('CS-437','Database Systems','Comp. Sci. ',4);

2.可以在insert语句中指定要插入的属性

insert into course(course_id,title,dept_name,credits)
values('CS-437','Database Systems','Comp. Sci. ',4);

3.9.3 更新

1.一般的update语句

update 表名
set xxx
where xxx;

2.升级的update语句

update table_name
set xxx = casewhen pred1 then result1when pred2 then result2...else result0
end;

3.例:给工资超过100000美元的教师涨3%的工资,其余教师涨5%

update instructor
set salary = casewhen salary > 100000 then salary*1.03else salary*1.05
end;

数据库系统概念笔记——第三章:SQL相关推荐

  1. 【学习笔记】数据库系统原理 第三章 SQL语言

    以下内容为参考课件和<数据库系统概论>(第5版,王珊等著)的个人整理,若有错误欢迎指出 第三章 SQL语言 文章目录 第三章 SQL语言 一.概述 二.数据查询功能 1.查询语句 2.连接 ...

  2. 数据库系统概念总结:第三章 SQL

    周末无事水文章,期末备考的总结资料 第三章 SQL 3.1 SQL查询语言概况 3.2 SQL数据定义 3.2.1 基本类型 char(n):固定长度n的字符串(长度不够自动补空格) varchar( ...

  3. 数据库系统概念笔记-引言

    转载自 数据库系统概念笔记-引言  作者 CyninMa 数据库系统概念笔记-引言 数据库管理系统(DBMS)由一个互相关联的数据的集合和一组用以访问这些数据的程序组成.这个数据集合通常称作数据库,其 ...

  4. Android群英传笔记——第三章:Android控件架构与自定义控件讲解

    Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...

  5. 《金融学》笔记 第三章 信用、利息和利率

    <金融学>笔记 第三章 信用.利息和利率 前言 在<<金融学>笔记>中开了一个头,现在完善具体细节. 金融范畴篇 第一章 货币的本质 第二章 货币制度 第三章 信用 ...

  6. 数据库系统概念笔记-关系模型介绍

    转载自 数据库系统概念笔记-关系模型介绍  作者 CyninMa 数据库系统概念笔记-关系模型介绍 2.1 关系数据库的结构 关系数据库由表(table)的集合构成,每个表有唯一的名字.例如,inst ...

  7. 深入理解 C 指针阅读笔记 -- 第三章

    Chapter3.h #ifndef __CHAPTER_3_ #define __CHAPTER_3_/*<深入理解C指针>学习笔记 -- 第三章*//*它们都保存在栈中的什么位置?*/ ...

  8. 《Go语言圣经》学习笔记 第三章 基础数据类型

    <Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...

  9. 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...

    计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...

最新文章

  1. 企业项目开发--分布式缓存memcached(3)
  2. 如何创建你的第一个Python元类?
  3. 【论文常用网站】-昍陽
  4. 大数据构建模块:选择体系结构和开源框架
  5. matchers依赖_Hamcrest Matchers的高级创建
  6. 开窍小老虎,一步一个脚印之 初识汇编(一)
  7. 定位模块介绍及使用(GPS、北斗、GLONASS、伽利略、准天顶)
  8. create---创建表
  9. 数据标准详细概述-2022
  10. Linux 命令 大结
  11. mysql 全库备份_MySQL 数据库完全备份
  12. c语言获取随机数硬币问题,算法 – 从硬币中创建一个随机数生成器
  13. SCVMM 2012 R2---安装Hyper-V Server 2012 R2主机服务器
  14. 面试笔记-1.计算机网络面试核心
  15. PHP去掉二维数组中某个元素重复的一维数组
  16. redission使用案例
  17. Oracle给查询结果从1到n添加序号
  18. 金刚狼java,《金刚狼3》:泪别狼叔,这次真的要说再见了
  19. python串口stm32_Python 实现Serial 与STM32J进行串口通讯
  20. python库-networkx模块

热门文章

  1. Office365客户端激活失败
  2. 通达信l2数据接口好用吗?
  3. 【技术综述】人脸关键点检测的数据集与核心算法
  4. 浙江大学求是科学班计算机,浙大校友网
  5. 【调剂】中国科学技术大学生物医学工程学院(中科院苏州医工所)2023年硕士研究生(专业学位硕士)调剂简章...
  6. [转载]3Dmax+blend+WPF综合运用
  7. 三重积分平均值_量子力学总结 习题 考卷及答案
  8. 推荐|如何利用碎片化时间学习?
  9. 现代物流不可或缺的EDI系统
  10. AI:DeepSpeed Chat(一款帮用户训练自己模型的工具且简单/低成本/快 RLHF 训练类ChatGPT高质量大模型)的简介、安装、使用方法之详细攻略