数据库是研究数据管理的技术。即如何妥善地保存和科学地管理数据。
数据管理是指对数据进行分类、组织、编码、存储、检索和维护等操作。
数据管理技术好坏评判的标准:
(1)数据冗余
(2)数据共享
(3)数据独立性
(4)数据统一集中管理
数据库:
按一定结构组织存储的、集成的、可共享的数据的集合。
数据库有两种类型:关系型数据库与非关系型数据库。
关系型数据库:
存储格式能直观地反映实体间的关系,和创建的表格比较相似,表与表之间是有复杂的关联关系。
非关系型数据库:
指的是分布式、非关系型的、不保证遵循ACID原则的数据存储系统。
使用场景:
1)海量数据存储
2)多格式的数据存储
3)对查询速度要求块的数据格式
关系数据库是一个结构化的数据集合,这个结构要使用数据模型来描述显示世界中事物间的联系。
数据模型——是表示数据及联系的模型。
数据模型分类(按模型应用的不同目的的划分)
概念模型(也称语义模型)
常用E-R模型
学生和课程是实体,菱形中对应的是实体之间的关系,椭圆中是对应的属性。
结构数据模型(简称数据模型)
1)层级模型
2)网状模型
3)关系模型等
关系型数据库的数据结构
关系
元组
属性
元数(度、目)
关系模式:关系结构的描述
R(A1,A2,A3,…,An)
R:关系名 括号中是属性名
操纵与完整性约束
1)数据操纵:
增、删、改、查
2)需满足关系的完整性约束条件:
实体完整性约束
参照完整性约束
用户自定义的完整性约束
关系型数据库中的一条记录中若干个属性,若其中某一个属性(组)能唯一表示一条记录,该属性(组)就可以成为一个主键。(primary key)
foreing key (外键)references参考课程的主键
关系数据库语言SQL
SQL(Structured Query Language)结构化查询语言:是通用的,功能极强的关系DB语言
作用:
SQL的数据定义
create database…
create table…
SQL的增删改查
SELECT, INSERT, UPDATE, DROP/DELETE
非关系型数据库,又称为NoSQL(Not Only SQL)
NoSQL数据库的特点:
1)模式自由
不需要定义表结构,数据表中的每条记录都可能有不同的属性和格式
2)逆规范化
不遵循范式要求,去掉完整性约束,减少表之间的依赖
3)弹性可扩展
可在系统运行的过程中,动态的删除和增加节点
4)多副本异步复制
数据快速写入一个节点,其余节点通过读取写入的日志来 实现异步复制。
5)弱事务
不能完全满足事务的ACID特性,但是可以保证事务的最终一致型。
启动mysql:
cmd输入
net start mysql
mysql -uroot -p
标识符和关键字
1)标识符用来命名一些对象,如数据库、表、列、变量等,以便在脚本中其他地方引用。MySQL标识符命令规则稍微有点繁杂,其通过命名规则是:标识符由以字母或下划线(_)开头的字母、数字或下划线序列组成。
2)对于标识符是否区分大小写取决于操作系统,Windows下是不敏感的,但对于大多数linux/Unix系统,这些表示大小写是敏感的。
3)关键字,MySQL的关键字众多,不同版本的MySQL语言关键字也略有变化。所有关键字有自己特有的含义,应尽量避免作为标识符。
使用算术运算符进行加减乘除、求余运算。
使用比较运算符判断运算。
运用is null、is not null运算符。
运用“between and”运算符判断一个数是否在某范围。
运用“in”运算符判断某值是否在指定的范围内
运算符“like”,"like"用来匹配字符串,其中“%”匹配任意个字符,“_”匹配一个字符。表达式如下 x1 like s1
与运算:“&&”、“and”
或运算:“||”、“or”
非运算:“!”、“not”
异或运算:“xor”
位运算:|、&、^、~、<<、>>
数学函数:abs,acos,asin,atan,ceiling,cos,degree(弧度值转为角度值),floor,greatest(获得一组数中的最大值),least(获得一组数中最小值),log,log10,PI,pow,radians(角度值转换为弧度值),rand(返回0~1之间的随机float数),round(返回指定小数的位数的表达式的值),sign(返回某个数的符号),sin(返回以弧度为单位的角度的正弦值),sqrt,tan
show databases;语句查看MySQL服务器中的所有数据库
创建数据库:create database if not exists mysqltest;指定字符集为gb2312
打开数据库:use test;
修改数据库:alter database mytest;
显示数据库结构:show create database test;
删除数据库:drop database [if exists] db_name;
创建数据库表
create [temporary] table [if not exists] table_name
temporary:使用该关键字表示创建临时表
if not exists:如果不存在就创建,存在就不执行
Float(3,1)表示精度为4,小数为一位
设置表的属性自动增加
MySQL中数据库表中,一个整数列可以有一个附加属性auto_increment,它是一个特殊的约束条件,主要用于为表中插入的新记录自动生成唯一的序列编码。
用法:
属性名 数据类型 auto_increment
创建选课表sc,选课号sn_no是自动增量,选课时间默认为当前时间,其他字段分别是学号、课程号和教师号。
查看已创建的表:show tables;
查看表结构:describe语句、show create table语句
修改数据库表,语法格式如下:
1)在student表的Email列后面增加一列address
操作完成后,可以执行describe语句查看一下
4)删除字段:删除student表的字段address
删除数据库中已存在的表,删除表会删除表中的所有数据,所以要慎重。
drop table table_name
在python数据库中创建表example,然后删除example表。
表记录的插入
1)利用insert命令向表student中插入一行数据
2)利用insert命令向表student中插入多行数据
利用replace命令向表course中插入多行数据
insert与replace的区别:
insert如果向表中插入已经存在的学号(主键)的记录,将出现主键冲突错误。
replace向表中插入数据时,首先尝试插入数据到列表中;若发现表中已有此行数据(根据主键或唯一索引判断),则先删除此行数据再插入新数据,否则直接插入新数据。
使用set子句插入数据
可以不按顺序插入数据,对允许空值的列可以不插入
利用set子句向se_course表插入数据。
用update…set…命令可以修改一个表的数据
将学号为210010的学生的课程号为c05103的期末成绩final修改为99分
利用delete…from…语句可以从单个表中删除指定表数据。
基本查询语句
select语句是SQL语句从数据库中获取信息的一个基本语句,可实现从一个或多个数据库中的一个或多个表中查询信息,并返回结果集。
all是默认值,distinct取消结果集中的重复行。
group by用于对查询结果根据grouping_columns的值进行分组。
having子句是应用于分组结果集的附加条件,与group by一起使用,用于在group by子句后选择行。
查询test数据库course表中的所有数据。
查询数据库中表中的前5条数据
select * from course limit 5;
查询student表中的studentNo、sname和phone数据
单表查询:
在student表中查询出生日期在2001年以后的学生的学号、姓名、电话,并为这些字段去别名。
在score表中查询期末成绩高于80 分的学生的学号,并按学号排序,不允许重复(distinct)
查询student中入学成绩在640分以上的学生的学号、姓名信息(where子句的使用)
带in关键字的查询:查询学号分别为210009、210010的学生学号、课程号、期末成绩。
between…and…
查询选修课程号为c05103的学生学号和期末成绩,要求平时成绩在80-95分之间
用is null关键字查询空值。se_course表添加成绩字段score,插入两条记录,查询se_course中成绩为null的学生学号、课程号和成绩。(一个字段值是否为空,要表示为“is null”或“is not null”),不能表示为=null或<>null。如果写成“字段=null”或“字段<>null”,系统直接处理为null值,按照false处理而不报错。
使用order by子句对结果集排序
在score表中查询期末成绩高于90分的学生学号、课程号和期末成绩,并先按课程号的升序、再按期末成绩的降序排列
使用group by子句
使用group by子句对score表数据分组,显示每个学生的学号和其所学各课程的平均期末成绩,并将结果按平均期末成绩的升序排列
group by和having子句一起使用
查询选课在2门以上且各门课程期末成绩均高于70 分的学生的学号及其各门课程期末成绩相加后的成绩,查询结果按总成绩降序列出。
多表连接
查询选修课程号为c05103的学生的学号、姓名和期末成绩
内连接inner join:通过比较数据源表键共享列的值,从多个源表检索符合条件的行
左外连接Left Outer Join,利用左外连接方式查询学生的学号、姓名、平时成绩和期末成绩。
左外连接left outer join:返回指定左表的全部行+右表中对应的行,如果左表中的数据在右表中没有与其匹配的行,则再查询结果集中相应位置显示为空值。
右外连接Right Outer Join
右外连接right outer join:返回指定右表的全部行+左表中对应的行,如果右表中的数据在左表中没有与其匹配的行,则再查询结果集中相应位置显示为空值。
select子句中的子查询
查询学号为210010的学生的姓名、入学成绩、所有学生的平均入学成绩及该学生成绩与所有学生的平均入学成绩的差。
where子句中的子查询:1、带比较运算符的字查询
查询期末成绩比选修该课程平均期末成绩低的学生的学号、课程号和期末成绩