SQL数据定义、查询、更新+空值的处理 实践学习报告

本篇博客分享的是博主的各种数据操作-实践详细过程(以截图方式展示)

  软件:Oracle  SQL  developer,希望对大家有所帮助咯!

目录

1、学生-课程数据库

2.1、数据定义理论

2.2、定义实践

3.1、数据查询理论

①单表查询:

②连接查询

③嵌套查询

④集合查询

⑤基于派生表的查询

3.2、查询实践

①单表查询:

②连接查询

③嵌套查询:

④集合查询

⑤基于派生表的查询

4.1、数据更新理论

4.2、更新实践

①插入数据

②修改数据

③删除数据

5、空值的处理


1、学生-课程数据库


2.1、数据定义理论

①SQL的数据定义功能包括模式定义、表定义、视图定义和索引的定义。

②模式、表、视图的索引均可创建或删除,然而只有表和索引在创建后可修改,而模式和视图创建之后不可改。若要修改只能删除重建。

③现在的关系数据库管理系统提供了一个层次化的数据库对象命名机制:一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象。

注意:要创建模式,调用该命令的用户必须拥有数据库管理员的权限,或者获得了数据库管理员授予的创建模式的权限。

建立索引是加快查询速度的有效方法。

删除模式或表,需要在后面选择级联删除(cascade)或者限制删除(restrict),默认是限制删除。删除索引则直接删除即可。

2.2、定义实践

1、首先用系统超级管理员身份sys创建一个连接,连接名为sys,注意角色选择SYSDBA,其他用户的话直接默认。测试成功后连接。

2、接下来创建一个用户c##panda,即创建一个模式,可连接到orcl。

 

3、用用户c##panda创建一个连接,查询用户为c##panda,正确。

 

4、接下来就可以在用户中创建表了,先创建学生表student并给它添加记录。

在sys中亦可查看学生表。

添加数据后记得commit; 提交后sys中也可以查询到该表记录:

 

5、创建课程表course并添加记录。查询结果截图如下:

 

6、接下来创建学生选课表sc并添加记录,查询结果如下:

 

7、对表和索引的修改和删除,最后删除模式,具体操作看注释即可。

 

删除成功之后再想连接panda就会显示错误:执行请求的操作时遇到错误!因为用户已经不存在了,如下

数据定义实践到此为止!

 


3.1、数据查询理论

SQL提供select语句进行数据查询。以下是一个简单例子:

整个select语句的含义是:根据where子句的条件表达式从from子句指定的基本表、视图或派生表中找出满足条件的元组,再按select子句中的目标列表达式选出元组中的属性值形成结果表。

select子句:指定要显示的属性列

from子句:指定查询对象(基本表或视图)

where子句:指定查询条件

group by子句:对查询结果按指向列的值分组,该属性列值相等的元组为一个组,通常会在每组中作用聚集函数。

having短语:只有满足指定条件的组才予以输出

order by子句:对最终查询结果表按指定列值的升序(asc)或降序(desc)排序。

①单表查询:

1、查询所有列时,<目标列表达式>指定为*。<目标列表达式>可以是表中的属性列,也可以是表达式,还可以是字符串常量。用户可以通过指定别名来改变查询结果的列标题。

2、选择表中元组时可以指定distinct,即查询结果会消除重复行。默认是all(不管重复行,全部显示在查询结果表中)。

where子句常用的查询条件表:

3、字符匹配之通配符:

%(百分号)表示任意长度(可为0)的字符串,例如a%b,表示以a开头,以b结尾的任意长度的字符串。

_(下横线)表示任意单个字符,例如a_b,表示以a开头,以b结尾的长度为3的任意字符串。

注意:如果用户要查询的字符串本身就含有通配符%或_,这时就要使用 escape'<换码字符>' 短语对通配符进行转义。

4、涉及空值的查询,"IS"不能用等号(=)代替。

and的优先级高于or,但建议书写时带上括号,这样对看你代码的人来说比较友好。

对于空值,排序时显示的次序由具体系统实现来决定。(本人升序排则含空值的元组最后显示,降序排则空值的元组最先显示)

5、当聚集函数遇到空值时,除count(*)外,都跳过空值而只处理非空值。聚集函数只能用于select子句和group  by中的having子句。

6、where子句与having短语的区别:对象不同。

where子句作用于基本表或视图,从中选择出满足条件的元组,having短语作用于组,从中选择出满足条件的组。

②连接查询

1、查询同时涉及两个以上的表称之为连接查询,是关系数据库最主要的查询。主要包括等值与非等值查询、自身连接、外连接及多表连接。

2、等值与非等值连接查询:where子句用来连接两个表的条件称为连接条件或连接谓词,当连接运算符为=时即称为等值连接,否则非等值连接。连接谓词中的列名称为连接字段,连接条件中的各连接字段类型必须是可比的,名字可不相同。

一条SQL语句可以同时完成选择和连接查询,这是,where子句是由连接谓词和选择谓词组成的复合条件。

3、自身连接:连接操作可以是一个表与其自己进行连接。此时注意要给表取别名。

4、外连接:连接后把悬浮元组保存在结果关系中。有左外连接和右外连接。

5、多表连接:连接操作可以是两个以上的表进行连接。执行时一般是先进行两个表的连接操作,再将其连接结果与第三个表进行

连接,以此类推。

③嵌套查询

一个select-from-where语句称为一个查询块,将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询称嵌套查询。

SQL语言允许多层嵌套查询,子查询的select语句中不能使用order by子句,order by子句只能对最终查询结果排序。

用户可以用多个简单查询构成复杂的查询,从而增强SQL的查询能力。

1、带有IN谓词的子查询

子查询的结果往往是一个集合。

