mysql數據庫筆記
Python數據庫
1、 數據庫概念
數據:文本、圖片、視頻、音頻、網頁……….
數據庫:按照一定的數據格式、結構存儲數據的倉庫
2、 為什麽使用數據庫存數據?
內存:
優點:存取速度快
缺點:
1、 容量小
2、 斷電後,數據不會保存
文件:
優點:數據可以持久化保存
缺點:
1、 讀取速度慢
2、 編碼格式不好控制
數據庫:
1、 容量大
2、 讀取速度快
3、 統一的編碼格式
3、怎樣操作數據庫?
數據庫管理軟件 Database Manage system
概念:簡稱DBMS,是一種操作數據庫的軟件
使用人員:
1、 程序員
2、 DBA Database Administrator 數據庫管理員
應用的本質是什麽?
對於開發人員:盡可能的用一種友好的方式,將數據傳輸給用戶。
對於用戶而言:獲取我們想要的數據。
4、數據庫管理軟件怎樣使用數據庫?
5、常用數據庫管理軟件 SQL
1、 MySQL
2、 Oracle
3、 MS SQL Server
4、 Sqlite
6、MySQL
概念:MsSQL是一個關系型數據庫管理系統。
優點:開源、免費、不要錢、跨平臺性支持好、提供了多種語言調用的API
Aplication interface 應用程序接口。 函數
使用範圍廣。
7、啥叫關系型?
關系模型概念:以行和列的形式進行數據的存儲
8、數據庫為什麽要采用關系模型進行數據存儲?
便於用戶理解
9、采用關系模型數據庫存儲的數據
關系模型 |
數據表 |
關系 |
表 |
屬性 |
字段(列) |
域 |
字段(列)的取值範圍 |
元祖 |
一行記錄(一條記錄) |
結論:
多行+多列=表
多表=數據庫
10、MySQL安裝
1、服務端的安裝
1、為啥安裝服務端?
畫圖演示
3、 安裝命令
sudo apt-get install mysql-server
sudo apt isntall mysql-client
sudo apt install libmysqlclient-dev
3、驗證安裝結果?
1、 查看服務是否開啟,命令:ps aux|grep mysql
2、 mysql服務相關命令
a) 啟動:sudo service mysql start
b) 停止:sudo service mysql stop
c) 重啟:sudo service mysql restart
2、客戶端的安裝
1、為啥安裝客戶端?
2、安裝流程
a) 登錄navicat官網下載
b) 將壓縮包拷貝ubuntu中進行解壓,解壓命令:tar zxvf navicat.tar.gz
c) 進入解壓目錄,運行命令./start
d) 刪除./navicat……
3、登錄數據庫
1、通過客戶端軟件登錄
2、通過命令登錄
登錄遠程主機:mysql [-h 192.168.205.129 –p 3306] –uroot –pmysql(註意:遠程登錄需要配置)
3、退出客戶端:exit quit ctrl+d
4、登錄本機:mysql –uroot -pmysql
3、配置msyql服務允許遠程登錄訪問
數據文件夾:
數據庫配置文件:
允許mysql遠程登錄: 配置文件:對程序的設置。 config
1、 防火墻
2、 sudo apt-get install ufw
3、 sudo ufw enable ubuntu firewall
4、 sudo ufw status
5、 sudo ufw disable
6、 軟件
a) 更改配置文件 bind-address
7、 權限
a) update `user` set host=”%” where user=”root”
4、重啟服務
允許指定用戶訪問:
GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘10.10.11.12‘ IDENTIFIED BY ‘FEFJay‘ WITH GRANT OPTION; flush privileges;
而IP這裏,可以使用%來表示所有IP
第一行中,10.10.11.12是一個ip地址,這個是允許遠程訪問的IP的值。自行改為其他值。
root是賬戶名,後面的FEFJay是密碼。
即,允許來自10.10.11.12的連接並使用root賬戶和FEFJay這個密碼進行訪問。
ALL PRIVILEGES ON 後面的*.*表示所有數據庫,即完全訪問權限,可以指定為特定數據庫。
而IP這裏,可以使用%來表示所有IP。
11、MySQL默認數據庫介紹
information_schema:元數據
mysql:當前數據庫信息
performance_schema:數據庫優化
sys:information_schema+performance_schema
SQL:操作數據的語言。結構化查詢語言
Summer SUMMER summer
12、創建數據庫
1、使用客戶端軟件
2、使用命令
create database 數據庫名
create database 數據庫名 character set utf8
show create database 數據庫名
3、修改數據庫編碼
alter database 數據庫名 character set utf8
4、刪除數據庫
drop database 數據庫名
5、切換、使用數據庫
use 數據庫名
6、顯示當前數據庫
select database()
7、展示所有數據庫
show databases
13、創建數據表
1、語法:
create table 表名
(
字段1 字段類型,
字段2 字段類型,
字段3 字段類型……
)
2、MySQL常用字段類型
1、整數
2、小數
Float |
Double |
Decimal |
Float |
Double |
Decimal |
Float(m,n) |
Double(m,n) |
Decimal(m,n) |
7個有效位 |
15個有效位 |
28個有效位 |
Float(5,2)999.99 |
Decimal(5,2) 999.99 |
|
m表示該值得總長度,D表示小數點後的位數
3、字符串
char、varchar、text、blob 超大型的文本,也不會存儲到數據庫中 圖片 文件
char 固定長度 char(10) 張三
varchar 可變長度 varchar(10) 張三 varchar(2)
地址
圖片:
/home/python/abc.jpg
圖片的二進制
char 固定長度 char(10) 張三
varchar 可變長度 varchar(10) 張三 張三 varchar(2)
char(8) varchar(8)
show full fields from table
4、enum 枚舉
enum(‘男’,’女’)
5、日期和時間
date:yy:mm:dd
datetime:yy-mm-dd hh:mm:ss
time:hh:mm:ss
14、練習,創建如下表
練習一:
SID |
SNAME |
SAGE |
SGENDER |
SBIR |
SADD |
1 |
張三 |
18 |
男 |
1990-01-01 |
中國北京 |
2 |
李四 |
19 |
女 |
1990-01-01 |
中國北京 |
練習二:
創建數據庫 School
TblStudent學生表
--tSId --學生編號
-- tSName --姓名
-- tSGender--性別
-- tSAddress --地址
-- tSPhone --電話
-- tSAge --年齡
-- tSBirthday --生日
-- tSCardId --身份證號
-- tSClassId --班級Id
TblScore成績表:
-- tScoreId(成績id,主鍵,自動編號)
-- tSId(學生編號)
-- tEnglish(英語成績)
-- tMath(數學成績)
TblClass班級表:
-- cId –班級ID
-- cName –班級名稱
-- cDesciption –班級描述
TblTeacher老師表:
-- tTId
-- tTName
-- tTGender
-- tTAge
-- tTSalary
pyt-- tTBirthday
***數據導出
mysqldump –uroot –p(註意不要輸入密碼) 要導出的數據庫名 到導出的數據庫表 > 目標文件.sql
mysqldump –uroot –p school > /home/python/Desktop/目標文件.sql
***數據導入
1、在數據庫中創建一個空數據庫
2、執行命令:mysql -uroot -p 新數據庫的名稱 < 要導入的數據庫名.sql
***對數據表進行增刪改查操作
15、select查詢
作用:查詢數據表中數據
查詢數據表中全部的行和列
查詢表的部分列
給查詢出來的數據列設置別名
DISTINCT關鍵字的使用
1、查詢數據表中全部的行和列
語法:
1、 select col1,col2,col3….from table
2、 select * from table
2、查詢表的部分列
select col1,col2,col3…from table
3、給查詢出來的數據列設置別名
select col1 as “別名1”,col2 as ‘別名2’…from table
select col1 ‘別名1’,col2 ‘別名2’….from table
註意多表查詢重名問題
4、DISTINCT關鍵字的使用
作用:消除結果集中的重復數據
語法:select distinct col from table
註意:要求所有的字段都相同才會去重
5、LIMIT關鍵字的使用
作用:指定結果的顯示範圍
語法:
1、 select * from table limit m,n
m:起始的位置
n:顯示的數量
2、 select * from table limit m
m:從第一條開始共顯示m條數據
16、插入數據
所有列都插入值
為特定列插入值
一次性插入多條記錄
1、所有列都插入值
語法:insert into table values(v1,v2,v3….)
特點:列值同數,列值同序
2、為指定列插入值
語法:insert into table(col1,col2,col3) values(v1,v2,v3)
特點:指定順序,列值對應
3、一次性插入多條記錄
語法:insert into table(co1,col2,col3…)values
(v1,v2,v3),
(v1,v2,v3),
(v1,v3,v3)…..
17、修改數據
修改指定數據
修改全部數據
1、修改指定數據
語法:update table set {col1=value1}[…n]where expressioin
2、修改全部數據
語法:update table set {col1=value1}[…n]
18、刪除數據
使用delete命令刪除數據
使用truncate命令刪除數據
使用邏輯刪除
1、使用delete命令刪除數據
語法:delete from table where expression
2、邏輯刪除
3、使用truncate命令刪除數據
truncate table
4、區別
1、Delete語句刪除數據,自動編號沒有恢復到默認值。但是truncate重新設置了自動編號
2、通過truncate語句刪除數據表數據,不能根據條件刪除,而是一次性刪除,delete語句可以根據條件進行刪除
3、truncate在清空表中數據的時候,速度要比delete語句快的多
19、對列進行增刪改查
增加一列
alter table tablename add 列名 數據類型
刪除一列
alter table tablename drop 、 列名
修改列的數據類型
alter table tablename modify 列名 數據類型
修改列的數據類型並且改名
alter table tablename change old_colname new_colname 數據類型
20、約束
問題1:數據冗余
問題二:失去了數據完整性
問題三:數據缺少唯一標識
問題四:失去了實體完整性
問題五:失去了引用完整性
問題六:失去了域完整性
約束概念:限定數據庫中數據的一套規則
約束作用:保證數據的準確性、完整性、可靠性、聯動性。
數據庫常用約束:
- 主鍵約束
- 自動增長
- 唯一約束
- 非空約束
- 默認約束
- 檢查約束
- 外鍵約束
主鍵約束
作用:讓數據具有唯一標識
語法:
create table table_primarykey
(
id int primary key
)
特點:自動設置非空約束
自動增長
作用:使數據自動增長,一般給主鍵設置
語法:
create table table_autoincrement
(
id int primary key auto_increment
)
唯一約束
作用:保證數據的準確性
語法:
create table table_unique
(
qqnumber int unique
)
特點:可以為多列設置唯一約束
非空約束
作用:保證數據不為空
語法:
create table table_notnull
(
name varchar(30) not null
)
默認約束
作用:給字段設置默認值
語法:
create table table_default
(
sex char(2) default ‘男’
)
檢查約束
作用:檢查數據的完整性
語法:
create table table_check
(
sex char(2) check(‘男’ or ‘女’)
)
create table table_enum
(
sex enum(‘男’,’女’)
)
外鍵約束
作用:讓兩表之間產生聯動關系
語法:
create table class
(
id int primary key auto_increment,
classname varchar(30) not null
)
create table score
(
id int primary key auto_increment,
chinese_score int not null,
foreign key(id) references class(id)
)
要想刪除class表和score表,首先要刪除score表
21、為數據增補約束
添加/刪除主鍵約束
1、添加主鍵約束
語法:alter table table_name add constrain con_name primary key(col_name)
2、刪除主鍵約束
外鍵約束
1、添加外鍵約束
語法:alter table table_name add constrain con_name foreign key(col_name) references table(col_name)
2、刪除外鍵約束
檢查約束
1、添加檢查約束
語法:alter table table_name add constraint con_name check(expression)
2、刪除檢查約束
默認約束
1、添加默認約束
語法:alter table table_name alter col_name default value
2、刪除默認約束
自動增長
1、添加自動增長
語法:alter table table_name modify column col_name type auto_increment
2、 刪除自動增長
22、約束練習
新建一張表:員工信息表
createtable Employees
(
EmpId int,
EmpName varchar(50),
EmpGender char(2),
EmpAge int,
EmpEmail varchar(100),
EmpAddress varchar(500)
)
createtable Department
(
DepId int ,
DepName varchar(50)
)
--手動刪除一列(刪除EmpAddress列)
--手動增加一列(增加一列EmpAddr varchar(1000))
--手動修改一下EmpEmail的數據類型(varchar(200))
--手動修改一下EmpEmail的數據類型及名稱
--為EmpId增加一個主鍵約束
--非空約束,為EmpName增加一個非空約束
--為EmpName增加一個唯一約束
--為年齡增加一個默認約束,默認為0
--為年齡增加一個檢查約束:年齡必須在-120歲之間,含0歲與120歲。
--創建一個部門表,然後為Employee表增加一個DepId列。
約束 查詢 添加 刪除 添加列 刪除列
主鍵約束 alter table tableName add constraint PK_name primary key(列名)
外鍵約束 alter table tablename add constraint FK_外鍵的列名_主鍵的列名 foreign key (外鍵列名) references 主鍵表名(主鍵名)
默認約束
alter table tableName modify 列名 類型 default 默認值
唯一約束
alter table tableName add constraint UQ_列名 unique 列名
非空約束
alter table tableName modify 列名 類型 not null
檢查約束
altert table tableName add constraint CK_列名 check(表達式)
自動增長
alter table tableName modify 列名 類型 auto_increment
--增加外鍵約束
createtable Employees
(
EmpId int,
EmpName varchar(50),
EmpGender char(2),
EmpAge int,
EmpEmail varchar(100),
EmpAddress varchar(500)
Deptid int
)
createtable Department
(
DepId int ,
DepName varchar(50)
)
primary key add constraint
foreign key add constraint
check
unique
modify
not null
default
註意:Department DepId主鍵問題
--刪除主鍵約束
1、先刪除主鍵的自動增長
2、刪除主鍵約束
alter table Employees drop primary key
--刪除外鍵約束
alter table Employees drop foreign key FK_DepId
--刪除唯一約束
alter table Employees drop index UQ_EmpName
23、數據表設計思想
設計流程 QQ號 昵稱 性別 得分….
需求分析:根據用戶的需求,分析出需要記錄的數據
需求設計:根據分析出的數據,設計E-R模型圖
詳細設計:將E-R模型圖轉換成數據表
三大範式:使用數據庫三大範式的設計思想對數據表進行審核
E-R模型圖 笛卡爾積
概念:Entity-Relationship,實體關系圖
組成元素:
舉例,將下面三張表用E-R模型圖表示出來
三大範式
概念:三大範式是數據庫的一種設計規範,主要用來檢查我們的數據庫是否存在冗余數據。
第一範式:每一列都具有原子性,也就是不能再分割
第二範式:要求每一個表,只描述一件事情
第三範式:要求表中不存在冗余字段
create table Score
(
sId int primary key auto_increment,
studentId int not null,
english float,
math float
)
create table teacher
(
tId int auto_increment primary key,
tName varchar(50) not null,
tSex char(2),
tAge int,
tSalary decimal
)
create table Class
(
cId int auto_increment primary key,
cName nvarchar(50) not null,
cDesciption text
)
createtable Student
(
SId intauto_incrementprimarykey,
SName varchar(50),
SGender char(2)notnull,
SAddress varchar(300),
SPhone varchar(100),
SAge int,
SBirthday datetime,
SCardId varchar(18)null,
SClassId intnotnull
)
24、條件查詢
普通條件查詢
模糊查詢
查詢空值的運算符
1、普通條件查詢
語法:select * from table where expression
select * from table where id != 1
where:將查詢到的數據,通過where後的expression一條一條的進行篩選,符合要求則顯示,不符合要求則去除。
2、模糊查詢
語法:
1、between….and….
2、範圍查詢 in 、or
3、like 通配符 %和_ % 隨便 _一個
3、查詢空值的運算符
is null is not null
25、數據排序
作用:對查詢出的數據進行升序或降序排列
語法:select col11,col2,col3…from table order by order_by_collist[asc/desc]
多列排序:
關註點:升序、降序、優先級
26、數據分組
語法:select col1..col2.. from table Group by col
分組配合排序
註意:如果使用了group by分組,那麽select不允許出現其他列,除非這些列包含在分組中。
27、聚合函數
作用:對多條數據做統計功能
註意:在使用聚合函數後,select後不允許出現其他列,除非這些列包含在分組中或者聚合函數中
常用聚合函數
聚合函數與Group by語句配合使用
練習:判斷下列sql語句是否正確
select c_class_id,count(*),c_age from t_student group by c_class_id
select c_class_id,count(*),count(c_age) from t_student group by c_class_id
28、Having by語句
作用:having 為group by之後得到數據進行進一步的篩選
類似於select 和 where的關系。Where為select後的數據進行進一步的篩選。
Having 為group by後的數據進行篩選
Select c_gender, avg(c_age) as ‘平均年齡‘ from t_student group by c_gender having 平均年齡 > 40;
綜合練習:
order_info表
1、 熱銷售商品排名表【即按照每種商品的總銷售數量排序】
- 根據商品名稱進行分組
- 通過 count() sum() 銷售數量總和
- 排序 降序
select 商品名稱,sum(銷售數量) as ‘總銷售數量’ from order_info group by 商品名稱 order by 總銷售數量 desc
2、 請統計銷售總結超過400元的商品名稱和銷售總價,並按照銷售總價降序排列
select 商品名稱,sum(銷售數量*銷售價格) as ‘銷售總價’from order_info group by 商品名稱 having 銷售總價>400 order by 銷售總價 desc
3、 統計每個銷售員對“樂百氏果凍”的銷售量
1、 根據銷售員進行分組
2、 篩選 樂百氏果凍
select 銷售員,sum(銷售數量) from order_info group by 銷售員
29、Limit關鍵字的使用
語法:
select * from table limit m
select * from table limit m,n
30、sql語句執行順序
1—from 表名
2—where
3—group by
4—select distinct *
5—having
6—order by
7—limit
Select c_gender, avg(c_age) as ‘平均年齡‘ from t_student where c_age > 10 group by c_gender having 平均年齡 > 40 order by 平均年齡 asc limit 2
31、連接查詢
當查詢結果的數據來自多張表的時候,需要將多張表連接成一個大的數據集,再選擇合適的列進行返回。
內連接:選擇兩種表中交叉的數據進行返回
左連接:選擇左表全部數據以及右邊中和左表相同的數據
右連接:選擇右表全部數據以及左表中和右表相同的數據
笛卡爾積:兩張表數據行的乘積
32、自關聯
概念:
讓某張表自己和自己進行連接。
思考:
設計省信息的表結構
create table province
(
id int,
ptitle varchar(30)
)
create table
city
(
id int,
ptitle varchar(30),
pid int 存儲當前城市所屬省的id
)
create table
xiancheng
(
id int,
ptitle varchar(30),
pid int
)
問題:
如果還有縣城的信息表、鄉鎮的信息表、村子的信息表,怎麽做?
解決方案:
把他們放到一張表中。
Create table areas
(
id int,
atitle varchar(100),
pid int
)
解釋:
1、 省份不需要填寫pid,設置為null即可
2、 城市的pid,填寫所屬省份的id
3、 這就是自關聯,表中的某一列關聯了表中的另外一列,但是他們的業務含義是不一樣的。
4、在這個表中,不需要改變結構,可以添加線程、鄉鎮、村子的信息表,只需要在pid填寫所屬的上級行政區的id即可。
導入數據:
source /home/python/Desktop/areas.sql
33、子查詢
概念:
將一個查詢結果在另一個查詢中使用,稱之為子查詢。
語法:
select * from (select col1,col2,col3 from table) as t
子查詢分類:
獨立子查詢:
子查詢可以獨立運行
相關子查詢:
子查詢中引用了父查詢的結果或者父查詢中引用了子查詢的結果,
子查詢和父查詢都不可以獨立運行
子查詢註意點:
1、如果主查詢使用到子查詢的數據,則必須給子查詢起一個表名。
2、在子查詢使用關系運算符的時候要註意,因為子查詢有可能返回多個值。
34、SQL演練
創建jing_dong數據庫
-- 創建 "京東" 數據庫
create database jing_dong charset=utf8;
-- 使用 "京東" 數據庫
use jing_dong;
-- 創建一個商品goods數據表
create table goods(
id int unsigned primary key auto_increment not null,
name varchar(150) not null,
cate_name varchar(40) not null,
brand_name varchar(40) not null,
price decimal(10,3) not null default 0,
is_show bit not null default 1,
is_saleoff bit not null default 0
);
-- 向goods表中插入數據
insert into goods values(0,‘r510vc 15.6英寸筆記本‘,‘筆記本‘,‘華碩‘,‘3399‘,default,default);
insert into goods values(0,‘y400n 14.0英寸筆記本電腦‘,‘筆記本‘,‘聯想‘,‘4999‘,default,default);
insert into goods values(0,‘g150th 15.6英寸遊戲本‘,‘遊戲本‘,‘雷神‘,‘8499‘,default,default);
insert into goods values(0,‘x550cc 15.6英寸筆記本‘,‘筆記本‘,‘華碩‘,‘2799‘,default,default);
insert into goods values(0,‘x240 超極本‘,‘超級本‘,‘聯想‘,‘4880‘,default,default);
insert into goods values(0,‘u330p 13.3英寸超極本‘,‘超級本‘,‘聯想‘,‘4299‘,default,default);
insert into goods values(0,‘svp13226scb 觸控超極本‘,‘超級本‘,‘索尼‘,‘7999‘,default,default);
insert into goods values(0,‘ipad mini 7.9英寸平板電腦‘,‘平板電腦‘,‘蘋果‘,‘1998‘,default,default);
insert into goods values(0,‘ipad air 9.7英寸平板電腦‘,‘平板電腦‘,‘蘋果‘,‘3388‘,default,default);
insert into goods values(0,‘ipad mini 配備 retina 顯示屏‘,‘平板電腦‘,‘蘋果‘,‘2788‘,default,default);
insert into goods values(0,‘ideacentre c340 20英寸一體電腦 ‘,‘臺式機‘,‘聯想‘,‘3499‘,default,default);
insert into goods values(0,‘vostro 3800-r1206 臺式電腦‘,‘臺式機‘,‘戴爾‘,‘2899‘,default,default);
insert into goods values(0,‘imac me086ch/a 21.5英寸一體電腦‘,‘臺式機‘,‘蘋果‘,‘9188‘,default,default);
insert into goods values(0,‘at7-7414lp 臺式電腦 linux )‘,‘臺式機‘,‘宏碁‘,‘3699‘,default,default);
insert into goods values(0,‘z220sff f4f06pa工作站‘,‘服務器/工作站‘,‘惠普‘,‘4288‘,default,default);
insert into goods values(0,‘poweredge ii服務器‘,‘服務器/工作站‘,‘戴爾‘,‘5388‘,default,default);
insert into goods values(0,‘mac pro專業級臺式電腦‘,‘服務器/工作站‘,‘蘋果‘,‘28888‘,default,default);
insert into goods values(0,‘hmz-t3w 頭戴顯示設備‘,‘筆記本配件‘,‘索尼‘,‘6999‘,default,default);
insert into goods values(0,‘商務雙肩背包‘,‘筆記本配件‘,‘索尼‘,‘99‘,default,default);
insert into goods values(0,‘x3250 m4機架式服務器‘,‘服務器/工作站‘,‘ibm‘,‘6888‘,default,default);
insert into goods values(0,‘商務雙肩背包‘,‘筆記本配件‘,‘索尼‘,‘99‘,default,default);
SQL習題:
- 查詢類型cate_name為 ‘超極本‘ 的商品名稱、價格
- 顯示商品的種類
- 求所有電腦產品的平均價格,並且保留兩位小數
- 顯示每種商品的平均價格
- 查詢每種類型的商品中 最貴、最便宜、平均價、數量
- 查詢所有價格大於平均價格的商品,並且按價格降序排序
- 查詢每種類型中最貴的類型 電腦 信息
思路:
1、 每種分類最貴的
2、 連接所有信息表
3、 選擇數據
問題:如果刪除了某一個商品類型的所有商品會出現什麽問題?
創建“商品分類”表
-- 創建商品分類表
create table if not exists goods_cates(
id int unsigned primary key auto_increment,
name varchar(40) not null
);
- 查詢goods表中商品的種類
- 將分組結果寫入到goods_cates數據表
insert into goods_cates(name) select cate_name from goods group by cate_name
同步數據表
- 通過goods_cates數據表來更新goods表
- 通過create...select來創建數據表並且同時寫入記錄,一步到位
update goods as g inner join goods_cates as c on g.cate_name=c.name set g.cate_name=c.id;
創建“商品品牌表”
-- select brand_name from goods group by brand_name;
-- 在創建數據表的時候一起插入數據
-- 註意: 需要對brand_name 用as起別名,否則name字段就沒有值
create table goods_brands (
id int unsigned primary key auto_increment,
name varchar(40) not null)
查詢goods_brands表中的brand_name
將分組結果寫入到goods_brand數據表
同步數據
通過goods_brands數據表來更新goods數據表
update goods name=b.id;
修改表結構
查看 goods 的數據表結構,會發現 cate_name 和 brand_name對應的類型為 varchar
但是存儲的都是數字
desc goods;
通過alter table語句修改表結構
alter table goods
change cate_name cate_id int unsigned not null,
change brand_name brand_id int unsigned not null;
外鍵
分別在 goods_cates 和 goods_brands表中插入記錄
insert into goods_cates(name) values (‘路由器‘),(‘交換機‘),(‘網卡‘);
insert into goods_brands(name) values (‘海爾‘),(‘清華同方‘),(‘神舟‘);
在 goods 數據表中寫入任意記錄
insert into goods (name,cate_id,brand_id,price)
values(‘LaserJet Pro P1606dn 黑白激光打印機‘, 12, 4,‘1849‘);
查詢所有商品的詳細信息 (通過內連接)
select g.id,g.name,c.name,b.name,g.price from goods as g
inner join goods_cates as c on g.cate_id=c.id
inner join goods_brands as b on g.brand_id=b.id;
查詢所有商品的詳細信息 (通過左連接)
select g.id,g.name,c.name,b.name,g.price from goods as g
left join goods_cates as c on g.cate_id=c.id
left join goods_brands as b on g.brand_id=b.id;
如何防止無效信息的插入,就是可以在插入前判斷類型或者品牌名稱是否存在呢? 可以使用之前講過的外鍵來解決
外鍵約束:對數據的有效性進行驗證
關鍵字: foreign key,只有 innodb數據庫引擎 支持外鍵約束
對於已經存在的數據表 如何更新外鍵約束
·
-- 給brand_id 添加外鍵約束成功
·
alter table goods add foreign key (brand_id) references goods_brands(id);
·
-- 給cate_id 添加外鍵失敗
·
-- 會出現1452錯誤
·
-- 錯誤原因:已經添加了一個不存在的cate_id值12,因此需要先刪除
· alter table goods add foreign key (cate_id) references goods_cates(id);
如何在創建數據表的時候就設置外鍵約束呢?
註意: goods 中的 cate_id 的類型一定要和 goods_cates 表中的 id 類型一致。
create table goods(
id int primary key auto_increment not null,
name varchar(40) default ‘‘,
price decimal(5,2),
cate_id int unsigned,
brand_id int unsigned,
is_show bit default 1,
is_saleoff bit default 0,
foreign key(cate_id) references goods_cates(id),
foreign key(brand_id) references goods_brands(id)
);
- 如何取消外鍵約束
·
-- 需要先獲取外鍵約束名稱,該名稱系統會自動生成,可以通過查看表創建語句來獲取名稱
·
show create table goods;
·
-- 獲取名稱之後就可以根據名稱來刪除外鍵約束
· alter table goods drop foreign key 外鍵名稱;
35、數據庫設計
36、使用pymysql對數據進行增刪改查
1、安裝pymysql
命令:pip3 install pymysql
2、pymysql執行流程
3、引入模塊
- 在py文件中引入pymysql模塊
from pymysql import *
4、Connection 對象
- 用於建立與數據庫的連接
- 創建對象:調用connect()方法
conn=connect(參數列表)
- 參數host:連接的mysql主機,如果本機是‘localhost‘
- 參數port:連接的mysql主機的端口,默認是3306
- 參數database:數據庫的名稱
- 參數user:連接的用戶名
- 參數password:連接的密碼
- 參數charset:通信采用的編碼方式,推薦使用utf8
對象的方法
- close()關閉連接
- commit()提交
- cursor()返回Cursor對象,用於執行sql語句並獲得結果
- 用於執行sql語句,使用頻度最高的語句為select、insert、update、delete
- 獲取Cursor對象:調用Connection對象的cursor()方法
5、Cursor對象
cs1=conn.cursor()
6、對象的方法
- close()關閉
- execute(operation [, parameters ])執行語句,返回受影響的行數,主要用於執行insert、update、delete語句,也可以執行create、alter、drop等語句
- fetchone()執行查詢語句時,獲取查詢結果集的第一個行數據,返回一個元組
- fetchall()執行查詢時,獲取結果集的所有行,一行構成一個元組,再將這些元組裝入一個元組返回
對象的屬性
- rowcount只讀屬性,表示最近一次execute()執行後受影響的行數
- connection獲得當前連接對象
制作京東案例:
提供用戶 1、查詢所有商品信息 2查詢所有分類信息
3、查詢所有品牌信息
以後一定習慣畫圖演示代碼執行過程
數據的備份和恢復
備份
mysqldump –uroot –p 數據庫名 > python.sql
恢復
連接mysql數據庫,創建新的數據庫
退出連接,執行如下命令
source:
mysql –uroot –p新數據庫名 <python.sql
37、SQL註入
create table user_info
(
id int unsigned primary key auto_increment not null,
name varchar(40) not null,
password varchar(40) not null
)
insert into user_info values(0,’張三’,’123abc’),(0,’李四’,’abc123’)
sql註入
如果用戶輸入’#,則會造成sql註入
解決方案:將參數以列表的方式傳入execute方法。
38、視圖
問題:
如果我有一個很復雜的sql語句,但是我還會經常使用該怎麽辦?
查詢goods和goods_cates和brands_cates的信息。
概念:
1、 視圖是一個虛擬表。
2、 視圖同樣跟真實表一樣包含行和列,但是視圖沒有在數據庫中真實的存儲數據
3、 視圖中行和列的數據都來自於其引用的真實表中行和列的數據
定義視圖:
create view 視圖名稱 as select 語句。
查詢goods和goods_cates和brands_cates的信息。
註意列同名問題。
create view v_detail as select a.id,a.name,a.cate_id,a.brand_id,a.price,b.name as ‘b_name‘ ,c.name as ‘c_name‘ from goods as a inner join goods_cates as b inner join goods_brands as c on a.cate_id =b.id and a.brand_id = c.id;
查看視圖:
查看所有的表,同時也會將所有的視圖顯示出來
show tables
使用視圖:
select * from 視圖名稱
刪除視圖:
drop view 視圖名稱
好處:
1、 安全性
2、 方便操作,減少編寫復雜的重復的sql語句
3、 易於擴展
例:a表、b表刪除,使用c表
視圖Demo:
查詢goods和goods_cates和goods_brands三張表中的信息
create view v_goods_details as select a.name as ‘aname‘,a.price ,b.name as ‘bname‘,c.name as ‘cname‘ from goods as a inner join goods_cates as b on a.cate_id=b.id inner join good
39、事務
為什麽會需要事務?
如,轉賬問題:
將A賬戶中的10000元,轉入到B賬戶中,需要三步:
- 檢查A的賬戶是否大於10000元
- 將A賬戶中的總金額減少10000元
- 將B賬戶中的總金額增加10000元
如果執行完第二步程序出問題了呢?
概念:
所謂事物,他就是一個操作序列,這些操作要麽都執行,要麽都不執行,它是一個不可分割的工作單位。
事務四大特性(ACID)
- 原子性
- 一致性
- 隔離性
- 持久性
原子性:
一個事務被看作為一個最小的工作單位,整個事務中的所有操作,要麽都提交成功,要麽都提交失敗,不可能只執行事務中的某一個部分。
一致性:
數據庫總是從一個一致性的狀態轉移到另一個一致性的狀態。事務中如果有操作沒有提交成功,其他操作也不可能提交成功。
隔離性:
一個事務在提交前,對其他事務是不可見的.
持久性:
一旦事務提交,則其所作的所有修改會永久性保存到數據庫中。
開啟事務
開啟事務後,修改的數據會存儲到本地緩存中,而不會修改物理表
begin
或者
start transaction
提交事務
將緩存中的數據變更到物理表中
commit
回滾事務
放棄緩存中的變更數據
rollback
註意點:
1、使用insert、update、delete會自動觸發事務。
可以通過set autocommit = 0進行命令行設置
2、表的insert、update、delete可以rollback
表的create/drop 不可以rollback
40、索引
1. 思考
在圖書館中是如何找到一本書的?
一般的應用系統對比數據庫的讀寫比例在10:1左右(即有10次查詢操作時有1次寫的操作),
而且插入操作和更新操作很少出現性能問題,
遇到最多、最容易出問題還是一些復雜的查詢操作,所以查詢語句的優化顯然是重中之重。
2. 解決辦法
當數據庫中數據量很大時,查找數據會變得很慢
優化方案:索引
3. 索引是什麽
索引是一種特殊的文件,它們包含著對數據表裏所有記錄的引用指針。
更通俗的說,數據庫索引好比是一本書前面的目錄,能加快數據庫的查詢速度。
4. 索引目的
索引的目的在於提高查詢效率
5. 索引原理
除了詞典,生活中隨處可見索引的例子,如火車站的車次表、圖書的目錄等。它們的原理都是一樣的,通過不斷的縮小想要獲得數據的範圍來篩選出最終想要的結果.
6. 索引的使用
- 查看索引
- 創建索引
- 如果指定字段是字符串,需要指定長度,建議長度與定義字段時的長度一致
- 字段類型如果不是字符串,可以不填寫長度部分
- 刪除索引:
show index from 表名;
create index 索引名稱 on 表名(字段名稱(長度))
drop index 索引名稱 on 表名;
7. 索引demo
7.1. 創建測試表testindex
create table test_index(title varchar(10));
7.2 使用python程序(ipython也可以)通過pymsql模塊 向表中加入十萬條數據
frompymysql
importconnect
def main():
# 創建Connection連接
conn = connect(host=
‘localhost‘,port=
3306,database=
‘jing_dong‘,user=
‘root‘,password=
‘mysql‘,charset=
‘utf8‘)
# 獲得Cursor對象
cursor = conn.cursor()
# 插入10萬次數據
for
i
inrange(
100000):
cursor.execute(
"insert into test_index values(‘ha-%d‘)"% i)
# 提交數據
conn.commit()
if__name__ ==
"__main__":
main()
7.3. 查詢
- 開啟運行時間監測:
- 查找第1萬條數據ha-99999
- 查看執行的時間:
- 為表title_index的title列創建索引:
- 執行查詢語句:
- 再次查看執行的時間
set profiling=1;
select * from test_index where title=‘ha-99999‘;
show profiles;
create index title_index on test_index(title(10));
select * from test_index where title=‘ha-99999‘;
show profiles;
8. 註意:
要註意的是,建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引文件。對於一個經常需要更新和插入的表格,就沒有必要為一個很少使用的where字句單獨建立索引了,對於比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。
建立索引會占用磁盤空間
8、 MySQL主從同步配置
1. 主從同步的定義
主從同步使得數據可以從一個數據庫服務器復制到其他服務器上,在復制數據時,一個服務器充當主服務器(master),其余的服務器充當從服務器(slave)。因為復制是異步進行的,所以從服務器不需要一直連接著主服務器,從服務器甚至可以通過撥號斷斷續續地連接主服務器。通過配置文件,可以指定復制所有的數據庫,某個數據庫,甚至是某個數據庫上的某個表。
使用主從同步的好處:
- 通過增加從服務器來提高數據庫的性能,在主服務器上執行寫入和更新,在從服務器上向外提供讀功能,可以動態地調整從服務器的數量,從而調整整個數據庫的性能。
- 提高數據安全,因為數據已復制到從服務器,從服務器可以終止復制進程,所以,可以在從服務器上備份而不破壞主服務器相應數據
- 在主服務器上生成實時數據,而在從服務器上分析這些數據,從而提高主服務器的性能
2. 主從同步的機制
Mysql服務器之間的主從同步是基於二進制日誌機制,主服務器使用二進制日誌來記錄數據庫的變動情況,從服務器通過讀取和執行該日誌文件來保持和主服務器的數據一致。
在使用二進制日誌時,主服務器的所有操作都會被記錄下來,然後從服務器會接收到該日誌的一個副本。從服務器可以指定執行該日誌中的哪一類事件(譬如只插入數據或者只更新數據),默認會執行日誌中的所有語句。
每一個從服務器會記錄關於二進制日誌的信息:文件名和已經處理過的語句,這樣意味著不同的從服務器可以分別執行同一個二進制日誌的不同部分,並且從服務器可以隨時連接或者中斷和服務器的連接。
主服務器和每一個從服務器都必須配置一個唯一的ID號(在my.cnf文件的[mysqld]模塊下有一個server-id配置項),另外,每一個從服務器還需要通過CHANGE MASTER TO語句來配置它要連接的主服務器的ip地址,日誌文件名稱和該日誌裏面的位置(這些信息存儲在主服務器的數據庫裏)
3. 配置主從同步的基本步驟
有很多種配置主從同步的方法,可以總結為如下的步驟:
- 在主服務器上,必須開啟二進制日誌機制和配置一個獨立的ID
- 在每一個從服務器上,配置一個唯一的ID,創建一個用來專門復制主服務器數據的賬號
- 在開始復制進程前,在主服務器上記錄二進制文件的位置信息
- 如果在開始復制之前,數據庫中已經有數據,就必須先創建一個數據快照(可以使用mysqldump導出數據庫,或者直接復制數據文件)
- 配置從服務器要連接的主服務器的IP地址和登陸授權,二進制日誌文件名和位置
4. 詳細配置主從同步的方法
主和從的身份可以自己指定,我們將虛擬機Ubuntu中MySQL作為主服務器,將Windows中的MySQL作為從服務器。 在主從設置前,要保證Ubuntu與Windows間的網絡連通。
4.1 備份主服務器原有數據到從服務器
如果在設置主從同步前,主服務器上已有大量數據,可以使用mysqldump進行數據備份並還原到從服務器以實現數據的復制。
4.1.1 在主服務器Ubuntu上進行備份,執行命令:
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql
說明
- -u :用戶名
- -p :示密碼
- --all-databases :導出所有數據庫
- --lock-all-tables :執行操作時鎖住所有表,防止操作時有數據修改
- ~/master_db.sql :導出的備份數據(sql文件)位置,可自己指定
4.1.2 在從服務器Windows上進行數據還原
找到Windows上mysql命令的位置
新打開的命令窗口,在這個窗口中可以執行類似在Ubuntu終端中執行的mysql命令
將從主服務器Ubuntu中導出的文件復制到從服務器Windows中,可以將其放在上面mysql命令所在的文件夾中,方便還原使用
在剛打開的命令黑窗口中執行還原操作:
mysql –uroot –pmysql < master_db.sql
4.2 配置主服務器master(Ubuntu中的MySQL)
4.2.1 編輯設置mysqld的配置文件,設置log_bin和server-id
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
4.2.2 重啟mysql服務
sudo service mysql restart
4.2.3 登入主服務器Ubuntu中的mysql,創建用於從服務器同步數據使用的帳號
mysql –uroot –pmysql
GRANT REPLICATION SLAVE ON *.* TO ‘slave‘@‘%‘ identified by ‘slave‘;
FLUSH PRIVILEGES;
4.2.4 獲取主服務器的二進制日誌信息
SHOW MASTER STATUS;
File為使用的日誌文件名字,Position為使用的文件位置,這兩個參數須記下,配置從服務器時會用到
4.3 配置從服務器slave(Windows中的MySQL)
4.3.1 找到Windows中MySQL的配置文件
4.3.2 編輯my.ini文件,將server-id修改為2,並保存退出。
4.3.3 打開windows服務管理
可以在開始菜單中輸入services.msc找到並運行
4.3.4 在打開的服務管理中找到MySQL57,並重啟該服務
5. 進入windows的mysql,設置連接到master主服務器
change master to master_host=‘10.211.55.5‘, master_user=‘slave‘, master_password=‘slave‘,master_log_file=‘mysql-bin.000006‘, master_log_pos=590;
註:
- master_host:主服務器Ubuntu的ip地址
- master_log_file: 前面查詢到的主服務器日誌文件名
- master_log_pos: 前面查詢到的主服務器日誌文件位置
6. 開啟同步,查看同步狀態
7. 測試主從同步
在Ubuntu的MySQL中(主服務器)創建一個數據庫
在Windows的MySQL中(從服務器)查看新建的數據庫是否存在
mysql數據庫筆記