2022-关系型数据库——MySQL笔记

目录

一、数据库相关的定义

二、常用数据库命令:

10、在window操作系统中,怎么使用命令来启动和关闭MySQL服务?

数据库的基本单元是表(table)

三、关于SQL语句的分类

四、简单查询

五、条件查询

小知识点:

like 称 模糊查询,支持%或下划线匹配

六、排序

数据处理函数(单行处理函数):

七、分组查询****

八、连接查询

连接查询的分类 :

九、外连接

3、多表联查:

4、子查询

十. union合并查询结果集(将匹配次数从乘法变成加法)

十一、limit是将查询结果集的一部分取出来,通常使用在分页查询中

十二、DDL 语句

1、表的创建

关于MySQL的数据类型:

2.删除表

十三、DML语句

1.插入数据insert

1、 insert 插入日期

2、date和datetime类型的区分?

2、修改数据update(DML)

3、删除数据delete(DML)

十四、创建表的约束(Constraint) 为了保证表中数据的有效性

1、关于创建表的约束的小问题

什么时候使用表级约束呢?

主键特征:

十五、存储引擎(了解)

十六、事务(transaction内须掌握且精通的)

1、事务的基本概念

2、事务的4个特性

事务之间的隔度级别:

十七、索引(底层原理:B-Tree)

索引的实现原理:

什么时候添加索引:

4、索引的创建删除

索引失效:

1、select * from 表 where 字段 like ’%I‘;

2、使用or的时候会失效,如果使用or,那么要求两边的条件字段要索引,才会走索引。如果是一个有,一个没有, 那么另一个字段上的索引也不会实现。

3、使用复合索引时、没有使用左侧的列查,索引失效。

4、在where当中索引列参加运算,索引失效。

5、在where中索引列使用了函数。

十八、视图(View)

1、创建、删除视图对象:

2、用视图做什么?

3、视图在实际开发的作用?(方便、简化开发、利于维护)

4、DBA:

十九、数据库设计的三范式(面试经常问)

1、数据库设计范式:

注意事项★:


一、数据库相关的定义

        数据库(Database)按照一定格式存储数据的一些文件的组合。(存储数据的仓库实际上就是一堆文件。这些文件中存储了具有特定格式的数据)。

数据库管理系统(DBMS)是专门用来管理数据库中的数据,其可以对数据库中的数据进行增删改查。

SQL结构化查询语言 程序员通过写SQL语句,然后DBMS执行SQL语句,来实现数据库中的数据进行增删改查(SQL、Database、DBMS这三者之间的关系)

SQL、Database、DBMS这三者之间的关系:DBMS—(执行)—>SQL—(操作)—>DB

二、常用数据库命令:

1、查看MySQL版本号:select version();

2、查看当前使用的数据库:select database();

3、查看所有数据库:show databases;

4、使用某个数据库:use 数据库名;

5、创建数据库:create database 数据名;

6、退出数据库:exit

7、导入数据:source 数据所在路径(不要有中文)

8、查看表结构:desc 表名;

9、进入数据库:mysql -hlocalhost -uroot -p密码

10、在window操作系统中,怎么使用命令来启动和关闭MySQL服务?

                关闭语法:net stop 服务名称

                开启语法:net start 服务名称

数据库的基本单元是表(table)

        行(row)被称为数据/记录

        列(colum)被称为字段

三、关于SQL语句的分类

DQL:数据查询语言;凡是带有select都是数据查询语言

DML:数据操作语言;凡是对表中数据进行增删改的都是DML(insert、delete、update)

DDL:数据定义语言;凡是create、drop、alter的语句都是DDL

TCL:事务控制语言;事务提交commit、事务回滚rollback

DCL:数据控制语言;例如授权grant、撤销权限revoke...

四、简单查询

1、查询一个字段:select 字段名 from 表名;

2、查询两个或多个字段:select 字段1、字段2、...  from 表名;

                                       select * from 表名;(效率低,可读性差)

3、给查询的别名:select 字段名 as 别名 from 表名;(注:只在查询时显示别名,原表的字段名不变)

注意:在所有数据库中,字符串统一使用单引号括起来,单引号才是标准

          字段可直接在语句中进行加减乘除的运算

五、条件查询

什么是条件查询?不是将表中所有数据查询出来,而是查询出符合条件的。

语法格式:select 字段1,字段2,...

                from 表名

                where 条件;

