關系型數據庫的核心內容是 關系 即 二維表
MYSQL的啟動和連接
show variables; 【所有的變量】
1服務端啟動
查看服務狀態
sudo /etc/init.d/mysql status 狀態
sudo /etc/init.d/mysql start 開啟
sudo /etc/init.d/mysql stop 停止
.... restart 重啟
.... reload 生效配置【熱】,不是所有都可以生效
2 客戶端連接
mysql -h 主機地址 -u 用戶名 -p 密碼
mysql -hlocalhost -uroot -p
庫的命名規則:
1,數字,字母,__,但是不能是純數字
2, 庫名區分字母大小寫
3,不能使用特殊字符 和 MYSQL關鍵字
基本操作
1,查看所有庫,所有表
show databases;
show tables;
2. 創建庫
create database 庫名;
create database 庫名 character set utf8; 設置庫的字符集類型
如何更改庫的默認字符集:
1 更改配置文件: 部分系統不一樣 文件名【mysqld.cnf】
1 獲取root 權限
2 cd/etc/mysql/mysql.d
3 cp mysqld.cnf mysqld.cnf.bak
4 subl mysqld.cnf
5 在[mysqld]下:
character_set_server=utf8 [更改庫的默認字符集]
6 /etc/init.d/mysql restart
3.查看創建庫的語句
show create database 庫名;
4,查看當前所在位置庫
select database();
5. 切換庫
use 庫名;
6.刪除庫
drop database 庫名;
創建表:
表的基本操作:
1 創建表: 【表名.frm(表結構) 表名.ibd(表數據) 存儲引擎innodb】
create table 【if not exist】表名(
字段名 數據類型,
字段名 數據類型,
字段名 數據類型
)character set utf8;

