第三章:关系数据库标准语言SQL

2023-10-27

模式数据定义语言(Schema Data Definition lanuage DDL )

外模式数据定义语言(Subschema Data Definition lanuage 外模式DDL)

数据存储有关的描述语言(Data storage Description Language,DSDL)

数据操纵语言(Data Manipulation Lanuage DML)

DQL 查询语言 DCL 控制语言

操作对象 操作方式
创建 删除 修改
模式 create schema Drop schema
create table Drop table alter Table
视图 create view Drop view
索引 create index Drop index alter index

模式

1create schema <模式名> authorization 用户名 没用模式名,则模式名隐含为用户名

2Drop schema<模式><casade|restrict>cascade 再删除模式时,其下的所有对象与视图都删掉

3restrict:模式下若有定义的对象与视图,则不能执行删除模式

create <表名>(列名<数据类型>  [列级完整性约束条件]

,[表级完整性约束条件])

关于表的名词性解释。

/*完整性约束条件 1:实体完整性:主要规范主键,即主属性不为空等

                             2:参照完整性:主要规范外键,即外码(外码不需要与主码同名,外码必须等于所参照主码的值,或者为空)

                             3:用户完整性:其他属性的域、取值范围、条件等*/

/*候选码:一个属性组可以唯一地标识元组

主码:候选码里选一个;

主属性:候选码的所有属性称为主属性,

非码属性:除了主属性以外的属性

全码

*/

举例:

create table student

(

sno char(9) primary key,

snmae char(20) unique /*取唯一值*/

ssex char(2),

sage smallint,

sdept char(20)

)

create table coures(

cno char(4) primary key,

cname char(40) not null,

ccredit  smallint,

foreign key(cpno) references coures(cno)

)

/*

char和varchar都是用来存储字符串的,但是他们保持和检索的方式不同。

char是属于固定长度的字符类型,而varchar是属于可变长度的字符类型。

由于char是固定长度的所以它的处理速度比varchar快很多。但是缺点是浪费存储空间,读取char类型数据时候时如果尾部有空格会丢失空格,所以对于那种长度变化不大的并且对查询速度有较高要求的数据可以考虑使用char类型来存储。

另外随着MySQL版本的不断升级,varchar数据类型的性能也在不断改进并提高,所以在许多的应用中,varchar类型被更多的使用

*/

外模式-对应视图(多个视图) 

模式-对应数据库(包含多个表)

内模式 对应物理存储文件

三种方法表名 表所属的模式

1:在表名显示的给出 ;create table "s-t".student(.....);S-T 为表名

2:创建模式是同时创建表;

3:在所属模式中,直接创建表

修改表

alter table<表名>

[add[column]<列名><数据类型>[约束]]

[add[表级约束]]

[drop [column]<列名>[cascade|restrict]]

[drop constraint[column]<完整性约束>[Restrict|cascade]]

[alter column<列名><数据类型>]

删除表

drop table<表名> [restrict|cascade];

以上restrict都是一个问题,就是不能被其他表所引用作为外键,视图,触发器,函数,存储过程等,若有则不能删除

查询

select [all|distinct]<目标列> 

from[表或视图]  as[别名]

[where<条件表达式>]

[group by<列名>[having<条件表达式>]]

[order by<列名>[asc|desc]];

每个关键字的作用演示

创建3个表如下:

课程表

学生选课表

 

  学生表

名词理解

传统集合运算:并,差,交,笛卡尔积

专门的关系运算:选择,投影,连接,除

单表查询:

1select Sno,sname form student  这里select对应的是投影

2select sname,2014-sname from student /*2014-sage这里是个运算,表中是2014-sage的结果*/

3复杂版:select sname NAME ,'year of birth:' birth,2014-sage birthday,lower(sdept) department from student;

4消除查询列重复元组:select sno from distinct sc

distinct 消除重复元组

可以返现 “,”分隔符 前面是查询记过,后面便是查询列的命名

查询满足条件  其实这里相当于关系条件的 选择

关键词:

查询条件 谓词
比较 比较大小、!=,<>,NOT+上述比较符
确定集合

IN,NOT IN

字符匹配

Like,not like

空值 is null, is not null
多重条件 and,or,not
确定范围 between and ,not between and

