B站视频
B站第一章
参考资料
图片来自视频链接和参考资料。

本章目录:

  • SQL特点
  • SQL基本概念
  • SQL的基本语法

SQL特点

SQL包括:数据查询、数据操作、数据定义、数据控制
它是一个非过程语言。

什么是非过程性语言?
我们在逻辑和物理模型里讲了层次、网状、关系模型。
其中层次模型和网状模型的查询是要有过程的,而关系模型不需要过程——这就是非过程性语言。

SQL特点:

  • 综合统一:把定义、修改、删除、连接、安全性、完整性、事务控制、动态SQL等统一起来
  • 高度非过程化:层次模型和网状模型是过程化的,关系模型是非过程化的
  • 面向集合的操作方式
  • 以同一种语法结构提供多种使用方式:既可以独立,也可以嵌入到Java或C++中
  • 语言简洁,易学易用

SQL基本概念



这一章先将前三行的语法,数据控制是安全性里面的。

一些概念:

  • 基本表:二维表
  • 存储文件:存在数据库里的文件
  • 视图:一个虚表,从一个或多个基本表中导出来的表,视图不是真正的表,他的数据都是在基本表中

外模式:视图与部分基本表
模式:基本表
内模式:存储文件

SQL

包括:

  1. 数据定义
  2. 数据查询
  3. 数据更新:修改和删除
  4. 视图

1.数据定义


定义模式:CREATE SCHEMA <模式名> AUTHORIZATION <用户名>

为用户WANG定义一个学生-课程模式S-T:(这里用户可以理解为一个账户)

  • CREATE 定义
  • SCEMA模式
CREATE SCHEMA "S-T" AUTHORIZATION WANG;

删除模式:DROP SCHEMA <模式名> <CASCADE|RESTRICT>

CASCADE(级联)
删除模式的同时把该模式下所有的数据库对象全部删除
RESTRICT(限制)
如果该模式中定义了下属的数据库对象(如表、视图等),则停止执行该语句。

基本表的定义,修改,删除
定义格式:

CREATE TABLE <表名>(<列名> <数据类型>[ <列级完整性约束条件> ][,<列名> <数据类型>[ <列级完整性约束条件>] ]………[,<表级完整性约束条件> ]);

举个定义的例子:
学生表:

CREATE TABLE Student( /*定义一个表名为Student的表*/
Sno(CHAR(9)) PRIMARY KAY,
/*第一列是Sno,是属性(列名),CHAR是数据类型,长度为9. PRIMARY KAY表示设置为主码,逗号分隔*/
Sname CHAR(20) UNIQUE,/*第二列是Sname,设置UNIQUE表示不允许重复*/
Ssex CHAR(2),/*中文'男''女'占两个字节*/
Sdept CHAR(20)
);

课程表:

CREATE TABLE Course(
Cno CHAR(4) PRIMARY KEY,/*列级完整性约数条件,Cno是主码*/
Cname CHAR(40) NOT NULL,/*Cname不能为空*/
Cpno CHAR(4),/*含义是先修课*/
Ccredit SMALLINT,
FOREIGN KEY(Cpno)REFERENCES Course(Cno)
/*表级完整性约束条件,Cpno是外码,被参照的表是Course,被参照的列是Cno*/
);

一些数据类型:

修改基本表
格式:

ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ];

如:向Student表增加“入学时间”列,其数据类型为日期型。

ALTER TABLE Student ADD S_entrance DATE;
/*向Student表   增加列,列名为S_entrance  数据类型为DATE*/

如:将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数

ALTER TABLE Student ALTER COLUMN Sage INT;
/*选择表Student      选择列Sage   让它的数据类型为INT*/

如:增加课程名称必须取唯一值的约束条件

ALTER TABLE Course ADD UNIQUE(Sname);
/**选择表Course 令Sname这列属性UNIQUE**/

删除基本表
格式:

