文章目录

      • 集合查询
      • 基于派生表的查询
    • 数据更新
      • 插入数据
        • 插入元组
        • 插入子查询的结果
      • 修改数据
      • 删除数据
        • 删除一个元组的值
        • 删除多个元组的值
    • 空值的处理
      • 空值的产生
      • 空值的算术运算、比较运算和逻辑运算
    • 视图
      • 建立视图
        • 带表达式的视图
      • 删除视图
      • 查询视图
      • 更新视图
  • 小结

集合查询

集合操作主要包括:
  并操作  UNION
  交操作  INTERSECT
  差操作  EXCEPT

例3.64:查询计算机科学系的学生及年龄不大于19岁的学生

SELECT *
FROM Student
WHERE Sdept = 'CS'
UNION
SELECT *
FROM Student
WHERE Sage <= 19


例3.65:查询选修了课程1或者选修了课程2的学生

SELECT *
FROM SC
WHERE Cno = '1'
UNION
SELECT *
FROM SC
WHERE Cno = '2'


例3.66:查询计算机科学系的学生与年龄不大于19岁的学生的交集

SELECT *
FROM Student
WHERE Sdept = 'CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage <= 19

例3.67:查询既选修了课程1又选修了课程2的学生

SELECT *
FROM SC
WHERE Cno = '1'
INTERSECT
SELECT *
FROM SC
WHERE Cno = '2'

例3.68:查询计算机科学系的学生与年龄不大于19的学生的差集

SELECT *
FROM Student
WHERE Sdept = 'CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage <= 19

基于派生表的查询

子查询不仅可以出现在WHERE子句中,还可以出现FROM子句中

例3.57:找出每个学生超过他自己选修课程平均成绩的课程号

SELECT Sno,Cno
FROM SC x
WHERE Grade >= (SELECT AVG(Grade)FROM SC yWHERE y.Sno = x.Sno
);可以改写成SELECT Sno,Cno
FROM SC,(SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno)
AS Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno = Avg_sc.avg_sno AND SC.Grade >= Avg_sc.avg_grade


例3.60:查询所有选修了1号课程的学生姓名

SELECT Sname
FROM Student
WHERE EXISTS(SELECT *FROM SCWHERE Sno = Student.sno AND Cno = '1'
);可以改写成SELECT Sname
FROM Student,(SELECT SnoFROM SCWHERE Cno = '1'
)
AS SCI
WHERE Student.Sno = SCI.Sno;

派生表出来的表格不会在数据库中显现出来,相当于是一个临时数据库

数据更新

插入数据

插入元组

插入元组用INSERT谓词,一般格式为