注意:在数据库中,null不能使用等号进行衡量;需要用is null;因为null在DB中代表什么也没有,它不是一个值,所以不能使用等号衡量。

小知识点:

        and和or同时出现时,要注意优先级问题;and比or优先级高

        in相当于多个or同时出现:

                select * from 表 where sal in(800,1500);(其中()不是区间,只表示800 or 1500)                              select * from 表 where sal=800 or sal=1500;

        not是取反,多用于is not null、not in()

like 称 模糊查询,支持%或下划线匹配

          %匹配任意多个字符(%是一个特殊符号)

           下划线,一个下划线只匹配一个字符

select * from 表 where like ‘%O%’(包括O的)

select * from 表 where like ‘O%’(O开头的)

select * from 表 where like ‘%O’(O结尾的)

select * from 表 where like ‘_A’(第二个字母为A的)

六、排序

语法:select 字段1,...

          from 表名

          order by 可排序的字段名;(默认是升序)

指定降序:select 字段1,...  from 表名 order by 可排序的字段名  desc;

指定升序:select 字段1,...  from 表名 order by 可排序的字段名  asc;

可以两个或多个字段排序吗?可以;但是前一个是主导。

数据处理函数(单行处理函数):

        一般都是在select之后和from之前写并应用函数 。

特点:一个输入对应一个输出。

单行处理函数相对的是多行处理函数,其特点是多个输入对应一个输出。

lower(字段名)   转小写               upper(字段名)  转大写

substr(字段名/字符串,起始下标,截取长度) 注意:起始下标从1开始

concat(字符串1,字符串2)    进行字符串的拼接

length(字段)   取长度

trim()   去除字符串前后的空格

round(字段,0)  如果是0则保留整数位,-1保留到十位,1保留到一位小数位,-2保留百位,2保留两位小数

rand()   生成随机数

ifnull(数据,替换的值)可以将null转化成一个具体值,是空处理函数,专门处理空的。

        在数据库中只要有null参与的数字运算,最终结果都是null

分组函数(多处理函数)
分组函数在使用的时候必须先进行分组,然后才能使用。
如果你没有对数据进行分组,整张表默认为一组 。

count(字段)  计数            avg(字段)  平均值 

min(字段)   最小值            sum(字段)  求和

max(字段) 最大值  

分组函数需要注意哪些?

        1、分组函数自动忽略null,你不需要提前对null进行处理 

        2、count(*)和count(字段)的区别:

                count(*):统计表中的总行数(只要有一行数据count++)

                count(字段)统计该字段下所有不为null的元素的总数

        3、分组函数不能直接使用在where子句中

        4、所以的分组函数可以组合在一起使用

七、分组查询****

        1、语法:select  ...  from  ....  group by  ...

        结论:在一条select语句中,如果有group by语句的话,select后面只能跟参加分组的字段以及分组函数,其他一律不能跟。因为无意义且可能导致报错。

        2、使用having可以对分完组之后的数据进一步过滤,不能单独使用having,必须和group by联合使用,having不能代替where。
优化策略 where和heaving优先选择where,where实在完成不了再选择heaving。


去除重复记录:原表数据不会被修改,只是查询结果去重 。
        去重需要使用关键字 distinct(可用在分组函数中 )
        Distinct只能出现在select之后,以及所有字段的最前方。
        如果distinct是在两个或多个字段的前方,则表示两个或多个字段联合去重。

八、连接查询


从一张表中单独查询称为单表查询。

多张表联合查询成为连接查询 。


连接查询的分类 :

年代:SQL92、SQL99(重点学习)