DROP TABLE <表名>[RESTRICT| CASCADE;

RESTRICT:删除表是有限制的。

  • 欲删除的基本表不能被其他表的约束所引用
  • 如果存在依赖该表的对象,则此表不能被删除

CASCADE:删除该表没有限制。

  • 在删除基本表的同时,相关的依赖对象一起删除

索引的建立和删除
索引就是为了加快查询的速度。

建立索引:

CREATE UNIQUE INDEX Stusno ON Student(Sno);/*这里Stusno就是索引名*/

修改索引名:

ALTER INDEX SCno RENAME SCSno;

删除索引:

DROP INDEX Stusname;

数据字典
数据字典是DBMS内部的系统表,它记录了数据库中所有的定义信息。

2.数据查询(重点)

数据查询部分是围绕这三个表展开的:

简单查询
查询学生的姓名、学号、所在系。

SELECT Sname,Sno,Sdept
FROM student;
/*这里查的是列*/

查询全体学生的详细记录。

SELECT *
FROM Student;

查全体学生的姓名及其出生年份。这里假定目前年份是2014年。

SELECT Sname,2014-Sage/*可以有算术表达式*/
FROM Student;

得到的表:

Sname 2014-Sage
李勇 1994
刘晨 1995
王敏 1996
张立 1995

给列进行重命名:把Sname改为NAME,把BIRTH那一列全填满’Year of Birth:',把2014-Sage改为BIRTHDAY,让Sdept内的内容全都变为小写并把它这列改名为DEPARTMENT:

SELECT Sname NAME,
'Year of Birth:' BIRTH,
2014-Sage BIRTHDAY,
LOWER(Sdept) DEPARTMENT/*LOWER是一个函数*/
FROM Student;
/*前面是原来的名字,后面是改后的名字*/

得到的表:

去掉列的重复值:

SELECT DISTINCT Sno
FROM SC;

原表:

去重后:

条件查询

查询计算机科学系的全体学生的名单:

SELECT Sname
FROM Student
WHERE Sdept='CS';
/*查姓名 在Student表里 条件是Sdept列的值为CS*/

查询所有年龄在20岁以下的学生姓名及年龄:

SELECT Sname,Sage
FROM Student
WHERE Sage<20;

查询所有年龄在20-23之间的学生姓名及年龄:

SELECT Sname,Sage
FROM Student
WHERE Sage BEWTEEN 20 AND 23;

查询CS系,MA系,IS系学生的姓名和性别:

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');

LIKEA模糊匹配

查询所有姓刘的学生的姓名、学号和性别:

SELECT Sname,Sno,Ssex
FROM student
WHERE Sname LIkE '刘%';/*以刘开头的字符串*/

查询姓”欧阳“且全名为三个汉字的学生的姓名:

SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳_';/*必须是三个字了*/

查询所有不姓刘的学生的姓名、学号和性别:

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE'刘%';

查询DB_Design课程的课程号和学分:当需要匹配的字符串里有_时,在前面加一个转义字符\

SELECT Cno,Ccredit
FROM Course
WHERE Sname LiKE 'DB\_Design' ESCAPE '\';
/*用escape '\'表示那是一个转义字符*/

涉及空值问题
谓词:

  • IS NULL
  • IS NOT NULL
  • IS不能用=代替

查询缺少成绩的学生的学号和相应的课程号。

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;

查询所有有成绩的学生学号和课程号。

SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;

多重条件查询
逻辑运算符:

  • AND和 OR来联结多个查询条件
  • AND的优先级高于OR
  • 可以用括号改变优先级

可用来实现多种其他谓词:
[NOT] IN
[NOT] BETWEEN … AND …

AND 两个条件都满足
OR 只要满足一个就行

查询计算机系年龄在20岁以下的学生姓名:

SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;

查询结果进行排序
ORDER BY

  • 从高到低 即降序DESC
  • 从低到高 即升序 啥都不加,或者加ASC

当排序含空值时,把空值当作无穷大了。即从高到低的话就最先显示,从低到高就最后显示。

查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列:

SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;

查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列:

SELECT *
FROM Student
ORDER BY Sdept , Sage DESC;
/*先对系号Sdept进行升序排序,所以它是第一关键字
再对年龄降序排列,它是第二关键字*/

聚集函数
用来统计的。

计数:

  • COUNT([DISTINCT|ALL] *)
  • COUNT([DISTINCT|ALL] <列名>)

计算总和:

  • SUM([DISTINCT|ALL] <列名>)

计算平均值:

  • AVG([DISTINCT|ALL] <列名>)

最大最小值:

  • MAX([DISTINCT|ALL] <列名>)
  • MIN([DISTINCT|ALL] <列名>)


查询学生总人数:

SELECT COUNT(*)
FROM Student;

查询选修了课程的学生人数:

SELECT COUNT(DISTINCT Sno)/*把课程号去重,查询选修了这些课的人数*/
FROM SC;

计算选修1号课程的学生平均成绩:

SELECT AVG(Grade)
FROM SC
WHERE Cno='1';

查询选修2号课程的学生最高分数:

SELECT MAX(Grade)
FROM SC
WHERE Cno='2';

查询学生201215012选修课程的总学分数:

SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;

由SC表的学号Sno可以找到课程号Cno,但找不到学分,要根据课程号找学分,则需要Course表:

所以这里的条件是:WHERE Sno='201215012' AND SC.Cno=Course.Cno;

GROUP BY

假设一个学校有几千人,我们把他们分为多个班,这样就可以求出每个班的平均分,这就是group by.

HAVINGWHERE的区别:

  • HAVING用于组,从中选出满足条件的
  • 可以理解为:HAVING是对GROUP BY 分类汇总的筛选
  • WHERE用于基表或视图,从中选出满足条件的元组(其实就是一行)

求各个课程号及相应的选课人数:

SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;

查询选修了2门以上课程的学生学号:

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>2;

多表连接查询
假设现在有两个表:

如果我们直接:

SELECT *
FROM A,B

我们会得到这两个表的笛卡尔积

而真正有意义的只有绿色部分:

所以,我们如果想得到有意义的表:

SELECT *
FROM A,B
WHERE A.学号=B.学号;


这里学号重复了,我们可以不像上面那样写,而是:

SELECT 学号,姓名,班级,课程,成绩
FROM A,B
WHERE A.学号=B.学号

左外连接与右外连接

左外连接格式:

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);

