MySQL数据库从0到1学习笔记(已完结)

1、  数据库:DataBase,简称DB ,按照一定格式存储数据的一些文件的组合。也就是存储数据的仓库。

  数据库管理系统:DataBaseManagement  ,简称DBMS。这个就是专门用来管理数据库的,可以对数据库里面的数据进行增删改查等。常见的有:MySQL,MS 、SQL sever、Oracle等数据库管理系统。

  SQL:这是一种结构化查询语言,程序员需要编写SQL语句,然后通过数据库管理系统来执行SQL语句。从而实现对数据库数据的管理。

  三者之间的关系:人写SQL语句,数据库管理系统(DBMS)来执行SQL语句,从而操作数据库(DB)数据。

SQL基本是通用的数据库结构化查询语言,大部分的数据库管理系统(DBMS)都是大同小异,都是用相同SQL语句来操作数据库。

2、MySQL数据库的安装:

点击安装包(安装的位置c盘下的Program File(X86)文件下有一个MySQL的文件夹里面)——>一路下一步、一顿下一步———>到端口号的时候默认是3306(不用改)————>之后来到字符集(重要),选最下面图像里带有问号的(一定要选择这个),然后在下拉菜单里面选择utf8字符集就可以了————>再一路下一步————>选择加入path环境变量————>来到超级管理员的密码(用户名不能改只能是root)————>然后一路下一步就完成了。

3、MySQL数据库的完美卸载:

第一步:双击MySQL的安装包,然后点击remove(第三个选项)即可。

第二步:删除MySQL的目录,位置在c盘下的Program File(x86)里面有一个MySQL的文件夹,然后删除他。

第三步:在c盘下有一个隐藏的目录,名字叫做programData,里面也有一个MySQL文件夹,删除他。然后就完美卸载完了。

4、服务的启动与停止:net stop 服务名/net start 服务名。

5、本地登录MySQL服务器:mysql  -uroot -p密码,隐藏密码登录:mysql -uroot -p即可。

6、数据库里面最基本的单元是表:table ,有行有列,数据库是以表的形式存储数据的,行:row(叫做记录),列:column(叫做字段)。

7、SQL语句不区分大小写。

8、简单的基本数据库操作命令:

查看MySQL里面有哪些数据库:show databases;

使用某个数据库:use 数据库的名字;

创建一个数据库:create database 数据库名字;//创建了一个数据库

查看数据库的表:show tables;

查看表里面的数据:select * from 表名;//表示查询该表的所有数据。*:表示查询所有的字段,即所有的列。但是有一个缺点:就是在查询的时候,MySQL要先将*转换为所有的列名在进行查询,所以就会降低查询的速度(效率降低),所以一般在较大的数据库一般不用*,而是将列名逐个写上。

不看表的数据,只看表的结构:desc 表名;查询该表的结构。

 

9、SQL语句的分类(有很多sql语句,将其分类有助于学习):

DQL:数据的查询语言(凡是带有select关键字的都是查询语言)。select。针对表里面的数据

DML:数据操作语言(凡是对表中的数据进行增删改的都是数据操作语言)。insert(增),delete(删),update(改)。:对表里面的数据进行操作。针对表里面的额数据

DDL:数据定义语言(凡是带有create(增),drop(删),alter(改的都是DDL))。:不针对表里面的数据,而是针对表的操作,主要操作表的结构。

TCL:事物控制语言(包括事物提交:commit,事物回滚:rollback)。

DCL:数据的控制语言(比如授权:grant,撤权:revoke。等等)。

10、导入数据到数据库里面:source  文件的路径。注意:路径不能有中文出现。

——————————————SQL语句————————————————

11、简单查询语句:

select  字段名  from  表名;//查询某一个字段,查询多个字段名名时,字段名之间要用逗号隔开。

给查询的列起别名:用as关键字:select  列名 as 别名 form 表名。:查询出来显示的是别名的列名,但是原数据库里面的列名不会改变(不会修改源数据库的列名)。特别:器别名的时候,as关键字可以省去,用空格代替。当别名有特殊的字符的时候,需要用引号括起来。(一般用单引号,双引号在Oracle不可用)

在查询的时候,可以在列名上进行运算:也就是字段(列名可以进行数学表达式计算在进行查询输出)。比如在教师表中查询教师的年薪:select  月薪 * 12  as  ”年薪“  from  教师表;

12、条件查询:

就是不是将表中的全部数据查询出来,而是将符合条件的数据查询出来。