1select sname, sage from student where sage<20;

2select sname,sdept,sage from student  where sage between 20 and 23'

3 select sname,ssex from student where sdept in('cs','ma','is');

4字符匹配

[not] like '<匹配串>' [escape'<换码字符>']

其中匹配串的通配符有:“%”:a%b以a开头,以b结尾的任意长度字符

                                        “_” :a_b表示 以a开头,b结尾的长度为3的任意字符

select *from student where sno ='201215121';

select*from student where sname like '刘%';

/*注意当用户要查询的字符串本身就有通配符%或_,就使用"escape"换字符进行转义*/

select sno,ccredit  from student where cname like 'DB\_design'    escape'\'

此时“\”不在具有通配符意义。

1多重查询条件:select sname from student where sdept='cs' and sage<20;

可以用and和or

2order by L对查询结果按照属性组进行升序(asc)或降序排列(desc)

3group by 字句:将具有相同cno值的元组为一组;

select cno,count(sno) from sc group by cno;

select sno from sc group by sno having count(*)>3;

where 与 croup短语的区别在于作用对象不同,where作用于基本表或者视图,而having作用于组,从中选择满足条件的组

注意 where 语句中不能用聚集函数作为表达式。

4 聚集函数;

count(*) 统计元组个数
count([distinct|all]<列名>) 统计一列中值的个数
sum([distinct|all]<列名>) 计算一列值的总和
avg([distinct|all]<列名>) 计算一列值的平均值
max([distinct|all]<列名>) 求一列值中的最大值
min([distinct|all]<列名>) 最小值

例:select count(distinct sno) from sc;

连接查询

各连接字段类型必须是可比的,但名字不必相同

格式:表名.列名  比较运算符 表名.列名

select from student.* sc.* from student sc where student.sno=sc.sno;

/*自然连接会把目标列中重复的属性列去掉*/

自身连接()

列:查询一门先修课的先修课

select first.cno,second.cpno

form course first ,course second where first.cpno=second.cno;

外连接

select student from student left outer join sc on(student.sno=sc.sno);

/*可以使用using来去掉结果中的重复值*/

左边连接列出左边关系的所有元组,右边连接列出右边关系的所有元组

多表连接

select student.sno,sname,cname,grade  from student ,sc,coures 

where student.sno=sc.sno and sc.cno=course.cno;

嵌套查询

即将一个查询块套在另一个查询块里面:

一个select-from-where 是一个查询块,如将一个查询块套在where子句或having短语中的查询

为嵌套查询

select sname from where sno in(select sno from sc where cno='2');

in这个谓词用来查找属性值属于集合的元组,in是嵌套查询中最常使用的谓词

*注意:select语句不能使用order by语句order by只能对最终结果排序。

不相关查询;子查询不依赖父查询。

查询选修了课程名为“信息系统”的学生学号和姓名

select sno,sname from student 

where sno in(select sno from sc  where cno IN(

select from course where  cname ='信息系统'))

select sno,cno from sc x where grade >=(select avg(grade from sc y where y.sno=x.sno))

相关谓词解释

/*  '<>'相当于 '!="       */

ANY 为任意

如:select from sname,sage from student where sage <any( select sage from student where sdept='cs') and sdept<>'cs'

可以发现谓词可以与聚集函数相互替换

EXISTS 谓词的子查询

exist 不返回任何数据,只产生逻辑真值:true或false;

exist 只关心内层查询是否有返回值,所以比较高效

select sname from student where not exists (select*from sc where sno=student.sno and con='1');

集合查询

并:UNION 交:INTERSECT 差:EXCEPT

select * from where sdept='cs '  UNION select * from student where sage <=19;

派生表的查询:

select sno,cno from sc ,(select sno,avg(grade) from sc group by sno as avg_sc(avg_sno,avg_grade));

数据更新

插入数据 

insert into student(sno,sname) values('201215128','城东');

插入子查询结果

create table dept_sage(sdept char(15)  avg_avg samllint);

insert into dept_age(sdept,avg_age)   select sdept,avg(sage)

from student group by sdept; 

修改数据

update student set sage=22 where sno='201215121';

update student set sage=sage+1;