右外连接只需要把LEFT OUTER 改成RIGHT OUTER即可。

嵌套查询

  • 一个SELECT-FROM-WHERE语句称为一个查询块
  • 将一个查询块嵌套在另一个查询块的WHERE子句HAVING短语的条件中的查询称为嵌套查询
  • 限制:不能使用ORDER BY 子句

选择2号课程的学生姓名:

SELECT Sname
FROM Student
WHERE Sno IN(SELECT SnoFROM SCWHERE Cno='2';);

括号里面是一个嵌套查询,它查到的是一个集合:Cno是2的Sno集合。
外面的查询是要查名字,其名字对应的Sno要在这个集合里。


存在EXISTS
在关系代数中我们可以用除法来查找某一全体。

查询选修了所有课程的学生姓名:(这里包含所有,所以要用存在语句)

  1. 有这样一个学生,对于任意Course中的课,该学生都选了
  2. 将上一句话等价转换
  3. 有这样一个学生,不存在Course中的课,该学生没选
  4. 接下来转化成代码:
  5. 有这样一个学生:SELECT Sname FROM Student
  6. 不存在:NOT EXISTS
  7. Course中的课:SELECT Cno FROM Course
  8. 该同学没选(SC对应选课表):NOT EXISTS(SELECT * FROM SC)

即:

SELECT Sname FROM Student /*选一个学生*/
WHERE NOT EXISTS /*不存在*/(SELECT * FROM Course /*课程表里的课*/WHERE NOT EXISTS(SELECT * FROM SC /*有没选的*/WHERE Sno=Student.Sno AND Cno=Course.Cno;))

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

SELECT Sname
FROM Student
WHERE EXISTS(SELECT *FROM SCWHERE Cno='1' AND Sno=Student.Sno)

集合查询
并集UNION
交集INTERSECTION
差集EXCEPT

3.数据更新

数据插入

INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
/*这里指明插入的分别是什么*/
VALUES('201215128','陈冬','男','IS',18);

INSERT
INTO Student
/*不指明插入的是什么,则就是按照表中列的顺序*/
VALUES('201215128','陈冬','男',18,'IS');

可以把SELECT的查询结果插入表。

修改语句

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

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

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

UPDATE Student
SET Sage=Sage+1;

将计算机科学系全体学生的成绩置零:

UPDATE SC
SET GRADE=0
WHERE Sno in(SELECT SnoFROM StudentWHERE Student.Sno=SC.Sno and Sdept='CS';)

删除语句
删除学号为201215128的学生记录:

DELETE
FROM Student
WHERE Sno='201215128';

4.视图

视图是一种虚表,它真正的数据存在基本表上。

CREATE VIEW <视图名>[<列名>[,<列名>]...]
AS <子查询>
[WITH CHECK OPTION];

关于WITH CHECK OPTION

举个例子:

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

这一段代码产生的视图是专业为IS的,包含学生学号、姓名、年龄的视图。但我们在对这个视图进行操作的时候可能对专业为‘MA’的学生数据给改变了——它是不属于试图范围的。
因此我们可以加一句WITH CHECK OPTION,来防止上面说到的情况。


删除视图
DROP VIEW<视图>[CASCADE];