一般条件有:>,>=,<,<=,!=,<>(也是不等于),between...and...(在这个范围的),>=and<=(等同于between...and....),is null,is not  null, and(同时满足两个条件),or(满足其中一个条件即可), in(包含的意思,相当于多个or),not  in(不包含)。like(模糊查询,%表示任意多个字符,_表示任意一个字符)

特别注意:null不能用等号来衡量,也就是不能=null,这是错误的写法;而是用is来衡量。is null ,因为null不是一个值,而是表示什么也没有。而0表示有值,只是值为0,null表示啥也没有。and和or同时出现,and的优先级比or高,所以当有and,or时一般要加括号。in的用法:相当于多个or;where  in  (列名1,列名2)。

select  字段1,字段2,字段3,...  from  表明  where  条件;//就是查询符合该条件的数据,比如:查询工资大于5000的员工:

select  *  from  员工表  where  工资>=5000;

select  *  from  员工表  where  工资 =0;//表示查出工资为零,即没有工资的员工

select  *  from  员工表  where  工资 is null;//表示查出工资为空的员工

select  *  from  员工表  where  工资 between   2000 and  5000;

select  *  from  员工表  where  工资=2000 and 奖金=5000;//查出工资是两千并且奖金是五千的员工

select  *  from  员工表  where  工资=2000 or  工资=5000;//查出工资是两千或者工资是五千的员工

select  *  from  员工表  where  工资 in (2000,5000);//查出工资是两千或者工资是五千的员工

select  *  from  员工表  where  名字  like  ‘%L%’;表示查出所有名字里含有L的员工

select  *  from  员工表  where  名字  like   ‘%L’;//表示查出所有名字以L结尾的员工

select  *  from  员工表  where  名字  like   ‘L%’;//表示查出所有名字以L开头的员工

select  *  from  员工表  where       名字  like   ‘_L’;//查出所有名字的第二个字母是L的员工

select  *  from  员工表  where       名字  like   ‘%\_%’;//查出所有名字中含有_的员工

13、排列:

order by:也就是将查询出来的表进行排序。默认是升序。

select  *  from  表名  where  order  by   工资;//表示查询的结果按工资进行排序(升序)

select  *  from  表名  where  order  by   工资  desc;//表示查询的结果按工资进行排序(降序):在后面加一个desc表示将查询结果是降序。

多字段排序:就是当第一个字段一样时,那就会按照第二个字段进行排序。如下:

select  *  from  表名  where  order  by   工资  ,奖金  desc;//按工资进行升序,当工资一样时,再按奖金进行降序。就是越往后优先级越低,就是当前一样时才按后面的进行排序。

14、数据处理函数:

分为单行处理函数和多行处理函数,单行处理函数就是一个输入对应一个输出,也就是对数据行的操作,处理完一行之后再接着去处理下一行,如:将某一个字段的所有大写字母全部转换为小写字母,他就会一行一行的转换,转换完一行就会接着去转换下一行。多行处理函数就是多个输入对应一个输出,对列进行操作,就是一次性把整个列的数据处理了,比如:求某一字段的和或者求某一字段的平均数等等。

常见的单行处理函数:lower()、upper()、length()、trim()去空格、substr()取字串。

使用例子:select  lower(列名)  from  表名;//表示表中的该列的所有的大写的字母全部转换成小写。

常见的多行处理函数(又叫聚合函数):就5个:count()、max()、min()、sum()、avg()。

例子:select  sum(列名)  from  表名;//表示计算该列的所有值的总和。特别说明count()函数,他表示计算列的行数,但是值计算不为NULL的列,一旦有NULL列将会忽略。

15、分组查询:

先将表进行分组再进行查询操作,关键字group  by。格式:select 列名 from 表名 where 查询的条件 group by 分组的条件 order by 排序的条件;//执行顺序:from、where、group by、select、order by。就是先找到表,再找出符合查询条件的数据,然后对数据进行分组,再选择出我们需要的列,最后再进行排序即可。

特别说明:where后面不能跟多行处理函数,也就是说要先进行分组才能使用多行处理函数;如何实在是要用条件过滤(也就是需要用到多行处理函数),那么就在group by后面加having进行条件过滤。having不能单独出现,只能跟group by 连起来使用。having 后面是可以跟多行处理函数的。格式:select  行  from  表名  where  条件  group by 列名(需要按那一列分组)  【如果还有条件过滤可以跟having  过滤的条件(可以为多行处理函数)】   order  by  升序或者降序;