INSERT
INTO <表名> [(<属性列1> [,<属性列2>…  )]
VALUES (<常量1> [,常量2]...);

例3.69:将一个新学生元组(学号:201215128,姓名:陈冬,性别:男,所在系:IS,年龄:18岁)插入到Student表中

INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('201215128','陈冬','男','IS',18);


出现这个提示是因为原表格中已经有陈冬这个人了

例3.70:将学生张成民的信息插入到Student表中

INSERT
INTO Student
VALUES('201215126','张成民','男',18,'CS');


在INTO后面没有指定属性的话,如果该属性可以赋NULL,则数据库自动将其赋值为NULL,否则会报错

插入子查询的结果

插入子循环结果的INSERT语句一般格式为:

INSERT
INTO <表名>  [(<属性列1> [,<属性列2>…  )]
子查询;

例3.72:对每一个系,求学生的平均年龄,并把结果存入数据库

CREATE TABLE Dept_age(Sdept CHAR(15),Avg_age SMALLINT
);

然后对Student表按系分组求平均年龄,再把系名和平均年龄存入新表中

INSERT
INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;

修改数据

UPDATE  <表名>
SET  <列名>=<表达式>[,<列名>=<表达式>] …
[WHERE <条件>];

例3.73:将学生201215121的年龄改为22岁

UPDATE Student
SET Sage = 22
WHERE Sno = '201215121';


例3.74:将所有学生的年龄增加1岁

UPDATE Student
SET Sage = Sage + 1

改变前:

改变后(手抖了,点击了两次执行):

例3.75:将计算机科学系的全体学生的成绩置为0

UPDATE SC
SET Grade = 0
WHERE Sno IN(SELECT SnoFROM StudentWHERE Sdept = 'CS'
);

删除数据

删除语句的一般格式为

DELETE
FROM <表名>
[WHERE <条件>];

删除一个元组的值

例3.76:删除学号为201215128的学生记录

DELETE
FROM Student
WHERE Sno = '201215128';


发现陈冬已被删除

删除多个元组的值

例3.77:删除所有学生的选课记录

DELETE
FROM SC;


空空如也了

例3.78:删除计算机科学系所有学生的选课记录

DELETE
FROM SC
WHERE Sno IN (SELECT SnoFROM StudentWHERE Sdept = 'CS'
);

空值的处理

空值的产生

例3.79:向SC表中插入一个元组,学生号是”201215126”,课程号是“1“,成绩为空

INSERT INTO SC(Sno,Cno,Grade)
VALUES('201215126','1',NULL);或INSERT INTO SC(Sno,Cno,Grade)
VALUES('201215126','1');


例3.80:将Student表中学生号为”201215200“的学生所属的系改为空值

UPDATE Student
SET Sdept = NULL
WHERE Sno = '201215200';


因为没有201215200学生,所以数据库0行进行了改动

例3.81:从Student表中找出漏填了数据的学生信息

SELECT *
FROM Student
WHERE Sname IS NULL ORSsex IS NULL ORSage IS NULL ORSdept IS NULL;

空值的算术运算、比较运算和逻辑运算

例3.82:找出选修了1号课程的不及格的学生

SELECT Sno
FROM SC
WHERE Grade < 60 AND Cno = '1';

例3.83:选出选修了1号课程的不及格的学生以及缺考的学生

SELECT Sno
FROM SC
WHERE Grade < 60 AND Cno = '1'
UNION
SELECT Sno
FROM SC
WHERE Grade IS NULL AND Cno = '1';SELECT Sno
FROM SC
WHERE Cno = '1' AND (Grade < 60 OR Grade IS NULL);

视图

视图是从一个或几个基本表中导出的表。与基本表不同的是,他是虚表。一旦基本表中的数据发生变化,从视图中查询出的数据也会随之发生变化。

建立视图

建立视图的 CREATE VIEW 命令建立视图

CREATE VIEW <视图名> [(<列名> [,<列名>] ...)]
AS <子查询>
[WITH CHECK OPTION]WITH CHECK OPTION表示对视图进行UPDATE、INSERT、DELETE操作时要保证更新、插入、删除的行满足视图定义中的谓词条件

组成视图的列名必须全部省略或全部指定。以下3中情况中,必须明确指明组成视图的所有列名:

  1. 某个目标列不是单纯的属性名,而是聚集函数或列表达式
  2. 多表连接时选出了几个同名列作为视图的字段
  3. 需要在视图中为某个列启用新的更合适的名字

例3.84:建立信息系学生的视图

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept = 'IS'


例3.85:建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图中只有信息系的学生

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept = 'IS'
WITH CHECK OPTION;

如果数据库中已经有了同名的视图,数据库不会给覆盖,而是会报错

例3.86:建立信息系选修了1号课程的学生的视图(包括学号、姓名、成绩)

CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Stduent.Sno,Sname,Grade
FROM Student,SC
WHERE Sdept = 'IS' AND Student.Sno = SC.Sno AND SC.Cno = '1';

多表建立视图的时候,AS后的SELECT可以将多表中的各属性直接一起列出来。如果视图的列名要重新命名的话,要将各新属性直接写在要创建的视图名后边

例3.87:建立信息系选修了1号课程并且成绩在90分以上的学生的视图

CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade > 90

带表达式的视图

例3.88:定义一个反映学生出生年份的视图

CREATE VIEW Student_Birthday(Sno,Sname,Sdept,YEAR)
AS
SELECT Sno,Sname,Sdept,2021-Sage
FROM Student;


例3.89:将学生的学号及平均成绩定义为一个视图

CREATE VIEW AVG_Grade(Sno,Grade)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;

这里的运行结果可能是在做上面实验的时候,将SC表清空了,而且126同学的Grade置为NULL

删除视图

删除视图语句的一般格式是

DROP VIEW <视图名> [CASCADE]CASCADE是级联(与其有关的全部删除)

例3.91:删除视图BT_S和视图IS_S1

DROP VIEW BT_S;
DROP VIEW IS_S1;

查询视图

例3.92:在信息系学生的视图中找出年龄小于20岁的学生

SELECT Sno,Sage
FROM IS_Student
WHERE Sage < 20

整体查询方法于基本表查询方法一致可参照前4篇博文进行对比查看
SQL 索引的操作 数据查询(1)数据更新
SQL 数据查询(2)
SQL 数据查询(3)
SQL 数据查询(4)—— 嵌套查询

更新视图

例3.95:将信息系学生视图IS_Student中学号为”201215122“的学生姓名改为”刘辰“

UPDATE IS_Student
SET Sname='刘辰'
WHERE Sno='201215122';

例3.96:向信息系学生视图IS_Student中插入一个新的学生记录

INSERT
INTO IS_Student
VALUES('201215129','赵新','20');

例3.97:删除信息系学生视图IS_Student中学号为2012151129的学生记录

DELETE
FROM Student
WHERE Sno = '201215129';

小结

感觉整个第三章主要难点在于嵌套查询这一块,上课的时候,虽然感觉在听讲,但总是有一种脑子转不过来劲的感觉。课后研究的时候,有点感觉,但是相关子查询和非相关子查询的嵌套步骤还需要熟悉。就不能光做完就了事了,还是要多研究。

SQL 数据查询(5)—— 集合查询、基于派生表的查询、数据更新、视图相关推荐

  1. mysql教程详解之多表联合查询_详解数据库多表连接查询的实现方法

    详解数据库多表连接查询的实现方法 通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 在关系数据库管理系统中,表建立时各数据之间的关系不必 ...

  2. 基于php的公交查询系统研究与实现,基于PHP的公交查询系统研究与实现

    基于PHP的公交查询系统研究与实现 摘要:公交查询系统是专门服务于市民出行的信息系统,它是城市社会和经济活动的重要组成部分.以浙江省兰溪市为例研究并实现了面向广大用户的公交查询系统,主要运用PHP技术 ...

  3. mysql查询当天最新的一张表_mysql 查询当天、本周,本月,上一个月的数据

    本篇文章内容为网上收集内容 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE T ...

  4. 《SQL 入门教程》第07篇 多表连接查询

    <SQL 入门教程>专栏目录 第01篇 SQL 简介 第02篇 查询初体验 第03篇 查询条件 第04篇 结果排序 第05篇 限定结果数量 第06篇 分组与汇总 第07篇 多表连接查询 第 ...

  5. mysql水果表查询_最全MySQL数据库表的查询操作

    序言 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可 ...

  6. mysql多个子查询_mysql(5)多表--子查询

    商品分类==goods cate.商品品牌==brand name.是否上架==is_show.是否销售一空==is_saleoff [子查询--subquery] 子查询是指出现在其他sql语句内的 ...

  7. mysql中多表联合查询语句_mysql中的多表联合查询语句是什么

    mysql中的多表联合查询语句是:[select 语句1 union [union 选项] select 语句2 union [union 选项] select 语句n].多表联合查询结果是将多个se ...

  8. SQL实现一对多、多对多建表与查询

    1 一对多.多对多.自关联多对多.自关联一对多场景描述 之前在做网页开发的时候一直用Sqlalchemy来操作数据库,当我用到自关联多对多和自关联一对多的时候,sqlalchemy的配置会有一些辅助的 ...

  9. mysql 查询从库状态_Mysql库表状态查询

    1. 查看库的各链接状态 对于一个mysql连接或者一个线程,任何时刻都有一个状态,表示其当前正在做什么.一般使用show full processlist查看. +---------+------- ...

最新文章

  1. pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器
  2. 【深度学习入门到精通系列】医学图像预处理—灰度转换代码(G通道)
  3. SAP-ABAP SmartForms之变量显示小技巧
  4. Halcon Example - 圆弧测量对象的使用
  5. vs调用css写的c语言程序,c语言文件读写实例
  6. mysql lock not wait_【MySQL】关于MySQL出现lock wait timeout exceeded 的解决方案
  7. Java中的Set, List, Map漫谈
  8. fastboot工具的操作流程
  9. 孙玄:年薪75万的真实技术面试实践攻略(篇章一)
  10. 高通MSM8953处理器(CPU)/骁龙625资料介绍
  11. python如何读取文件数据恢复_如何找回丢失的文件数据
  12. 趋势移动或者移动应用2012
  13. 系统安全性之十大措施
  14. 【微信小程序】合法域名校验出错,不在以下合法域名列表中 解决方法
  15. 微表面模型Beckmann–Spizzichino distribution的概率密度函数推导
  16. Heart Rate Variability Analysis with the HRV Toolkit: Basic Time and Frequency Domain Measures/背景
  17. 最全遥感样本数据集分享:场景识别数据集
  18. 从“策略模式”聊聊“设计模式”有多重要?
  19. 树的递归与非递归遍历算法
  20. spring中bean的5个作用域

热门文章

  1. Android的两种视频播放
  2. 微宝球型机器人功能_腾讯微宝球型机器人亮相 能游戏可无线充电
  3. 关于一些刚开始接触计算机的基础知识
  4. Linux常用命令及知识点汇总(二)
  5. webform asp.net gridview 分页 利用aspnetpager 分页
  6. 【imessage相册脚本源码】苹果群发头部添加合并id
  7. 黑马程序员 发布一个虚拟复印机的小程序
  8. unity transform的position和localPosition属性的区别
  9. 37、Java——吃货联盟订餐系统(JDBC+MySQL+Apache DBUtils)
  10. Linux docker(01) 基础操作