为什么使用数据库?
1.现有数据存在的问题
Java程序在运行的过程中对于数据进行存储操作,变量,对象,数组,集合,双边队列等
数据是保存到内存中,数据的存储是瞬时的,程序退出,电脑异常。都会导致数据丢失并且不可逆
文件存储数据,XML、JSON、其他文件。可操作性比较差,API繁琐,不同文件有不同的解析
方式,而且存在内存占用的效率问题上很难达到两全程度
存在的问题:
1.文件保存的数据没有数据类型的区分,都是字符串
2.数据存储量是较小的,有一定限制
3.没有安全限制
4.文件操作没有备份,回滚,数据保护机制
什么是数据库
数据库按照特定的数据结构,来进行数据的组织,存储,管理和查询,
数据库软件,可以长期存储,有安全限制,数据恢复,并且数据存储可拓展
数据库分类:
网状结构数据库
层状结构数据库
关系结构数据库【重点】
Oracle,MySQL,DB2,SQL Server
通过表结构方式来进行数据的存储操作。 ==> XLS表格非关系型数据库
MongDB Redis
使用哈希表结构方式,Key - Value数据存储方式
ES
ElastecSearch
数据库管理系统
数据库管理系统
DataBase Management System
DBMS
操作和管理数据的大型软件,用于管理,建立,使用和查询数据
Oracle:
贼厉害,安全性,稳定性,数据存储复杂程度...可以完全符合工业要求,但是贵
DB2
IBM公司,不是很多件
SQL Server
MS公司推出的关系型数据库
SQLite
轻量级数据库,源码1w行C语言,用于手机通讯录
MySQL
历史简介:
MySQL隶属于Oracle公司,免费提供使用的数据库软件。
目前流行的版本是MySQL 5.5 5.6 5.7 最新版本是8.0
实际开发中我们要考虑稳定性,兼容性,普适性
SQL
SQL是数据库通用查询语句,不管是MySQL,Oracle,SQL Server都是支持标准SQL语句
不同的数据库都会有自己特定的SQL语句
CRUD:
Create
Read
Updata
Delete
MySQL基本操作
在cmd操作,连接数据库:
mysql -hlocalhost -uroot -p123456
# mysql指目前需要操作连接的数据库
# -hlocalhost -h是host端口,当前数据库所处的服务器ip地址,域名或者主机名
# localhost 表示本地,如果是本地连接可以省略
# -uroot -u user用户,root表示用户
# -p -password密码
推荐连接的方式:
mysql -uroot -p
Enter password: ******
命令:
show databases; 展示当前数据库中所有的数据表
create database; 创建一个数据表
create database shujubiao character set gbk; 创建数据库的过程中修改编码集合
alter database shujubiao character set gbk; 修改数据库的编码集
drop database shujubiao; 删除对应的数据库
use shujubiao; 选择使用数据库
select database(); 让M告知当前使用的数据库是哪一个
小问题:
当遇到以下错误:
2003 - cant connect to mysql server on localhost(10061)错误时,是因为mysql服务器没启动
在命令行输入cmd
打开后输入
dcomcnfg
回车进入,找到“本地服务”
找出mysql右键启动即可
Select查询语句
格式:
select 字段 from 表名;
字段为 * 代表所有字段全部展示
数据计算:
允许使用 + - * / 但是没有取余
% 是一个占位符
去重:
distinct
select distinct 字段 from 表名;
字段别名:
select 字段 as '别名' from 表名;
排序查询:
asc :指定条件升序
desc:指定条件降序
基本格式:
select filedName from tbName order by fieldName asc/desc;
从tbName表中根据升序/降序排列filedName字段
单一条件排序:
代码
select name from student order by age asc
把student表中的name字段根据年龄升序排序
多字段条件排序:
代码
select name from student order by age asc, mathscore desc
把student表中的name字段根据年龄升序和数学成绩降序排序
条件查询
基本格式:
select field from tbName where condition;
从指定数据表tbName中,按照condition条件,查询field字段数据
等值判断 =
Java中的等于判定是用的 == ,而数据库中使用 =,在上面的where条件之后就是一个等值
判定
不等值判定: > < >= <= != <>(这个也是不等于)
逻辑判断 and or not:
区间 between and(包含边界):
NULL之判定:
is NULL:指定当前的字段是null
is not NULL:指定当前的字段不是null
枚举查询in:
模糊查询 like :%
- : 匹配一个字符 select age from student where age like '1_' (查询年龄为十几岁的学生)
% :匹配任意长度字符 select age from student where age like '1%'
(年龄为1开头的学生,后面不限制位数,如果为字母,不区分大小写)
分支结构查询:
case
when condition1 then ret1
when condition1 then ret1
when condition1 then ret1
end
从case开始,到end结束。满足条件对应一个结果,类似于Java中的switch case
eg:select 工资,
case
when 工资>1000 then '千元户'
when 工资>5000 then '小康户'
when 工资>10000 then '万元户'
else '暴发户'
end
时间查询:
select 时间函数([参数列表,可有可无]);
查询时间的情况下,得到的是一个单列单表(虚表)
时间函数 | 功能描述 |
sysdate() | 当前系统时间(年,月,日,时,分,秒) |
systimestamp() | 当前系统时间(日,月,年,时,分,秒) |
curdate() | 当前日期年月日 |
curtime() | 当前时间时分秒 |
week(d) | 指定日期d是这一年的第几周 |
hour(d) | 指定日期d是今天的第几个小时 |
minite(d) | 指定日期d是这一个小时的第几分钟 |
second(d) | 指定日期d是这一分钟的第几秒 |
字符串验证
方法 | 功能描述 |
concat(str1,str2,str3...) | 拼接多个字符串 |
insert(str,pos,len,newStr) | 在指定字符串位置pos,长度限制len,插入新的字符串 |
lower(str) | 大写转小写 |
upper(str) | 小写转大写 |
sbustring(str,pos,len) | 指定字符串,从pos位置开始,长度限制len |
内置方法
方法 | 功能描述 |
sum() | 指定字段一列总和 |
avg()
| 指定字段一列平均值 |
max() | 指定字段一列中的最大值 |
min() | 最小值 |
count() | 指定字段有多少行 |
分组查询
格式:
select fieldName from tbName where condition_ group by 分组要求;
group by 是一个分组关键字,
分组过滤查询
格式:
select fieldName from tbName where condition_ group by 分组要求 having 过滤规则;
限定查询
select field Name from tbName limit 限制;
limit核心用法,分页查询
基本查询总结:
select fieldName
from tbName
where condition_
gtoup by 分组
having 分组过滤
order by 排序[asc/desc]
limit offset,count;
子查询【重点】:
基本格式:
select fieldName from tbName where(子查询结果);
eg:
查询工资大于Jack的工资的人的id跟名字
select EMPLOYEE_ID,FIRST_NAME from t_employees
where SALARY >
(select SALARY
from t_employees
where FIRST_NAME = 'Jack');
子查询结果作为枚举限制in
查询和Jack同部门的员工信息:
select DEPARTMENT_ID,FIRST_NAME
from t_employees
where DEPARTMENT_ID in
(select DEPARTMENT_ID
from t_employees
where FIRST_NAME = 'Jack');
子查询结果一张表,从表内查询指定数据:
从表中查询工资为前五名的员工信息:
合并查询【了解】
-- 合并,要求查询要求的字段个数一致
-- 去重
select employee_id, first_name
from t_employees
union
select job_id, job_title
from t_jobs;
-- 合并,要求查询要求的字段个数一致
-- 不去重
select department_id, first_name
from t_employees
union all
select manager_id, department_name
from t_departments;
表连接查询【重点】
基本格式:
select fieldName from tbName1 连接符 tbName2 on 条件
内连接查询:inner join on
左外连接 left join on:
左表是主表,要求左表完整显示,右表匹配左表数据,如果右表没有数据匹配,显示null
右外连接 right join on:
同上
DML语句
增加
insert
create table person(
id int,
name varchar(30),
salary float(8,2),
age int;
//创建一个数据表
)
-- 规矩插入
insert into person(id,name,salary,age) value (1,'小红',121,16);
-- 省略所有字段名,但是要按顺序添加
insert into person value (1,'小红',121,16);
-- 指定插入
insert into person(name,age) value ('小明',18);
修改
updata
update person set id = 10 where name = '小明';
update person set id = 11,salary = 20000, age = 18 where name = '小明';
删除
delete【不要删库跑路】
--删除id=1的一整行数据
delete from person where id = 1;
清空t整个表的数据runcate
trencate table person;
库表操作
创建数据库:
create database dbName;
eg:
create database dbName [chrarcter set charset]
[设置编码集,根据清空而定]
删除数据库
drop database dbName
修改数据库
alter
-- 修改数据库编码集
alter database dbname character set utf8;
修改表的编码集:
-- 更改表格的编码集
alter table student convert to character set gbk;
alter table course convert to character set gbk;
alter table score convert to character set gbk;
alter table teacher convert to character set gbk;
创建表
create table tbName(
fieldName1 fieldType1,
fieldName2 fieldType2,
fieldName3 fieldType3,
fieldName4 fieldType4,
fieldName5 fieldType5
);
可以假如约束,字符集和存储引擎
数据约束
默认值
创建数据表的过程中,指定字段可以带有默认值,如果用户没有指定数据的情况下,
当前字段会采用默认值方式来进行数据的赋值操作
default
create table person1(
id int,
name varchar(50),
country varchat(50) default 'PRC' -- 设置默认值
);
非空 not null
not null,非空,要求当前字段必须有对应的数据,如果没有赋值就报错
唯一 unique
使用unique约束后,当前字段中保存的数据在当前表内不可重复
但是null不作为唯一判断范围以内
主键 primary key
主键要求 : 唯一非空
主键一般用于在开发中涉及到数据的唯一性参照物,但是不能能使用带有业务逻辑要求的
数据作为主键,列如性别,年龄,工资等
自增长 auto_increment
自增长修饰字段会在数据添加的过程中自动赋值叠加操作
auto_increment修饰的字段必须是一个key