数据库基础还很迷糊?点进来就好了(增删查改详细示例)

一、数据库基础认识

1、什么是数据库,为什么要有数据库?

存储数据用文件就可以了,为什么还要弄个数据库?数据存储在文件中是有一定问题的,比如可能容易丢失,当数据量过大时无法存储,不利于查询和管理等等,数据库有专门的SQL语句来进行查询管理,这也是这篇文章的重点;所以数据库就应运而生了,数据库就是专职存数据的一个软件;

2、数据库的分类

现在市场大致分为关系型数据库和非关系型数据库,
我的这篇博客详细解释了两者的优缺点等,感兴趣可以看一下
关系型数据库(RDBMS)
是指采用了关系模型来组织数据的数据库。 简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
常用的关系型数据库如:
Oracle:甲骨文产品,适合大型项目,适用于做复杂的业务逻辑,如ERP、OA等企业信息系统。收费。

MySQL:属于甲骨文,不适合做复杂的业务。开源免费。

SQL Server:微软的产品,安装部署在windows server上,适用于中大型项目。收费。
非关系型数据库:不规定基于SQL实现。现在更多是指NoSQL数据库,大概分为四种:
基于键值对(Key-Value):如 memcached、redis
基于文档型:如 mongodb
基于列族:如 hbase
基于图型:如 neo4j
关系型数据库与非关系型数据库的 区别
在这里插入图片描述

3、数据库的基本数据类型介绍

①数值类型:主要用的是int、double、float,假如你设置了一个字段为int(4),你插入的数据是5,数据库中实际存的是0005;
在这里插入图片描述
②字符串类型:常用的有有char、varchar
这两个的区别:varchar是可变长的,char是定长的,比如你定义char(5)和varchar(5);实际char存的是0005,varchar就是个5,它会自动去调节;

在这里插入图片描述
③日期类型:这个是很重要的,它可以标识数据上传的时间
在这里插入图片描述

4、SQL语言的分类

这个大概知道一下,经常选择题会考一下这类型概念;
DDL:数据定义语言,用来维护存储数据的结构
代表指令: create, drop, alter,(创建、删除、更改操作)

DML重点:数据操纵语言,用来对数据进行操作(这就是增删查改,这个过程就是对数据库里面的数据进行操作)
代表指令:select、 insert,delete,update

DCL:数据控制语言,主要负责权限管理和事务
代表指令: grant,revoke,commit

5、数据库的三大范式

第一范式:属性不可再分
属性就是表中的字段,这个字段必须原子,不能分解成两个以上;
第二范式:确保表中的每列都和主键相关
要有主键,其他字段都依赖于主键
第三范式:消除函数传递依赖
确保表中的每一列数据都和主键直接相关,而不能间接相关;

二、数据库的库和表操作

1、创建数据库:语法就是
create database[if not exists] 库名 [character set utf8mb4]
以创建学生表为例

CREATE DATABASE IF NOT EXISTS student
如果系统没有 student这个数据库,则创建,如果有则不创建

CREATE DATABASE IF NOT EXISTS student CHARACTER SET utf8mb4;
如果系统没有 student这个数据库,则创建一个使用utf8mb4字符集,有则不创建

2、显示当前数据库:可以显示你都建立了哪些库

SHOW DATABASES;

3、使用数据库:语法是 use 数据库名;

USE student;

4、删除数据库:drop [if exists] 库名
drop会同时删除表结构和数据;
附上drop,delete,truncate的区别,也是面试爱考察的一个点
数据库三个删除的区别

DROP DATABASE [IF EXISTS] student;

5、查看表结构:这个经常会用到
desc 表名:可以完整的展示表信息

desc student;

6、创建表:语法如下
CREATE TABLE table_name (
字段1 datatype,
字段2 datatype,
字段3 datatype
);
comment是注释,有时还会加上主键、是否为空等约束条件

CREATE TABLE stu(
id INT,
NAME VARCHAR(10) COMMENT '姓名',
PASSWORD VARCHAR(20),
age INT,
sex VARCHAR(2),
RESUME TEXT);

7、删除表:drop table [if exists] 表名
drop 可以用来删库,也可以用来删表

DROP TABLE [IF EXISTS] stu

三、增删查改语句基础篇

