MySQL
1.Mysql簡介:
數(shù)據(jù)庫是數(shù)據(jù)持久化的一種工具绵咱, 如果想要做到數(shù)據(jù)持久化必須將數(shù)據(jù)通過文件保存到硬盤中。主要有關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫兩種.Mysql就是一種應(yīng)用最為廣泛的關(guān)系型數(shù)據(jù)庫.
2.關(guān)系型數(shù)據(jù)庫的特點(diǎn)
理論基礎(chǔ):集合論和關(guān)系代數(shù)
-
具體表象:用二維表組織數(shù)據(jù)
列 — 字段
行 — 記錄
編程語言:結(jié)構(gòu)化查詢語言(SQL)
3.Mysql安裝使用
3.1Mysql安裝
windows系統(tǒng)下載安裝: 百度搜索
Linux系統(tǒng)(服務(wù)器)安裝:
3.1 先檢查服務(wù)器是否已經(jīng)安裝mysql,執(zhí)行命令:yum list installed | grep mysql
3.2 若已安裝,可以卸載后再安裝:yum -y remove mysql
3.3清理之前的數(shù)據(jù)和日志文件(如果存在)
rm -rf /var/lib/mysql
rm -f /var/log/mysqld.log
3.3 下載Mysql的源:
在終端根目錄下執(zhí)行如下代碼下載Mysql源文件
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
3.4 將第三方源安裝到本地:
執(zhí)行命令:yum localinstall mysql57-community-release-el7-8.noarch.rpm
3.5 安裝mysql:
執(zhí)行命令:yum install mysql-community-server
3.6 登錄mysql并重置密碼
3.6.1 systemctl start mysqld 啟動(dòng)mysql
3.6.2 systemctl status mysqld 查看MySQL狀態(tài),是否啟動(dòng)成功
3.6.3 vim /etc/my.cnf 修改my.cnf文件,在[mysql]后添加一行語句: validate_password=OFF 關(guān)閉強(qiáng)密碼驗(yàn)證,保存退出
3.6.4 grep "password" /var/log/mysqld.log 查看mysql初始默認(rèn)隨機(jī)密碼(結(jié)果最后一行),復(fù)制
3.6.5 mysql -u root -p 登錄MySQL
3.6.6粘貼隨機(jī)密碼進(jìn)入mysql
3.6.7 ALTER USER 'root'@'localhost' IDENTIFIED BY "新密碼"; 修改密碼
3.6.8 命令執(zhí)行成功后:輸入exit 退出mysql
3.6.9 systemctl stop mysqld 關(guān)閉mysql
3.6.10 systemctl start mysqld 啟動(dòng)mysql
3.6.11 mysql -u root -p 登錄MySQL
3.6.12 輸入新密碼登錄
成功后即可以本地和數(shù)據(jù)庫連接,然后設(shè)置遠(yuǎn)程訪問數(shù)據(jù)庫.
3.6.1.1 登錄進(jìn)入數(shù)據(jù)庫
3.6.1.2執(zhí)行:“GRANT ALL PRIVILEGES ON . TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;” 創(chuàng)建一個(gè)允許遠(yuǎn)程訪問的用戶腻窒,用戶名是root,密碼是123456
3.6.1.3 輸入 flush privileges; 進(jìn)行更新權(quán)限
3.6.1.4 遠(yuǎn)程連接數(shù)據(jù)庫
3.2 mysql使用語法
1. 數(shù)據(jù)庫和表的操作
1.1 創(chuàng)建數(shù)據(jù)庫
1. create database 數(shù)據(jù)庫名; -- 創(chuàng)建指定數(shù)據(jù)庫;如果該數(shù)據(jù)庫已經(jīng)存在會(huì)報(bào)錯(cuò)
2. create database if not exists 數(shù)據(jù)庫名; -- 當(dāng)指定數(shù)據(jù)庫不存在的時(shí)候創(chuàng)建數(shù)據(jù)庫员淫;如果存在就不創(chuàng)建端盆,也不會(huì)報(bào)錯(cuò)
3. create database if not EXISTS 數(shù)據(jù)庫名 default charset utf8; -- 創(chuàng)建數(shù)據(jù)庫的時(shí)候設(shè)置字符集編碼方式為utf8,讓數(shù)據(jù)庫支持中文數(shù)據(jù)的存儲(chǔ)
-- 注意: 可以在通過 character-set-server=utf8 來設(shè)置MySQL服務(wù)啟動(dòng)時(shí)默認(rèn)使用的字符集
-- 創(chuàng)建school數(shù)據(jù)庫示例:
CREATE DATABASE IF NOT EXISTS school DEFAULT charset utf8;
1.2 刪除數(shù)據(jù)庫
1. drop database 數(shù)據(jù)庫名; -- 刪除指定數(shù)據(jù)庫怀骤;如果該數(shù)據(jù)庫不存在會(huì)報(bào)錯(cuò)
2. DROP DATABASE if EXISTS 數(shù)據(jù)庫名; -- 當(dāng)指定數(shù)據(jù)庫存在的時(shí)候刪除數(shù)據(jù)庫;如果數(shù)據(jù)庫不存在不會(huì)報(bào)錯(cuò)
-- 刪除school數(shù)據(jù)庫示例:
DROP DATABASE IF EXISTS school;
1.3 使用/切換數(shù)據(jù)庫
1. use 數(shù)據(jù)庫名; -- 切換到指定數(shù)據(jù)庫
-- 使用school數(shù)據(jù)庫示例:
USE school;
1.4 創(chuàng)建表
1. create table if not exists 表名(字段名1 類型1 約束1 comment 描述1, 字段2 類型2 約束2 comment 描述2,...);
-- 1)表名 - 程序員自己命名焕妙,但是一般以t或者tb作為前綴表示表名蒋伦; 而且要見名知義
-- 2)字段名 - 程序員自己命名,要求見名知義
-- 3)類型 - 類型必須是當(dāng)前數(shù)據(jù)庫支持的類型名焚鹊,mysql中常見的類型有: int(整數(shù)), float(小數(shù)),char/varchar/text(字符串)痕届,bit(布爾),date(日期)
-- 4)約束 - 創(chuàng)建約束:not null - 不為空, default - 設(shè)置默認(rèn)值, unique - 值唯一, primary key - 主鍵約束
-- 4.1)主鍵約束 - 主鍵的值可以確定列表中唯一一條記錄(通過一個(gè)主鍵值可以找到表中的唯一一條記錄),所以一般每張表都需要設(shè)置一個(gè)字段為主鍵,主鍵的值也必須是唯一的研叫;一般需要可以通過auto_increment約束讓整型主鍵自動(dòng)增加
-- 5)comment - 添加字段說明
-- 創(chuàng)建學(xué)生表示例1:
CREATE TABLE IF NOT EXISTS t_student
(
stuid int not null PRIMARY KEY auto_increment COMMENT '學(xué)號(hào)',
stu_name varchar(20) not null COMMENT '姓名',
stuage int COMMENT '年齡',
stugender bit default 1 COMMENT '性別',
stubirth date COMMENT '生日'
);
-- 創(chuàng)建教師表示例2:
CREATE TABLE IF NOT EXISTS t_teacher
(
teaid int not null auto_increment COMMENT '編號(hào)',
teaname varchar(20) not null COMMENT '姓名',
teaage int comment '年齡',
teatitle varchar(20) DEFAULT '助教' COMMENT '職稱',
PRIMARY KEY (teaid) -- 主鍵設(shè)置可以在后面單獨(dú)設(shè)置
)
1.5 刪除表
1. DROP TABLE if EXISTS 表名; -- 刪除指定表
-- 刪除教師表示例:
DROP TABLE if EXISTS t_teacher;
1.6 修改表
1.6.1 添加字段/列
1. alter TABLE 表名 add COLUMN 字段名 字段類型 約束 comment 描述; -- 在指定表中添加指定字段
-- 給學(xué)生表添加地址字段示例:
alter TABLE t_student add COLUMN stuaddr varchar(200) DEFAULT '' COMMENT '家庭住址';
1.6.2 刪除字段/列
1. alter TABLE 表名 drop COLUMN 字段名; -- 刪除指定表中的指定字段
-- 示例:
ALTER TABLE t_student DROP COLUMN stuage;
2. DML(表中數(shù)據(jù)的操作)
2.1 增(添加記錄)
1. insert into 表名 values(值1,值2,值3,...) -- 按照表中字段的順序依次給每個(gè)字段賦值
-- 示例:
insert into t_student values(2,'李四',0,'2017-12-30','成都');
2. insert into 表名(字段1,字段2,字段3,...) values(值1,值2,值3,...); -- 按指定順序給指定字段賦值
-- 示例:
insert into t_student(stuname, stugender, stubirth,stuaddr) values('夏明',1,'1992-3-12','大連');
-- 一次插入多條記錄
insert into t_student(stuname, stubirth, stuaddr) values
('小花','1989-10-2','南京'),
('Tom',date(now()),'西安'),
('大黃','2000-1-20','沈陽');
-- 值的問題: sql中是數(shù)字對(duì)應(yīng)的值直接寫锤窑,字符串需要使用引號(hào)引起來,bit類型的值只有0或者1, 時(shí)間可以用內(nèi)容是滿足時(shí)間格式字符串也可以是通過時(shí)間函數(shù)獲取的值
-- 時(shí)間函數(shù): now() - 當(dāng)前時(shí)間 date(now()) - 當(dāng)前日期 year(now()) - 當(dāng)前年 month(now()) - 當(dāng)前月 ....
2.2 刪(刪除記錄)
1. delete from 表名; -- 刪除指定表中所有記錄
-- 示例:
delete from t_student;
2. delete from 表名 where 條件語句; -- 刪除滿足條件的記錄
-- 示例:
delete from t_student where stuid=9; -- 刪除stuid等于9的記錄
delete from t_student where stuage=18 and stugender=0; -- 刪除stuage等于18并且stugender等于0的記錄
delete from t_student where stuage in (16,17); -- 刪除stuage是16和stuage是17的記錄
delete from t_student where stuname like 'stu%'; -- 刪除stuname的值是以stu開頭的記錄
delete from t_student where stuname like '%1'; -- 刪除stuname的值是以1結(jié)尾的記錄
delete from t_student where not age=18; -- 刪除stuage不是18的記錄
delete from t_student where birth is NULL; -- 刪除stubirth是NULL的記錄
-- 條件語句的寫法
-- 1)比較運(yùn)算符: =(等于), <>(不等于),>(大于), <(小于),>=(大于等于), <=(小于等于)
-- 2)邏輯運(yùn)算符: and(并且), or(或者), not(非)
-- 3)是否為空: is null(為空), is not null(不為空)
-- 4)范圍: between x and y(在x到y(tǒng)之間), not between x and y(不在x到y(tǒng)之間)
-- 5)字符串匹配: like 字符串(像, like后面的字符串可以使用%表示任意個(gè)任意字符, _表示任意一個(gè)字符)
-- 6)指定集合元素: in (值1,值2,...)(結(jié)果是集合中的元素)
2.3 改(修改數(shù)據(jù)/記錄)
1. update 表名 set 字段1=新值1, 字段2=新值2,...; -- 將指定表中所有行的指定列/字段的值賦值為新值
-- 示例:
update t_student set stubirth='1992-3-12'; -- 將所有記錄中的stubirth字段都設(shè)置為1992-3-12
2. update 表名 set 字段1=新值1, 字段2=新值2,... where 條件語句; -- 將表中滿足條件的行中指定字段的值賦值為新值
-- 示例:
update t_student set stuage=20 where not stuname like 'stu%'; -- 將所有stuname不是stu開頭的記錄的stuage字段設(shè)置為20
2.4 查(獲取數(shù)據(jù))
2.4.1 直接查詢
1. select * from 表名; -- 獲取指定表中所有行和所有的列(所有數(shù)據(jù))
-- 示例:
SELECT * FROM t_student;
-- 映射
2. select 字段名1,字段名2,... from 表名; -- 獲取指定表中所有行指定的列
-- 示例:
SELECT stuname,stuid FROM t_student;
3. select * from 表名 where 條件; -- 獲取指定表中所有滿足條件的行所有列的數(shù)據(jù)
-- 示例:
SELECT * FROM t_student WHERE stuid>115;
SELECT stuname,stuage FROM t_student WHERE stuid>115;
2.4.2 列重命名
1. select 字段1 as 新字段1, 字段2 as 新字段2,... from 表名;
-- 注意: 這兒的as可以省略
-- 示例:
select stuname as '姓名', stuage as '年齡' from t_student;
2.4.3 對(duì)查詢結(jié)果重新賦值(一般針對(duì)布爾數(shù)據(jù))
1. select if(字段名,值1,值2) from 表名; -- 查詢指定字段嚷炉,并且判斷字段對(duì)應(yīng)的值是0還是1渊啰,如果是1結(jié)果為值1,否則為值2
-- 注意: 這兒的if的用法是MySQL專有的
-- MySQL寫法: if(字段, 新值1, 新值2)
-- 通用寫法: case 字段 when 值 then 新值1 else 新值2 end
-- 示例:
select stuname, if(stugender, '男', '女') from t_student; -- 查詢的時(shí)候如果stugender的結(jié)果不再是0或者1而是男或者女
select stuname, case stugender when 1 then '男' else '女' end from t_student; -- 查詢的時(shí)候如果stugender的結(jié)果不再是0或者1而是男或者女
2.4.4 對(duì)列進(jìn)行合并
1. select concat(字段1,字段2,...) from 表名;
-- 示例:
select concat(stuname, stuage) from t_student; -- 將多個(gè)字段的數(shù)據(jù)合并成一個(gè)數(shù)據(jù)返回
select concat(stuname, stuage) as 'nameage' from t_student; -- 將多個(gè)字段的數(shù)據(jù)合并成一個(gè)數(shù)據(jù)返回并且為其數(shù)據(jù)重命名
select concat(stuname, ':', stuid) as 'name_id' from t_student;
-- 注意: 數(shù)字和字符串?dāng)?shù)據(jù)可以合并申屹,bit類型的數(shù)據(jù)不可以合并
2.4.5 模糊查詢 - 查詢的時(shí)候時(shí)候通過like條件來指定查詢對(duì)象
-- 示例:
select * from t_student where stu_name like 'stu%' and gender=0;
2.4.6 排序(先按之前的任何語法進(jìn)行查詢?cè)谂判?
1. select * from 表名 order by 字段; -- 對(duì)查詢結(jié)果按照指定字段的值進(jìn)行升序排序
2. select * from 表名 order by 字段 asc; -- 對(duì)查詢結(jié)果按照指定字段的值進(jìn)行升序排序
3. select * from 表名 order by 字段 desc; -- 對(duì)查詢結(jié)果按照指定字段的值進(jìn)行降序排序
-- 示例:
select * from t_student order by stuage;
select * from t_student order by stuage asc;
select * from t_student order by stuage desc;
select * from t_student order by age asc, gender asc; -- 對(duì)查詢結(jié)果先按年齡進(jìn)行排序虽抄;年齡相同的再按性別進(jìn)行排序
2.4.7 去重
1. select distinct 字段 from 表名; -- 獲取指定字段的值并且去重
-- 示例:
select distinct stuage from t_student;
2.4.8 限制和分頁
1. select * from 表名 limit 數(shù)量; -- 值獲取指定數(shù)量的查詢結(jié)果
-- 示例:
select * from t_student limit 3; -- 獲取查詢結(jié)果的前3條
2. select * from 表名 limit M offset N; -- 跳過前N條數(shù)據(jù)獲取M條數(shù)據(jù)
-- 示例:
select * from t_student limit 3 offset 4; -- 跳過前4條數(shù)據(jù)獲取3條數(shù)據(jù)
3. select * from 表名 limit M,N; -- 跳過前M條數(shù)據(jù)獲取N條數(shù)據(jù)
-- 示例:
select * from t_student limit 3,4; -- 跳過前3條數(shù)據(jù)獲取4條數(shù)據(jù)
3. 外鍵與E.R圖
3.1 約束管理
3.1.1 添加約束
添加普通約束的方式有兩種,一種是創(chuàng)建表的時(shí)候直接給字段添加相應(yīng)的約束独柑,另一種是通過修改表的方式添加約束
1. 創(chuàng)建表的時(shí)候添加約束
建表的時(shí)候可以在字段類型后面加一個(gè)或者多個(gè)約束
2.通過添加約束索引的方式添加約束
alter table 表名 add constraint 索引名 約束(字段);
-- 說明: 索引名 - 自己隨便命名; 約束 - 當(dāng)前想要添加的約束(但是只支持唯一約束迈窟、主鍵約束和外鍵約束)
-- 示例:
alter table t_teacher add constraint uni_tel UNIQUE(teatel);
3.1.2 刪除約束
alter table 表名 drop index 約束索引;
-- 示例:
alter table t_teacher drop index uni_tel;
3.2 外鍵約束
1.什么是外鍵:表中的某個(gè)字段的值是根據(jù)其他表中主鍵的值來確定的。那么這個(gè)字段就是外鍵
1.1 不同類型的外鍵添加方法:
多對(duì)一的外鍵的添加: 將外鍵添加到多的一方對(duì)應(yīng)的表中
一對(duì)一的外鍵的添加: 將外鍵隨便添加到哪一方忌栅,同時(shí)添加值唯一約束
多對(duì)多的外鍵的添加: 關(guān)系型數(shù)據(jù)庫中车酣,兩張表沒法實(shí)現(xiàn)多多的關(guān)系,需要一個(gè)中間表索绪。(中間表有兩個(gè)外鍵分別參照 多多的兩個(gè)表的主鍵)
1.2 添加外鍵約束語法:
alter table 表名1 add constraint 外鍵約束索引名 foreign key (字段1) references 表名2 (字段2);
-- 將表1中的字段1設(shè)置為外鍵湖员,并且讓這個(gè)外鍵的值參照表2中的字段2
1.3 刪除外鍵約束
alter table 表名 drop foreign key 外鍵索引名;
3.3 高級(jí)查詢
3.3.1 聚合:max()/min()/sum()/avg()/count()
SELECT score FROM tb_score;
SELECT max(score) as max_score FROM tb_score; -- 獲取tb_score表中字段score的最大值
SELECT min(score) as min_score FROM tb_score; -- 獲取tb_score表中字段score的最小值
SELECT sum(score) as sum_score FROM tb_score; -- 獲取tb_score表中字段score的和
SELECT AVG(score) as avg_score FROM tb_score; -- 獲取tb_score表中字段score的平均值
SELECT COUNT(score) as count_score FROM tb_score WHERE score>80; -- 統(tǒng)計(jì)tb_score表中字段score大于80的個(gè)數(shù)
3.3.2 分組
SELECT 字段操作 FROM 表名 WHERE 條件 GROUP BY(字段2);
-- 將指定表中滿足條件的記錄按照字段2的進(jìn)行分組(值是一樣的在一個(gè)組里面), 然后再講每個(gè)分組作為整體按照指定字段進(jìn)行指定聚合操作
-- 注意:a.字段操作的位置除了分組字段不用聚合,其他字段都必須聚合 b.分組的時(shí)候where要放到分組前對(duì)需要分組的數(shù)據(jù)進(jìn)行篩選
select stuid, avg(score) from tb_score group by(stuid);
-- having: 分組的時(shí)候瑞驱,在分組后用having代替where來對(duì)分組后的數(shù)據(jù)進(jìn)行篩選
select stuid, max(score) from tb_score group by(stuid) having max(score)>90;
select stuid, avg(score) from tb_score group by(stuid) having avg(score)>80;
3.3.3 子查詢
-- 將一個(gè)查詢的結(jié)果作為另外一個(gè)查詢的條件或者查詢對(duì)象
-- 第一種子查詢: 將查詢結(jié)果作為另外一個(gè)查詢的條件
-- 獲取成績大于90分的學(xué)生姓名
select stuname from tb_student where stuid in
(select stuid from tb_score where score>90);
-- 第二周子查詢:將一個(gè)查詢的結(jié)果作為查詢對(duì)象提供給另外一個(gè)查詢娘摔。但是第一個(gè)查詢結(jié)果需要重命名
select score from (SELECT stuid,score from tb_score where score>80) as t2;
3.3.4 連接查詢 - 同時(shí)查詢多張表
1. 直接連接
select * from 表名1,表名2,表名3 連接條件 查詢條件;
-- 注意: 如果既有連接條件又有查詢條件,查詢條件必須放在連接條件的后面
-- 查詢所有學(xué)生的名字和學(xué)院名字
select stuname, collname from tb_student, tb_college where tb_student.colid=tb_college.collid;
2.內(nèi)連接
SELECT * FROM 表1 inner join 表2 on 表2的連接條件 inner join 表3 on 表3的連接條件 ...;
-- 注意: 中間表寫在最前面(存在關(guān)聯(lián)其他表外鍵的表)
3.外連接
-- 外連接分為左外連接唤反、右外連接和全連接凳寺, 但是在MySQL中支持左外連接和右外連接
-- 左外連接:將左表中對(duì)應(yīng)字段的所有數(shù)據(jù)取出,然后再對(duì)應(yīng)的右表中字段的值彤侍,如果右表對(duì)應(yīng)的值不存在結(jié)果就為null
-- 右外連接:將右表中對(duì)應(yīng)字段的所有數(shù)據(jù)取出肠缨,然后再對(duì)應(yīng)的左表中字段的值,如果左表對(duì)應(yīng)的值不存在結(jié)果就為null
select * from 表1 left join 表2 on 連接條件;
select * from 表1 right join 表2 on 連接條件;
-- 獲取所有學(xué)生的成績
select stuname, score from tb_student left join tb_score on tb_student.stuid=tb_score.sid;
4. DCL(數(shù)據(jù)控制語言)
DCL主要提供grant和revoke來授權(quán)和召回權(quán)限
4.1 用戶管理
1. 添加用戶
create user 用戶名@登錄地址; -- 創(chuàng)建數(shù)據(jù)用戶盏阶,登錄不需要密碼
-- 登錄地址 - 限制用戶能夠登錄MySQL的主機(jī)地址晒奕,可以賦值為: ip地址(指定地址)、localhost(數(shù)據(jù)庫本機(jī))名斟、%(任何位置)
create user 用戶名@登錄地址 identified by 密碼; -- 創(chuàng)建數(shù)據(jù)用戶脑慧,登錄需要輸入指定密碼密碼
-- 示例:
create user zhangsan@localhost;
create user lisi@localhost identified by '123456';
2. 刪除用戶
drop user 用戶名;
drop user zhangsan;
4.2 權(quán)限管理
1. 授權(quán)
grant 權(quán)限類型 on 數(shù)據(jù)庫.對(duì)象 from 用戶名;
-- 常見權(quán)限類型: delete(刪除權(quán)限), select(查詢權(quán)限),update(更新權(quán)限),insert(插入權(quán)限), all PRIVILEGES(所有權(quán)限)
-- 示例:
GRANT SELECT on school.tb_student TO 'zhangshan';
GRANT UPDATE on school.tb_student TO 'zhangshan';
GRANT all PRIVILEGES ON school.* TO 'zhangshan'; -- 添加所有權(quán)限
2.召回授權(quán)
revoke 權(quán)限類型 on 數(shù)據(jù)庫.對(duì)象 from 用戶名;
-- 示例:
REVOKE DELETE on school.* FROM 'zhangshan';
REVOKE all PRIVILEGES on school.* FROM 'zhangshan';
REVOKE all PRIVILEGES on school.* FROM 'zhangshan';
REVOKE SELECT on school.tb_student FROM 'zhangshan';
REVOKE UPDATE on school.tb_student FROM 'zhangshan';
4.3 事務(wù)
完成一個(gè)任務(wù)需要執(zhí)行多條sql,但是要求這多個(gè)操作中只要有一個(gè)操作失敗砰盐,這個(gè)任務(wù)就失敗闷袒,數(shù)據(jù)全部還原;所有的操作都成功楞卡,整個(gè)任務(wù)才成功的時(shí)候就使用事務(wù)
-- 開啟事務(wù)環(huán)境
begin;
需要執(zhí)行的多個(gè)操作對(duì)應(yīng)的sql語句
-- 提交事務(wù)(只有begin到commit之間的所有的sql都執(zhí)行成功霜运,才會(huì)執(zhí)行commit; 否則執(zhí)行rollback)
COMMIT;
-- 事務(wù)回滾(放棄beigin到commit之間執(zhí)行成功的所有sql語句的結(jié)果)
ROLLBACK;
5. 視圖
視圖是關(guān)系型數(shù)據(jù)庫中將一組查詢指令構(gòu)成的結(jié)果集組合成可查詢的數(shù)據(jù)表的對(duì)象。簡單的說蒋腮,視圖就是虛擬的表淘捡,但與數(shù)據(jù)表不同的是,數(shù)據(jù)表是一種實(shí)體結(jié)構(gòu)池摧,而視圖是一種虛擬結(jié)構(gòu)焦除,你也可以將視圖理解為保存在數(shù)據(jù)庫中被賦予名字的SQL語句。
使用視圖可以獲得以下好處:
- 可以將實(shí)體數(shù)據(jù)表隱藏起來作彤,讓外部程序無法得知實(shí)際的數(shù)據(jù)結(jié)構(gòu)膘魄,讓訪問者可以使用表的組成部分而不是整個(gè)表,降低數(shù)據(jù)庫被攻擊的風(fēng)險(xiǎn)竭讳。
- 在大多數(shù)的情況下視圖是只讀的(更新視圖的操作通常都有諸多的限制)创葡,外部程序無法直接透過視圖修改數(shù)據(jù)。
- 重用SQL語句绢慢,將高度復(fù)雜的查詢包裝在視圖表中灿渴,直接訪問該視圖即可取出需要的數(shù)據(jù);也可以將視圖視為數(shù)據(jù)表進(jìn)行連接查詢胰舆。
- 視圖可以返回與實(shí)體數(shù)據(jù)表不同格式的數(shù)據(jù)骚露,
1. 創(chuàng)建視圖
create view 視圖名 as sql查詢語句;
-- 示例:
create view vw_student
as SELECT * FROM tb_student;
2. 使用視圖 - 視圖在用的時(shí)候可以直接當(dāng)成表來使用
-- 示例:
select * FROM vw_student;
select stuname, collname from vw_student, tb_college where vw_student.colid=tb_college.collid;
6. 索引
索引相當(dāng)于書本的目錄,為表創(chuàng)建索引可以加速查詢(用空間換時(shí)間)缚窿。
索引雖然很好棘幸,但是不能濫用:
索引會(huì)占用額外的空間
索引會(huì)讓增刪改變得更慢
如果哪個(gè)列經(jīng)常被用于查詢的篩選條件那么就應(yīng)該在這個(gè)列上建立索引。
主鍵上有默認(rèn)索引(唯一索引)
1. 創(chuàng)建索引
-- 如果使用模糊查詢倦零,查詢條件不以%開頭误续,那么索引有效
-- 如果使用模糊查詢,查詢條件以%開頭扫茅,那么索引無效(盡量避免)
create index 索引名 on 表名 (字段); -- 給指定表的指定字段添加索引
create unique index 索引名 on 表名 (字段); -- 給指定表的指定字段添加唯一索引
-- 示例:
create index idx_stuname on tb_student(stuname);
create unique index idx_stuname on tb_student(stuname);
2. 刪除索引
alter table 表名 drop index 索引名; -- 刪除指定索引女嘲,唯一索引也是這樣刪
-- 示例:
alter table tb_student drop index idx_stuname;
注意: 可以通過explain來查看sql的執(zhí)行計(jì)劃
Redis
1.下載安裝Redis
1.1 wget http://download.redis.io/releases/redis-5.0.7.tar.gz 下載Redis安裝包.
1.2 gunzip redis-5.0.7.tar.gz 解壓安裝包
1.3 tar -xvf redis-5.0.7.tar 解歸檔壓縮包
1.4 cd redis-5.0.7 進(jìn)入Redis目錄下
1.5 make && make install 編譯,并安裝redis
1.6 啟動(dòng)Redis服務(wù): redis-server
1.7 進(jìn)入Redis客戶端: redis-cli
1.8 關(guān)閉服務(wù): 查看redis的進(jìn)程編號(hào):ps –ef | grep redis
? kill -9 redis的進(jìn)程編號(hào) 殺死redis進(jìn)程
1.9 命令 & ---> 將命令放到后臺(tái)運(yùn)行(如下載任務(wù))
? jobs ---> 查看后臺(tái)運(yùn)行的命令
? fg %編號(hào) ---> 將后臺(tái)命令放到前臺(tái)運(yùn)行
? Ctrl+z ---> 將前臺(tái)命令暫停并放到后臺(tái)
? bg %編號(hào) ---> 將暫停的命令在后臺(tái)運(yùn)行
1.10 殺死進(jìn)程
? ps aux 列出系統(tǒng)中正在運(yùn)行的進(jìn)程,找到想要?dú)⑺赖某绦虻木幪?hào)
? kill -9 '進(jìn)程編號(hào)' 殺死進(jìn)程
1.11 redis-server --requirepass 密碼 >> redis.log & 啟動(dòng)reids服務(wù)并設(shè)置密碼 放到后臺(tái)運(yùn)行
1.12 auth 密碼 驗(yàn)證身份進(jìn)行操作redis(在進(jìn)入redis客戶端后輸入)
2.Redis數(shù)據(jù)類型
Redis的核心數(shù)據(jù)類型:
- 字符串
set key value ---> 添加鍵值對(duì)
get key ---> 通過鍵查看值
strlen key ---> 獲取字符串長度
append key value2 ---> 給字符串追加內(nèi)容
mset key1 value1 key2 value2 ---> 添加多組鍵值對(duì)
mget key1 key2 ---> 查看多個(gè)鍵對(duì)應(yīng)的值
incr key ---> 值加1
incrby key value ---> 值加上value
decr key ---> 值減1
decrby key value ---> 值減去value
getrange key start end ---> 獲取字符串指定范圍的子串
setrange key offset value ---> 修改字符串指定位置的內(nèi)容 - 哈希(表) - hash
hset key field value ---> 添加hash類型鍵值對(duì)
hmset key field1 value1 field2 value2 ---> 添加多組hash類型鍵值對(duì)
hget key field ---> 獲取hash類型字段對(duì)應(yīng)的值
hmget key field1 field2 ---> 獲取hash類型多個(gè)字段對(duì)應(yīng)的值
hgetall key ---> 獲取hash類型所有的字段和對(duì)應(yīng)的值
hkeys key ---> 獲取hash類型所有的字段
hvals key ---> 獲取hash類型所有字段的值
hexists key field ---> 判斷hash類型某個(gè)字段是否存在 - 列表 - list
lpush key value1 value2 value3 ---> 在左邊添加元素
rpush key value1 value2 value3 ---> 在右邊添加元素
lpop key ---> 從左邊移除一個(gè)元素
rpop key ---> 從右邊移除一個(gè)元素
lrange key start end ---> 查看列表指定范圍的元素
llen key ---> 查看列表元素個(gè)數(shù)
lindex key index ---> 查看列表指定位置元素
lrem key count value ---> 刪除列表中指定元素 - 集合 - set
sadd key value1 value2 value3 ---> 添加元素
srem key value ---> 刪除元素
spop ---> 獲取隨機(jī)元素
scard key ---> 查看元素個(gè)數(shù)
smembers key ---> 查看所有元素
sismember key value ---> 查看集合中有沒有指定元素
sinter key1 key2 ---> 交集
sunion key1 key2 ---> 并集
sdiff key1 key2 ---> 差集 - 有序集合 - zset
zadd key score1 mem1 score2 mem2 ---> 添加元素
zrem key mem ---> 刪除元素
zrange key start end ---> 按score的升序查看元素
zrevrange key start end ---> 按score的降序查看元素
zscore key mem ---> 查看元素對(duì)應(yīng)的score
zincrby key value mem ---> 修改元素的score值
免密操作:
1.打開終端,用戶主目錄下查看是否有一個(gè).ssh文件(ls .ssh)
2.輸入 ssh-keygen -t rsa -b 1024 (生成密鑰的強(qiáng)度) -c 郵箱地址 命令生成密鑰對(duì)(公鑰和私鑰)
3.生成的密鑰在新生成的.ssh文件夾中(.ssh文件在c盤的用戶目錄下诞帐,id_rsa.pub-公鑰 文件)欣尼,打開文件,將密鑰復(fù)制粘貼到需要的地方
創(chuàng)建新項(xiàng)目:
1.從版本控制克隆到本地
2.配置虛擬環(huán)境- interpretion(加入依賴庫)
3.生成依賴項(xiàng)清單(pip freeze >requirements.txt)(pip install -r requirements.txt)
4.生成版本控制忽略文件
5.push到git