不相关子查询:子查询的查询条件不依赖于父查询。

相关子查询:子查询的查询条件依赖于父查询。整个查询语句称为相关嵌套查询。求解时需反复求值。

2、带有比较运算符的子查询

指父查询与子查询之间用比较运算符进行连接。子查询返回单值时可以用比较运算符。

3、带有any(some)或all谓词的子查询

子查询返回多值时用ANY(有的系统用some)或ALL谓词修饰符,而使用any或all谓词时则必须同时使用比较运算符。

语义:

事实上,用聚集函数实现子查询通常比直接用any或all查询效率要高,any、all与聚集函数的对应关系如下表:

4、带有exists谓词的子查询

带有exists谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false"。由其引出的子查询的目标列表达式通常都用 *

所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用EXISTS谓词的子查询等价替换。

SQL中没有全称量词,可把带有全称量词的谓词转换为等价的带有存在量词的谓词。

④集合查询

select语句的查询结果是元组的集合,所以多个select语句的结果可进行集合操作。主要包括并操作union、交操作intersect和差操作except(我的软件中差操作是minus)。

⑤基于派生表的查询

子查询不仅可以出现在where子句,还可以出现在from子句,这时子查询生成的临时表成为主查询的查询对象。

注意派生表要指定属性列,但若子查询中没有聚集函数则可以不指定,子查询select子句后面的列名为其默认属性。

说明,通过from子句生成派生表,我这里的实现软件不需要关键字AS。但必须为派生关系指定一个别名!

3.2、查询实践

首先由前面实践基础建立模式(即用户)并在里面创建学生表student、课程表course和学生选课表sc。

student表:

course表:

sc表:

说明:每一步的具体目的都在注释里写清楚了,及其一些注意事项。

①单表查询:

1、选择表中的若干列

2、选择表中的若干元组

where子句运用:

3、order by 子句

4、聚集函数

5、group  by 子句

②连接查询

1、等值与非等值连接查询

 

2、自身连接

 

3、外连接

 

4、多表连接

 

③嵌套查询:

1、带有IN谓词的子查询

2、带有比较运算符的子查询

3、带有any(some)或all谓词的子查询

4、带有exists谓词的子查询

④集合查询

1、并操作union

2、交操作intersect

3、差操作except(Oracle SQL developer此处是minus)

⑤基于派生表的查询

1、注意:有聚集函数时,必须为派生表指定属性列。派生表的属性列在select+列名 后面 as+属性列名,派生表的名字在该select语句后面直接写出,不用AS(有的软件可省可写)

2、子查询中没有聚集函数时,派生表可以不指定属性列。

数据查询实践到此为止!


4.1、数据更新理论

数据更新操作有三种:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据。

1、插入数据:插入元组+插入子查询结果

into子句中没有出现的属性列,新元组在这些列上取空值,但在定义时not null的属性列不能取空值。如若into未指定属性列则要在每个属性列上均有值,空即为NULL。

字符串常数要用单引号(英文符号)括起来。

子查询可嵌套在insert语句中用以生成要插入的批量数据。(批量插入)

2、修改数据

where子句+条件,满足条件则修改该元组,若无where子句则修改表中所有元组。

子查询可嵌套在update语句中用以构造修改的条件。

关系数据库管理系统在执行修改语句时会检查修改操作是否破坏表上已定义的完整性规则:

--实体完整性

--主码不允许更改

--用户定义的完整性

  • not null 约束
  • unique约束
  • 值域约束

3、删除数据

where子句+条件,满足条件则删除该元组,若无where子句则删除表中所有元组。

delete语句删除的是表中的数据,而不是关于表的定义。

子查询可嵌套在delete语句中,用以构造执行删除操作的条件。

4.2、更新实践

插入数据

1、插入元组

2、插入子查询结果

修改数据

1、修改某一个元组值

2、修改多个元组的值

3、带子查询的修改语句

删除数据

1、删除某一个元组的值

2、删除多个元组的值

3、带有子查询的删除语句

数据更新实践到此为止!


5、空值的处理

经过上面的操作之后三个表具体情况如下:

说明:因为之前的操作几乎删除了sc表中的全部数据,所以我添加了一些新数据!

前面也有有关空值的一些操作,这里系统介绍这个问题并且会附上相应的实践操作。

所谓空值就是“不知道”或“不存在”或“无意义”的值。

SQL语言中允许某些元组的属性在一定情况下取空值,比如:

1、该属性应该有一个值,但目前不知道它的具体值。

2、该属性不应该有值。比如缺考的学生成绩必为空值。

3、因为某种原因不便于填写。

空值是一个很特殊的值,含有不确定性。

空值的产生

外连接也会产生空值!空值的关系运算也会产生空值!

空值的判断

判断一个属性是否为空值,用 is null 或 is not null来表示。

空值的约束条件

属性定义(或者域定义)中有not null约束条件的不能取空值,码属性不能取空值。

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

1、空值与另一个值(包括另一个空值)的算术运算的结果为空值。

2、空值与另一个值(包括另一个空值)的比较运算结果为unknown。(有了unknown后,传统的逻辑运算中二值逻辑扩展成了三值逻辑)

T(true),F(false),U(unknown)

3、在查询语句中,只有使where和having子句中的选择条件为true的元组才被选出作为输出结果。

空值的处理介绍到此为止!


以上便是博主边学边实践SQL语言的学习报告了,历时一周多终于更完了哈哈,若有错漏欢迎纠正补充,谢谢!

大家觉得有帮助的话点个赞或留个言给点鼓励呗哈哈(笑脸)

有帮助?那就-->开启传送大阵         希望分享的东西能对大家有所帮助哈

猜你喜欢

转载自blog.csdn.net/weixin_44723488/article/details/105180653