写在前面:本文适合0基础小白参考,大佬轻喷
绪论
概念:
数据库;长期储存在计算机内、有组织的、可共享的大量数据的集合
按一定的数据模型组织、描述和储存;较小冗余度;较高的数据独立性和易扩展性;并可以共享
基本特点:永久储存;有组织;可共享
特点:
数据结构化(主要特征之一,也是数据库系统与文件系统的本质区别):整体数据的结构化
数据独立性:分为==物理独立性==和==逻辑独立性==;独立性由二级映像功能来保证
一、两类数据模型
1.概念模型(信息模型):按用户的观点对数据和信息进行建模;用于数据库设计
实体:客观存在并可相互区别的事物(相当于对象)
属性 :实体所具有的某一特征属性
码:唯一标识实体的属性集体称为码
实体型:用实体名及其属性名集合来抽象和刻画同类实体
实体集:同一类型实体的集合
联系:分为一对一;一对多;多对多
概念模型的一种表示方法(实体-联系方法):E-R模型
2.逻辑模型和物理模型:逻辑模型用于数据库管理系统的实现
物理模型是对数据最底层的抽象,是面向计算机的
二、数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成
数据结构:数据结构描述数据库的组成对象以及对象之间的联系
数据操作:指数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作及有关的操作规则
数据的完整性约束条件:一组完整性规则,是给定的数据模型中数据及其联系所具有的制约和依存规则
三、常用的数据模型
格式化模型
1.层次模型:有且只有一个节点没有双亲节点,这个节点称为根节点;根以外的其他节点有且只有一个双亲节点
像一棵倒立的树,节点的双亲是唯一的
优点:==对具有一对多的层次联系的部门描述非常自然、直观、容易理解。==
2.网状模型:允许一个以上的节点无双亲;一个节点可以有多余一个的双亲
典型代表是DBTG系统(也称CODASYL)
层次模型中子女节点与双亲节点的联系是唯一的,而在网状模型中这种联系可以不唯一
优点:更直接描述现实世界;良好的性能,存取效率高
缺点:结构复杂;用户不容易掌握,不容易使用;加重了编写应用程序的负担
格式化模型中数据结构的单位是==基本层联系==:两个纪录及他们之间的一对多(包括一对一)的联系
3.关系模型
4.面向对象数据模型
5.对象关系数据模型
6.半结构化数据模型
三、关系模型
1.关系模型的数据结构
关系:就是通常说的一张表
元组:表中的一行即为一个元组
属性:表中一列就是属性
码:可以唯一确定元组的属性
分量:元组的一个属性值
2.关系模型的数据操纵与完整性约束
完整性约束条件包括三大类:实体完整性、参照完整性和用户定义的完整性
数据库系统的结构
一、数据库系统模式的概念
数据模型中有“型”和“值”的概念;
型:某一类数据的结构和属性的说明;
值:型的具体赋值
二、数据库系统的三级模式结构
1.模式(逻辑模式):一个数据库只有一个模式
2.外模式(子模式、用户模式):数据库==用户能够看见和使用的局部数据的逻辑结构和特征的描述==
3.内模式(储存模式):一个数据库只有一个内模式,是==数据物理结构和储存方式的描述==,是数据在数据库内部的组织方式
三、数据库二级映像功能和数据独立性
1.外模式/模式映像
当模式改变时,数据库管理员对外模式/模式映像进行相应的改变,保证了数据与程序的逻辑独立性
2.模式/内模式映像
当数据库的存储结构改变时,管理员对模式/内模式映像进行相应的改变,保证了数据和程序的物理独立性
数据库系统的组成
1.硬件开发平台及数据库
2.软件
3.人员(数据库管理员、系统分析员、数据库设计人员、应用程序员、用户)
数据库管理员职责:
界定数据库中的信息内容和结构;
决定数据库的储存结构和存取策略;
监控数据库的使用和运行;
数据库的改进和重组
关系数据库标准语言SQL
特点:综合统一;高度非过程化;面向集合的操作方式;以同一种语法结构提供多种使用方式;语言简洁
终端操作:
1.如何登陆数据库服务器?
mysql -uroot -p123456(填写你的账户和密码)
2.如何查询数据库中所有数据库?
show database;
3.如何选中一个数据库进行操作?
use sushe(这里填数据库名)
4.怎么执行操作?查看数据表中的记录?
select *from admin(执行查找操作)
5.如何退出数据库?
exit;
6.如何在数据库服务器中创建我们的数据库?
create database test(数据库名);
7.如何查看某个数据库中所有的数据表?
show table;
8.如何创建一个数据表?
CREATE TABLE PET(表名)(
name VARCHAR(20),
owner VARCHAR(20),
species VARCHAR(20),
sex CHAR(1),
birth DATE,
death DATE
);
9.如何查看创建好的数据表的结构?
describe pet;
10.如何往数据表中添加记录?
INSERT INTO pet
VALUES('Puffball','Diane','hamster','f','1999-03-30',NULL);
11.如何删除数据
delete from pet where name='Fluffy';
12.如何修改数据?
update pet set name='旺旺财' where owner='周星驰';
MySQL数据类型、
数值类型:
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
|---|---|---|---|---|
| TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
| SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
| MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
| INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
| BIGINT | 8 字节 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
| FLOAT | 4 字节 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
| DOUBLE | 8 字节 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
| DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
日期和时间类型:
| 类型 | 大小 (字节) | 范围 | 格式 | 用途 |
|---|---|---|---|---|
| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
| TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
| YEAR | 1 | 1901/2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
| TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型:
| 类型 | 大小 | 用途 |
|---|---|---|
| CHAR | 0-255字节 | 定长字符串 |
| VARCHAR | 0-65535 字节 | 变长字符串 |
| TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
| TINYTEXT | 0-255字节 | 短文本字符串 |
| BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
| TEXT | 0-65 535字节 | 长文本数据 |
| MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
| MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
| LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
| LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
sql约束条件
-
主键约束
能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以==使得该字段重复且不为空==
--单独主键 create table user( id int primary key, name varchar(20) ); --联合主键->只要联合的主键加起来不重复就可以 tip:联合主键里面任意一个字段都不能为空 create table user2( id int, name varchar(20), primary key(id,name) ); --建表后添加主键(add) create table user4( id int; name varchar(20); ); alter table user4 add primary key(id); --建表后添加主键(modify修改字段) alter table user4 modify id int primary key; --删除主键 alter table user4 drop primary key; -
自增约束
--auto_increment可以管控id的值可以实现id的自动增长 create table user3() id int primary key auto_increment, name varchar(20) ); -
外键约束
--涉及两个表:父表、子表;主表、副表 --班级表 create table classes( id int primary key, name varchar(20) ); --学生表 create table studernts( id int primary key, name varchar(20), class_id int, foreign key(class_id) references class(id) ); --总结; --主表中没有的数据值,在副表中是不可以使用的 --主表中的记录被副表引用是不可以被删除的 -
唯一约束
--约束修饰的字段的值不可以重复 --建表后添加约束 create table user5( id int, name varchar(20) ); alter table user5 add unique(name); --建表时添加约束 create table user6( id int, name varchar(20), unique(name) ); --另一种写法 create table user7( id int, name varchar(20) unique ); --联合的唯一约束->只要联合的主键加起来不重复就可以 create table user8( id int, name varchar(20), unique(id,name) ); --删除唯一约束 alter table user7 drop index name; --建表后添加唯一约束 alter table user7 modify name varchar(20) unique; ---总结: ---1.建表的时候就添加约束 ---2.可以使用alter。。。add。。。 ---3.alter。。。modify。。。 ---4.删除alter。。。drop。。。 -
非空约束
--修饰的字段不能为空NULL create table user9( id int, name varchar(20) not null ); -
默认约束
--就是当我们插入字段值的时候,如果没有传值,就会使用默认值 create table user10( id int, name varchar(20), age int default 10 );数据库的三大范式
1.第一范式(1NF)
数据表中所有的字段都是不可分割的原子值
--字段值还可以继续拆分的,就不满足第一范式 create table student3( id int primary key, name varchar(20), country varchar(20), province varchar(20), city varchar(20), details varchar(20) );tip:范式,设计的越详细,对于某些实际操作可能更好,但是不一定都是好处
2.第二范式
必须是满足第一范式的前提下,第二范式要求,除主键外的每一列都必须完全依赖于主键
如果要出现不完全的依赖,只可能发生在联合主键的情况下
--这就是不满足第二范式的案例
--除主键外的列并不完全依赖主键
create table myorder(
product_id int,
customer_id int,
product_name varchar(20),
customer_name varchar(20),
primary key(product_id,customer_id)
);
--解决办法:拆表
create table myorder(
order_id int primary key;
product_id int,
customer_id int
);
create table product(
product_id int primary key,
product_name varchar(20)
);
create table customer(
customer_id int primary key,
customer_name varchar(20)
);
3.第三范式
必须先满足第二范式,除开主键列的其他列之间不能有传递依赖关系
--不满足第三范式的案例
create table myorder(
order_id int primary key,
product_id int,
customer_id int,
customer_phone varchar(20)
);
--满足第三范式的案例
create table myorder(
order_id int primary key,
product_id int,
customer_id int
);
create table customer(
id int primary key,
name varchar(20),
phone varchar(15)
);
TIPS:创建表的时候,如果是别的表引用的外键,那么就需要先创建
查询
-
查询student表的所有记录
select * from student; -
查询student表中所有记录的sname、ssex、class列
select sname,ssex,class from student; -
查询教师所有的单位即不重复的depart列
--排除重复distinct select distinct depart from teacher; -
查询score表中成绩在60到80之间的所有记录
--第一种写法 select * from score where degree between 60 and 80; --第二种写法 select * from score where degree > 60 and degree < 80; -
查询score表中成绩为85、86或88的记录
select * from score where score in (85,86,88); -
查询student表中“95031”班或性别为“女”的同学记录
select * from student where class='95031' or ssex='女'; -
以class降序查询student表的所有记录
select * from student order by class desc; -
以cno升序、degree降序查询score表的所有记录
--因为默认是升序,所以asc可以省略 --但是在下面这种情况中必须要写 select * from score order by cno asc,degree desc; -
查询“95031”班的学生人数
--count 计数 select count(*) from student where class='95031'; -
查询score表中的最高分的学生学号和课程号(子查询或者排序)
select sno,cno from score where degree=(select max(degree) from score); -
select sno,cno,degree from score order by degree desc limit 0,1; --limit 第一个数表示从哪里开始 --第二个数表示查找几条 -
查询每门课的平均成绩
--avg() select avg(degree) from score where cno='3-105'; select avg(degree) from score where cno='3-106'; select avg(degree) from score where cno='3-107'; select avg(degree) from score where cno='3-108'; -
用一个语句来查询
--group by 分组 select cno,avg(degree) from score group by cno; -
查询score表中至少有2名学生选修的并且以3开头的课程的平均分数
select cno,avg(degree) from score group by cno having count(cno)>=2 and like '3%'; -
查询分数大于70,小于90的sno列
--第一种 select sno,degree from score where degree between 70 and 90; --第二种 select sno,degree from score where degree>70 and degree<90; -
查询sname,cno,degree(不在同一个表中)
--通过对多个表的共同键值进行连接 select sname,cno,degree from student,score where student.sno=score.sno; -
查询所有学生的sno、cname和degree列
select sno,cname,degree from course,score--多表查询 where course.cno=score.cno;--判断语句 -
查询所有学生的sname,cname和degree列
select sname,canme,degree from student,course,score where student.sno=course.sno and course.cno=score.cno; ------------------------------------------------------------ --当涉及多表查询的时候,如果要查询的列多个表里都有,要加上明确的哪个表里面的信息 -- . 的用法 select sname,cname,degree,student.sno,course.cno from student,course,score where student.sno=score.sno and course.cno=score.cno; ------------------------------------------------------------ --为查找到的列取一个别名 -- as 的用法 select sname,canme,degree,student.sno as stu_sno,crouse.cno as cou_cno from student,course,score where student.sno=score.sno and course.cno=score.cno; -
查询"95031"班学生每门课的平均分
--在student表中找到class为95031的班级 select sno from student where class='95031'; -- 在score表里面找到班级为95031的成绩 select * from score where sno in (select sno from student where class='95031'); --找到那些班号之后,从中找到他们的课程号,并且以课程号分组,并分别得出评均分 select cno,avg(degree) from score where sno in (select sno from student where class='95031') group by cno; -
查询选修”3-105“课程高于”109“号同学”3-105“成绩的所有同学的记录
select degree from score where sno='109' and cno='3-105'; select * from score where cno='3-105' and degree >(select degree score where sno='109' and cno='3-105'); -
查询学号为108、101的同学同年出生的所有学生的sno、sname和sbirthday列
--year(sbirthday) 用到了内置函数 year 获取年份 select * from student where year(sbirthday) in (select year(sbirthday) from student where sno in(108,101));