数据库总结
一.Centos安装Mysql
1.下载mysql包。地址:https://dev.mysql.com/downloads/mysql/
进去选择配置如下:
选择
2.在centos下随便一个目录下进行解压。
tar -vxf MySQL-5.6.44-1.el7.x86_64.rpm-bundle.tar
执行命令
groupadd mysql
useradd -g mysql -m mysql
rpm -e mariadb-libs-1:5.5.60-1.el7_5.x86_64
rpm -ivh MySQL-server-5.6.44-1.el7.x86_64.rpm
rpm -ivh MySQL-client-5.6.44-1.el7.x86_64.rpm
rpm -ivh MySQL-devel-5.6.44-1.el7.x86_64.rpm
rpm -ivh MySQL-shared-5.6.44-1.el7.x86_64.rpm
chown -R mysql:mysql /var/lib/mysql
/etc/init.d/mysql start
3.上述安装过程中,有任何报错直接百度。接下来进行密码更改。
随机密码在/root/.mysql_secret 里,第一次登录需要用到里面的密码。
mysql -uroot -p
4.更改密码。
直接执行set PASSWORD=password('root');
设置远程连接 grant
all
privileges
on
*.*
to
'root'
@
'%'
identified
by
'root'
with
grant
option
;
FLUSH PRIVILEGES;
5.tip:安装报错小提示。
出现mariadb错误时,直接卸载mariadb版本,然后再装mysql。查询mariadb:
rpm -qa | grep mariadb 然后卸载 rpm -e maraidb*****
出现perl(Data::Dumper) 被 MySQL-server-5.6.44-1.el7.x86_64 需要 错误时,安装如下
yum install -y perl perl-devel
yum -y install autoconf
yum install -y perl-Data-Dumper
然后再重新安装Mysql即可
二、Mysql语句练习
近期突然有事情要加强sql练习,本文是在转载的基础上自己进行尝试练习 原文地址: https://blog.csdn.net/fashion2014/article/details/78826299 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s_birth` VARCHAR(20) NOT NULL DEFAULT '', `s_sex` VARCHAR(10) NOT NULL DEFAULT '', PRIMARY KEY(`s_id`) ); CREATE TABLE `Course`( `c_id` VARCHAR(20), `c_name` VARCHAR(20) NOT NULL DEFAULT '', `t_id` VARCHAR(20) NOT NULL, PRIMARY KEY(`c_id`) ); CREATE TABLE `Teacher`( `t_id` VARCHAR(20), `t_name` VARCHAR(20) NOT NULL DEFAULT '', PRIMARY KEY(`t_id`) ); CREATE TABLE `Score`( `s_id` VARCHAR(20), `c_id` VARCHAR(20), `s_score` INT(3), PRIMARY KEY(`s_id`,`c_id`) ); insert into Student values('01' , '赵雷' , '1990-01-01' , '男'); insert into Student values('02' , '钱电' , '1990-12-21' , '男'); insert into Student values('03' , '孙风' , '1990-05-20' , '男'); insert into Student values('04' , '李云' , '1990-08-06' , '男'); insert into Student values('05' , '周梅' , '1991-12-01' , '女'); insert into Student values('06' , '吴兰' , '1992-03-01' , '女'); insert into Student values('07' , '郑竹' , '1989-07-01' , '女'); insert into Student values('08' , '王菊' , '1990-01-20' , '女'); insert into Course values('01' , '语文' , '02'); insert into Course values('02' , '数学' , '01'); insert into Course values('03' , '英语' , '03'); insert into Teacher values('01' , '张三'); insert into Teacher values('02' , '李四'); insert into Teacher values('03' , '王五'); insert into Score values('01' , '01' , 80); insert into Score values('01' , '02' , 90); insert into Score values('01' , '03' , 99); insert into Score values('02' , '01' , 70); insert into Score values('02' , '02' , 60); insert into Score values('02' , '03' , 80); insert into Score values('03' , '01' , 80); insert into Score values('03' , '02' , 80); insert into Score values('03' , '03' , 80); insert into Score values('04' , '01' , 50); insert into Score values('04' , '02' , 30); insert into Score values('04' , '03' , 20); insert into Score values('05' , '01' , 76); insert into Score values('05' , '02' , 87); insert into Score values('06' , '01' , 31); insert into Score values('06' , '03' , 34); insert into Score values('07' , '02' , 89); insert into Score values('07' , '03' , 98); SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。 JOIN: 如果表中有至少一个匹配,则返回行!!!!! LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行!!!!! RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行!!!! FULL JOIN: 只要其中一个表中存在匹配,就返回行!!!!!!! 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数 自己的答案 SELECT s.*,a.s_score as a,b.s_score as b from student s JOIN score a on a.s_id=s.s_id and a.c_id='01' JOIN score b on b.s_id=s.s_id and b.c_id='02' where a.s_score > b.s_score 原文答案 select a.* ,b.s_score as 01_score,c.s_score as 02_score from student a join score b on a.s_id=b.s_id and b.c_id='01' left join score c on a.s_id=c.s_id and c.c_id='02' or c.c_id = NULL where b.s_score>c.s_score 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数 和第一题相差不多,就不写了 这是原文答案 select a.* ,b.s_score as 01_score,c.s_score as 02_score from student a left join score b on a.s_id=b.s_id and b.c_id='01' or b.c_id=NULL join score c on a.s_id=c.s_id and c.c_id='02' where b.s_score<c.s_score 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 select s.*,ROUND(AVG(a.s_score),2) as avg_score from student s join score a on s.s_id = a.s_id GROUP BY s.s_id HAVING avg_score >=60; 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩 select a.s_id,a.s_name,count(b.c_id) as sum_course,sum(b.s_score) as sum_score from student a left join score b on a.s_id=b.s_id GROUP BY a.s_id,a.s_name; 这里说一下left join,此处即便该学生没有分数,也会返回学生信息。而join只会返回匹配的行,而right join只会返回有成绩的学生信息。 6、查询"李"姓老师的数量 SELECT t.*,COUNT(t.t_id) from teacher t where t.t_name LIKE '李%'; 7、查询学过"张三"老师授课的同学的信息 SELECT s.*,t.t_name from student s LEFT JOIN score sc on sc.s_id=s.s_id LEFT JOIN course c on sc.c_id=c.c_id LEFT join teacher t on c.t_id=t.t_id where t.t_name='张三'; 第二种方式: select t.t_name,s.* from student s,score sc,course c,teacher t where t.t_id=c.t_id and sc.c_id=c.c_id and t.t_name='张三' and sc.s_id=s.s_id; 原文答案: select a.* from student a join score b on a.s_id=b.s_id where b.c_id in( select c_id from course where t_id =( select t_id from teacher where t_name = '张三')); 8、查询没学过"张三"老师授课的同学的信息 select s.* from student s where s.s_id not in(select sc.s_id from score sc,course c,teacher t where t.t_id=c.t_id and sc.c_id=c.c_id and t.t_name='张三'); 思路为:找到所有学过张三老师的学生id,然后从所有学生里找不在这些id里的学生,即为没学过张三的学生。
三、有关Mybatis的知识点
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
1.Mybatis一级缓存。之所以有缓存,主要是为了减少数据库的访问,如果在缓存命中,直接返回即可。所以当即增删改操作时会清空缓存,避免脏读。
一级缓存是SqlSession级别的,即一个数据库连接。在Spring中,每次访问都会有一个新的连接通过注解生成,并且使用完后都会执行close方法,所以基本上一级缓存在Spring整合时都废了。。
2.Mybatis二级缓存。二级缓存比一级缓存的作用范围大,即所有SqlSession都可以用,属于Mapper级别的。二级缓存默认关闭,需要在Mybatis配置中设置。
二级缓存是建立在同一个namespace下的,每个mapper都有自己的二级缓存,如果对表的操作查询可能有多个namespace时,由于namespaceA执行了增删改,并不会通知namespaceB,数据就是错的。
四、数据库小结
1.事务:是数据库操作的最小单元,是一个工作单元的一系列操作,这些操作作为一个整体,要么全执行,要么全不执行。
(1).A(原子性):即本次执行的系列操作要么全部成功要么全部失败。
(2).C(一致性):保证在一个事务中的多次操作的数据中间状态对其他事务不可见的,即只能看到结果值。还有就是执行前后数据要一致,比如A的100元转给B,其总额不变。
(3).I(隔离性):多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
(4).D(持久性):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响。
2.索引
聚集索引(主键索引):在数据库里面,所有行数都会按照主键索引进行排序。
非聚集索引:就是给普通字段加上索引。
联合索引:就是好几个字段组成的索引,称为联合索引。联合索引遵从最左前缀原则,比如创建索引时顺序是'name','age',则查询时也需要从name开始查询,即查询的时候查询条件精确匹配索引的左边连续一列或几列。
普通索引:CREATE INDEX 索引名 ON 表名(列名);
唯一索引:CREATE UNIQUE INDEX 索引名 ON 表名(列名) ;
不走索引的:
(1).Like这种就是%在前面的不走索引,在后面的走索引。
(2).用索引列进行计算的,不走索引。
(3).对索引列用函数了,不走索引。
(4).索引列用了!= 不走索引。
五、三范式
一般都指的是关系型数据库的规范。
一范式:建表时保证列的原子性,即不可分割。比如有一列phone,既可以是座机,又可以是手机,应该分成两列。
二范式:在一范式的基础上,保证表的唯一性。即一张表只表示一种事物,每列和主键有依赖关系。
三范式:在二范式基础上,没有其他表中已有的除主键外的其他列,即没有传递性。
六、MySql
1.常用的MySql数据类型有:
int或integer:大整数。
bigint:极大整数。
float:单精度浮点型。
double:双精度浮点型。
date/time/datetime:年月日/时分秒/年月日时分秒混合时间。
char:定长字符串。
varchar:变长字符串。
text:长文本数据。
char和varchar的n表示字符个数,char会进行超出截取、不满位数时补齐为空的特点,最大255。而varchar按照实际大小存储(不能超出指定n),最大65532。