去除重复记录的操作:关键字distinct,就是去除某一列里面具有重复性的数据。如:select   distinct  class   from   学生表。

16、连接查询(多表连接查询)关键字(  表名  join  表名  on   条件 ):

连接查询有内连接和外连接,内连接分为等值连接,非等值连接和自连接;外连接分为左外连接和右外连接。//连接查询的原理:将第一张表的每一个数据与第二张表的每一条数据进行匹配,满足条件的拿出来。比如第一张表有5个记录(5行数据),第二张表有3行记录,那么一共就需要进行15此匹配。这样的现象叫笛卡尔积现象。(如何我们不加条件,则会查询出15条数据,但是我们加了条件限制,就会按照满足条件的查询出来,但是系统依然会进行笛卡尔积的方式进行查询,也就是说查询的次数是不会减少的。)

内连接:就是查询两张表中符合条件的数据,只会查询出满足条件的的数据,按条件的不同分为等值与非等值两种方式(两张表没有主次之分)。如:等值查询:select 表1.列名,表2.列名 from 表1  join  表2 on   表1.某一个列名 = 表2.表2的某一个列名;join表示将两个表进行连接,而on 表示查询的条件  。 非等值查询就是将等值查询的等号改为不等号、大于、小于等其他的符号。还有一个自连接:自连接就是只有一张表,把他当作两张表来使用即可。

外连接   (关键字 left  right):(有主次表之分)就是在内连接的基础上,除了查询出满足条件的数据,还会查询出主表与次表不匹配的数据。也就是在查询的过程中,先将主表的所要查询的列全部查询出来,再顺便查询满足条件的次表中的数据。如:select 表1.列名,表2.列名 from 表1     left/right    join  表2 on   表1.某一个列名 = 表2.表2的某一个列名;也就是在join的左边有left,则表示join左边是主表,如果在join的左边是right,则表示join的右边是主表。外连接查询出在次表中没有的数据,所以查询出来后次表所在的位置上的数据就是NULL显示。在说一遍:内连接没有主次之分,只要满足条件的数据都会查询出来,外连接有主次之分,将主表查询的字段都查询出来,次表的数据只有符合条件的才会查询出来。( join连接两张表 on 后面跟条件  )。

17、

  子查询:就是再select语句中的select、from 、where后面嵌套select语句:如:

select  (select  列名  form  表名  where  条件) form   表名   where   条件;

select  列名  form   (select  列名  form  表名  where  条件)   where   条件;

select  列名  form   表名   where   (select  列名  form  表名  where  条件);

他的意思就是,将一张表查询出来作为另外一张表的 列、表、条件。再进行查询。当子查询再from后面的时候,我们可以把子查询的的结果看作是一张表,然后再对这张表进行查询。

注意:SQL语句的子查询是先进行子查询再进行外层的查询。

nuion(合并查询结果集):
再同一个表中查询一个字段中的多个值的时候,一般是再where后面添加两个条件,字段与字段用or连接的时候就能查询出一个字段中的多个值了。但是一般这样的情况我们使用union来进行查询,因为union的查询效率较高。
原始的sql:select  列名    from  表名       where       列名1=‘条件1’ or  列名1=‘条件2’;//查询出该列下满足条件1或者条件2的数据。
union版的:select  列名    from  表名       where       列名1=‘条件1’    union   select  列名    from  表名       where      列名1=‘条件2’;//与上面是一样的效果,但是查询的效率比上面快。

但是使用union是有条件的:也就是当union合并两个查询的结果集的时候,要求连个结果集的类型、数量是一样的。//也就是说不能多一列少一列。

limit(分页显示):就是将查询的结果集进行分页显示(只显示一部分):

用法:limit    开始的下标位置, 长度(步长);//   或者是   limit    长度(步长);//去掉开始的下标表示默认从开头显示。

如:limit   0   ,3;就等于limit  3; //表示从开头开始每次取3个数据。

       limit    2,3  ;表示从下标为2的地方开始,每次取3个数据。 // 表示取3个数据,3、4、5。

完整格式:select 列名 from 表名 where 条件 order  by   排序    limit    下标,步长;// 也就是最后才进行分页

每一页显示的数据的条数:这个是有规律的,limit (页码-1)*长度 ,长度;//套路公式固定写法。

18、

对表进行操作(DDL语句):

建表:create  table   表名  (

    字段1 数据类型 约束,

    字段2 数据类型 约束);

删表:drop table 表名;//删除一张表

插入数据:insert  into   表名  (字段1,字段2)values  (值1,值2);

