数据库概念
为什么学习数据库:
1.web中的数据量非常大
2.数据不方便存储和管理
什么是数据库:用于存储和管理数据的仓库
数据库的特点:
- 数据可以实现持久化存储,其实数据库就是一个文件管理系统
- 可以很方便的存储和管理数据
- 数据库定义了统一的方式,才操作数据库。 -SQL Structure Quary Lanaguage 接过话查询语句
常见的数据库软件:
- Oracle 收费的大型关系型数据库
- MySQL 开源免费的数据库,中小型关系数据库
- PSL 免费的数据库
- DB2 IBM公司 收费 常用在银行系统中
- redis 免费,非关系型数据库 key-value键值对
- MongoDB 非关系型数据库 文档类型
SQL:结构化查询语言,Structured Quary Language
数据库管理系统,数据库和表的关系
可以使用数据库管理系统创建多个数据库,比如java31/apartment数据库…,一般一个项目对应的是一个数据库,一个数据库可以创建多张表,一般在项目中,数据库中的表映射Mode类 pojo,model,entry
比如数据库中创建一张用户表user 在后再服务器中一般对应的都有一个model类 User.class
后台中的model类一般用于临时存储从数据库中查询出来对应表中的数据,如从user表中查询出来一条记录,这条记录对应的就是后台服务器中的一个user对象(属性)
SQL操作数据库
概念:
结构化查询语言 Structured Quary Language
作用:
- 是一种数据库的查询的标准,对虽有的数据库都支持
- 不同的数据库SQL语句可能有不点不同(方言),MySQL Oracle DB2
sql语句分类
- DDL:操作数据库,表 。数据库定义语言 :Data Definition Language
- DML:增删改表中的记录 。数据库操作语言 :Data Manipulation Language
- DQL:查询表中的记录 。数据查询语言 :Data Query Language
- DCL:管理用户与授权 。数据控制语言 Data Control Language
数据类型
-
整数类型 tinyint(微整形)8位
smallint
(小整形)16位
mediumint
(中整形)24位
int
(integer整形)32位 -
小数类型
double
8个字节
float
4个字节 -
日期类型
date
(年月日)
time
(时分秒)
datetime
(年月日时分秒)
timestamp
(时间戳 年月日时分秒):如果该字段为时间戳类型,没有赋值或该字段位null,会默认使用系统当前的时间自动赋值。一般情况一张表只能有一个字段使用时间戳数据类型 -
字符串类型
char
(固定长度的字符串)varchar
(可变长度的字符串) 使用几个字符就占几个 -
二进制类型
tinyblob
(允许0~255个字节)
big large
blob
(允许0~65535个字节)
longblob
(非常大) -
文本类型
tinytext
(允许长度为0~255个字节)
text
(允许0~65535个字节)
longtext
(非常大)
DDL语言
操作数据库
- 创建数据库 方式有很多种:
create database 数据库名;
create database if not exists 数据库名;
(创建的时候先判断数据库是否存在create database 数据库名 character set 编码字符集;
(创建数据库的时候指定编码字符集- 三者组合到一起表达
create database if not exists college character set utf8;
- 查询 r -->retrieve
- 查询当前数据库服务器:
show databases;
- 查询某个数据库的编码字符集:
showcreate database college;
- 查询当前数据库服务器:
- 修改 u—>update
- 修改数据库的编码字符集
alter database 数据库名称 character set 编码字符集;
- 修改数据库的编码字符集
- 删除 d—>delete drop
- 删除数据库
drop database 数据库名称;
- 判断数据库是否存在,存在删除掉
drop database if exists 数据库名称;
- 删除数据库
操作表
-
创建表 C—>create
-
语法:
create table 表名(
列名1 数据类型,
列名2 数据类型,
......
)
-
-
查看表
- 查看当前使用的数据库所有的表
show table;
- 描述该表的结果
desc 表命;
- 查看创建的表
show create table 表名;
- 快速创建一个表结构相同的表(复制表)
create table 新表名 like 旧表名;
- 查看当前使用的数据库所有的表
-
修改 update
- 修改表名
alter table 旧表名 rename to 新表名;
- 修改表的编码字符集
alter table 表名character set 编码字符集;
- 添加一列字段 add
add table 表名 add 列名 数据类型;
- 删除一列 drop
alter table 表名 drop 类名;
- 修改列名 数据类型
change: alter table 表名 change 旧列名 新列名 新数据类型;
modify:alter table 表名 modify 列名 新数据类型;
- 修改表名
-
删除 delete
- 删除表
drop table 表名;
- 删除判断表是否存在:
drop table if exists 表名
- 删除表
大多数情况下我们是借助于图形化管理工具Naviget来操作
DML 增删该数据库中的表的数据
1.添加数据:
- 语法:
insert into 表名(列名1,列名2,......列名n) values(值1,值2,......值n);
- 注意事项:
- 列名和后面的值的类型要保持一致
- 如果表名后面没有指定列名,默认为该该表中的所有的列添加对应的值。注意依然是有顺序的
- insert into 表名 values(值1,值2,…值n);
- 除了数字类型外 (int double),其他类型一律要使用引号(单引号或双引号)引起来。
2.删除数据:
- 语法:delete
delete from 表名 [where 条件];
- 注意事项
- 如果后面不跟条件,则删除整张表中的数据
- 删除表的所有记录:
delete from 表名
/truncate table
表名;(底层是先把表删了,然后创建一张一摸一样的表) - 如果条件中的字段值有重复的,凡是符合条件的都删除
3.修改数据:
- 语法:
update 表名 set 列名1 = 替换值1,列名2 = 替换值2,......列名n = 替换值n [where 条件];
- 注意:
- 如果不带条件,会修改表中的所有记录
DQL查询表中的记录 select from
语法:
select 需要查询的信息(列名1,列名2,......列名n)/ * from 表名 [where 条件];
- ifnull表达式:ifnull(表达式1,表达式2)
表达式1:代表那个字段需要判断是否为null
表达式2:如果该字段值为null 后面的可以进行替换
查询表中的所有的行和列的数据
select * from 表名;
查询指定列的数据:如果有多个列,中间用逗号隔开。
select 列名,列名2,列名3,...... from 表名;
查询时指定列的别名进行查询
-
使用关键字
as
-
使用别名的好处:显示的时候可以指定新的名字,并不修改表的原有结构。
-
对指定列进行别名操作:
select 列名1 as 新名字,列名2 as 新名字, ...... from 表名 as 新表名;
如:对学生表进行操作:查询学生表的姓名和年龄
select s.age as 年龄, s.name as 姓名 from student as s; -- as关键字可以省略不写。
去除重复查询
使用关键字 distinct
去掉重复的记录
语法格式:select distinct 字段名 from 表名;
例如:查询本班同学都来自那个地方
select distinct address from student;
查询的结果值可以参与数学运算
查询出来的列和其他列可以进行数学运算
语法:select 列名1+、-、*、/ 列名2,..... from 表名;
注意:能够参与数学运算的前提是列的数据类型是数值型,整数和小数
例如:查询学生的成绩
select s.english+s.mathematics as 综合成绩 from sudent as s;
查询条件
查询的时候,有时候只想获取符合条件的结果值,不是获取表中的所有记录
语法:select 字段列表 from 表名 where 条件表达式;
结果值:符合条件的记录就会被返回,条件不符合就不返回(过滤掉)
比较运算符:
>、<、>=、<=、!=(不等于)、=、<>(不等于),没有"==" | 在sql当中,不等于有两种表示方式:!=、<> |
---|---|
between…and | 表示的是一个区间范围 如:between A and B :[A,B] |
in(具体的取值) | in里面放的是一个个数值,如果有多个,中间用逗号隔开 |
like | 模糊查询,根据关键字查询,一般搭配"%" |
is null | 查询某一列为null的值,注意在sql中 不能这样表达: 字段名=null |
is not null | 查询某列不为null的值 |
操作:
-- 比较运算符的操作
select * from sudent as s where s.math > 60;
-- between and
-- 查询数学成绩在70-100 之间的
select * from sudent as s where s.math between 70 and 100;
-- in
-- 查询英语在80和100 的同学
select * from sudent as s where s.english in(80,100);
-- 模糊查询
-- 查询地址中含有阳的同学
select * from sudent as s where s.address like '%阳%';
-- 查询本班同学中含有刘的同学
select * from sudent as s where s.username like '%刘%';
-- 查询生日不为空的同学
select * from sudent as s where s.birthday is not null;
备注:在进行模糊查询时,通配符有两种表示方式:
%
_
%
匹配任意多个字符
_
匹配单个字符两者都需要注意书写的位置:
一般我们使用
%
作为模糊查询的通配符
逻辑运算符 与、或、非
与:&& —> and
或:|| —> or
非:!
在sql中建议使用单词来表示逻辑运算**“and or”**
操作:
-- or
select * from student as s where s.english = 85 or s.english = 100;
-- 查询本班同学全部成绩在70分以上的 and
select * from student as s where s.math > 70 and s.english > 70;
-- 取非
select * from student as s where !(s.math > 70 and s.english > 70);
排序
单列排序
通过order by 语句类实现排序,只是将查询出来的结果值进行排序,并不影响查询的结果,不进行条件过滤,影响的是显示的方式(从大到小还是从小到大)
升序:asc 默认就是升序
降序:desc
单列排序:根据表中的某个字段,某列进行排序
语法:select 字段列表 from 表名 where 条件 order by 字段名 asc/desc;
如:对查询出来的同学的英语成绩进行降序排序
select * from student as s order by s.english desc;
组合排序
同时对表中的多个字段进行排序,如果前面的字段值相同,再根据后面的字段再次排序
语法:select 字段列表 from 表名 where 条件 order by 字段1 desc/asc,字段名2 desc/asc;
操作:先根据数学成绩进行升序排序,如果相同,根据英语进行降序排序
select * from student as s order by s.math asc,s.english desc;
聚合函数
常用的聚合函数
-
求最大值
max
-
求最小值
min
-
求平均数
avg
-
求总和
sum
-
统计查询结果的记录数
count
使用count统计记录数的是时候,如果count中填写的是表中的某个字段,如果某条记录中字段为null,则该记录会被过滤掉。
ifnull(表达式1,表达式2),如果前面的字段为null后面的表达式2可以替换掉前面的字段为null的值。这是就可以统计带null的值。
分组查询 group by
select
字段列表
from
表名列表
where
分组之前的条件条件
group by
分组字段
having
分组之后的条件
limit
分页限定条件
概念:使用group by 对查询的结果信息进行分组,相同的数据分成一组。
语法:select 字段列表 from 表名 group by 分组字段 having 分组之后的条件;
如:将查询出来的结果值内容,按照性别进行分组,分为2组。每个组的文综和是多少 年龄大于18岁
select
s.gender,SUM(s.history+s.geography+s.politics) as 文综和 -- 查询的结果展示出来
from
student as s
WHERE
s.age > 18
group BY
s.gender;
-- 统计成年人男女个多少个 只显示个数小于3的那一组成员
select
s.gender,COUNT(s.gender) as 个数
from
student as s
where
s.age >= 18
group by
s.gender;
having
count(s.gender) < 3;
having和where的区别
- where语句:将查询结果分组前的符合条件返回数据,不符合条件的过滤掉。先过滤再分组。where后面不能使用聚合函数。
- having语句:再分组之后过滤数据,即先分组再过滤。having后面可以使用聚合函数。
分页查询 limit
使用关键字limit,它是Mysql中的方言操作
作用:对查询的结果值进行分页展示,一次性显示多少条记录
语法:select 字段列表 from 表名 where 条件 group by 分组字段 having 分组之后条件 order by 升降序 limit 分页条件;
分页限定条件 —> 起始值 展示的记录数 limit offset,length
-- 查询学生表中的数据,从第一条开始,每页显示两条,第一次只能看到前两条
select
*
from
student as s
limit
0,2;
-- 查询学生表数据从第四条开始 展示3条
SELECT
*
from
student
limit
3,3;
-- 分页 转换非农业查询的起始值和页码数,每页展示的个数确定的
-- 如果查询的记录值是从第一条开始的,这个0可以省略不写
select
*
from
student
limit
5;
-- 如果查询的是最后几条,有几条显示几条,不会报分页错误
-- 查询从第三条开始,查询5条
select
*
from
student
limit
2,5;
备注:如果查询从第一条开始,起始值可以省略,如果查询最后几条,有几条显示几条,不会报分页错误