CREATE TABLE `test`.`users` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `age` int(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
需要注意的是這個符號不是單引號,而是【`】這個符號
2 查看創建表的語句(字符集,存儲引擎)
show create table 表名;
3 查看表結構,(詳細信息)
desc 表名;
4 刪除表
drop table 表名;
root@tedu:/home/tarena/下載# cd /var/lib/mysql 【查看表的存儲路徑,下面都是表的存儲位置】
root@tedu:/var/lib/mysql# ls
auto.cnf ib_buffer_pool ib_logfile0 ibtmp1 mysql_upgrade_info sys
debian-5.7.flag ibdata1 ib_logfile1 mysql performance_schema text
【表名.frm(表結構) 表名.ibd(表數據) 存儲引擎innodb】
斷開與數據庫連接:exit;|quit;|\q;
數據類型
1 數值類型
1 整數 1個字節占8位
1 int 大整型(占用4個字節)32 取值范圍:0~(2**32-1) 42億多
2 tinyint 微小整型(占用1個字節)8 0~2**8-1
有符號(signed默認) :-128~127
無符號(unsigned) : 0~255
age tinyint unsigned;
3 smallint 小整型(2個字節)
4 bigint 極大整型(8個字節)
2 浮點型
1 float (占用4個字節,最多顯示7個有效位)
字段名:float(m,n) M->總位數,m的最大為7 n->小數位位數
float(5,2) -999,99~999.99
1 浮點型 插入整數時,自動補全小數位位數
2 小數位如果多於指定位數,對指定位下一位四舍五入
2 double 最多顯示15個有效位
字段名 double(m,n)
3 decimal(m,n)
1 存儲空間(整數部分,小數部分分開存儲)
規則:將9的倍數包裝成4個字節
余數 字節
0 0
1-2 1
3-4 2
5-6 3
7-8 4
例:decimal(19,9)
整數部分:10/9=1余1 4字節+1字節 =5
小數部分:9/9=1余0 4字節+0字節 =4
消耗總共:9個字節
2 字符類型
1 char : 定長
char(寬度) 寬度取值范圍:1~255 寬度指的是字符的寬度
char(20)
插入一個 'A' 也是占20個字節 ,沒有20字節就補空格
2 varchar : 變長
varchar(寬度) 寬度取值范圍 : 1~65535
3 text / longtext(4G) / blob / longblob
4 char 和 varchar 的特點為
1 char : 浪費存儲空間,性能高
2 varchar : 節省存儲空間,性能低
5 字符類型的寬度和數值類型寬度的區別
1 數值類型寬度為顯示寬度,只用於select 查詢時顯示,和占用存儲無關,可用zerofill查看效果
id int(3) zerofill,
2 字符類型的寬度超過后無法存儲
3 枚舉類型
1 單選 enum
sex enum(值1,值2,...)
2 多選 set
hobby set(值1,值2,...)
###插入記錄時 'study,python,mysql'
4 日期時間類型
1 date: 'YYYY-MM-DD'
2 datetime: 'YYYY-MM-DD HH:MM:SS' 【不給值,默認返回null】
3 timestamp : 'YYYY-MM-DD HH:MM:SS' 【不給值,默認返回系統當前時間】
4 time : 'HH:MM:SS' 【不常用】
insert into 表(timesstamp) values(now());
【可調用now()函數直接獲取當前時間插入】
日期時間函數
1 now() 返回服務器當前時間
2 curdate() 當前日期
3 date("1999-09-09 09:09:09") ---> 【1999-09-09】 提取年月日
4 time('...') 提取 時分秒
5 year('...') 提取 年
where 字段名 運算符(now()-interval 時間間隔單位);
時間間隔單位:
2 day | 3 hour | 1 minute | 2 year | 3 month
示例:
1
查詢一天以內的 -----> select * from t2 where cztime>=(now()-interval 1 day)
查詢一天之前,三天以內的記錄 ----> SELECT * from t1 where cztime>=(now()-INTERVAL 15 day) and cztime<=(now()-INTERVAL 1 day)
表字段操作
1 語法 alter table 表名...
2 添加字段(add)
alter table 表名 add 字段 數據類型; 【默認添加到字段最后】
alter table 表名 add 字段 數據類型 first; 添加到字段首
alter table 表名 add 字段 數據類型 after 字段名; 添加到哪個字段之后
3 刪除字段
alter table 表名 drop 字段名;
4 修改字段數據類型(modify)
alter table 表名 modify 字段名 新數據類型;
會受到表中已有數據的限制
5 修改表名(rename)
alter table 表名 rename 新表名;
6 修改字段名(change)
alter table 表名 change 原字段名 新字段名 數據類型;
運算符操作
數值比較&&字符比較&&邏輯比較
數值比較:= != > >= <=
字符比較: = !=
邏輯比較:
and 兩個或者多個條件同時成立
or 有一個條件滿足即可
...where country='蜀國' or country='魏國'; 列出蜀國和魏國的記錄
范圍內比較
between 值1 and 值2
in (值1,值2)
not in(值1,值2)

+------+-----------+--------+--------+------+---------+ | id | name | gongji | fangyu | sex | country | +------+-----------+--------+--------+------+---------+ | 1 | 諸葛亮 | 120 | 20 | 男 | 蜀國 | | 2 | 司馬懿 | 119 | 25 | 男 | 魏國 | | 3 | 關羽 | 188 | 60 | 男 | 蜀國 | | 5 | 孫權 | 100 | 60 | 男 | 吳國 | +------+-----------+--------+--------+------+---------+ 4 rows in set (0.00 sec) mysql> select * from sanguo where (gongji between 100 and 200)and country='蜀國';
空: is null
非空: is not null
null: 空值,只能用is ,is not null 去匹配
'' :空字符串,只能用 =,!= 去匹配
模糊查詢(like)
1 where 字段名 like 表達式
2 表達式
1,_ : 匹配單個字符
2, % : 匹配0到多個字符
select name from sanguo where name like "_%_"; #name中有兩個字符以上的 select name from sanguo where name like "%"; #匹配所有,但不包括null select name from sanguo where name like "___"; #匹配名字為3個字符的 select name from sanguo where name like "趙%"; #匹配姓趙的英雄
表記錄的管理:插入
插入語句,
insert into 表名 values(id1,'xxx'),(id2,'***')...; 【不用字段名,直接插入】
insert into 表名(字段1,字段2,字段3..) values(值1,值2,值3,...); 【剩下沒有指定插入的值,將為成為空值(null)】
INSERT INTO list(soure) VALUES('2018-5-8') INSERT INTO list(soure) VALUES('2018-8-8'),('2019-9-8')
查詢語句;
1,select * from 表名 where 條件;
2,select 字段1,字段2 from 表名
distinct : 不顯示字段的重復值
1 。語法 select distinct 字段1,字段2 from 表名;
如果字段1的值和字段2的值全部相同,才會去重,
刪除表記錄(delete)
1 delete from 表名 where 條件; 【不加where條件 全部刪除表記錄】
更新表記錄(update)
update 表名 set 字段1=值1,字段2=值2 where 條件
SQL高級查詢
1 總結
3 select ... 聚合函數 from 表名
1 where ...
2 group by ...
4 having ...
5 order by ...
6 limit ...
2 order by... 給查詢結果排序
1 order by 字段名 ASC(默認升序) / DESC(降序)
2 按防御值從高到低排序

3 將蜀國英雄按攻擊值從高到低排序

4 將魏蜀兩國英雄中名字為3個字符的,按防御值升序排序

3 limit (永遠放在SQL命令的的最后寫)
1 顯示查詢記錄的條數
2 用法
limit n;--->顯示n條記錄
limit m,n; -->從第m+1條記錄開始,顯示 n 條
3 分頁
每頁顯示5條記錄,顯示第4頁的內容
每頁顯示n條記錄,顯示第M頁的內容
第M頁,limit(m-1)*m,n
4 聚合函數
1 分類
avg(字段名):求該字段的平均值
sum(字段名):求和
max(字段名):最大值
min(字段名): 最小值
count(字段名):統計該字段記錄的個數
select max(gongji) from sanguo;
select name,max(gongji) as max from sanguo; 引入別名函數 別名[max]
5 group by : 給查詢的結果進行分組
1 查詢表中都有哪些國家
select country from sanguo group by country;
2 計算每個國家的平均攻擊力
先分組,再聚合, 再去重
select country,avg(gongji) from sanguo group by country;
3 select 之后的字段名如果沒有在group by 之后出現,則必須要對該字段進行聚合處理(聚合函數)
4 查找所有國家中英雄數量最多的前2名的國家名稱和英雄數量
5 having 語句
1 作用 :對查詢結果進行進一步的篩選
2 找出平均攻擊力大於105的國家的前2名, 顯示國家名稱和平均攻擊力

3
1 having 語句通常和group by 語句聯合使用,過濾由 group by 語句返回的記錄集
2 where 只能操作表中實際存在字段,having語句可操作由聚合函數生成的顯示列
4 查詢記錄時做數學運算
1 運算符 + - * / %
2 查詢時顯示所有英雄攻擊力翻倍
select id,name,gongji*2 as newgj from sanguo;
2 嵌套查詢(子查詢)
1 定義: 把內層的查詢結果作為外層的查詢條件
2 語法
select ... from 表名 where 字段名 運算符 (select ... from 表名 where 條件);
練習 找出每個國家攻擊力最高的英雄的名字和攻擊值

上面的查詢可能會出現一些人BUG,所以為了防止BUG的發生,作出一點修改
多表查詢。連表查詢
1 SELECT * FROM list_char LEFT JOIN list_name on list_char.pid=list_name.pid
1 兩種方式
1 笛卡爾積 : 不加where條件
使用一條記錄跟后面的每個表的記錄逐一匹配
2 加where 條件
select .. from 表1,表2 where 條件;
4 連接查詢
1 內連接(inner join)
1 語法格式
select 字段名列表 from 表1
inner join 表2 on 條件;【可以加個 】
inner join(等值連接) 只返回兩個表中聯結字段相等的行
2 外連接
1 左連接(left join)
1 以左表為主 顯示查詢結果
2 select 字段名列表 from 表1
left join 表2 on 條件
left join 表2 on 條件
3 練習 ,
顯示省,市詳細信息,要求省全部顯示

2 右連接(right join)
以右表為主顯示查詢結果,用法同左連接一模一樣
left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄
right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄
inner join(等值連接) 只返回兩個表中聯結字段相等的行
鎖
讀鎖(共享鎖)
寫鎖(互斥鎖,排他鎖)
2 鎖粒度
1 行級鎖:Innodb
select : 加讀鎖,鎖1行
update : 加寫鎖,鎖1行
2 表級鎖 : MyISAM
select : 加讀鎖,鎖當前整張表
update : 加寫鎖,鎖1張表
6 存儲引擎(Engine)
1 查看所有存儲引擎
show engines;
2 查看已有表的存儲引擎;
show create table 表名;
3 創建表指定存儲引擎
新表
create table 表名(...) engine=myisam;
已有表
alter tbale 表名 engine=myisam;
常用存儲引擎的特點
1 InnoDB 特點
1,支持事務,外鍵,行級鎖
2 共享表空間
表名.frm : 表結構和索引信息
表名.ibd : 表記錄
2 MyISAM特點
1 支持表級鎖
2 獨享表空間
表名.frm 表結構
表名.myd 表記錄 mydata
表名.myi 表索引 myindex
3 MEMORY存儲引擎
1 數據存儲在內存中,速度快
2 服務器重啟,MYSQL服務重啟后表記錄消失
4 如何決定使用哪個存儲引擎
1 執行查詢操作多的表使用 MyISAM引擎 【使用 InnoDB節省資源,表加鎖比行加鎖節省資源】
2 執行寫操作多的表使用 InnoDB
約束
1 作用 : 保證數據的一致性,有效性
2 約束分類
1 默認約束 (default)
插入記錄時,不給該字段賦值,則使用默認值
sex enum('H','F') default 'S',
2 非空約束(not null)
不允許該字段的值為null
id int not null,
id int not null default 0
create table t1(
id int not null,
name varchar(15) not null,
sex enum('m','f','s') default 's',
course varchar(20) not null default 'python'
)character set utf8;
索引
1 定義 :
對數據庫中表的一列或多列的值進行排序的一種結構(bTree)
2 優點
加快數據的檢索速度
3 缺點
1 當對表中數據更新時,索引需要動態維護,降低數據的維護速度
2 索引需要占用物理存儲空間
4 索引示例
使用 show variables like 'profiling' 查看當前狀態
1 開啟運行時間檢測 : mysql> set profiling=1
2 執行查詢語句 select name fromm t1 where name='lucy99999';
3 查看執行時間 show profiles;
4 在name 字段創建索引
create index name on t1(name);
5 再次執行查詢語句 select name fromm t1 where name='lucy99999';
5 索引 排序都是bTree,,區別只是約束不一樣
1 普通索引(index)
1 使用規則
1,可設置多個字段 ,字段值無約束
2 把經常用來查詢的字段設置為索引字段
3 KEY標志 : MUL
2 創建
1 創建表時創建 【create table t1 (id int ,name varchar(15) ,index(name),index(id));】 【創建兩個索引】
2 在已有表中創建索引 【create index 索引名 on 表名(字段名);】-->索引名一般寫字段名
3 查看索引
1 desc表名;--->KEY標志為 MUL
2 show index from 表名;
4 刪除index
drop index 索引名 on 表名;
2 唯一索引(unique)
1 使用規則:
1 可設置多個字段
2 約束:字段的值不允許重復,但可以為NULL
3 KEY標志 : UNI
2 創建
1 創建表時
unique(phnumber),
unique(cardnumber)
2 已有表
create unique index 索引名 on 表名(字段名);
3 查看,刪除同普通索引
刪除:drop index 索引名 on 表名;
3 主鍵索引(primary key)&&自增長屬性(auto_increment)
1 使用規則
1 只能有一個字段為主鍵字段
2 約束:字段值不允許重復,也不能為NULL
3 KEY標志:PRI
4 通常設置記錄編號字段id,能夠唯一鎖定一條記錄
2 創建
1 創建表時
1 id int primary key auto_increment,
2 id int auto_increment,
name varchar(20) not null
primary key(id,name)) 復合主鍵
auto_increment=10000,... 【ID從10000開始】
2 已有表
alter table 表名 add primary key(id);
alter table 表名 auto_increment=10000; 【補充】
3 刪除主鍵
1,先刪除自增長屬性(modify更改數據類型)
alter table 表名 modify id int;
2 刪除主鍵
alter table 表名 drop primary key;
4 外鍵(foreign key)
***明天講***
數據導入
1 作用: 把文件系統中的內容導入到數據庫中 出現亂碼情況往下看
2 語法格式
load data infile '文件名'
into table 表名
fields terminated by '分隔符'
lines terminated by '\n'
3 導入數據庫中
1 在數據庫中創建對應的表
2 執行數據導入
1 查看搜索路徑
show variables like 'secure_file_priv';

2 拷貝文件到上圖路徑
3 注意路徑和分隔符
亂碼情況下,,更改字符編碼
4 導出數據
語法格式
select ... from 表名
into outfile '文件名'
fields terminated by '分隔符'
lines terminated by '\n';
導入導出時,特別需要注意文件路徑,單詞的正確程度
5 查看,更改文件權限
1 【ls -l score.txt】
r : 讀
w : 寫
x :可執行
表的復制
1 語法
create table 表名 select ... from 表名 where 條件;
2 示例

3
復制下表,且若每頁顯示2條記錄,復制第3頁的內容

4 復制表結構
create table 表名 select ... from 表名 where false;
1 外鍵
1 定義: 讓當前表的字段值在另一張表的范圍內去選擇
2 語法格式
foreign key (參考字段名)
regerances 主表(被參考字段名)
on delete 級聯動作
on update 級聯動作;
3 使用規則
1 主表,從表字段數據類型要一致
2 主表 : 被參考字段是主鍵
3 創建主鍵

4 刪除外鍵
alter table 表名 drop foreign key 外鍵名;
外鍵名查看 : show create table 表名; -- >CONSTRAINT `bjtab_ibfk_1` FOREIGN KEY (`stu_id`) REFERENCES `jftab` (`id`)【紅字為外鍵名】
5 已有表創建主鍵
alter table bjtab add foreign key(stu_id) references jftab(id);
6 級聯動作:
1 cascade 數據級聯刪除,級聯更新(參考字段)
2 restrict(默認)
如果從表中有相關聯記錄,不允許主表操作
3 set null
主表刪除,更新,從表相關聯記錄字段值為null,
MYSQL 用戶賬戶管理
1 開啟mysql遠程連接(獲取root權限 改配置文件)
bind-address
2 用root 用戶添加授權用戶
1 用root 用戶登錄mysql
2 授權
mysql> grant 權限列表 on 庫名.表名 to "用戶名"@"%" identified by "密碼" with grant option;
權限列表 : all privileges | select | update
庫名.表名 : db4.* | *.*(所有庫的所有表)
3 示例
1 添加授權用戶tiger,密碼123,對所有庫的所有表有所有的權限,可從任何IP去連接
數據備份(mysqldump,在linux終端操作)
1 命令格式
msyqldump -u用戶名 -p 源庫名 > ***.sql
回車輸入數據庫密碼
2 源庫名的表示方式
--all-databases 備份所有庫
庫名 備份一個庫
-B 庫1 庫2 庫3 備份備份多個庫
庫名 表1 表2 表3 備份多張表
數據恢復
1 命令格式(linux終端)
mysql -u用戶名 -p 目標庫名 < ***.sql
2 從所有庫備份all.sql中恢復某一個庫
mysql -u 用戶名 -p --one-database < all.sql
注意:
1,恢復庫時,如果恢復到原庫會將表中的數據覆蓋,,新增表不會刪除
2 恢復庫時,如果庫不存在,則必須先創建空庫
MYSQL 調優
1 創建索引
在select .where .order by常涉及到的字段建立索引
2 選擇合適的存儲引擎
讀操作多 : MyISAM
寫操作多 : InnoDB
3 SQL語句優化(避免全表掃描)
1 where 子句盡量不使用 != ,否則放棄索引
2 盡量避免 NULL判斷,否則全表掃描
優化前 :
select number from t1 where number is null;
優化后 :
在number 字段設置默認值0,確保number 字段無NULL
select number from t1 where number=0
3 盡量避免用or 連接條件,否則全表掃描
優化前:
select id from t1 where id=10 or id=20
優化后:
select id from t1 where id=10
union all
select id fromm t1 where id=20
4 模糊查詢盡量避免使用前置 % ,否則全表掃描
select variable from t1 where name="%secure%";
5 盡量避免使用 in 和 not in,否則全表掃描
優化前
select id from t1 where id in (1,2,3,4);
優化后
select id from t1 where id between 1 and 4;
6 不能使用select * ...
用具體字段代替*,不要返回用不到的任何字段
事務和事務回滾
1 定義 : 一件事從開始發生到結束的整個過程。
2 作用 : 確保數據一致性
3 事務和事務回滾應用
1 SQL命令會 autocommit 到數據庫執行
2 事務操作
1 開啟事務
mysql> begin; | mysql> start transactions;
mysql> SQL命令...
##此時autocommit 被禁用##
2 終止事務
mysql> commit; | rollback;
1 python交互
1 python3
模塊名: pymysql
安裝 : sudo pip3 install pymysql
sudo pip3 install pymysql==版本號 【安裝指定版本】
離線:pymysql.tar.gz
解壓:setup.py
python setup.py install 【必須加上install】
2 python2
模塊名 : MySQLdb
安裝 : sudo pip install mysql-python
pymysql 使用流程
1 建立數據庫連接對象(db=pymysql.connect(...))
2 創建游標對象CUR(cur=db.cur***)
3 游標對象: cur.execute('SQL命令')
4 提交 db.commit
5 關閉游標對象
6 關閉數據庫連接對象
connet連接對象
1 db=pymysql.connet(參數列表)
1 host =主機地址
2 user =用戶名
3 password =密碼
4 database =庫名
5 charset =編碼方式,推薦utf8
6 port =端口號
2 db (數據庫連接對象)的方法
1 db.close()斷開連接
2 db.commit()提交到數據庫執行
3 db.cursor()游標對象,用來執行sql命令
4 db.rollback()回滾
3 cursor 游標對象的方法
1 erxecute(sql命令) : 執行SQL命令
2 close() : 關閉游標對象
3 fetchone() : 獲取查詢結果的第1條數據
4 fetchmany(n): 獲取N條記錄
5 fetchall() :獲取所有記錄
orm(Object Relation Mapping) 對象關系映射
#查詢一個表是否存在 SELECT table_name FROM information_schema.TABLES WHERE table_name ='tablename';