修改表中的数据:update  表名  set   字段1 =值1,字段2=值2    where    条件;// 注意:当没有条件时,会修改整张表字段的所有值。

删除表中的数据:delete  from   表名   where   条件  ;//如果没有条件就会清空整张表。

数据类型:int、char、varchar、date、timedate等类型。

char与varchar的区别:char是静态分配空间,就是每次都是给一个固定的空间大小,而varchar是动态分配空间:比如你给某字段分配了10个字符长度的空间,char就会每次都会给分配10个字符长度的空间,而varchar就会先检测你输入数据的大小,然后动态的给你分配空间。注意:不过是char还是varchar都不能超出所分配的空间大小。//说明一下,虽然varchar会动态给数据分配空间,但是他的没有char执行的效率高。

快速的创建一张表(也就是复制一张表):create  表名   as   select  * from   表名 ;//原理就是将一张表所有的内容查出来然后将查询的结果用来创建一张表。可以快速的复制一张表。当然可以跟where条件。

将查询结果插入到表中:insert  into   表名   select   字段   from   已存在的表名;

快速的删除一张表(两种方式):1、delete  from  表名;//效率较慢,但是删除的数据可以回滚(恢复)  。2、truncate   from   表名  ;//效率很快,但是删除的数据不可以恢复。

19、

约束(constraint):就是在创建表的时候给字段加上约束,为了保证数据的完整性和有效性。

非空约束:not  null,给字段加上该约束就表示该字段就不能为空。

唯一性约束:unique  ,给字段加上该约束就表示该字段必须唯一,不能有重复。但是该字段可以为空。

主键约束:primary   key (PK),不能重复不能为空,是每一行数据的唯一标识符,并且每一张表都必须有主键,若表没有主键则该表无效。可以多字段为主键,一般不建议用。

外键约束:foreign   key  (FK),将一张表的某一列设为外键,那么表示这一列就关联到另外一张表的某一个字段。如:表1的列1是外键,关联的是表2的列2字段,那么列1的值只能是列2中的值。列2可以为空但是必须具有唯一性(unique)。

外键例子:create  table    表名(

字段1   数据类型    primary  key,

字段2   数据类型   not   null,

字段3  数据类型   unique ,

foreign  key   (字段2) reference   父表名(列名)//表示字段2为外键,关联父表的列名

)  

 

存储引擎:MySQL的术语,存储引擎就是存储一张表的方式。

查看表的存储引擎:show  table   表名;在建表的时候也可以指定存储引擎。

常见的存储引擎:MYISAM(用3个文件来存储表,格式、数据、索引三个文件,可以被压缩);InoDB(重量级存储引擎,MySQL默认存储引擎,支持数据库崩盘后自动恢复机制,非常安全);MEMORY(内存存储引擎,存在内存中,断电数据消失,优点就是查询速度快)。

20、

事务(transaction):一个事务就是一个完整的业务逻辑,完整的业务逻辑就是完整的完成一件事,只要这件事里面有任何一个步骤没有完成,则这件事就没有完成,表示该事务就没有完成。事务只跟DML(insert,update,delete)语句有关,也就是对表中的数据进行操作的时候才会有事务一说。比如当一个要完成一个事务需要多条DML语句来共同完成的时候,只要其中有一条DML语句没有完成,则该事务就没有完成。也就是要么同时成功要么同时失败,只要有一个失败就表示事务失败,全部成功则事务成功。

事务的特性:原子性(事务的每一个步骤必须对原子的不能在分割的)、一致性(要么同时成功要么同时失败)、隔离性(不被其他事务影响)、持久性(完成时写入磁盘)。

事务是如何做到同时成功或同时失败:在事务执行过程中会将每一条DML语句的操作都计入到一个叫“事务活动的日志文件“中。

提交事务(commit):表示事务成功完成和结束,同时将数据写入到磁盘中。清空“事务活动日志文件”。

回滚事务(rollback):表示事务失败和结束,将之前执行的DML语句全部撤销 。清空”事务活动日志“。

注意:在MySQL中是默认提交事务的,也就是我们执行一条DML语句的时候,系统就自动提交事务了;我们每一次回滚都只能回滚到上一次提交事务的时候。

关闭自动提交事务:start  transaction;//如何就可以使用rollback回滚事务了。

事务的隔离级别:

1、读未提交(读脏数据):就是事务A可以读到事务B还没有提交的数据。//级别最低,基本不用。

