資料庫總結
一.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。