什么是数据库?
学数据库你要知道什么是数据库
数据库是数据的仓库。
与普通的“数据仓库”不同的是,数据库依据“数据结构”来组织数据,因为“数据结构”,所以我们看到的数据是比较“条理化”的(比如不会跟以前的普通文件存储式存储成一个文件那么不条理化,我们的数据库分成一个个库,分成一个个表,分成一条条记录,这些记录是多么分明)
也因为其“数据结构”式,所以有极高的查找速率(比如B-Tree查找法),(由于专精,可以根据自己的结构特性来快速查找,所以对于数据库的查找会比较快捷;不像普通文件系统的“查找”那么通用)
如果与EXCEL来比的话,能明显的看出数据库的好处,我们能给一个个“字段”添加“约束”(比如约束一列的值不能为空)
数据库与普通的文件系统的主要区别(起因):数据库能快速查找对应的数据
常说的XX数据库,其实实质上是XX数据库管理系统。数据库管理系统是一个软件,是数据库管理的程序实现。
为什么要使用数据库
因为使用io流文件存储数据有很多弊端:1、文件存储数据存储效率低;2、不管存还取操作比较麻烦3、一般只能保存小量字符串数据等。为了解决这些弊端,才有数据库的出现,使用数据库存储数据就可以很好的解决这些弊端。
什么是DB
DB的全称是data base,即数据库的意思。数据库实际上就是一个文件集合,是一个存储数据的仓库,本质就是一个文件系统,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查操作;
什么是DBMS
DBMS的全称是Database Management System,即数据库管理系统的意思,是一个软件,用来管 理数据库文件的软件,用户可以访问DBMS对数据进行增删改查操作,常见DBMS有: MySQL、oracle、DB2、sqlite、sqlserver等
数据库大体分为两类
1.关系型数据库
MySQL ,oracle ,SQLserver , DB2 , H2 …等等
2.非关系型数据库
Redis mongDB ealsitcserach …等等
语言结构
DML 用来操作数据库中所包含的数据 INSERT UODATE DELETE
DDL 用于创建和删除数据库对象的等操作 CREATE DROP ALTER 一般接触不到
DQL 用来对数据库中的数据进行查询 SELECT
DCL 用来控制数据库组建的存取许可,存取权限等 GRANT COMMIT ROLLBACK 一般接触不到
字段约束![在这里插入图片描述](https://img-blog.csdnimg.cn/20190927093940143.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDEzOTQwOA==,size_16,color_FFFFFF,t_70)
id字段 是某一条记录的唯一标识 ID字段在数据库中一般都作为主键来使用 A表中有B表的ID 那么A表的B表ID就叫外键
自动增长: 如果设置这个表的id主键为自动增长,那么我们就不需要给id值,数据库会帮我们自动的将id赋值, 并且是有顺序的
数据库分解
一个mysql服务 可以有N个数据库
一个数据库有N张表,每张表代表其不同的含义
一张表有N个字段, 每个字段都有其特定的描述
用java举个例子
User类 id / name/ age -----> 对应数据库 ----> User类就是一个表 id/name/age就是表中的字段
使用SQLYong/NativeCat创建表
1:表名必须小写 如果有多个单词 则用下划线进行拼接
2.我们每一个表都应该有一个id字段,用于表示这个表记录(每一条数据)的唯一性,并且这个id字段一般用于主键/非空/自增(前提: 必须是数值类型)
3.在一个表中,尽量设置一个主键 如果在一个表中,有多个主键,则称之为联合主键
4.字段中 数值类型和字符串类型必须给定长度 日期类型是没有长度的
5.给字段起名: 单词必须小写 多个单词用_拼接
6.表名和字段名称不能使用关键字
7.在mysql表中,每一行都叫一条记录
8.mysql中的注释: #
插入数据
增加语法
insert into 表名 (字段名1,字段名2,字段名3......) values (字段值1,字段值2,字段值3......);
练习:插入一个记录: id为1 ,name为张三 年龄为18
异常: Duplicate entry '1' for key 'PRIMARY' 主键冲突 : 主键的特性是唯一的,所有我们在增加同一个id值时,报错
Column count doesn't match value count at row 1 列值转换错误
insert into user (id,name,age,birthday) values (2,"李四",18,now());
我们没有设定id的值 但是依然有数据, 是因为我们给这个表的id设置了自增 ,机制: 寻找上一条记录的id 这条记录的id 为上一条记录的id值 + 1
INSERT INTO USER (NAME,age,birthday) VALUES ("王五",19,NOW());
省略 字段名称,直接插入数据值 报错: 如果我没有给定哪个字段进行增值, 那么就是默认为这个表的全字段
示例:
INSERT INTO USER VALUES ("王五",19,NOW());
INSERT INTO classes ( class_name ) VALUES ("1班"),("2班");
查询数据
查询语法:
select 字段 from 表名 [where 条件]
查询特定字段
select name from user
查询user表的所有记录
SELECT *
FROM USER
根据条件进行查询: 查询user表的数据 条件是 年龄是19岁的记录
如果有条件查询, 那么where这个关键字必须在from的后面, where的后面就是条件
SELECT *
FROM USER
WHERE age = 19
修改数据
修改语法 update 表名 set 字段 = 新值 where 条件
UPDATE USER SET NAME = "田七" WHERE NAME = '张三'
删除数据
删除语法
delete from 表名 where 条件
删除时如果没有条件则把当前的这个表的所有记录都删除了
delete from user
删除姓名为王五的数据
delete from user where name = '王五'
排序
排序: order by 字段 DESC代表降序(从第一条记录开始,根据排序的字段值越往下越小) ASC代表升序(从第一条记录开始, 根据排序的字段值越往下越大)
select * from user order by age DESC
分组
分组: group by 字段
根据年龄分组
select * from user group by age
练习: 根据age进行排序 降序 , 根据age进行分组
我们在写SQL语句时 必须先分组 后排序
SELECT * FROM USER GROUP BY age ORDER BY age DESC
分页
分页
limit 值1,值2 limit代表的是执行分页 值1代表的是从这个表当中的哪个下标开始 , 值2代表查询几条
SELECT * FROM USER LIMIT 3,2
函数
平均值函数
查询平均值
语法 select avg(字段名称) from 表名 字段名称:根据哪个字段来查询他的平均值
前提: 所查询的字段必须是数值类型
select avg(age) from user
记录函数
记录函数 count()
select count(字段名称) from 表名
查询user表有多少条记录
SELECT COUNT(id) FROM USER
最大值函数
最大值 select max(字段名称) from 表名
查询user表中年龄最大的
SELECT MAX(age) FROM USER
最小值函数
最小值 select min(字段) from 表名
查询user表中年龄最小的
SELECT MIN(age) FROM USER
求和函数
求和函数 select sum(字段名) from 表名
查询user表中年龄的总和
SELECT SUM(age) FROM USER
字符串函数
日期函数
数学函数
子查询
需求: 现有的数据是 user->id = 8 需求查询出8这条记录所在的班级名称
子查询 : 查询一张表 条件是另一张表的字段
select class_name from classes where id = (SELECT classes_id FROM USER WHERE id = 8 )
需求分析: 现有的数据是 user->id = 8 需求查询出8这条记录所在的班级名称
我们有的数据是: user->id = 8 那么我们能够通过这个8来查询到user所对应的记录
思考: 我们现在查询出了这条记录 想要什么? 拿到classes_id 所在的班级名称
SELECT classes_id FROM USER WHERE id = 8
我们现在有了班级的id,想查询班级的名称 是不是就可以根据id查询class_name呢?
SELECT classes_id FROM USER WHERE id = 8
SELECT * FROM classes WHERE id = ( SELECT classes_id FROM USER WHERE id = 6 ) # 实际上我们可以理解为:用学生的id来查询学生所在班级的记录
in查询
in查询 in 是在....里
需求: 在user表中 id有没有在1,2,3这些值中存在
SELECT * FROM USER WHERE id IN (1,2,5)