2、读已提交(不可重复度):事务A可以读到事务B已提交的数据(但是事务B还没有完成),如果事务B失败,那么将回滚事务,一开始提交的数据就会回滚到最开始的状态,这是事务A再去读取该数据就会发现两次读取的数据是不一致的。就会造成不可重复度现象。//级别第二,MySQL默认级别。

3、可重复读(幻读):事务A读取数据,无论其他事务如何更改数据,事务A都无法读取到更改后的数据,他只能读到开启事务之前的数据。这就可能读到的数据不是实时的数据(这种现象叫幻读)。//级别第三。

4、序列化/串行化:效率最低,也就是将所有的事物按先后顺序排队,不能并发执行,每一次读取到的数据都是真实的。//级别第四,级别最高,但效率最低。

21、

索引:

索引是为了提高查询效率的一种机制,在数据库表字段上添加索引,一张表的一个字段可以添加一个索引,多个字段也可以联合起来添加索引。如果我们不加索引,当我们取查询的时候,就会去字段里面一个一个进行匹配(全表扫描),效率低;如果我们添加了索引,就会根据索引去匹配(局部扫描),这样就会缩小范围,效率高。

注意:在任何的数据库中,主键都会自动的添加索引,在MySQL中unique字段也会自动添加主键。

索引结构:一般时一种B-tree的数据结构(二叉树),遵循左小右大的原则存放。索引的每一个结点都会携带他所存储数据的物理地址,当索引到该结点的时候,就直接去相应的物理地址获取取数据。

创建索引:create   index    给索引取的名字    on    表1(列1);//表示给表1的列1添加一个索引。

删除索引:drop   index    索引名  on    表1(列1);//表示将表1的列1上的索引删掉。

索引失效现象:1、以%或_开头的模糊查询(like   ’%A%');2、使用函数查询的时候也不能索引。等等还有很多。。。

22、

数据库的三范式:这玩意有啥用呢,其实就是教你如何设计数据库表的。就是理论上我们设计表的是时候要按照三范式来设计。这样设计的好处就是减少数据冗余和空间浪费。

第一范式:就是任何一张表必须有主键,每一个字段必须是原子性的(字段不可在分割)。//最重要,必须满足主键和原子性。

第二范式:在第一范式基础上,所有的非主键完全依赖与主键,不能产生部分依赖现象。//一张表里有多对多的现象就会产生部分依赖。当一张表中有多对多的现象时,那么就会有联合主键,则就会产生部分依赖,也就是一个字段依赖联合主键其中一个,另一个字段依赖联合主键的另一个(部分依赖现象)。

第三范式:在第二范式基础上,所有的非主键直接依赖与主键,不能产生传递依赖现象。//一张表里有一对多的现象就会产生传递依赖。当一张表中有一对多的现象时,那么就会有传递依赖。

表的设计秘籍:

当多对多的时候(第二范式部分依赖的现象,会有联合主键):多对多,三张表,关系表整两外键。

当一对多的时候(第三范式传递依赖的现象):一对多,两张表,多的表加外键。

一对一的时候(当字段很多很多数据很庞大的时候,这时可以将一张表进行拆分):一对一,外键唯一   或   共享主键。

注意:三范式只是理论上的,在实际的开发中有时候会有偏差,有时候会那冗余去换取速度。因为在拆分表查询数据的时候会进行表连接,由于笛卡尔积的现象就会造成效率低。不拆分表sql的语句难度也会降低,开发的难度也会降低。

23、

视图(view):就相当于站在不同的角度来看待数据,也就是给一个DQL(查询)语句起一个别名,然后后续就可以拿这个别名来操作表了。只能给DQL语句起别名(视图)。可以理解为引用。

创建视图:create  view  视图名  as  select  *  from  表名   ;

删除视图:drop  view 视图名;

此时我们对视图的增删改查实际就是对表的操作。当select语句不复杂简单的时候一般用不到。当select语句很长很长,并且还要很多次用到该语句的时候就可以添加视图。

视图的作用:简化sql语句的操作,便于后期的维护。

24.

DBA(数据库的管理人员)的常用命令:创建用户、授权、撤权等。重点时数据的导出和导入。

数据的导出:mysqldump   数据库名   >你要导出的路劲\文件名.sql     -uroot     -p密码;

数据的导入:创建数据库,使用数据库,然后导入:source   文件所在的路径;

 

数据库整完了~~~~~~~~~~~~~~~~~~~~~~刺激>_._<~~~~~~~~~~~~~~~~~~~~~~

 

posted @ 2022-02-25 18:50  Ant_blog  阅读(155)  评论(0编辑  收藏  举报