> 文章列表 > 数据库预科与增删查改(CURD)

数据库预科与增删查改(CURD)

数据库预科与增删查改(CURD)

一、预科

1.分类

分为关系型数据库和非关系型数据

关系型数据库对于数据库中数据的格式,要求比较严格(使用硬盘来存储数据)

非关系型数据库则相对不太严格,因此其功能相对于关系型数据库少一些,但是性能更高,因此更适应当前大数据分布式时代

关系型数据库的代表软件有Oracle(甲骨文),这是最牛好的数据库软件;然后就是MySQL,这时使用最广泛的数据库软件;然后就是SQL Sever以及SQLite........

非关系型数据库的软件代表有redis,MongDB,Hbase......

 2.作用

数据库用来组织/保存/管理数据的,然后为了下一步进行增删改查.

如果没有数据库,那么当一个程序跑起来后,才可以向其中增加内容,但是关闭程序以后,其中储存的一些信息也会消失,那么其程序是毫无意义的,因此我们需要使用到数据库,但是在对数据库的操作过程中,一定要小心,如果删库删表,那么造成的损失有可能是不可估量的.

3.定义 

数据库是一个客户端与服务器结构的程序,数据库的本体是服务器,数据是在服务器这里组织和存储的.客户端是程序员们所操作的,是主动的;服务器则是机器本身的,是被动的.当程序员发出请求命令时,客户端给服务器发送数据;然后,通过一系列的操作,服务器返回客户端数据.

客户端和服务器通过网络进行通信,因此客户端和服务器可以在同一个主机上,也可以在不同的主机上

数据库是使用硬盘来存储数据的.

4.关系型数据库的结构

服务器按照数据逻辑,分出了很多数据集合,称为数据库

数据库中,又有很多表来存储数据

每个表里又有很多行

每行又有很多列(每列称作一个字段)

列(字段) -> 行 -> 表 -> 数据库

数据库是大小写不敏感的

二、库操作

以student为数据库名建库,下列所有操作都在student库中

1.查看当前数据库 

show databases ;

 show databases ;

2.创建数据库

create database 自定义库名 charset utf8 ;

create database student ;

建数据库时,最好手动指定字符集,防止出现错误.

对于字符集来说,一个是gbk,这是windows的默认字符集;还有一种就是utf8,这是更通用的字符集,utf8mb4是相对于ut8更完整字符集操作如下所示:

-- 以student为库建立
create database student charset utf8 ;

3. 选中数据库(如果要操作数据库中的表等,就要先选中数据库)

use 库名 ;

use student ;

4.删除数据库(删库操作是非常危险的,包括接下来的表操作等等)

delete database 库名 ;

drop database student ;

三、表操作 (以score为表名建表)

在进行表操作以前,一定要选定数据库,否则无法进行对表的操作.

1.查看数据库中的表

show tables ;

show tables ;

2.创建表(以成绩表举例,表中有名字和语数英三门成绩)

create table 表名(列名 数据类型,列名 数据类型......) ;

create table score(name varchar(20) , chinese decimal(3,1) , math decimal(3,1) , english decimal(3,1) ) ;

创建表的过程中,需要指定列,以及列的类型 :数值类型、字符串类型以及日期类型.

最常见的几种数据类型:

  • int:整数类型,占四个字节
  • varchar( ):可变长度字符串,括号中的是最大长度
  • double(  ,  ):双精度浮点数,括号中第一参数是整体长度,第二参数是小数点后长度
  • decimal(  ,  ):双精度浮点数,括号中第一参数是整体长度,第二参数是小数点后长度
  • datetime:日期类型,举例('2023_04_21 20:35:00'),还有一个函数now()可以插入当前时间

3.删除表(此时得以score表来查询)

drop table 表名 ;

drop table score ;

4. 查看表结构(此时得以score表来查询)

desc 表名 ;

desc score ;

四、表内操作 (建立一个学生基本信息表然后操作)

use student ;
create table information (id int , name varchar(20) , gender varchar(5) ,class_id int , phone varchar(20) ) ;

1.插入数据(两表都有进行操作,为了后续做铺垫)

insert into 表名 value (数据1),(数据2),(数据3);

insert into 表名(指定列插入) value (数据1),(数据2) ;