表连接的分类:

        内连接:等值连接、非等值连接、自连接

        外连接:左外连接、右外连接 

        全连接 :两个或多个表都是主表 

        1、当两张表在没有任何条件限制的条件下,最终查询结果条数是两张表条数的乘积(笛卡尔积现象)
        2、避免笛卡尔积现象:连接时加条件,满足条件的被筛选出来,(查询次数还是在连接查询中,一定要注意效率问题,在查询两个表中的两个或多个字段时,字段前一定要加上表名(表名.字段名)
        注意:通过迪卡尔积现象知,表的连接次数越多效率越低,尽量避免表的连接次数 

SQL92语法:select ...  from  表1,表2  where 连接条件  and ...

SQL99语法:select ...  from  表1  join  表2 on  连接条件;

SQL92语法缺点:结构不清晰,表的连接条件和后期进一步筛选的条件都放在了where后面 

SQL99语法缺点:表连接的条件是独立的,连接之后若还需要进一步筛选,再往后添加where即可。

九、外连接

外连接中,表之间存在主次关系。

1、语法:select * from 表1 right join 表2 on 连接条件

2、right : 表示将join关键字右边的看作主表,主要是为了将这张表的数据全部查询出来,捎带关联查询左边的表。

3、多表联查:

语法: select ... from  表1 join 表2  on 连接条件  join 表3  on 连接条件  join 表4 on  连接条件;

4、子查询

sekct语句中嵌套select 语句,被嵌套select 语句 称子查询

语法:select .....(select).....from .....(select).....where......(select)

where 子查询:当有筛选条件中需要用分组函数时,则可以使用子查询来实现

from 子查询:注意: from后的子查询,可以将子查询结果当做一张临时表

selec子查询(了解即可)

十. union合并查询结果集(将匹配次数从乘法变成加法)

union的效率集更高些,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,但是union可以减少匹配的次数。在减少匹配的次数的情况下,还可以完成两个结果的拼接。

语法select 字段1,字段2 from 表 where 查询条件

          union

          select 字段1,字段2 from 表 where 查询条件2

union的注意事项: 1、union在进行结果集合并的时候,要求两个结果集的列数相同;2、如果合并查询的字段类型不统一,则MySQL可以,oracle不可以,会报错,即结果集合并时列和列的数据类型也要一致。

十一、limit是将查询结果集的一部分取出来,通常使用在分页查询中

完整用法:limit startIndex,length;

缺省用法: limit limit 5;    取前5

注:MySQL中limit在order by之后执行!!!

语法:select 字段 from 表 order by desc limit xxxx;

公式: limit (pageNo -1)*pageSize,pageSize;

DQL顺序总结:

from\ where\ group by\ heaving\ select \ order by\ limit

十二、DDL 语句

(建表属于DDL 语句,DDL包括:create 、drop、alter)

1、表的创建

语法格式:create table 表名 (字段名1 数据类型,        

                            字段名2 数据类型,

                            字段名3 数据类型,

                           );

关于MySQL的数据类型:

varchar(可变长度字符串,最长255)                      double

char (定长长度字符串) (长255)                               date短日期类型

int (最长11)                                                            datatime长日期类型

bigint                                                        clob字符大对象(最多可以存储4G的字符串)

float                                                        blob 二进制大对象(专门储图片、声音视频等流媒体)

2.删除表

语法:

drop table 表名;  //如果表不存在,则报错

drop table if exists 表名;//不存在也不会报错

十三、DML语句

1.插入数据insert

语法格式:

insert into 表名(字段名1,...,字段名n) values(值1,....,值n);

注:字段名和值一一对应,即数量要对应,数据类型要对应。

        insert语句但凡是执行成功了,那必然会多一记录

        没有给字段名值, 则默认为null

        insert的字段名全省掉,等于对应 的value都写上。

1、 insert 插入日期

str_to_date:将字符串varchar类型转换为date类型 str_to_date('字符串日期','日期格式')

date_format:将date类型转换为特定格式的varchar类型。

MySQL的日期格式:%Y年,%m月,%d日,%h时,%i分,%s秒

2、date和datetime类型的区分?

date 短日期:包括在日信息(%Y- %M-%d)

datetime是长日期:包括年月日时分秒信息,(%Y- %M-%d  %h:%i:%s)

在MySQL中,怎么获取系统当前时间: now()函数 一> 得到的时间datetime类型

2、修改数据update(DML)

语法格式:update 表名 set 字段名1:值1,字段名2:值2,...,where 条件;

:没where限制条件,会导致所有数据全部更新

3、删除数据delete(DML)

语法 delete from 表 where 条件;

注:没有限制条件,整张表的数据全删除。

        表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不释放。

        缺点:删除效率低

        优点:支持回滚,后悔了可以在恢复数据。

快速创建表: create table 表 as select * from 表;

原理:将一个查询结果当做一张表新建!相当于完成一张表的快速复制。

快速插入 :insert into 表 select * from 表2; 

truncate语句删除原理:(物理删除) 缺点、不支持回滚;优点:快

truncate  table 表名( DDL);

十四、创建表的约束(Constraint) 为了保证表中数据的有效性

非空约束: not null 约束的字段不能为null   ——>只有列级约束,没有表级约束

唯一性约束: unique 约束的字段不能重复,但可以为null

主建约束(只有一个):Primary Key (简PK)任何一张表都应该有主键, 没有主键,表无效

外键约束:Foreign Key(简FK)

检查约束: check (MySQL不支持,oracle支持)

1、关于创建表的约束的小问题

什么时候使用表级约束呢?

        需要给多个字段联合起来添加某一个约束时,才使用表级约束

在MySQL中如果一个字段同时被not null 和 unique约束的话,该字段自动变成主键字段(oracle不一样)

主键特征

        not null + unique(有单一主键,也有复合主键,一般情况下,但单一主键用的多一点)

        外键约束:foreign key (字段名) reference 另一表(字段)

        外键值可以为null;子表中的外键引用的父表中的某一字段,被引用的这个字段不一定是主键,但至少有unique约束。

十五、存储引擎(了解)

存储引擎是一个表存储/组织数据的一种方式;不同的存储引擎,表的存储数据的方式不同(存储引擎是MySQL中特有的一个术语,其他数据库没有)。

在建表的时候可以在最后小括号的')'的右边使用:

        engine用来指定存储引擎

        charset来指定这张表的字符编码方式。

结论:MySQL默认的存储引擎是 InnoDB;默认字符编码utf-8

在MySQL中,用来查看搜索引擎有哪些:show engines \G

存储引擎类别:

MyIsAM(节省空间) :格式文件 (存储表结构的定义)mytable.frm

                                  数据文件(存储表行的内容) mytable.MYD

                                  索引文件(存储上索引) mytable.MYI

InnoDB : MySQL默认搜索引擎; InnoDB支持事物支持数据库崩溃后自动恢复机制。

InnoDB的特点:非常安全。

MEMORY :优点:查询效率非常高(快)

缺点:不安全,关机之后数据自动消失(因为数据和索引在内存当中)

十六、事务(transaction内须掌握且精通的)

1、事务的基本概念

事务是一个完整的业务逻辑,是一个最小的工作单元,不可再分

有DML语句才会有事务,其它语句和事务无关! (insort、delete、update)

事务的本质:一个事务本质上就是多条DML语句同时成功或同时失败。

提交事务(commit): 清空事务性活动日志文件,将数据全部彻底持久化到数据库表中。提交事务标志着事务的结束。并且一种全部成功的结束。

事务回滚 (rollback):将之前所有DML操作全部撤销,并且清空事务性活动的日志。事务回滚标志着事务的结束,并且是种全部失败的结束。

提交事务: commit; 语句

回滚事务: rollback; 语向(回滚永远只能回滚到上一次的提交点)

        在MySQL中,默认情况下是支持自动提交事务的(commit),即每执行一条DML语句,则提交一次; 一>  一般不符合开发的机制,一般在start transation; 之中进行.

        关闭MySQL中的自动提交机制: start transation;

2、事务的4个特性

A原子性:说明事务是最小的工作单元,不可再分。

C一致性:所有事务要求,在同一个事务中,所有操做必须同时成动或同时失败,保证数据的一致性

I隔离性:A事务与B事务之间具有一定的隔离.

D持久性:事务结束的保障,事务提交就相当于将没有保存到硬盘上的数据,保存到硬盘上。

事务之间的隔度级别:

        读未提交:read uncommitted (最低的隔离级别)即事务A可以读到事务B未提交的数据。(“脏读数据" (没什么用,一般从read committed)

        读已提交:read committed解决"脏读“,但不可重复读取据(前后读的数据不一致)

        可重复读: repeatable read   A开启,不管多久A读到的数据都是一致的,即使B修改并提交了数据,A读的不变,可重复读。(存在"幻读"数据)

        序列化:Serializable(最高的隔离级别):效率最低,解决所有问题,事务不排队,不能并发。

十七、索引(底层原理:B-Tree)

        索引是在数据库表中的字段上添加的,是为了提高查询的效率存在的一种机制。索引相当于一本书的目录,是为了缩小扫描的范围而存在的一种机制。

        一张表的字段可以添加一个索引,多个字段联合起来也可以添加索引。

索引的实现原理:

        提醒1:在任何数据库中,主键(PK)上都会自动添加索引对象。在MySQL中,一个字段上如果有unique约束的话,也会自动创建索引对象。

        提醒2:在mysql中,任何一张表的任何一张记录,在硬盘存储上都有一个硬盘的物理存储编号。

        提醒3:在mysql中,索引是一个单独的对象,不同的存储引擎以不同的形式存在。在MyIsAM中,索引存储在一个.MYI文件中。 在InnoDB中,索引存在一个逻辑名称 叫做tablespace中。在MEMOKY中,索引存在内存中。不管索引存在哪。在MySQL中都是一个树的形式存在。平衡二叉树(B-Tree)

什么时候添加索引:

1.数据量庞大(就设置而言)

2.该字段经常出现在where 的后面(即以条件的形式存在)

3.该字段很少的DML操作(因在DML之后,索引要重新排序)

        建议不要随意添加索引,因为索引也需要维护,太多反而降低系统性能;建议通过主键 或 unique 进行索引查询,效希高。

4、索引的创建删除

创建: create index 索引名 on 表(字段);

删除: drop index 索引名 on 表;

在Mysql中查看是否使用了索引:   explain select * from 表 whete 条件1;

索引失效:

1、select * from 表 where 字段 like ’%I‘;

即使字段上加了索引,不会索引,因为模糊匹配当中以%开头(索引失效)尽量避免模糊查询时以%开始,这是优化的手段。

2、使用or的时候会失效,如果使用or,那么要求两边的条件字段要索引,才会走索引。如果是一个有,一个没有, 那么另一个字段上的索引也不会实现。

3、使用复合索引时、没有使用左侧的列查,索引失效。

        复合索引:两个字段或更多字段联合起来添加一个索引。

        create index 索引名 on 表(字段1,字段2);//字段1可用索引查,字段2不可用字段查

4、在where当中索引列参加运算,索引失效。

        explain select * from 表 where 字段+1=xxx;   //无索引

5、在where中索引列使用了函数。

        explain select * from 表 where lower(字段)=“  ”;    //索引失效

索引是各种数据库进行优化的重要手段,优化的时候优先考虑的就是索引

索引类别:单一索引,复合索引,主键索引、唯一性索引......

注:唯一性比较弱的字段,添加索引用处不大。

十八、视图(View)

view: 站在不同的角度去看待同一份数据。

1、创建、删除视图对象:

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

        删除: drop view 视图名:

注:只有DQL才能以view的形式创建:create view 视图名 as DQL语句;

2、用视图做什么?

面向视图对象进行增删改查,对视图对象的增删改查,会导致原表被操作(视图的特点:通过对视图的操作会对原表造成影响。)。

3、视图在实际开发的作用?(方便、简化开发、利于维护)

        如果在一个非常复杂的SQL语句,需要在不同的位置反复使用,就可以把这个复杂的SQL语句以视图对象的形式新建,简化开发,利于后期维护。

面向视图开发,使用视图时可以像table一样,可对视图进行增删改查,一般都说CRUD。

        C:create 增                R:retrive 查;检索

        U:update 改                D:delete 删

4、DBA:

重点掌握:数据的导人和导出(数据的备份)

数据库的导出:在window的dos命令窗口下:musqldump 数据库名 > 存放路径 -uroot -p密码;

导出指定表: mysqldump 数据库名 表名 > 存放路径 -uroot -p密码;

数据库的导入:

注:要先登录到mysql数据库服务器上,然后创建数据库:create database 数据库名;

                                                                                        使用数据库:use 数据库名;

然后初始化数据库: source 路径;

十九、数据库设计的三范式(面试经常问)

1、数据库设计范式:

        数据库表的设计依据。教你怎么进行数据库表的设计。

第一范式:要求任何一张表必须有主键,每个字段原子性不可再分。

第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部份依赖。

第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖

按以上的范式进行,可避免表中数据的冗余以及空间的浪费。

第一范式:(最核心、最重要的范式,所有表的设计都要满足)

第二范式口诀:多对多怎么设计?多对多,三张表,关系表两外键...

第二范式口诀:一对多怎么设计?  一对多,两张表加外键

第二范式口诀:一对一怎么设计?  一对一,外键唯一 (unique)

注意事项★:

(面试说,会显得自己不那么初级)

        数据库设计三范式是理论上的,实践和理论可能有偏差。最终目的是为了满足客户需求,有时可能拿冗余换速度。因为在MySQL中,表与表之间的连接次数越多,效率越低(笛卡尔积),这对开发人员来说,SQL语句的编写难度也会降低。

你可能感兴趣的:(数据库笔记,数据库,mysql,sql)