基础知识
什么是数据库
数据库是按照数据结构来组织、存储和管理数据的仓库
什么是关系型数据库、主键、外键、索引分别是什么?
关系型数据库是由多张能相互联结的二维行列表格组成的数据库 主键:是表中的有一个或者多个字段,它的值用于唯一地标识表中的某一条记录 。外键:表示了两个关系之间的相关联系,以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。在关系数据库中,索引是一种单独,物理的对数据库表中一列或多列的值进行排序一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单
数据库的分类
关系型数据库
关系型数据库模型是把复杂的数据结构归根结为简单的二元关系。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分类、合并、连接、或选取等运算来实现数据库管理
oracle mysql sqlserver sqlite
非关系型数据库
Nosql 泛指非关系型的数据库,Nosql数据库在特定的场景下可以发挥难以想象的高效率和高性能,它是作为传统关系型数据库的一个有效的补充
MongoDB Redis
MYSQL安装
SQL语句分类
DQL:数据查询语言,用于对数据的查询,select
DML:数据操作语句,用于修改数据库中的数据,包括插入(INSERT)、更新(UPDATE)和删除(DELETE)
DDL:数据定义语言,用于创建、修改、和删除数据库内的数据结构
DCL:数据控制语言,用于对数据库的访问,如:1:给用户授予访问权限(GRANT);2:取消用户访问权限(REVOKE)
表字段数据类型
MYSQL支持多种类型,大致可以分为三类:数值、日期、时间和字符串类型
整型
浮点型
设一个字段定义为 float(5,3),如果插入一个数 23.45678,实际数据库里存的是 23.457,但总个数还以实际为准,即 5位。
字符串
char 和 varchar:
VARCHAR与CHAR两种字符型数据类型相比,最大的差异就是前者是可变长度,而后者则是固定长度。在存储时,前者会根据实际存储的数据来分配最终的存储空间。而后者则不管实际存储数据的长度,都是根据CHAR规定的长度来分配存储空间
时间
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
数据类型的属性
如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引。 您可以使用多列来定义主键,列间以逗号分隔。
UNIQUE KEY的用途:主要是用来防止数据插入的时候重复的
CHARSET 设置编码
DDL数据库定义语言
1)、创建数据库
语句
create database 数据库名;
示例
create database mywork character set utf8;
2)、选择数据库
要选择操作的数据库
语句
use 数据库;
操作
use mywrok;
3)、查询建立数据
查看数据库创建细节
语句
show create database 数据库;
操作
show create database mywrok;
4)、删除数据库
删除创建的数据库
语句
drop database 数据库;
操作
drop database mywork;
5)、创建表
语句
create table 表名(字段、类型、字段、类型·····)
操作
create table student(
id int primary key auto_increment,
name varchar(20),
sex varchat(20),
age int,
birthday date
);
6)、查看表的创建细节
show create table student;
7)、展示表结构
desc student;
8)、添加表字段
在原有的学生基础上添加address列
alter table sstudent add address varchar(20);
9)、修改表字段
在原有的学生基础上修改address列
alter table student modify address varchar(125);
10)、删除表字段
再原有的学生基础上删除address列
alter table student drop address;
DML
1)、新增数据
语句
单条:insert into 表名 values(字段值,字段值,字段值、、、)
多条:insert into 表名 values (字段值,字段值…),(字段值,字段值…)
2)、修改数据
语句
update 表名 set 字段1 = 值1 ,字段2=值2…
where 条件
操作
update student set name=‘123’ where id = 2;
3)、删除数据
语句
单条:delete from 表名 where 条件 ;
全部 delete from 表名
操作
delete from student where id=1;
DQL
数据查询语言,用于对数据的查询
1)、查询表中的具体字段数据
select 字段1,字段2 from 表名;
2)、查询表中的全部数据
select * from 表名
3)、条件查询
select * from student where id = 1;
按关系运算符筛选
等于 =
大于 >
大于等于 >=
小于<
小于等于<=
不等于!=
逻辑运算符筛选
and 与\并且
or 或
not 非
in的使用
IN 运算符用于 WHERE 表达式中,以列表项的形式支持多个选择,语法如下:
where name in(value1,value2);
where name not in(value1,value2);
当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择。
2.IN 子查询
更多情况下,IN 列表项的值是不明确的,而可能是通过一个子查询得到的:
select * from student where sid IN (select sid from score where yuwen=50);
在这个 SQL 例子里,我们实现了查出所有分数为 50 的学生(可能是被禁止)的所有信息。首先通过一个查询得到所有所有 yuwne=50 的用户:
然后将查询结果作为 IN 的列表项以实现最终的查询结果,注意在子查询中返回的结果必须是一个字段列表项。
4)模糊查询
select * from 表名 where 字段 like “%内容%”;
5)、分组查询
select * from 表名 group by 字段 ;
select * from 表名 group by 字段 having 条件;
having 条件表达式:用来分组查询后指定一些条件来输出查询结果
having作用和where一样,但having只能用于group by
7)分页查询
select * from table limit m.n;
其中m是记录从m+1开始,N代表取n条记录
select * from student limit 2,4;
取出第三条至第六条,4条记录
selct * from table limit 8;
而是 取出从1-8条数据
8)、聚合函数
count(个数)、sum(求和)、avg(平均)、max(最大)、min(最小)等
多表设计
有时候,为了业务,或者避免一张表中数据量过大,过复杂,在开发中会进行一对一方式来设计表。
一对多
指的是一个实体的某个数据与另外一个实体的多个数据有关联关系, 一对多的关系在设计的时候,需要设计表的外键
多对多
一个实体的数据对应另外一个实体的多个数据,另外实体的数据也同样对应当前实体的多个数据。
比如:一个学生可以有多个老师,一个老师可以教多个学生
解决方案:创建一个中间表,专门用来维护多表之间的对应关系,通常是能够唯一标识出数据的字段(主键)
连接查询
内连接 inner join
左外连接 left join
右外连接 right join
语句
select 表1.字段,表2.字段,from 表1 inner/left/right join 表2 on 表1.字段 = 表2.字段
where 条件
select 表1.字段,表2.字段,表3.字段 from 表1 inner/left/right join 表2 on 表1.字段 = 表2.字段 inner/left/right join 表3 on 表1.字段 = 表3.字段 where 条件
1.找出选修过何老师的课程的学生成绩
select sc.scgrade from sc inner join c on sc.cno = c.cno where c.cteachar = '何昊';
2.列表有不及格课程(成绩小于60)的学生的姓名
select sname form s inner join sc on s.sno = sc.sno where sc.scgrade<60 group by sname;
3:查询SC表中对应何昊老师所授课程的女生的信息
select * from studentcourse as sc INNER JOIN course as c on sc.cno = c.cno INNER JOIN student as s on s.sno=sc.sno where Cteacher='何昊' and sex='女';
4找出没有选修过何老师的课程的所有学生的姓名
select sname from s where s.sno not in (select sno from sc inner join c on sc.cno = c.cno where cteachar = '何昊');