基本概念
1.数据库DataBase简称:DB
2.什么数据库?——用于存储和管理数据的仓库。存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。
3.数据库的特点:持久化存储数据。数据库就是一个文件夹系统
MySQL服务启动
1. 手动:管理——服务——手动关闭和开启。
2.cmd-->services.msc打开服务的窗口
3.使用管理员打开cmd
net start mysql:启动mysql的服务
net stop mysql:关闭mysql服务
MySQL登录
1.mysql-uroot-p密码
2.mysql-hip-uroot-p连接目标的密码
MySQL退出
1.exit(退出)
2.quit(辞职、退出)
索引的作用?它的优点缺点是什么?
索引在数据库的搜索时可以加速对数据的检索。类似与现实生活中书的目录,缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
在数据库中查询语句速度很慢,如何优化?
1.建索引2.减少表之间的关联 3.优化sql,尽量用PreparedStatement来查询,不要用Statement
索引类型有哪些?B-tree :b+树、b-树——叶子节点中的数据索引、二叉树,红黑树、Hash表
什么是事务?
事务就是被绑定在一起的SQL语句分组,有原子性,一致性,隔离性和持久性。
怎么验证MySQL的索引是否满足需求
explain语法:explain select*from table where type=1。
数据库的事务隔离
MySQL的事务隔离是在MySQL.ini配置文件最后添加:transaction-isolation=REPEATABLE-READ
可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。
Read-uncommitted:未提交读,最低隔离级别、事务未提交前,就可被其他事务 生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
视图:是一种虚拟的表,具有和物理表相同的功能。优点:对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。
Oracle和Mysql的区别?
1)库函数不同。
2)Oracle是用表空间来管理的,Mysql不是。
Oracle语句分三类:DDL、DML、DCL。DDL(Data Definition Language)数据定义语言,包括:Create语句:可以创建数据库和数据库的一些对象。Drop语句:可以删除数据表、索引、触发程序、条件约束以及数据表的权限等。Alter语句:修改数据表定义及属性。Truncate语句:删除表中的所有记录,包括所有空间分配的记录被删除。DML(Data Manipulation Language)数据操控语言,包括:Insert语句:向数据表张插入一条记录。Delete语句:删除数据表中的一条或多条记录,也可以删除数据表中的所有记录,但是它的操作对象仍是记录。Update语句:用于修改已存在表中的记录的内容。DCL(Data Control Language)数据库控制语言,包括:Grant语句:允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限。Revoke语句:可以废除某用户或某组或所有用户访问权限
数据库三范式是什么?
第一范式:列不可再分第二范式:行可以唯一区分,主键约束第三范式:三大范式是一级一级依赖的
什么是SQL?
Structured Query Language:结构化查询语言,定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。Mysql,oracle,SQLserver, DB2
都是关系型数据库。
SQL语句单行或多行书写,以分号结尾。MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。单行注释:-- 注释内容或#注释内容(mysql特有),多行注释:/*注释*/
SQL分类
1) Data Definition Language (DDL 数据定义语言) 如:建库,建表 关键字:create,drop,alter等
2) Data Manipulation Language(DML 数据操纵语言),如:对表中的记录操作增删改 关键字:insert,delete,update等
3) Data Query Language(DQL 数据查询语言),如:对表中的查询操作 关键字:select,where等
4) Data Control Language(DCL 数据控制语言),如:对用户权限的设置。关键字:GRANT,REVOKE等
DDL:操作数据库、表——CRUD
1.C(Create):创建
创建数据库:
create database数据库名称;
创建数据库,判断不存在,再创建:
create database if not exists数据库名称;
创建数据库,并指定字符集
create database数据库名称character set字符集名;
练习:创建db4数据库,判断是否存在,并制定字符集为gbk
create database if not exists db4 character set gbk;
2.R(Retrieve):查询
*查询所有数据库的名称:
show databases;
*查询某个数据库的字符集:查询某个数据库的创建语句
show create database数据库名称;
3.U(Update):修改
*修改数据库的字符集
alter database数据库名称character set字符集名称;
4.D(Delete):删除
删除数据库
drop database数据库名称;
判断数据库存在,存在再删除
drop database if exists数据库名称;
5.使用数据库
*查询当前正在使用的数据库名称
*select database();
*使用数据库
*use数据库名称;
2.DCL操作表
1.C(Create):创建
1.语法:
create table表名(
列名1数据类型1,
列名2数据类型2,
列名n数据类型n
);
*注意:最后一列,不需要加逗号(,)
*数据库类型:
1.int:整数类型
age int,
2.double:小数类型
score double(5,2)
3.date:日期,只包含年月日,yyyy-MM-dd
4.datetime:日期,包含年月日时分秒yyyy-MM-dd HH:mm:ss
5.timestamp:时间错类型包含年月日时分秒yyyy-MM-dd HH:mm:ss
如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
6.varchar:字符串
*name varchar(20):姓名最大20个字符
*zhangsan 8个字符张三2个字符
*创建表
create table student(
id int,
name varchar(32),
age int,
score double(4,1),
birthday date,
insert_time timestamp
);
*复制表:
*create table表名like被复制的表名;
2.R(Retrieve):查询
*查询某个数据库中所有的表名称
*show tables;
*查询表结构
*desc表名;
3.U(Update):修改
1.修改表名
alter table表名rename to新的表名;
2.修改表的字符集
alter table表名character set字符集名称;
3.添加一列
alter table表名add列名数据类型;
4.修改列名称类型
alter table表名change列名新列别新数据类型;
alter table表名modify列名新数据类型;
5.删除列
alter table表名drop列名;
4.D(Delete):删除
*drop table表名;
*drop table if exists表名;
*客户端图形化工具:SQLYog
DML:增删改表中数据
1.添加数据:
*语法:
*insert into表名(列名1,列名2,...列名n)values(值1,值2,...值n);
*注意:
1.列名和值要一一对应。
2.如果表名后,不定义列名,则默认给所有列添加值
insert into表名values(值1,值2,...值n);
3.除了数字类型,其他类型需要使用引号(单双都可以)引起来
2.删除数据:
*语法:
*delete from表名[where条件]
*注意:
1.如果不加条件,则删除表中所有记录。
2.如果要删除所有记录
1.delete from表名;--不推荐使用。有多少条记录就会执行多少次删除操作
2.TRUNCATE TABLE表名;--推荐使用,效率更高先删除表,然后再创建一张一样的表。
3.修改数据:
*语法:
*update表名set列名1=值1,列名2=值2,...[where条件];
*注意:
1.如果不加任何条件,则会将表中所有记录全部修改。
##DQL:查询表中的记录
*select*from表名;
1.语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
2.基础查询
1.多个字段的查询
select字段名1,字段名2...from表名;
*注意:
*如果查询所有字段,则可以使用*来替代字段列表。
2.去除重复:
*distinct
3.计算列
*一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
*ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
*表达式1:哪个字段需要判断是否为null
*如果该字段为null后的替换值。
4.起别名:
*as:as也可以省略
3.条件查询
1.where子句后跟条件
2.运算符
*>、=、=、<>
*BETWEEN...AND
*IN(集合)
*LIKE:模糊查询
*占位符:
*_:单个任意字符
*%:多个任意字符
*IS NULL
*and或&&
*or或||
*not或!
--查询年龄大于20岁
SELECT*FROM student WHERE age>20;
SELECT*FROM student WHERE age>=20;
--查询年龄等于20岁
SELECT*FROM student WHERE age=20;
--查询年龄不等于20岁
SELECT*FROM student WHERE age!=20;
SELECT*FROM student WHERE age<>20;
--查询年龄大于等于20小于等于30
SELECT*FROM student WHERE age>=20&&age<=30;
SELECT*FROM student WHERE age>=20 AND age<=30;
SELECT*FROM student WHERE age BETWEEN 20 AND 30;
--查询年龄22岁,18岁,25岁的信息
SELECT*FROM student WHERE age=22 OR age=18 OR age=25
SELECT*FROM student WHERE age IN(22,18,25);
--查询英语成绩为null
SELECT*FROM student WHERE english=NULL;--不对的。null值不能使用=(!=)判断
SELECT*FROM student WHERE english IS NULL;
--查询英语成绩不为null
SELECT*FROM student WHERE english IS NOT NULL;
--查询姓马的有哪些?like
SELECT*FROM student WHERE NAME LIKE'马%';
--查询姓名第二个字是化的人
SELECT*FROM student WHERE NAME LIKE"_化%";
--查询姓名是3个字的人
SELECT*FROM student WHERE NAME LIKE'___';
--查询姓名中包含德的人
SELECT*FROM student WHERE NAME LIKE'%德%';
查询缓存(了解):MySQL拿到一个查询请求后→会先到查询缓存看看之前是不是执行过这条语句→命中就返回缓存的value。【他跟Redis一样,只要是你之前执行过的语句,都会在内存里面用key-value形式存储着。缓存在MySQL8.0之后就取消了——查询的缓存容易被清空消失(原因)】
MySQL的内连接、左连接、右连接有什么区别?
内连接:inner join;左连接:left join;右连接:right join。
内连接是把匹配的关联数据显示出来;左连接是把表全部显示出来,右边的表显示出符合条件的数据
MySQL索引是怎么实现的?
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。不同的数据引擎实现有所不同。
MySQL中的索引是B+树实现的,B+树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。
MySQL常用的引擎?
InnoDB引擎:InnoDB引擎提供了对数据库acid事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL运行的时候,InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行select count(*)from table指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。
MyIASM引擎:MySQL的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和InnoDB不同的是,MyIASM引擎是保存了表的行数,于是当进行select count(*)from table语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将MyIASM作为数据库引擎的首选。
什么是锁?
锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。
MySQL的行锁和表锁、乐观锁和悲观锁
MyISAM只支持表锁,InnoDB支持表锁和行锁,默认为行锁。
表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。
行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。
数据库的乐观锁需要自己实现,在表里面添加一个version字段,每次修改成功值加1,这样每次修改的时候先对比一下,自己拥有的version和数据库现在的version是否一致,如果不一致就不修改,这样就实现了乐观锁。
MySQL问题排查都有哪些手段
使用show processlist命令查看当前所有连接信息。
使用explain命令查询SQL语句执行计划。
开启慢查询日志,查看慢查询的SQL。