解决在做练习题过程中遇到的疑问以及自己想了解的一些知识:
- 了解exists 、esists和in的区别,一般来说exists的效率比in 的效率要高,exists返回的是一个boolean类型的值,然后根据where后边子句返回的值来判断是否满足条件。此外与之类似的还有一些 关键字,比如:SOME、ANY、ALL、BETWEEN等,
select a.ename from emp a where not exists (select mgr from emp b where a.empno = b.mgr)
上面的语句如果要用not in写的话是这样的 select ename from emp where empno not in (select mgr from emp),但是这样写的话是得不到想要的结果的,因为not in经常会出错,那就换一个方向,用not exists来写,防止犯错
ANY : 表示满足子条件查询结果的任何一个,和<、<=搭配,表示小于或者等于列表中的最大值,和>、>=搭配表示大于等于列表中的最小值
SOME:基本和ANY的含义相同
BETWEEN: 表达式 (not)between 表达式1 and 表达式2
ALL :表示满足子查询结果的所有结果,和< <=搭配表示小于等于列表中的最小值,相反表示大于或者等于列表中的最大值
- 看了一些关于查询优化的基本方法,查询优化主要分为外围优化和应用程序优化,应用程序优化又可以划分为源代码优化和sql语句优化,优化方面的文档主要放在当天的工作日文件中。方便以后查看使用
- 学习了DISTINCT的用法
- 作用主要是去除查询结果的重复信息,使用的格式为: select DISTINCT 列名 from 表名
- 使用DISTINCT的弊端也很明显,使用的时候,DBMS是先对查询结果进行排序,然后根据排序结果对数据进行分组,这一过程浪费的时间比较多。所以不建议经常使用
- 如果表中有多个NULL数据,服务器会把这些数据视为相等
- 学了一些模糊查询,也就是一些通配符的使用,
语法格式: 表达式 (not) like 条件
- %: 可匹配任意类型和长度的字符
- _ : 可匹配任意单个字符,他常用来限制表达式的字符长度
- [] : 表示方括号里列出的任意一个字符
- [^]: 任意一个没有在方括号里面列出的字符
- escape: 关键字转义字符 , like ‘%T%‘ escape ‘T‘ T为转义字符,他后边的%为实际值,不再有特殊含义
例子:
字符串中有“彩电”的字符串用:select * from 商品 where 商品名称 like ‘%彩电%‘
以曹开头的字符串用: select * from student where 姓名 like ‘曹%‘
找三个字的名字中第三个名字为“升”字的人的信息: select * from student where name like ‘_ _ 升‘
3.
复习了order by的用法
- order by 不是所有的列都可以使用,个别不能使用
- 默认情况下以升序排列,即使用ASC关键字,按照降序使用DESC关键词
- NULL视为最小的值,
- order by 子句一定是放在最后的
4. 练习了一些练习题如下:
//7.1
Select sno, sname from student where sno=(Select sno from sc where cno =( Select cno from Course where cname =’计算机原理’))
本题练习了三表联查,通过中间的索引来寻求最终的答案
//7.2
Select cname from course where cno = (Select cno from sc where sno =(Srelect sno from student where sname=’周星驰’ ))
同上,基本考了相同的问题
- 巩固复习了group by的用法
- 定义:group by 子句将查询结果按照一列或者多列的值分组,值相等的为一组,从而将行分为较小的组,然后使用聚集函数返回组的汇总信息
- 注意:在带有group by子句的查询语句中,select 列中要么是group by指定的列,要么是聚集函数
- group by 语句之后不能跟where子句,但是可以跟having子句,where和having子句的区别就是wherezai分组前进行筛选,having是对分组后进行筛选
- where后边不能有聚集函数,而having条件中经常出现聚集函数,可以使用多个分组标准进行分组
2. 理解了各种码的意义
- 候选码的定义:如果关系中的某一属性组的值能唯一地标识一个元祖,则称该属性组为候选码;
- 主码的定义:如果一个关系有多个候选码,则选定其中一个为主码;
- 主属性定义:候选码的诸属性称为主属性;
- 非主属性定义:不包含在任何候选码中的属性称为非主属性;
- 实体完整性规则:如果属性(一个或者一组属性)A是基本关系R的主属性,则A不能取空值。
- 超码的定义:超码是一个或多个属性的集合,这些属性可以让我们在一个实体集中唯一地标识一个实体
- 主码与外码的关系:主码和外码是用来实现参照完整性的,外码的数据项需参照主码的数据项来操作。具体实现是在创建数据库时为表间创立关系。如:
三个关系:
学生信息表(学号、姓名、性别、出生年月、籍贯、所属学院) //学号 是主键(主码
课程表(课程号,课程名称,学分) //课程号 是主键(主码
成绩表(学号,课程号,成绩) //学号 是外码;课程号 是外码
“成绩表”(从表)的学号参照“学生信息表”(主表)的学号来录入。1、也就是主表里面没有的学号,从表里面不能有,外码参照主码录入;
2、级联操作,即当删除、修改某个主表里面的学号时,从表里面的那个学号会相应的自动删除、修改。外码参照主码操作
3. 理解事务的概念
- 定义:事务是对数据库操作的最小工作单元,事务具有原子性,即事务的执行只有两种结果:1、事务所包含的工作全部成功完成;2、事务什么都没操作,回到原来的状态
- 事务的状态有:活动状态、局部提交、失败状态、成功执行、异常终止
- 事务的4个ACID性质:1、原子性、2、一致性、3、隔离性、4、持久性
- 如果一个事务成功完成,则在该事物中进行的所有数据更改均会提交,成为数据库组成中永久的部分,如果事务遇到错误必须取消或者回滚,则所有已经提交的数据均被清除,这个时候表示事务没有对数据库做任何工作!
- 在数据库系统中,很多事务在并发运行,他们之间可能会对共享数据进行各类运算,为了保证数据库的完整性和一致性,数据库使用事务的定义、并发控制、事务的备份和恢复等来解决。
- 事务的三种运行模式1、自动提交事务:即每条单独的语句就是一个事务,当sql语句在查询分析器上被执行后,后面的分号;将自动提交事务2、显式事务:sql通过事务定义语句来表示事务的开始和结束,如每个事务均以begin transaction开始,以commit(提交)或者roolback(回滚)结束。3、隐性事务:在前一个事务完成时新事物隐式启动,但每个事务均以commit或者rollback语句显式完成。
- 并发事务在执行的过程中,隔离性遭到了破坏,可能带来以下三个问题:1、丢失更新;2、读了过时数据;3、读未提交的数据,解决以上三个问题的方法主要有封锁法和时间印法。
- 封锁法:主要有两种锁:排它锁 (X锁) 和共享锁 (S锁),事务通过获取这两种锁,可以保证事务的隔离性,间接的保证了数据库的完整性和一致性。
- 学校教科书的102页有具体详细的实例,以供以后参考!