【墙裂建议自己把这些语句写出来运行一下,可能你看着会了,写出来就不是那么回事了】
增删查改我们主要掌握的是查select,其他的简单会用的就行,先来看增Insert,先建一个表

CREATE TABLE exam(
id INT,
NAME VARCHAR(20),
chinese DOUBLE,
math DOUBLE,
english DOUBLE
)CHARACTER SET utf8mb4;

1Insert:往表里面插入数据

可以一次插一行+全列,也可以一次插多行+全列,
单行插入时不需要指明字段,多行插入要指明字段,而且插入顺序要和字段顺序保持一致

//单行:
INSERT INTO exam VALUES(8,'谢晨',10,20,20);
//多行
INSERT INTO exam VALUES
(1,'唐三藏',67,98,56),
(1,'孙悟空',87.5,78,77),
(1,'猪无能',88,98.5,90),
(1,'曹孟德',82,84,67),
(1,'刘玄德',55.5,85,45),
(1,'孙权',70,73,78.5),
(1,'宋公明',75,65,30);

2、select查询(分种类):

是学习的重点,分好多种查询,下面一个一个介绍
1、全列查询:有多少列展示多少列:SELECT * FROM 表名;

SELECT * FROM exam;

2、指定列查询:比如我只想看成绩表的名字和语文成绩,那就指定这两个字段
select 字段名,字段名 from 表名

SELECT name,chinese FROM exam;

3、表达式查询:这里select后面可以跟列名 可以跟加减乘除运算 、还可以跟函数,听着有点蒙,举几个例子就明白了

给每个人的英语成绩加上10分
SELECT NAME,english+10 FROM exam;
计算每个人语文数学英语的总分
SELECT chinese+math+english FROM exam;
计算所有数据的总和

第二个和第三个的运行结果,看看方便理解
在这里插入图片描述
在这里插入图片描述
4、别名显示:就像上面总分那个写成chinese+englisg+math多少有点怪,为了方便理解,我们可以给他起别名
SELECT 列名 [AS] 别名 […] FROM 表名,比如把总分用total表示

SELECT chinese+math+english AS total FROM exam;

5、去重:使用DISTINCT关键字去重,

SELECT DISTINCT math FROM exam;//去掉数学成绩重复的

6、排序:ASC 为升序,DESC 为降序,没有指定的话默认为ASC,语法为
注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序,排出来你所看到的只是一个偶然情况。NULL 数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面;
SELECT … FROM 表名 [WHERE …]
ORDER BY 列名 [ASC|DESC], […];

查询姓名数学和语文成绩,语文按降序排列
SELECT NAMES,math,chinese FROM exam ORDER BY chinese desc;
查询姓名和总分由高到底排列
SELECT NAMES,chinese+math+english AS total FROM exam ORDER BY total DESC;

在这里插入图片描述
在这里插入图片描述
先按什么升序,再按什么升序,
select device_id,gpa,age from user_profile order by gpa,age;
查询null值时不能使用比较运算符
7、条件查询:需要注意的
WHERE条件可以使用表达式,但不能使用别名。

①一些比较运算符,像< > >= = !=等等,这类比较简单

查询英语成绩大于60分的学生
SELECT NAMES english FROM exam WHERE(english>60);
查询语文成绩等于88分的学生
SELECT NAMES,chinese FROM exam WHERE(chinese=88);
查询语文比数学好的学生,并按数学排序;(下面的这个运行结果)
SELECT NAMES,chinese FROM exam WHERE(chinese>math) ORDER BY math;

在这里插入图片描述
②逻辑运算符:and or not

AND: 多个条件必须都为 TRUE(1),结果才是 TRUE(1)
OR :任意一个条件为 TRUE(1), 结果为 TRUE(1)
NOT :条件为 TRUE(1),结果为 FALSE(0)
AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分

查询语文大于70分或者英语大于60分的同学,
SELECT * FROM exam WHERE(english>60 OR chinese>70);
查询英语大于70,语文大于80或者数学大于80的学生;
这两个哪个能实现呢?
SELECT * FROM exam WHERE (math>70 OR chinese>80) AND english >70;
SELECT * FROM exam WHERE math>70 OR chinese>80 AND english >70;