//单条数据插入
insert into information value(1,'刘一','男',1,'13191039999') ;//多条数据插入
insert into information value(2,'陈二','男',2,'13233556666'),(1,'张三','女',2,'18835598888'),(3,'李四','男',1,'18603557777') ;//指定列插入(只是讲述,并没有在数据库进行操作)
insert into information(name,id) value('王五',6) ;//上述是对学生信息表的插入,下述是对成绩表的插入
insert into score value('刘一',98.9,88,79),('赵四',77,80.9,99),('王五',56,76,89) ;

2.查询表数据

<1>全表查找(此时得以information表来查询)

select * from 表名 ;

select * from information ;

操作比较危险,自制的表比较小,但是如果当在一个公司时,其表的内容可能是很大的.

如果数据量很大,那么会瞬间吃满硬盘带宽和网络带宽,导致其他程序无法使用网络和硬盘

<2> 指定列名查询 - > 无论在表中数据如何排列,但是查询时并没有前后之分(此时得以score表来查询)

select 列名1,列名2 from 表名 ;

select id ,name from information ;

<3>表达式查询(此时得以score表来查询) 

select 列名1+列名2,列名3 from 表名 ;

select name,chinese+math+english from score ;

<4>指定别名查询 - > as也可以省略不写,不过一般不建议这样做(此时得以score表来查询)

select 列名1+列名2 as 自定义列名 ,列名3 from 表名 ;

select name,chinese+math+english as total from score ;

<5>排序后查询 - > 利用order by 子句,指定某些列进行排序(此时得以score表来查询)

select * from 表名 order by 列名 排序关键词 ;  

//以其中的数学成绩降序排列(desc就是降序的意思)
select * from score order by math desc ;//以其中的数学成绩程序排列(不写降序就是升序,不过也有其关键字asc)
select * from score order by math asc ;/*也可以指定两个关键字,当前一个相同时,使用第二个进行排序以其中数学成绩为第一关键字,语文成绩为第二关键字如果数学成绩相同时,用语文成绩来比较*/
select * from score order by math desc , chinese ;

<6>去重查询 - > 利用distinct(此时以score表来查询)

select distinct 列名 from 表名 ;

select distinct math from score ;

也可以有多列进行查询,但是多列都相同时才判定为重复

如果重复,那么只保留一个

<7>条件查询 - > 利用where子句

select * from 表名 where  查询条件 ;

where之后是条件,符合条件的数据留下,不符合的直接pass 

判断条件时,有一系列的运算符:比较运算符和逻辑运算 - > 其实和语言中的差不多

这里就不过多阐述,写SQL语句时都会给大家介绍到(此时得以score表来查询举例)

//判断数学成绩是否大于80,如果大于,留下
//这里利用了>来比较(同时还有< <= >= != )
//不过判断相等不使用 == ,而是使用 =
select * from score where math > 80 ;//这里利用的是between...and...,判断成绩是否在此区间中 
//判断数学成绩是否在此区间
select * from score where math between 40 and 80 ;//判断数学成绩有没有60分或这100分
//利用的是in(......),判断成绩是否有想要看见的成绩
select * from score where math in (60,100) ;//模糊匹配,也就是类似于正则表达式的东西,但是比其简单
//利用的是like
//%表示的是不确定字符数;_表示的是一个字符
//如果有人姓王,就将其表示出来,否则pass
//%和_可以写在前面或者后面
select * from score where name like '王%' ;
select * from score where name like '王_' ;

<8>分页查询(此处利用的是score表)

一个关键字是limit,表示一页最多有几个

select * from 表名 limit 自定义数字 ;

另一个关键字是offset,表示从哪一条开始查询

select * from 表名 limit 自定义数字 offset 自定义数字 ;

//限制有每页最多两个
select * from score limit 2 ;//下列的也可以写成limit 2,2
//前者表示从哪一行开始,后者表示最多几个
//SQL中,也是从第0个开始
select * from score limit 2 offset 2 ;

<9>将查询到的表插入另一个表

在此操作中,必须满足的条件就是两表插入的所有列数的所有信息都匹配

insert into 表名 select * from 表名 ;

//这个操作不在所建立的表中进行
//因为这是一个比较偏的操作,利用的机会很少
//在另一个库中建立一个student表和另一个student2表
//将student表中的内容插入到student2表中
//注意,我们上述所有的操作基本上都是可以对列操作的
//由于我无法列举所有的情况,大家自行理解
insert into student2 select * from student ;

<10>聚合查询 (此处利用的是score表)

select 聚合函数(列名) from 表名 ;

