一、数据库的分类
可分为关系型数据库(SQL),和 非关系型数据库(noSQL)
非关系型数据库(noSQL):
数据库不需要固定的表结构,通常也不存在关联关系,但在互联网大数据存取上具有关系型数据库无法比拟的性能优势。目前非关系型数据库仍然没有统一的标准,大概分为两类
a) 键值存储型数据库;主要通过key来添加、删除、查询数据,优点高性能,易用、高并发。典型产品:Redis
b) 面向文档型数据库; 类似于json,比键值存储型数据库查询效率稍高,允许嵌套键值。典型产品:MongoDB
二、数据库基本概念
数据(data):数据库中存储的基本对象,是描述事物的记录(文字、图片、声音、视频....)
数据库(database):存储在计算机内的大量的、有组织的、可分享的数据集合。
数据库管理系统(DBMS):可以方便的组织管理、获取、维护数据的软件。
数据库系统(DBS):是一个总称,包含数据库、应用软件、管理员、用户。例xx学生管理系统。
数据库设计基本概念:
实体:现实世界中存在可以相互区分的事物。例如:某个个体,某个公司
实体集:同类型的实体的集合。例如:学生,公司,比亚迪汽车
属性:描述实体的特征。例如:姓名,身份证号,性别,籍贯、体重、血型。。。。
键:唯一区分实体的属性。例如:身份证号,DNA,指纹,...
主键:数据库中使用的,用于唯一区分实体的属性。例如:身份证号,唯一不重复的id
三、实体之间的关系
一对一关系:在实体集A中有唯一一条记录与实体集B中的记录相对应,反之亦然,则称实体集A与B为一对一关系。例:班级与班长,丈夫与妻子
一对多关系:在实体集A中有多条记录与实体集B中的记录相对应,反之实体集B中只能有一条记录与实体集A中的记录对应,称为一对多关系。例如:母亲与子女、省与城市
多对多关系:在实体集A中每条记录与实体集B中有多条记录相对应,反之亦然,则称实体集A与B为多对多关系。例如:医生与病人
四、MySQL中的数据类型
mysql数据库的数据类型
类型 大小 用途
CHAR 0-255字节 定长字符串,只能存储数字、英文
VARCHAR 0-65535 字节 变长字符串,可存储汉字
TINYTEXT 0-255字节 短文本字符串
TEXT 0-65535字节 长文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据
整数类型 字节 范围(有符号) 范围(无符号) 用途
TINYINT 1字节 (-128,127) (0~255) 小整数值
SMALLINT 2字节 (-32 768,32 767) (0~65 535) 大整数值
INT或INTEGER 4字节 大整数值
BIGINT 8字节 极大整数值
FLOAT 4字节 单精度浮点数值
DOUBLE 8字节 双精度浮点数值
AUTO_INCREMENT(自动递增)
每次插入一条新数据时,自动的创建主键字段的值。它的开始值是1,每条新纪录自动加1;
五、SQL语言
新增数据(插入记录):语法:INSERT INTO 表名(字段1,字段2,...) VALUES(值1,值2, ....)
修改数据:语法: UPDATE 表名 SET 字段1=值1,字段2=值2, ... WHERE 条件
删除记录:语法:DELETE FORM 表名 WHERE 条件
查询数据:语法:SELECT 字段1 AS 别名1,字段2 AS 别名2, ... FROM 表名
子句:WHERE 条件1=条件2 (= != >= <= > <) AND 条件3 OR 条件4 NOT 条件5
模糊查询 WHERE 字段 LIKE '%内容%'
例: 姓名 LIKE '张%' 查询所有姓张的姓名
姓名 LIKE '%张' 查询所有以张结尾的姓名
姓名 LIKE '%张%' 查询所有包含张字的姓名
NOT 姓名 LIKE '张%' 查询所有不姓张的姓名
查询结果排序(放在sql最后): ORDER BY 字段名 DESC/ASC (降序/升序, asc为默认值)
查询结果分组 ( 放在sql查询条件后面): GROUP BY 字段名
六、统计函数
1) avg() 求平均数 sum() 求和 count() 统计
2) min() 求最小值 max() 最大值
七、多表联合查询
1) 两表联合内连接
语法: SELECT 表1.字段1,表2.字段1,.... FROM 表1 INNER JOIN 表2 ON 表1.连接字段=表2.连接字段
2) 两表联合左连接。以左为大,左边的表为主表,右边为从表,主表的记录优先全部显示。假如从表中没有对应记录则以null填充。
3) 多表联合
eg:SELECT 学生.学号,学生.姓名,课程.课程名,成绩.成绩
FROM 成绩
INNER JOIN 学生 ON 成绩.学号 =学生.学号
INNER JOIN 课程 ON 成绩.课程编号 =课程.id
WHERE 学生.学号 = 'B0001'
八、例子:
表名和内容如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/d7776b35eabc69fec681d7779f199ae1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b06d951c51dfa89c2bdace73cfad01b1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/035805dad38f19e272b68756265f7888.png)
题目及答案:
--1:查询学生的学号与姓名。
select 学号,姓名 from 学生表
--2:查询全体学生的记录。
select * from 学生表
--3:查询全体学生的姓名及出生年份。
select 姓名,2008-年龄 from 学生表
--4:查询计算机系全体学生的姓名。
select 姓名 from 学生表 where 所在系='计算机系'
--5:查询所有学生年龄在20岁以下的学生的姓名和年龄。
select 姓名,年龄 from 学生表 where 年龄<20
--6:查询年龄在20~23之间的学生的姓名、所在系、和年龄。
select 姓名,年龄,所在系 from 学生表 where 年龄 between 20 and 23
--7:查询年龄不在20~23之间的学生的姓名、所在系、和年龄。
select 姓名,年龄,所在系 from 学生表 where 年龄 not between 20 and 23
--8:查询姓“张”的学生的详细信息。
select * from 学生表 where 姓名 like'张%'
--9:查询学生表中姓“张”,“李”,“刘”的学生的情况。
select * from 学生表 where 姓名 like'张%' or 姓名 like‘李%’ or 姓名 like '刘%'
--10:查询学生表中不姓“刘”的学生的情况。
select * from 学生表 where 姓名 not like'刘%'
--11:将学生按年龄升序排序。
select * from 学生表 order by 年龄
--12:查询选修了课程“C02”的学生的学号及其成绩,查询结果按成绩降序排列。
select 学号,成绩 from 成绩表 where 课程号='c02' order by 成绩 desc
--13:查询全体学生的信息,查询结果按所在系的的系名升序排序,同一个系的学生按年龄降序排列。
select * from 学生表 order by 所在系,年龄 desc
--14:统计学生总人数。
select count(*) from 学生表
--15:计算学号为9512101的学生考试总成绩。
select sum(成绩) from 成绩表 where 学号='9512101'
--16:计算课程“c01”的学生的考试平均成绩。
select avg(成绩) from 成绩表 where 课程号='c01'
--17:查询选修了“c01”的学生的最高分和最低分。
select max(成绩), min(成绩) from 成绩表 where 课程号='c01'