看一下运行结果
根据结果我们可以看到上面的三个要求只有数学大于70分实现了,其他两个都没有实现,因为先执行and后执行or,但or只要有一个结果为真就为真;
SELECT * FROM exam WHERE math>70 OR chinese>80 AND english >70;
在这里插入图片描述
这个带括号的才可以实现三个条件都满足
在这里插入图片描述
③范围查询:bewteen ……and, in
给一个区间查询,比如语文成绩在70到80分之间

SELECT * FROM exam WHERE chinese BETWEEN 70 AND 80;
用逻辑词and也可以实现
SELECT * FROM exam WHERE chinese >=70 AND chinese <=80;
查询语文成绩等于70或者75或者88分的同学;
SELECT * FROM exam WHERE chinese IN(70,75,88);

④模糊查询:
关键词like
%:匹配多个字符,含有这个字的都显示出来 -:匹配一个字符,

问题:查询名字里有孙的同学
这个输出结果是孙悟空和孙权,就是有孙的都打印出来
SELECT NAMES FROM exam WHERE NAMES LIKE '孙%';
这个只输出孙权,就是所谓的匹配一个字符
SELECT NAMES FROM exam WHERE NAMES LIKE '孙_';

⑤null查询:NULL 的查询:IS [NOT] NULL

//查询语文成绩为空的学生
SELECT * FROM exam WHERE chinese IS  NULL;

8、limit分页查询:使用limit查询的前提是有序,也就是有order by,不然你怎么输出前几个呢对吧

选出英语成绩前三名的学生
SELECT * FROM exam ORDER BY english  DESC LIMIT 3;
这个就是从2号往后,也就是第三名开始,往后的三名,也就是4 5 6 
SELECT * FROM exam ORDER BY english  DESC LIMIT 3 OFFSET 2;

3、update修改表里面的数据
修改比较简单,举几个例子就明白了
update 表 set 字段1=value1, 字段2=value2 where 条件

将所有同学的语文成绩乘2
UPDATE exam SET chinese=chinese*2;
把孙悟空的数学成绩加20分
UPDATE exam SET math=math+20 WHERE NAMES='孙悟空';
给总成绩倒数123名的数学成绩加50分
UPDATE exam SET math=math+50 ORDER BY (chinese+english+math) LIMIT 3;

4、delete:删除表中数据

delete from 表 where 条件

删除孙悟空同学的考试成绩
DELETE FROM exam WHERE NAMES='孙悟空';

四、复杂查询和索引事务

1、数据库的约束

有时我们需要对数据库或者里面的字段进行约束,具体约束类型如下;

  • NOT NULL :指示某列不能存储 NULL 值,比如学生表的一个字段是姓名,肯定就不能为空。
    UNIQUE :保证某列的每行必须有唯一的值。像身份证这种字段就不能重复(null不算在里面)
  • DEFAULT :规定没有给列赋值时的默认值。如果建表时没给值,默认值就是null;
  • PRIMARY KEY: NOT NULL 和 UNIQUE 的结合。一条数据的唯一标识,像学号就是学生的唯一标识确,不能为空不能重复
  • AUTO INCREMENT:自增,像id这种设置为自增就比较合适
  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CREATE TABLE student1(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '选择id做主键',
sn INT DEFAULT NULL COMMENT '默认值为null',
NAME VARCHAR (100) NOT NULL,
sex CHAR(1) NOT NULL DEFAULT '女'
)CHARSET=utf8mb4;

三大范式:检查没- -张表是否符合三大范式
1、每个表中的字段含义不可再分(根据业务来)
2、每个表中的字段应该和完整的主键有关系,而不是部分主键有关系
3、每个表中的字段应该和主键有直接关系,而不是间接关系

2、复杂查询

聚合查询
先来看聚合函数
在这里插入图片描述

统计考试表中总共有多少行数据
SELECT COUNT(*) FROM exam;//8
名字这个字段总共有多少行
SELECT COUNT(NAMES) FROM exam;//8
把数学重复的去掉看总共有多少行
SELECT COUNT(DISTINCT math) FROM exam;//7,因为去重了

对所有的数学成绩求和,
SELECT SUM(math) FROM exam;//输出843.5
SELECT SUM(math) FROM exam WHERE math < 60;//输出null,因为没有比60小的

找出数学成绩的最高分
SELECT MAX(math) FROM exam;

找出数学成绩的最低分
SELECT MIN(math) FROM exam;