【数据库系统概论】第三章:SQL相关推荐

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

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

  2. 数据库系统概念 第三章 SQL介绍

    文章目录 第 3 章 SQL 介绍 3.1 SQL 查询语言概览 3.2 SQL 数据定义 3.2.1 基本类型 3.2.2 基本模式定义 3.3 SQL 查询的基本结构 3.3.1 单关系查询 3. ...

  3. 数据库系统概论-第三章 关系数据库标准语言 SQL

    概述 SQL的特点 综合统一 SQL集数据定义语言,数据操纵语言,数据控制语言的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动,可以执行以下一系列要求: 定义和修改.删除 关系模式 ...

  4. 数据库系统概论 第三章 第五大题 实验报告

    实验目标: 根据课本p71提供的表格,实现p130第五大题的问题,理解和掌握关系数据库标准SQL语言,能够熟练使用SQL语言完成各种数据库操作和管理任务.包括使用SQL DDL语句创建.更改和删除数据 ...

  5. 数据库系统概论第三章学习通作业(建表、查询、修改、删除、视图)

    设有3个关系: S(S#,SNAME,SEX,AGE) SC(S#,C#,GRADE) C(C#,CNAME,TEACHER) 试用SQL语句完成下列大题1~4的任务: 用数据定义语言DDL定义上述三 ...

  6. 东北大学 数据库概论 第三章SQL 习题见解:Find all customers who have an account at all branches located in Brooklyn

    题目:找到所有客户中 在Brooklyn城市的所有支行都有存款 的客户的信息 解析:见图,按照①②③④的顺序阅读,分别介绍 except前方的语句的作用 except后方的语句的作用 except前后 ...

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

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

  8. 第三章 SQL命令 ALTER USER

    文章目录 第三章 SQL命令 ALTER USER 大纲 参数 描述 权限 示例 第三章 SQL命令 ALTER USER 修改用户密码. 大纲 ALTER USER user-name IDENTI ...

  9. 第三章 SQL错误信息

    文章目录 第三章 SQL错误信息 `SQLCODE` `0`和`100` `SQLCODE -400` 检索`SQL`消息文本 第三章 SQL错误信息 下表列出了SQL数字错误代码及其错误消息.这些代 ...

  10. 第三章 SQL聚合函数 COUNT(一)

    文章目录 第三章 SQL聚合函数 COUNT(一) 大纲 参数 描述 没有行返回 流字段 第三章 SQL聚合函数 COUNT(一) 返回表或指定列中的行数的聚合函数. 大纲 COUNT(*)COUNT ...

最新文章

  1. 微软批量授权版WINDOWS 10资料(截至到2015年11月,此处无下载地址)
  2. struts2文件下载及 param name=inputNameinputStream/param的理解
  3. [CSS]CSS:类目之间的竖线问题
  4. html隐藏块元素过度动画,CSS3实现DIV图层隐藏到显示的过渡效果
  5. 特斯拉自动驾驶遭遇中国性价比强敌!纽劢(mài)L3方案发布,成本1万3
  6. 【原/转】UITableview性能优化总结
  7. 2021总结,我在CSDN这些年
  8. 各大网站的主题色RGB值,做icon专用
  9. 【Hostapd support for WPA3 R3 Wi-Fi Security】
  10. java des 加密 单倍长_明明白白使用DES加密算法
  11. idea复制项目导致sources root复用了另一个项目
  12. 虚拟存储技术-virtual memory technologies
  13. 【大数据入门核心技术-Tez】(一)Tez介绍
  14. mysql 表锁和行锁
  15. Tensorflow C++使用ops::BatchMatMul实现特征批量乘法
  16. Virtualbox源码分析20 NEM(Hyper-V兼容)1 Hyper-V架构和API介绍
  17. angular2 (v2.0)
  18. 知乎、B站为何成「中国社区」概念股?
  19. 【云计算与虚拟化】第三章 实验二 在ESXi主机中安装操作系统
  20. JavaWeb项目在Tomcat中的部署

热门文章

  1. echarts 柱状图 如何添加点击事件
  2. 悲痛中提醒大家注意安全(深圳事件,有些恐怖),大家可要注意啊!
  3. 【工具】1634- 提高工作效率,这 10 款 AI 工具不能错过!
  4. 这种取巧的方法,你应该掌握
  5. 京东商品详情页API接口、京东详情API接口、京东商品销量API接口、京东商品列表API接口、京东APP详情API接口、京东SKU信息接口,京东API接口
  6. 总结几个比较常用的数学公式(新手入门)
  7. java 设置语言_Java 国际化 语言切换
  8. 常见外贸英文缩写(中)
  9. C# 操作LDAP查找组或人员信息
  10. Easypoi使用模板导出文档或excel表格详解