数据库就是存储数据的仓库
数据库可以实现数据的持久化存储
数据库的本质是文件系统
Database Management System:数据库管理系统
DBMA:数据库管理员
常见的数据库管理系统:
MySQL:Oracle公司的中小型数据库,从6版本开始收费
Oracle:Oracle公司的大型数据库,收费的
DB2:IBM公司的大型数据库
SQLServer:Mircosoft公司的大型数据库
SQLite:移动端的嵌入式的小型数据库
Java中主要使用的是MySQL和Oracle
一个DBMS中可以维护管理多个数据库
一个数据库由若干张表组成
一张表包含若干条记录
一条记录包含若干字段信息
数据库中的表相当于代码中的实体类
例如:要研究医生这个类,就应该创建一张医生表
数据库表中的一列(字段)相当于实体类中的属性
例如:汽车有品牌属性,那么在汽车表中就应该有品牌字段
根据类创建出的对象就相当于数据库表中的一行(一条记录)
例如:当我们获取宠物对象时,我们就可以从该对象上获取它所具备的所有属性;同样的,当我们查询到一条宠物记录时我们就可以从表中明确该宠物的所有字段信息。
结构化查询语言:Structured Query Language
分类:
DDL:数据定义语言(Data Definition Language)
对数据库、表进行创建、修改、删除等操作
关键字:create、alter、drop等
DML:数据操作语言(Data Manipulation Language)
对表中记录、字段进行增、删、改等操作
关键字:insert、delete、update等
DQL:数据查询语言(Data Query Language)
对数据库、表、记录、字段进行查询的
关键字:select、from、where、in、and、or、between、having、group by、order by、limit等
DCL:数据控制语言(Data Control Language)
对数据库的安全级别和访问权限进行管理的
关键字:revoke、grant、commit、roll back等
注:
- 安装的目录必须是纯英文路径的
- 删除步骤
- 在控制面板中卸载软件
- 删除mysql安装路径下的mysql文件夹
- 删除C盘下ProgramData下的mysql文件夹
登录mysql
方式一:
- 打开 cmd
- 输入 mysql -uroot -p密码
方法二:
- 打开 cmd
- 输入 mysql -uroot -p
- 再输入密码
方式三:
- 找到安装mysql后的 Command Line Client
- 输入密码
C (create) R (read) U (update) D(delete)
建库:
create database 库名;
判断数据库是否存在,不存在才创建:
create database if not exists 库名;
创建数据库并指明编码格式:
create database 库名 character set 编码格式;
查询数据库的创建语句以及编码格式:
show create database 库名;
查看已有的数据库:
show databases;
删库:
drop database 库名;
判断数据库是否存在,存在才删除:
drop database if exists 库名;
修改数据库的编码格式:
alter database 库名 character set 编码格式;
指定使用的数据库:
use 库名;
建表:
create table 表名 (字段名 字段类型 [约束], 字段名 字段类型 [约束], 字段名 字段类型 [约束], ...);
判断表是否存在,不存在才创建:
create table if not exists 表名 (字段名 字段类型 [约束], 字段名 字段类型 [约束], 字段名 字段类型 [约束], ...);
查询所有表:
show tables;
查看表结构:
desc 表名;
删表:
drop table 表名;
判断表是否存在,存在才删除:
drop table if exists 表名;
复制表结构:
create table 新表名 like 被复制的表名;
修改表名:
alter table 旧表名 rename to 新表名;
修改表结构:
添加新字段
alter table 表名 add 新字段 字段类型 [约束];
删除字段
alter table 表名 drop 字段;
修改字段类型
alter table 表名 modify 字段 字段类型 [约束];
修改字段名
alter table 表名 change 旧字段名 新字段名 字段类型 [约束];
查询表中的所有记录:
select * from 表名; * 表示所有字段(列) 等价于 select 字段1,字段2,字段3,... from 表名;
添加记录:
向所有字段添加数据
insert into 表名 values (值1,值2,值3,...);
向指定字段添加数据
insert into 表名 (字段1,字段2,字段3,...) values (值1,值2,值3,...);
批量添加(所有字段)
insert into 表名 values (值1,值2,值3,...), (值1,值2,值3,...),...;
批量添加(指定字段)
insert into 表名 (字段1,字段2,字段3,...) values (值1,值2,值3,...), (值1,值2,值3,...),...;
删除记录:
删除所有记录
delete from 表名;
根据条件删除指定记录:
delete from 表名 where 条件;
删除所有记录
truncate table 表名;
修改记录:
修改所有记录
update 表名 set 字段名 = 值,字段名 = 值,字段名 = 值...;
根据条件修改指定记录
update 表名 set 字段名 = 值,字段名 = 值,字段名 = 值,... where 条件;
注:
- 添加记录时,值的数量必须与列的数量一致
- 添加记录和修改记录时,值的类型必须与字段类型一致
- 除了数值类型,其他类型都必须用单/双引号括起来
- delete from 表名;删除表中所有记录,它的删除方式是逐行删除,表中有多少条记录,删除语句就会执行多少次;truncate table 表名;删除表中记录,它的删除方式是将整张表删除,然后构建一张与原来表结构相同的空表。
int:整数类型
double:小数类型
特殊的:salary double(n,m)
n:表示整数位和小数位一共最多有n位
m:表示小数位最多保留m位
例如:salary double(6,2) 的最大值是9999.99
datetime:时间戳,包含年月日时分秒,格式:yyyy-MM-dd HH:mm:ss
timestamp:时间戳,包含年月日时分秒,格式:yyyy-MM-dd HH:mm:ss
注:
- 如果某个字段的是类型是timestamp,在我们给它赋值为null或者没有对它赋值时,系统会给它一个默认值,默认值是添加这条语句的时间或者是对它赋值为null时的时间。
- timestamp类型字段值不可能是空值
varchar:
例如:name varchar(20):表示姓名字段的值最大20个字符
查询所有:
select * from 表名;
查询所有记录的指定字段:
select 字段1,字段2,字段3,... from 表名;
去重查询
select distinct 字段名 from 表名;
在 where 关键字后加上条件,查询时会根据条件进行记录的筛选
逻辑运算符
- &&、and
- ||、or
- !
关系运算符
- " > "
- " < "
- " >= "
- " <= "
- " = "
- " != “、” <> "
指定范围内
between … and …
例如:查询成绩在80~100之间的学生 select * from student where score between 80 and 100;
注:含头含尾
在指定列表中
in(值1,值2,值3,…)
不在指定列表中
not in(值1,值2,值3,…)
空和非空
判断为空:is null
判断非空:is not null
模糊查询
关键字:like
占位符:
- _:单个任意字符
- %:任意个任意字符
关键字:order by
排序方法:
升序:默认,asc
降序:desc
// 降序排列员工的销售额,销售额相同时,根据工资升序排列 select * from emp order by sale desc,salary asc;
注:如果多个字段进行排序,只有第一字段的值相同时,才会执行第二字段的排序
格式:order by 字段1 排序方式,字段2 排序方式,…;
概念:将一列数据作为一个整体,然后进行纵向的计算
- avg():计算平均值
- sum():求和
- max():求最大值
- min():求最小值
- count():求数量
注:
- count() 的参数一般使用非空字段或者*
- 聚合函数不计算 null 值
关键字:group by
注:
- 分组后查询的字段只能是:分组字段、聚合函数
- where 和 having 的区别:
- where 用在分组前进行条件筛选,如果不满足 where 的条件则不进入分组;having 用在分组后进行条件筛选,如果不满足 having 的条件则不被查询到
- where 后不能跟聚合函数,having 后可以使用聚合函数进行分组后的条件筛选
关键字:limit
语法:limit 开始索引,每页查询的记录数
注:索引从0开始
公式:开始索引 = (当前页码 - 1) * 每页查询的记录数
select
字段列表
from
表名
where
条件列表
group by
分组字段
having
分组后的条件
order by
排序字段 排序方式
limit
索引,记录数
可以为字段、表起别名
起别名的作用是能够区分多张表中的同名字段,并且简化了书写
格式:
as 别名
注:as 可以省略
概念:对表中数据进行限定
分类:
- 非空约束:not null
- 唯一约束:unique
- 主键约束:primary key
- 外键约束:foreign key
限定字段值不能为空
- 创建表时,添加非空约束
create table 表名(字段名 字段类型 not null,字段名 字段类型 [约束],字段名 字段类 [约束]...);
- 创建表后,添加非空约束
alter table 表名 modify 字段名 字段类型 not null;
注:已存在空值的字段不能被设置成非空
- 删除非空约束(设置字段允许有空值)
alter table 表名 modify 字段名 字段类型;
限定字段值不能有重复
- 创建表时,添加唯一约束
create table 表名(字段名 字段类型 unique,字段名 字段类型 [约束],字段名 字段类 [约束]...);
- 创建表后,添加唯一约束
alter table 表名 modify 字段名 字段类型 unique;
- 删除唯一约束
alter table 表名 drop index 字段名;
注:
- 唯一约束的值可以是空值,并且允许存在多个 null 值
- 已经存在重复值的字段不能被设置成唯一的
- 一个字段可以同时被设置成非空且唯一的,并且非空和唯一的关键字的顺序是任意的
一般主键不使用具有特殊含义的字段
特点:
- 非空且唯一
- 一张表中只能有一个主键字段
- 主键是表中记录的唯一标识
- 创建表时,添加主键约束
create table 表名(字段名 字段类型 primary key,字段名 字段类型 [约束],字段名 字段类 [约束]...); create table 表名(字段名 字段类型 [约束],字段名 字段类型 [约束],..., primary key(主键字段));
- 创建表后,添加主键约束
alter table 表名 modify 字段名 字段类型 primary key;
- 删除主键约束
alter table 表名 drop primary key;
注:删除主键约束后,主键仍有非空约束
主键自增长:
概念:如果某个字段是数值类型的主键字段,可以使用 auto_increment 来实现主键自增长
- 创建表时,添加主键自增长
create table 表名(字段名 字段类型 primary key auto_increment,字段名 字段类型 [约束],字段名 字段类 [约束]...);
- 创建表后,添加主键自增长
alter table 表名 modify 主键字段 字段类型 auto_increment;
- 删除主键自增长
alter table 表名 modify 主键字段 字段类型;
- 创建表后,添加主键约束的同时添加自增长
alter table 表名 modify 字段 字段类型 primary key auto_increment;
注:
- 能添加自增长功能的必须是主键字段
- 添加主键自增长的主键字段必须是数值类型的
- 第一条自增长的字段值是 1
- 从存在过的最大值开始 +1
- 如果存在过的最大值是小数,那么自增长的值是大于它的最小整数
外键让表与表之间产生了联系,保证了数据的完整性
注:从表外键的类型必须与主表主键的类型一致
- 创建表时,添加外键约束
create table 表名(字段名 字段类型 [约束], 字段名 字段类型 [约束], ..., [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段));
- 删除外键
alter table 表明 drop foreign key 外键名;
- 创建表后,添加外键约束
alter table 表名 add [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段);
- 创建表后,新建外键字段的同时,添加外键约束
alter table 表名 add 外键字段 字段类型, add [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段);
级联操作:对主表中的记录进行更新和修改的同时,能直接影响从表中的记录
- 创建从表时,添加级联操作
create table 表名(字段名 字段类型 [约束], 字段名 字段类型 [约束], ..., [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段) on delete cascade on update cascade);
- 创建从表后,添加级联操作
alter table 表名 add [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段) on delete cascade on update cascade;
- 创建从表后,新建外键字段,添加外键约束,并添加外键的级联操作
alter table 表名 add 外键字段 字段类型, add [constraint 外键名] foreign key(外键字段) references 主表(主表的主键字段) on delete cascade on update cascade;
一对一
例如:人和身份证、公司与注册地址、汽车与车牌号
一对多(多对一)
例如:部门和员工、商品和分类
多对多
例如:学生和课程、商品和订单
一对一
在任意一方添加外键指向另一方的主键,外键要保证唯一
一对多
在多的一方添加外键指向一的一方的主键
多对多
需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为中间表的外键,分别指向两张主表的主键。为了保证中间表不会出现重复值,需要将这两个外键字段形成联合主键。
create table tb_user_hobby( uid int, hid int, primary key(uid,hid), /* 联合主键 */ foreign key(uid) references user(uid), foreign key(hid) references hobby(hid) );
语法:
select 字段列表 from 表1, 表2;
交叉查询的结果是笛卡尔积,是多张表所有记录的组成情况
我们需要使用条件来去除无效的数据
在交叉查询的基础上使用 where 条件 去除无效的数据
语法:
- 隐式内连接
select 字段列表 from 表1, 表2 where 条件;
- 显式内连接
select 字段列表 from 表1 inner join 表2 on/where 条件;
注:inner 可以省略
内连接查询的结果是两表的交集
语法:
- 左外连接
select 字段列表 from 表1 left outer join 表2 on 条件;
- 右外连接
select 字段列表 from 表1 right outer join 表2 on 条件;
注:outer 可以省略
左外连接查询的结果是左表的全部和两表的交集
右外连接查询的结果是右表的全部和两表的交集
概念:将一条查询语句的结果作为另一条查询语句的表、记录、字段、条件