数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
通常使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。
所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database
SQL(结构化查询语言)是关系型数据库的标准语言。SQL集数据查询、数据操纵、数据定义、数据控制为一体。
MySQL 是一个关系型数据库管理系统又是一种关联数据库管理系统(将数据保存在不同的表中,而不是将所有数据放在一个大仓库内。增加了速度并提高了灵活性)。
下面将以一个典型的学生-课程数据库来进行示例:
首先,因为关系数据库支持三级模式结构,且每种模式中的基本对象都包含模式、表、视图和索引等。因此SQL的数据定义如下表:
他们之间的关系如下:
//为用户wang定义一个S-T模式
create schema S-T authorization wang;
//删除该模式所有
drop schema S-T cascade
批量插入记录:
然后ding !
删除:
drop table student cascade;
当表的数据量过大时,查询操作会比较耗时。此时,建立索引能加快查询速度。但是索引需要占用一定的内存空间,且当表更新时,索引需要维护,会对数据库造成一定的负担。
索引有多种类型,包括:顺序文件上的索引、B+树索引、散列(hash)索引、位示图索引等。
删除索引(这里我不知道他为毛删不掉):
核心语句:
select 某列,某列(*表示全部)
from 某表,某表
where 某条件
group by 某列 (having 某条件)
order by 某列 (asc/升序,desc/降序)
用口水话解释下就是:根据where的条件——从from中指定的表、视图中找出满足条件的元祖——按select中的目标列 选出满足条件的属性值得出结果表。
若是有group by的话,则先按 某列 的值进行分组,属性相等为一组。若同时还带having,则只挑选满足指定条件的组输出。
若是有order by的话,结果还要排序一下。
因为需要计算,先改下年龄的字段类型为smallint,因为char无法参与计算
重复太多?
反之:
查询选修2号课程的学生最高分数:
包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询、复合条件连接查询等。
SQL语句中,一个 select-from-where 语句称为一个查询块。将一个查询块嵌套在另一个查询块的where子句或having语句中的查询称为嵌套查询。
这题也可以用自然连接来做:
查询选修了课程名为“信息系统”的学生学号和姓名:
方法二:(现实生活中,能用连接运算尽量连接运算)
即从sc中取一行与所有行作比较。
注:求解相关子查询不能像求解不相关子查询一样将子查询求解出来,然后求解父查询。
子查询返回单值时可以用比较运算符,但返回多值时要用any(some)或者all修饰符。且使用any或all是必须同时使用比较运算符。
查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄:
带有exists的子查询不返回任何数据,只产生"true"和"false".
注:由exists引出的子查询,其目标列表达式通常为*,因为带exists的子查询只返回其真值或假值,给出列名无实际意义。
所有带IN、比较运算符、ANY和ALL的子查询都能用带EXISTS子查询替代。
例如,查询选修了所有课程的学生姓名:
换言之,即没有一门课是他没有选修的
再举个栗子:查询至少选修了学生201215122选修的全部课程的学生学号
即:不存在这样的课程y,学生201215122选修了y,而学生x没有选。
集合操作主要包括:并操作UNION、交操作INTERSECT、差操作EXCEPT (mysql只支持UNION)
注:参加集合查询的各查询结果的列数必须相同,对应项的数据类型也必须相同。
子查询不仅可以出现在where语句中,还可以出现在from 语句中,这是子查询生成的临时派生表成为主查询的查询对象。
插入有两种:一是插入元组,二是插入子查询结果。
插入元组:
inset
into student(学号,姓名,性别,所在系,年龄)
values('201215218','陈东','男','IS','18');
插入子查询结果:
对于每一个系,求学生的平均年龄,并把结果存入数据库:
首先在数据库新建一个表,再对student分组求平均年龄,填入新表。
三种不能取空值的情况:NOT NULL, UNION, KEY;
空值与一个值的运算结果为空值,与一个值的比较结果为UNKNOWN;
所在在查询表时,要考虑到空值的情况:
查询1号课程不及格的学生(包括缺考)
select 学号
from sc
where 成绩<60 and 课程号 = '1';
上面的查询若是有缺考就查不出来,UNKNOWN,改为:
select 学号
from sc
where 课程号 = '1'and (成绩<60 or 成绩 is null);
打了一遍,感觉MySQL的基本语法算是熟悉了…也花了我好多时间鸭~
赶数据库的实验报告去了~