聚合查询依赖的是聚合函数 - > 这是SQL所提供的库函数

聚合查询的作用就是将列进行一定的计算,比如说语文成绩的总和,平均值等

//count函数,求的是行数
//下述的*也可以换成某一列的列名
//不过如果当此列为null时,则不会被计算
select count(*) from score ;//sum函数,求的是某列的总和
select sum(math) from score ;//avg函数,求的是某列的平均值
select avg(chinese) from score ;//将多列的平均值求出(还利用了一下as)
select avg(chinese+math) as avg_total from score ;//求最大值
select max(math) from score ;//求最小值
select min(math) from score ;

<11>分组查询 - > group by子句进行查询 (使用student表)

select 列名,聚合函数(列名) from 表名 group by 列名 ;

select 列名,聚合函数(列名) from 表名 where 自定义条件 group by 列名 ;

select 列名,聚合函数(列名) from 表名 group by 列名 having 自定义条件;

指定一个列,把列里的值,相同的分到同一个组

//在学生信息表中,利用group by语句,计算每个班的人数
select class_id,count(class_id) from information group by class_id;//在分组查询中,也可以指定条件//第一个是在分组前筛选
select class_id,count(class_id) from information where name != '张三' group by class_id ;//第二个是分组后查询
select class_id,count(class_id) from information group by class_id having class_id != 1 ;//也可以同时使用

在分组查询的过程中,要么是带有聚合函数的列,要么是所要进行分组的列.如果使用其他列,都是毫无意义的.

<12>联合查询(也就是多表查询)    (以information表和score表举例)

select * from 表1,表2;

select * from 表1 join 表2 ; 

联合查询也就是多表查询,基于笛卡尔积进行查询

笛卡尔积:我认为就是排列组合,比如第一张的第一行和第二张的每一行都组合,然后第一张的第二行和第二张表的每一行都结合.......最后形成的表的行数是两表行数之积,列数是两表列数之和

//笛卡尔积如下
select * from score , information ;
//但是一般不使用这种全表查询的方式,学习时还可以使用进行查看
//但是当工作时一张表便是成千上万行.两张表更是可怕
//如果全表查询,那么会导致一些情况发生,不建议如此做//这两张表,建立联系的地方就是名字,因此以此为条件查询
select information.name,score.math+score.chinese from score,information 
where information.name = score.name ;//不仅由上述方式进行两表联合,还可以使用join进行两张表的联合
select * from information join score ;
//如果使用on,后续条件就必须使用on
select information.name , score.math from score join information 
on score.name = information.name ;

上述都是内连接,内连接的意思也就是在第一表中的每个记录,在第二个表中也必须体现,也就是不能为null,而外连接则是如果第一张表中有体现,查询结果就会体现;或者第二章表有体现,第一张表五体现,查询结果也会体现,称为左连接或右连接.

//先插入数据,插入刘三的信息,但是六三没有参加考试,因此无分数
insert into information value (3,'刘三','男',2,'14345450000');
insert into score(name) value ('刘三');//进行查询,左外连接
select information.name,score.math from information left join score 
on information.name = score.name ;//右外连接和此相同,只不过是将left转换为right//上述只是两表查询,也可以进行多表查询,不过一般不会用到,给大家写个模板
select * from 表1 join 表2 on 条件1 join 表3 on 条件2......//除了不同的表进行连接查询,也可以自连接进行查询
//比如说想要查看某位同学的数学成绩比自己的语文成绩高
select s1.name from score as s1,score as s2 where s1.math > s2.chinese ;
//在子连接中,必须要给表使用别名,不然就会报错

<12>合并查询 - > 使用关键字union,会自动去重;union all则不会去重

//合并查询,也可以使用or ,但是针对的是一个表
//如果使用union,则可以在不同的表中进行查询
select name from score where name like '刘%' union 
select name from information where name like '王%' ;

3.修改表数据(此处使用score表进行修改)

update 表名 set 列名 ;

//上述说过的查询等各种子语句都可以使用
//自己一定要贯通,而不是一成不变
update score set math = 89.5 where name = '刘三' ;

4.删除表数据

delete from 表名 ;

//删除表数据,是一条一条删,因此结果绝对没有一起删快
//但是一般删除的时候,都是有条件的,而不是全表删除
delete from score where name like '刘%' ;

到这里就结束了,接下来就是约束,索引,事务,以及JDBC了.