数据库预科与增删查改(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了.