group by和 having的配合使用
group by 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 where 语句,而需要用having

以姓名分组,查询英语成绩最小的
SELECT NAMES,MIN(english),AVG(english) FROM exam GROUP BY NAMES;

跟上面一样,只是把小于50分的去掉,having是在最后一步执行
SELECT NAMES,MIN(english),AVG(english) FROM exam GROUP BY NAMES HAVING AVG(english)>50;

3、索引和事务

1、什么是索引?为什么要有索引?

简单来说,比如你想在图书馆借一本莫言的小说,一楼存的数学类,二楼医学类,三楼文学类。在三楼一排存的徐志摩的,二排存的莫言的,三排存的林徽因的。索引就相当于引导,有人告诉你三楼二排存的莫言的,你就不用从一楼一本一本的去往上找,这就大大增加了查找速度。
来官方一点:索引能快速找出在某一列中有一特定值的行。不使用索引,mysql必须从第一条记录开始查找,就是在遍历,时间复杂度为O(n),如果表中查询的列有一个索引,索引其实是一颗搜索树,这时时间复杂度就能提升为O(logn)。

2、索引的成本和收益

收益:总的一句话就是加快查询效率,比如10亿个QQ号你要是遍历,遍历到什么时候去了
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
成本:
1.索引需要占物理空间,你要来保存索引。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

3、索引的类型和使用场景

唯一索引:就是保证字段唯一;不允许其中任何两行具有相同索引值的索引。当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。

主键索引:,
在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

聚簇索引
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引, 即如果存在聚集索引,就不能再指定CLUSTERED 关键字。一个表中只能有一个聚集索引,但表中的每一列都可以有自己的非聚集索引。
非聚集索引:则表中行的物理顺序与键值的逻辑(索引)顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。聚集索引更适用于对很少对基表进行增删改操作的情况。
使用场景
1、数据量足够大的时候,比如超过10万
2、查询频繁的字段使用索引
3、索引的相关字段不要太大

在哪儿建立?索引的建立是在数据库的某些列上面,
1、在经常需要搜索的列上,可以加快搜索速度,
2、在作为主键的列上,强制该列的唯一性,
3、在经常用作连接的列上,可以加快连接的速度
4、在经常需要排序的列上,利用索引的排序,加快排序时间,
5、在经常使用where子句中的列上,可以加快条件的判断速度

使用create操作索引
// 创建索引
create index 索引名 表名(字段名);
// 删除索引
drop index 索引名 on 表名;(内部被映射成alter table语句)

使用alter table 语句创建和删除索引
//创建索引
alter table table_name add index(column_name);
// 删除索引
alter table table_name drop index index_name;

索引为什么使用B+树而不使用B树或红黑树

首先要明白数据库索引是存储在外部磁盘上的,我们要选的数据结构应该是符合这一特性的;

红黑树的缺点:红黑树的深度过大而造成磁盘 IO 读写过于频繁,而 IO 读写效率很低,这在大规模的数据处理中一点优势也没有;根据磁盘查找存取的次数往往由树的高度所决定,所以要做的改进就是减少树的高度,B树就很合适

为什么说 B+ 比 B 树更适合实际应用中操作系统的文件索引和数据库索引?

①B+的磁盘读写代价更低
B+ 的内部结点并没有指向关键字具体信息的指针,因此其内部结点相对B树来说更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。

②B+ 的查询效率更加稳定
由于非叶子结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相同。

③ B树在提高了磁盘 IO 性能的同时,并没有解决元素遍历的效率低下的问题。正是为了解决这个问题,B+树应运而生。B+树只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中,基于范围的查询是非常频繁的,而 B 树不支持这样的操作

4、为什么使用事务
先想一个场景,比如A要给B转200块钱,那就需要两部操作,A账户少200,B账户多200,如果第一步执行成功了,因为一些不知道的原因,第二部没成功B没收到200块钱,这是非常危险的事情,所以就需要事务
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
事物的四大特性
原子性
事务中的全部操作在数据库中是不可分割的;对于其数据修改,要么全都执行,要么全都不执行。

一致性
事务在完成时,必须使所有的数据都保持一致状态。比如两个杯子倒水,A往B里倒一点,B往A里倒一点,到最后,A杯跟B杯加起来的水是没有少的。

隔离性
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值