数据库相关概念:
- 数据库是:
存储数据的仓库,数据是有组织的进行存储; 英文:DataBase,简称 DB
保存数据的仓库;保存数据的形式,需要程序员自己制定保存的数据格式;
优势是:将来可以通过sql语句,对存储的数据,进行增删改查(CRUD)的操作;
MySql 是:一款数据管理系统的软件(程序) ;可以管理数据库
- 数据库管理系统:
管理数据库的大型软件; 英文:DataBase Management System,简称 DBMS
- SQL:
是:结构化化查询语言,可以相当于普通话,可以用sql语句操作不同类型的关系型
操作关系型数据库的编程语言 ,定义操作所有关系型数据库的统一标准
英文:Structured Query Language,简称 SQL,结构化查询语言
- 常见的关系型数据库管理系统:
Oracle:收费的大型数据库,Oracle 公司的产品
MySQL: 开源免费的中小型数据库。后来 Sun公司收购了 MySQL,而 Sun 公司又被 Oracle 收购 SQL Server:MicroSoft 公司收费的中型的数据库。C#、.net 等语 言常使用
PostgreSQL:开源免费中小型的数据库
DB2:IBM 公司的大型收费数据库产品
SQLite:嵌入式的微型数据库。如:作为 Android 内置数据库
使用idea连接数据库管理系统
idea连接mysql
在idea的左上角位置找到如下图的 "database"按钮;
SQL的 通用语法:
注释:--单行注释,/**/多行注释;
每一行代码使用分号结束;
单词不区分大小写(建议关键词大写);
单引号或者双引号均可以当成字符串使用;
SQL分类(了解):
DDL(data Definition Language):数据定义语言,用来定义数据库对象:数据库,表,列等
DDL简单理解就是用来操作数据库,表等
手动创建一个库:
手动创建一个表:
![]()
DML(Data Manipulation Language):数据库操作语言,用来对数据库中表的数据进行增删改---重点
简单理解:是对表中数据进行增删改
DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录(数据) ---重点
简单理解就是:对数据进行查询操作的,从数据库表中查询到我们想要的数据
DCL(Data Control Language):数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户 ---重点
简单理解就是:对数据库进行权限控制。比如我让某一个数据库表只能让某一个用户进行操作等
DDL:重点练习
操作数据库:
1.展示:SHOW DATABASES ----展示所有的数据库
2.创建:CREATE DATABASE t1(比如t1库) ---直接创建一个t1库
CREATE DATABASE IF NOT EXISTS t1 ---如果不存在指定的库再创建
3.删除:DROP DATABASE t2 ---删除库t2
DROP DATABASE IF EXISTS t2 ---如果存在就删(t2不存在运行成功)
DROP DATABASE IF EXISTS t1 ---如果存在就删(t1存在删除成功)
4.选择:USE day08 ---选择要使用的库
5.查看:SELECT DATABASE(); ---查看正在使用的库
操作数据表:
操作表就是:对表进行增(Create) 删(Retrieve) 改(Update) 查(Delete)
1.查看:SHOW TABLES; ---查看库中所有的表 (选择使用的库后,再选择要查看的表)
DESC 表名称tes01; ---查看表结构
2.创建:CREATE TABALE test02( --- 创建表
id int 非空(not null ) 唯一(unique) 自动增长(out_increment), --- 修饰符可以加那么多
字段名1(id) 数据类型1(int),
字段名2(age) 数据类型2(int),
字段名3(pname) 数据类型3(varchar(20)),
指定主键primary 数据类型key(id)
...
字段名n 数据类型n,
); --- 创建表
3.数据类型:
数值:tinyint:小整数类型,占一个字节
int:大整数类型,占四个字节
eg:age int
double:浮点类型 --判断一个数据类型需不需要小数 需要的话就用double
使用格式:字段名double(总长度,小数点后保留的位数)
eg:score double(5,2) --5:总长度是5 --2:小数点后最多2位
在数据类型中一共需要指定长度有两个类型:char或者varchar double
日期:
date:日期值,只包含年月日
eg:birthday DATE;
datetime:混合日期和时间值,包含年月日时分秒
字符串:
char:定长字符串
优点:存储性能高
缺点:浪费空间
eg:name char(10)如果存储的数据不足10个,会占用10个的空间
varchar:变长字符串
优点:节约空间
缺点:存储性能低
eg:name(10)如果存储的数据字符不足10个,那就数据字符个数是极就占 几个的空间
案例:
4.删除:DROP TABLE 表名test02; --- 删除表
DROP TABLE IF EXISTS 表名test02 --- 如果存在则删除
DML语句 重点:
是什么?:是专门对表中的数据进行增删改操作的语句
DML增:INSERT INTO test01 VALUES(1,'迪丽热巴');---给test01表中添加数据
USE day08; ---前提选用day08库
批量增:INSERT INTO test01 VALUES(2,'马尔扎哈'),(3,'张三'),(4,'李四');---给所有列批量添加数据
指定增:INSERT INTO test01(id) VALUES(6) ---给指定的列添加数据,没有指定的列都是默认值
select *from test01;
DML修:UPDATE 表名test01 SET 列名1=值1,列名2=值2,[WHERE 条件];
where条件如果不增加会导致数据库中所有的数据通通发生改变
--- 修改数据:UPDATE test01 SET sex = '男' where id = 1;
UPDATE test01 SET sex= '男' WHERE id = 3 or id = 4;
UPDATE test01 SET sex= '女' WHERE id IN(1,4);
---与null比较的时候不能用=号,只能用is null或者is not null
UPDATE test01 SET sex= '男' WHERE name = null;
UPDATE test01 SET sex= '男' WHERE name IS NULL;is null :意思等于null
UPDATE test01 SET sex= '男' WHERE name IS NOT NULL;is not null :意思不等于null
![]()
加法:UPDATE test01 SET age = age+2 WHERE name = '马尔扎哈'
DML删:DELETE FROM test01 WHERE name IS NULL;--- 删除数据
DQL查询语句 重要-3星:
SFGHOL :S:SELECT, F:FROM, W:WEHERE, G:GROUP BY, H:HAVING, O:ORDER BY, L:LIMIT
字段列表 表名列表 条件列表 分组字段 分组后条件 排序字段 分页限定
字段列表 表名列表
1查:SELECT * FROM stu;--- 查询所有数据
SELECT DISTINCT address FROM stu ---查询表中所有的数据
去重 :只能对一列去重 除非两个列的数据一样的 可以去重出来数据
起别名:SELECT address AS 地址哈 FROM stu; ---使用as起别名,as可以省略不写
字段列表 表名列表 条件列表
2条件:SELECT 字段列表 FROM 表名 WHERE 条件列表 ---条件列表可以使用以下运算符
--- 查询年龄大于等于20岁 并且 小与等于38岁的 学生信息
SELECT * FROM stu WHERE age >= 20 AND <= 38;
或:SELECT * FROM stu WHERE age BETWEEN 20 AND 38;
---查询入学日期在'1998-09-01' 到 '1999-09-01' 之间的学员信息
SELECT* FROM stu WHERE hire_date BETWEEN '1998-09-01' AND '1999-09-01';
---查询年龄不等于18岁的学员信息
SELECT * FROM stu WHERE age != 18;
SELECT * FROM stu WHERE age <> 18;---查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
SELECT * FROM stu WHERE age = 18 OR age = 20 OR age = 22;
SELECT * FROM stu WHERE age IN (18,20 ,22);
---查询英语成绩为 null的学员信息;
null值的比较不能使用 = 或者 != 。需要使用 is 或者 is not
SELECT * FROM stu WHERE english = null; -- 这个语句是不行的
SELECT * FROM stu WHERE english IS NULL;
SELECT * FROM stu WHERE english IS NOT NULL;
3模糊:关键字 LIKE,可以使用通配符进行占位:_:代表单个任意 字符; %:代表任意 数字符
SELECT * FROM stu WHERE name LIKE "马%";--查询姓'马'的学生信息
SELECT * FROM stu WHERE name LIKE "_花%"; --查询第二个字是'花'的学员信息
SELECT * FROM stu WHERE name LIKE "%德%"; --查询名字中包含'德'的学员信息
排续: 字段列表 表名列表 排序字段 ASC:升序排列(默认) SESC:降序排列
SELECT name,english,math FROM stu ORDER BY english DESC;
---按英语成绩降序排序排列查询信息
--按总成绩降序排列,如果总成绩一样,则按照英语成绩升序排列查询,不包含为null的同学
SELECT name,math+stu.english 总成绩,math,english FROM stu WHERE english
IS NOT NULL ORDER BY 总成绩 DESC,english;
聚合函数: SELECT 聚合函数名(列名) FROM 表; --- 将一列数据作为一个整体,进行纵向计算
SELECT avg(english) FROM stu; ---求平均分(聚合函数会自动忽略NUll值)
SELECT count(*) FROM stu;---求总数量
...如下表操作 一样不再一 一操作 下表为:聚合函数的分类
![]()
分组查询重点: SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];
字段列表 表名列表 分组字段
SELECT name ,max(english) FROM stu GROUP BY sex; --以性别分组查询分组后每个分组中学生的英语最高分
SELECT name sex ,avg(math) FROM stu GROUP BY sex; --以性别分组查询分组后每个组中学生的数学平均成绩
SELECT sex,avg(math) FROM stu WHERE math>=60 GROUP BY sex;
以性别分组查询分组后每个组中学生的数学平均成绩,不及格的学生不参与
SELECT sex ,count(*) FROM stu WHERE math >= 60 GROUP BY sex; --求男女生各自数学成绩及格分的人数 --求男女生各自数学成绩及格分的人数,且按照人数降序排序
SELECT sex,count(*) c FROM WHERE math >= 60 GROUP BY c DESC;
-- 求男女生各自数学成绩及格分数的人数大于3个人的组,且按照人数降序排列 HAVING 分组后条件
SELECT sex,count(*) c FROM stu WHERE math >= 60 GROUP BY sex having c > 3 ORDER BY c DESC where和having区别:
执行时机不一样:where是分组之前进行限定,不满足where条件,则不参与分组,
而having是分组之后对结果进行过滤。
可判断的条件不一样:where不能对聚合函数进行判断,having可以。
分页查询:
计算公式:起始索引(跳过的条数)= (当前页码-1)* 每页显示的条数
第一个4= 2-1*1=4;第二个4:就是每页显示的条数
SELECT * FROM stu LIMIT 4,4 --每页查询4条,查询第2页
SELECT * FROM stu LIMIT 4,2 -- 每页查询2条,查询第3页
1约束 重要-1星:
约束是:相当于java中的修饰符,可以在创建表的时候对数据进行各种“限制”;
分类:主键约束 primaryKey 唯一约束 unique 非空约束 not null 自增约束 auto_increment
默认值约束 default 检查约束 check(mysql不支持) 外键约束 forign key
主键:1张表中最多只能有1个主键,但是这个主键可以由多个列共同担当(联合主键);
其作用就是:用于区分表中的每一条数据记录的;
演示联合主键 :create table abc(
a int not null ,
b int not null ,
c int,
primary key (a,b) -- a和b联合在一起充当主键
);演示主键自增:
create table bbc(
a int not null unique auto_increment primary key ,
b int not null ,
c int);
insert into bbc values (0,2,6);
insert into bbc values (null,5,9);
insert into bbc values (6,6,6);外键:用于维系两张表之间的关系的,外键一般都设计在多的一方,指向主表的主键,
将来给从表(多的一方)添加数据的时候,外键列的值必须和主表(1的1方)的主键值一致,
否则添加失败,
将来给主表删除数据的时候,必须保证从表中没有数据与这个数据想关联,否则删除失败!
其作用:就是维护数据的安全性和完整性!
演示外键:
外键约束 :
关键字是:FOREIGN KEY
外键用来让两个表的数据之间建立连接,保证数据的一致性和完整性。
创建表时添加外键约束 创建一个员工表
CREATE TABLE emp(
eid int not null unique primary key auto_increment,
ename varchar(32),
dept_id varchar(20), [约束] [外键名称] (外键列名) [参照] (主表列名)
CONSTRAINT emp_dept_fk_haha FOREIGN KEY(dept_id) REFERENCES dept(did)
);创建部门表dept
CREATE TABLE dept(
did varchar(20) not null unique primary key,
dname varchar(32)
); alter table drop foreign key删除外键:ALTER TABLE emp DROP FOREIGN KEY emp_dept_fk_haha;
2 数据库设计(表关系很重要-2级):
一、数据库设计简介:
软件的研发步骤 :
数据库设计概念 :1.数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,
为这个业务系统构造出最优的数据存储模型。
2.建立数据库中的==表结构==以及==表与表之间的关联关系==的过程。
3.有哪些表?表里有哪些字段?表和表之间有什么关系?
数据库设计的步骤:
1. 需求分析(数据是什么? 数据具有哪些属性? 数据与属性的特点是什么)
2.逻辑分析(通过ER图对数据库进行逻辑建模,
不需要考虑我们所选用的数据库管理系统)
3.如右图就是ER(Entity/Relation)图:
4.物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
5.维护设计(1.对新的需求进行建表;2.表优化)
表关系:
一对一:
如:用户 和 用户详情
一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,
用于提升查询性能
上图左边是用户的详细信息,而我们真正在展示用户信息时最长用的则是上图右边红框所示,
所以我们会将详细信息查分成两周那个表。
实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)
案例:
用户表
举例:
![]()
而在真正使用过程中发现 id、photo、nickname、age、gender 字段比较常用,
此时就可以将这张表查分成两张表。
![]()
建表语句如下:
一对多:
如:部门 和 员工
一个部门对应多个员工,一个员工对应一个部门。如下图:
实现方式:在多的一方建立外键,指向一的一方的主键
案例:
员工表
和部门表
举例:经过分析发现,员工表属于多的一方,而部门表属于一的一方,
(一个员工只有一个部门,而一个部门则有多个员工)
此时我们会在员工表中添加一列(dep_id),指向于部门表的主键(id):
建表语句如下:
![]()
多对多:
如:商品 和 订单
一个商品对应多个订单,一个订单包含多个商品。如下图:
实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
案例:
订单表
和商品表
举例:
经过分析发现,订单表和商品表都属于多的一方,此时需要创建一个中间表,
(一个商品可以产生多个订单,一个订单可以包含多个商品)
在中间表中添加订单表的外键和商品表的外键指向两张表的主键:
![]()
![]()
多表查询 (重要-3星):
多表查询是:多张表的数据 ,关联起来查询;
直接查询多表的现象(笛卡尔积):如果这样查询:SELECT * FROM emp,dept
虽然语法正确,但是不能这么查询,因为这样会产生错误的组合数据
这个不是我们想要的结果;
一、笛卡尔积:
应该使用多表查询的语法查询 ,内连接 外连接 子查询
内连接:
隐式内连接:只查询有关联的数据
显示内连接(了解):
左外连接:
![]()
![]()
右外连接:
子查询:
事务(概念重要-1星):
概述:
数据库的事务(Transaction)是:一种机制、一个操作序列,包含了一组数据库操作命令。
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,
即这一组数据库命令,要么同时成功,要么同时失败
事务是:一个不可分割的工作逻辑单元
事务就是:人为规定的一个逻辑整体,可以包含多个数据库操作的动作;
这样做可以保证我们的这个逻辑整体中的所有操作,要么全部成功,要么全部失败,不允许出现一部分成功
语法:
开启事务:START TRANSACTION;或者BEGIN
提交事务:COMMIt;
回滚事务:ROLLBACK;
代码验证:
环境准备:
事务的四大特征:
原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态
隔离性(Isolation) :多个事务之间,操作的可见性
持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
二 MySQL 数据库
- MySQL 安装
- MySQL 卸载
- MySQL 配置
- MySQL 登陆、退出
- MySQL 数据模型
安装:
安装环境:Win10 64位 软件版本:MySQL 5.7.24 解压版
一、下载
点开下面的链接: MySQL :: Download MySQL Community Server (Archived Versions)
选择选择和自己系统位数相对应的版本点击右边的Download
,此时会进到另一个页面,同样在接近页面底部的地方找到如下图所示的位置:
不用理会上面的登录和注册按钮,直接点击No thanks, just start my download.
就可以下载。
二、安装(解压)
下载完成后我们得到的是一个压缩包,将其解压,我们就可以得到MySQL 5.7.24的软件本体了(就是一个文件夹),我们可以把它放在你想安装的位置。
三、配置
1. 添加环境变量
环境变量里面有很多选项,这里我们只用到
Path
这个参数。为什么在初始化的开始要添加环境变量呢? 在黑框(即CMD)中输入一个可执行程序的名字,Windows会先在环境变量中的Path
所指的路径中寻找一遍,如果找到了就直接执行,没找到就在当前工作目录找,如果还没找到,就报错。我们添加环境变量的目的就是能够在任意一个黑框直接调用MySQL中的相关程序而不用总是修改工作目录,大大简化了操作。
右键此电脑
→属性
,点击高级系统设置
点击环境变量
在系统变量
中新建MYSQL_HOME
在
系统变量
中找到并双击Path
点击新建
最后点击确定。
如何验证是否添加成功?
右键开始菜单(就是屏幕左下角),选择命令提示符(管理员)
,打开黑框,敲入mysql
,回车。 如果提示Can't connect to MySQL server on 'localhost'
则证明添加成功; 如果提示mysql不是内部或外部命令,也不是可运行的程序或批处理文件
则表示添加添加失败,请重新检查步骤并重试。
2. 新建配置文件
新建一个文本文件,内容如下:
[mysql] default-character-set=utf8 [mysqld] character-set-server=utf8 default-storage-engine=INNODB sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
把上面的文本文件另存为,在保存类型里选所有文件 (*.*)
,文件名叫my.ini
,存放的路径为MySQL的根目录
(例如我的是D:\software\mysql-5.7.24-winx64
,根据自己的MySQL目录位置修改)。
上面代码意思就是配置数据库的默认编码集为utf-8和默认存储引擎为INNODB。
3. 初始化MySQL
在刚才的黑框中敲入mysqld --initialize-insecure
,回车,稍微等待一会,如果出现没有出现报错信息(如下图)则证明data目录初始化没有问题,此时再查看MySQL目录下已经有data目录生成。
mysqld --initialize-insecure
tips:如果出现如下错误
是由于权限不足导致的,去C:\Windows\System32
下以管理员方式运行 cmd.exe
4. 注册MySQL服务
在黑框里敲入mysqld -install
,回车。
mysqld -install
现在你的计算机上已经安装好了MySQL服务了。
MySQL服务器
5. 启动MySQL服务
在黑框里敲入net start mysql
,回车。
net start mysql // 启动mysql服务 net stop mysql // 停止mysql服务
6. 修改默认账户密码
在黑框里敲入mysqladmin -u root password 1234
,这里的1234
就是指默认管理员(即root账户)的密码,可以自行修改成你喜欢的。
mysqladmin -u root password 1234
至此,MySQL 5.7 解压版安装完毕!
四、登录MySQL
右键开始菜单,选择命令提示符
,打开黑框。 在黑框中输入,mysql -uroot -p1234
,回车,出现下图且左下角为mysql>
,则登录成功。
mysql -uroot -p1234
到这里你就可以开始你的MySQL之旅了!
退出mysql:
exit quit
登陆参数:
mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)
五、卸载MySQL
如果你想卸载MySQL,也很简单。
右键开始菜单,选择命令提示符(管理员)
,打开黑框。
-
敲入
net stop mysql
,回车。
net stop mysql
-
再敲入
mysqld -remove mysql
,回车。
mysqld -remove mysql
-
最后删除MySQL目录及相关的环境变量。
至此,MySQL卸载完成!
MySQL目录结构
MySQL数据模型
关系型数据库
关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的 二维表 组成的数据库
优点
都是使用表结构,格式一致,易于维护。
使用通用的 SQL 语言操作,使用方便,可用于复杂查询。
数据存储在磁盘中,安全。