写在前面:本博客是根据动力节点课程所写的笔记,原视频链接:https://www.bilibili.com/video/BV1fx411X7BD?p=1
关于这篇博客,可能内容比较基础,很多细节的东西没讲到,后面我还会继续跟进这篇博客,做好修改。
目录
一、数据库简介
二、安装MySQL
三、DB、DBMS、SQL的关系
四、表
五、SQL语句的分类
六、导入初始化数据
七、查看表结构以及表中的数据
八、MySQL的常用命令
九、查询简介及简单查询
十、条件查询
十一、排序查询
十二、分组查询
十三、去重查询
十四、连接查询
十五、子查询
十六、联表查询
十七、分页查询
十八、表的创建
十九、插入数据
二十、修改数据
二十一、删除数据
二十二、修改表结构
二十三、约束
二十四、存储引擎
二十五、事务
二十六、索引
二十七、视图
二十八、数据库的导入导出
二十九、设计三范式
三十、作业题
一、数据库简介
在学习数据库之前,我们回忆一下在IO流中所学习的一个序列化流和反序列化流,可以向文件中存入对象,也可以从文件中取出对象,这无疑是存储和取出数据的一种形式。
我们学习数据库,也是为了操作数据,其包括对数据的增加、删除、修改、和查询,那你就会问了,既然二者功能相同,那为什么不能直接用序列化流呢?
那肯定是因为【数据库管理系统】来操作数据更加简单啊,只需要通过简单的sql语句就能完成对数据的操作,不需要向序列化流那样,需要创建对象啊,存入文件啊,关闭流啊等等麻烦的操作。
什么是数据库?
本质上是一个文件夹,先有个概念,往下文看你就知道了。
什么是数据库管理系统(DBMS)呢?
顾名思义,管理数据库的软件,常见的有MySQL(免费,供初学者学习的),Oracle(付费,性能比MySQL好很多,一般是公司中使用的),SQL Server(大学课程中都用这个DBMS来教学)。
二、安装MySQL
为了学习数据库,接下来,我们安装一个数据库管理系统MySQL。安装与配置,我都写在一篇博客里了,很详细,还有百度网盘链接,这里就不花篇幅写了
https://blog.csdn.net/weixin_43724203/article/details/108651956
三、DB、DBMS、SQL的关系
上文提到几个概念DB、DBMS、SQL,来总结一下,看看他们之间的关系。
DB(DataBase):本质是文件夹,用来存储数据
DBMS(DataBase Management System):数据库管理系统,用来管理数据库,也就是对数据库中的数据进行管理
SQL(Structure Query Language):结构化查询语言,DBMS使用SQL来管理DB。SQL是高级语言,计算机不能直接读懂,因此SQL在执行前,内部会先编译,这个编译过程由DBMS完成。
四、表【table】
数据库(文件夹)是不能直接存放数据的,需要有文件来存储,我们称数据库中的文件为表。
什么是表?看图。在数据库中,表和excel中设计的表基本一样,是二维表格。【一个表对应一个文件】
也就是说,表是数据库的基本组成单元,其数据以表格形式组织起来,可读性很强。
学习表,那么我们就要学习字段,以及对记录的操作方法。
首先我们来看【字段】。
每一个字段包括哪些属性呢?
字段名、字段类型、相关约束。
字段名就不需要解释了,根据我们的需要进行命名即可;
字段类型的话,从上表可以看出,对于姓名,“张三”和“李四”可以看成是字符串类型;对于年龄,“15”和“17”可以看成是整型。在数据库中,字符串类型用varchar表示(java中用String),整型用 int 表示(和java一样)。
相关约束就是,给字段加一些条件,该字段对应的数据,必须满足这些条件,数据才有效,否则会报错。比如姓名的约束是 not null ,那么当姓名为空的时候,就会报错。
五、SQL语句的分类
在我们认识了DB、DBMS、表这三个概念之后,还有一个没讲,就是SQL。作为操作数据的语言,SQL自然是很重要的知识点。这里,我们先看看它的分类。
对于其分类,先有个大概的认识。
DDL(Data Definition Language):数据库定义语言。主要关键字:create drop alter,对表的结构的增删改
DML(Data Manipulation Language):数据库操纵语言。主要关键字:insert delete update,对表的数据的增删改
DQL(Data Query Language)【最重点】:数据库查询语言。主要关键字:select,包含select的sql语句都是查询语句。
DCL(Data Control Language):数据库控制语言。主要关键字:grant授权、revoke撤销权限
TCL(Transaction Control Language):事务控制语言。主要关键字:commit提交事务,rollback回滚事务
这里的关键字,先知道就行,后面学习就会了。不过,关于五个分类,DDL、DML、DQL、DCL、TCL以及它们的作用,还是要记忆一下先。
六、导入初始化数据
学习完前面一些概念之后,我们先导入一些数据,方便我们后面的练习。
导入初始化数据,有以下几个步骤:
1)打开cmd窗口,登陆我们的MySQL
2)创建一个数据库,来存放我们的练习数据(语句看不懂没关系,先跟着敲)
create database if not exists bjpowernode;
使用数据库
use bjpowernode;
3)导入我们的数据:新建一个文件,命名为 bjpowernode.sql ,打开,将下面的代码复制粘贴进去。然后回到我们的 cmd 窗口,输入以下命令:source 路径\bjpowernode.sql;(注意,这里的“路径”中不能有中文)。这样,我们就把数据导入bjpowernode这个数据库中了。
【注意:下面的代码直接复制粘贴就行,经过后面的学习,就能够看懂了】
DROP TABLE IF EXISTS EMP;
DROP TABLE IF EXISTS DEPT;
DROP TABLE IF EXISTS SALGRADE;
CREATE TABLE DEPT
(DEPTNO INT(2) NOT NULL ,
DNAME VARCHAR(14) ,
LOC VARCHAR(13),
PRIMARY KEY (DEPTNO)
);
CREATE TABLE EMP
(EMPNO INT(4) NOT NULL ,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR INT(4),
HIREDATE DATE DEFAULT NULL,
SAL DOUBLE(7,2),
COMM DOUBLE(7,2),
PRIMARY KEY (EMPNO),
DEPTNO INT(2)
)
;
CREATE TABLE SALGRADE
( GRADE INT,
LOSAL INT,
HISAL INT );
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
1, '财务部', '北京');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
2, '研发部', '上海');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
3, '销售部', '深圳');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
4, '管理层', '广州');
COMMIT;
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1000, '张三', '文员', 1003, '1980-12-17'
, 800, NULL, 2);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1001, '李四', '销售员', 1005, '1981-02-20'
, 1600, 300, 3);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1002, '王五', '销售员', 1005, '1981-02-22'
, 1250, 500, 3);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1003, '赵六', '经理', 1008, '1981-04-02'
, 2975, NULL, 2);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1004, '刘备', '销售员', 1005, '1981-09-28'
, 1250, 1400, 3);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1005, '关羽', '经理', 1008, '1981-05-01'
, 2850, NULL, 3);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1006, '张飞', '经理', 1008, '1981-06-09'
, 2450, NULL, 1);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1007, '皮卡丘', '研发人员', 1003, '1987-04-19'
, 3000, NULL, 2);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1008, '小火龙', '董事长', NULL, '1981-11-17'
, 5000, NULL, 4);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1009, '妙蛙草', '销售员', 1005, '1981-09-08'
, 1500, 0, 3);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1010, '杰尼龟', '文员', 1006, '1987-05-23'
, 1100, NULL, 2);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1011, '钢铁侠', '文员', 1005, '1981-12-03'
, 950, NULL, 3);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1012, '蜘蛛侠', '研发人员', 1003, '1981-12-03'
, 3000, NULL, 2);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
1013, '永强', '文员', 1006, '1982-01-23'
, 1300, NULL, 1);
COMMIT;
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES (
1, 700, 1200);
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES (
2, 1201, 1400);
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES (
3, 1401, 2000);
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES (
4, 2001, 3000);
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES (
5, 3001, 9999);
COMMIT;
4)输入 show tables; 发现我们的bjpowernode这个数据库中多了几个表
【关于bjpowernode.sql这个文件】
在上面的操作中,我们已经向数据库导入了数据,且是通过bjpowernode.sql这个文件进行导入的。
那么,什么是sql脚本呢?
(以sql结尾的文件,我称为“sql脚本”。这种文件中,编写了大量的sql语句,通过source命令执行sql脚本,就是将这个脚本中的sql语句一一执行。)
七、查看表结构以及表中的数据
在操作表中的数据之前,先查一下表的结构,是有必要的。
我们先看看,bjpowernode这个数据库中,有哪些表
查看dept表的表结构
这里我先介绍一下,让大家能看懂上面的表
Field是字段名称,Type是字段类型,Null、Key、Default、Extra这些是字段约束。
字段类型中,int(2)、varvhar(14),后面的数字,表示宽度,但是,int和varchar二者的宽度,含义还不一样。
对于int(2),不是说你的数字大小只能是0~99,而是说,当你给字段deptno添加UNSIGNED ZEROFILL这个约束
时,如果你的值是1,那么会自动帮你补齐为 01。
对于varchar(14),是说在你的字符串中,无论是字母还是符号还是中文,都不能超过14和字符,一旦超过14个,
就会报错。
字段约束中,null空约束,yes时表示该字段可以为空,no时反之;key是主键约束;default是默认约束,也就是
对于该字段的默认值,这些约束在后面会细讲。
这里,我们把各个表的字段都介绍一下,顺便了解一下各个字段的含义,方便后面的理解和练习
dept表(部门表):deptno(部门编号)、dname(部门名称)、loc(部门位置)
emp表(员工表):empno(员工编号)、ename(员工姓名)、job(工作岗位)、mgr(上级领导编号)、hiredate(入职日期)、sal(月薪)、comm(津贴)、deptno(部门编号)
salgrade表(薪资等级表):grade(等级)、losal(最低薪资)、hisal(最高薪资)
接下来,查一下我们的表都有哪些数据,命令复制粘贴就行,后面会学
八、MySQL的常用命令
MySQL中有一些常用的命令,但是不难,一下子就记住了
select database