update studen set grade=0 where sno in (select sno from student where sdept='cs');

删除数据

delete from student where.........

空值处理

判断是否空值 用 IS NULL 或 IS not NULL 来处理、

空值的算数运算,比较运算,和逻辑运算

空值与另一个值的比较运算结果为UNKNOWN;

找出不及格与缺考的学生

select sno from sc where grade<60 and cno='1'  UNION select sno from sc  where grade IS null AND con='1';

视图

create  view  IS_studen as select sno,sname,sage from student where sdept ='5';

执行create view 语句时只是把视图的定义存入数据字典,并不执行其中的select语句

删除视图:

drop view  student_s/*如拒绝执行,很可能在这个视图之上又建立了视图,所以非要删除

则 drop view  student_s  cascade/*此时删除其本省和其导出的全部视图*/

更新视图:

对视图的更新最终要转化为对基本表的更新

update IS_student set sname='刘晨' where sno='20125122';

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第三章:关系数据库标准语言SQL 的相关文章

  • SQL FORMAT 函数错误

    这个SQL select FORMAT lNum from rpt myView 产生以下错误 参数数据类型 varchar 对于格式的参数 1 无效 功能 lNum is a varchar 10 运行 SQL Server 2012 v
  • ADO.NET 池连接无法重用

    我正在开发一个 ASP NET MVC 应用程序 该应用程序使用 EF 6 x 来处理我的 Azure SDL 数据库 最近 随着负载的增加 应用程序开始进入无法再与 SQL 服务器通信的状态 我可以看到有 100 个到我的数据库的活动连接
  • MSSQL:如何使用代码编写存储过程创建脚本?

    我正在尝试使用一个数据库中存在但另一个数据库中不存在的 information schema routines 查询存储过程定义列表 SELECT t1 Routine Definition FROM server1 MyDatabase
  • 如何比较 Postgresql 中日期时间字段中的日期?

    在比较 postgresql Windows 中的版本 9 2 4 中的日期时 我遇到了一个奇怪的情况 我的表中有一列说update date与类型timestamp without timezone 客户可以仅使用日期搜索此字段 例如 2
  • 查询从同一表中的另一条记录获取值并按大于间隙阈值的差异进行过滤

    我将数据导入到 MS Access 中的临时表中 如下所示 我添加了需要使用 SQL 查询计算的 Gap 和 Previous Current 列 间隙阈值 是用户输入或范围提供给查询和例如是 300 GlobalID 对 ItemID 进
  • Delphi XE5 FireDAC 错误:无法加载供应商库 [libmysql.dll 或 libmysqld.dll]

    我在 Windows 7 64 位上使用 Delphi XE5 只是尝试 FireDAC 组件 我正在使用一个 TFDConnection 组件连接到本地 MySQL 数据库 v5 6 15 我已经将 libmysql dll 32位 v5
  • 如何使用 Alter Table 在 Access 中创建小数字段?

    我想以编程方式在 MS Access 表中创建一个新列 我尝试过很多排列ALTER TABLE MyTable Add MyField DECIMAL 9 4 NULL 并得到 字段定义中的语法错误 我可以轻松创建一个数字字段Double类
  • 随机排列每行的列值

    我正在使用 C NET 开发多项选择题考试生成器 每次做出报告时 都会在数据库中随机挑选问题 并随机调整选项 我可以做随机问题部分 但我不能做选择的洗牌 我有一张表 其中一行如下 question answer distractor1 di
  • 日常 MySQL(部分和过滤)复制的最佳实践?

    我有一个相当大的数据库 有超过 40 个表 我只需要复制几个表 5 并且每个表也被过滤 我正在寻找一些复制这些数据的最佳实践 每天就足够了 我可以只选择几个表并为每个表包含一些 WHERE 子句 我正在考虑为每个表启动 mysqldump
  • 无法从 Web 主机本身以外的任何地方连接到任何 Web 主机的 MySQL 数据库

    我有 2 个不同的虚拟主机 pagodabox 000webhost 都是免费的 并且我已经设置了localhost与MySQL 我已经在他们三个上安装了 wordpress 它们在自己的域中工作得很好 即 什么时候localhostwor
  • oracle lag 函数与 group by

    我有一个查询忽略从前一个值增加的值 例如 采用下表 col1 col2 col3 5 1 A 4 2 A 6 3 A 9 4 B 8 5 B 10 6 B 现在进行以下查询 select col1 from select col1 lag
  • 删除前导零

    给定列中的数据 如下所示 00001 00 00026 00 我需要使用 SQL 删除空格后面的所有内容以及值中的所有前导零 以便最终输出为 1 26 我怎样才能最好地做到这一点 顺便说一句 我正在使用 DB2 这已在 DB2 for Li
  • SQL查询获取最后两条记录的DateDiff

    我有一个名为 Event 的表 其中 eventNum 作为主键 日期作为 SQL Server 2008 R2 中的 datetime2 7 我试图获取表中最后两行的日期并以分钟为单位获取差异 这就是我目前所拥有的 Select DATE
  • VIEW for 表结合 UNION ALL 的 MySQL 性能

    假设我有 2 张桌子MySQL create table persons id bigint unsigned not null auto increment first name varchar 64 surname varchar 64
  • 如何将变量设置为触发器 MYSQL 内存储过程的结果?

    我这里有一个小问题 我正在为我的数据库工作创建一个触发器 但我不知道如何在触发器内使用存储过程 我想将过程的结果保存在变量中 然后使用稍后在 IF 比较器上变量 这是我的代码 DELIMITER CREATE TRIGGER insert
  • If Else 条件的 SQLite 语法

    我正在使用 SQLite 数据库 我的表有一个名为 密码 的文本列 早些时候 为了检索我用来执行简单操作的值select from myTable询问 但现在的要求是 如果Password值不是NULL那么我需要将其显示为 是 或 否 它是
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • jDBI中如何进行内查询?

    我怎样才能在 jDBI 中执行这样的事情 SqlQuery select id from foo where name in
  • ActiveRecord 查询,按关联排序,最后一个 has_many

    我试图列出所有Users by the created at最近创建的关联记录 通讯 列 到目前为止我所拥有的 User includes communications order communications created at IS
  • SQL Server查询麻烦,多对多关系

    不知道如何用一行字来表达这个问题 对标题表示歉意 我的数据库中有3个表 例如 Shop Item 商店库存 Shop 和 Item 具有多对多关系 因此 ShopStock 表将它们链接起来 ShopStock 中的字段是 ID ShopI

随机推荐

  • java 上传方法_Java实现文件上传的方法

    本文实例为大家分享了java实现文件上传的具体代码 具体内容如下 1 java代码 package com github reston servlet import java io file import java io fileoutpu
  • 添加高斯噪声

    coding utf 8 import cv2 as cv import numpy as np import sys def add noise image mean 0 val 0 01 size image shape image i
  • 用本机电脑搭建网站(域名、DNS解析)

    最近又准备瞎捣鼓一下个人网站 本来呢 如果是自己玩玩的话 用花生壳或者NAT123这样的动态DNS解析就可以了 但是最近花生壳这个吊玩意不知道怎么又没办法解析了 而且这货给的域名用的是我的手机号 如此一来个人隐私也暴露了 所以今天我就来研究
  • 吴恩达Coursera深度学习课程 deeplearning.ai (5-2) 自然语言处理与词嵌入--编程作业(二):Emojify表情包

    Part 2 Emojify 欢迎来到本周的第二个作业 你将利用词向量构建一个表情包 你有没有想过让你的短信更具表现力 emojifier APP将帮助你做到这一点 所以不是写下 Congratulations on the promoti
  • java的继承(一)

    程序中的继承 特点 利于代码复用 缩短开发周期 关键字 class Dog extends Animal 方法重写 与方法重载 方法重写 方法和父类方法参数完全一样 返回值相同 访问修饰符权限 gt 父类方法 重写方法 我理解为重写参数作用
  • buuctf[MRCTF2020]千层套路

    buuctf MRCTF2020 千层套路 题目描述 题目分析 解题过程 题目描述 题目给了一个以四位数字做文件名的压缩文件 题目分析 发现题目给的压缩文件名 就是解压这个压缩文件的密码 既然是千层套路 类似的操作可能要进行一千次 解题过程
  • div失去焦点事件onblur()无效

    初学js事件 想做一个点击时变红 取消聚焦时变白的div 于是我这样写代码 div style width 100px height 50px border 1px solid div
  • 谷歌Chrome浏览器开发者工具教程—基础功能篇

    Chrome F12开发者工具 是非常实用的开发辅助工具 对于前端开发者简直就是神器 但苦于开发者工具是英文界面 且没有中文 这让很多朋友都不知道怎么用 下载吧小编为大家带来Chrome开发者工具基础功能和高级性能分析器 Timeline
  • 背包问题的动态规划算法和fptas

    背包问题 instance 给定n个item i 1 2 n i 1 2 dots n weights w1 w2 wn Z w 1 w 2 dots w n in Z values v1 v2 vn Z v 1 v 2 dots v n
  • 搭建CentOS在线yum源镜像服务器

    说明 操作系统 CentOS 6 7 Nginx版本 1 8 0 rsync版本 3 0 6 IP地址和端口 192 168 3 100 8080 目标 同步CentOS镜像站点的内容到此服务器 通过配置http服务器 提供yum服务 一
  • Python——math库常用的数学函数

    在使用math库前 要用import导入该库 上图为math库中常用的一些数学函数 下面给出具体实例 例1 import math a eval input 请输入一个负数 print a math fabs a 输出结果 例2 impor
  • 【LeetCode刷题】237 删除链表中的节点

    题目 请编写一个函数 用于 删除单链表中某个特定节点 在设计函数时需要注意 你无法访问链表的头节点 head 只能直接访问 要被删除的节点 题目数据保证需要删除的节点 不是末尾节点 示例 这题其实真的简单 只能直接访问到给定要删除的节点 本
  • 设置Tab键为4个空格 Java开发手册规范之tab键设置

    设置Tab键为4个空格 在阿里的Java开发手册 一 编程规约 三 代码格式 第5条提到 强制 采用4个空格缩进 禁止使用tab字符 IDEA中勿勾选 Use tab character eclipse中必选 insert spaces f
  • [JAVEee]SpringBoot项目的创建

    SpringBoot可以更好的开发Spring项目 本文章将使用idea社区版来演示创建项目的过程与注意事项 SpringBoot的优点 SpringBoot中内置快速添加依赖的功能 能够便捷的集成各种框架 帮助开发 内置运行容器 无需配置
  • Linux top里面%CPU和us%的解释

    有的同学会把 CPU和us 搞晕 也就是下图所示在top的时候查看cpu的信息 这时有的同学会问 这两个CPU到底哪个是对的 其实都是对的 只是表达的意思不一样 官方解释如下 Cpu s 34 0 us 用户空间占用CPU百分比 CPU 上
  • 2023华为OD机试真题【最小调整顺序次数】

    问题描述 给定一个队列 但是这个队列比较特殊 可以从头部添加数据 也可以从尾部添加数据 但是只能从头部删除数据 输入一个数字n 会依次添加数字1 n 也就是添加n次 但是在添加数据的过程中 也会删除数据 要求删除必须按照1 n按照顺序进行删
  • 13 二叉树:建立存储结构(前序输入次序) &&二叉树专题

    目录 首先讲讲指针的引用 然后我们再复习一下typedef的用法 然后我们来创建二叉树 二叉树的建立 首先二叉树的存储结构 实际用代码体现 分为顺序存储和链式存储两种 但一般情况我们都用链式存储结构 部分内容转自指针的引用 MAGDB的博客
  • ChatGPT还有哪些不足?

    从技术角度来看 ChatGPT作为一个基于神经网络的自然语言处理模型 其优势在于能够处理大量的语言数据 并生成自然流畅的语言表达 ChatGPT还可以通过对话历史的分析 对当前对话进行上下文感知和情境推理 从而提供更加个性化和智能化的回答
  • Lua 输出可变参数列表内容

    在 Lua 中有8种基本数据类型 nil boolean number string user data function thread table 数据类型 描述 nil 表示一个无效值 boolean 包含两个值 false 和 tru
  • 第三章:关系数据库标准语言SQL

    模式数据定义语言 Schema Data Definition lanuage DDL 外模式数据定义语言 Subschema Data Definition lanuage 外模式DDL 数据存储有关的描述语言 Data storage