轉載:MySQL看這一篇就夠了

No.1 數據庫概念

什麼是數據庫?

數據庫就是一種特殊的文件,內部存儲着須要的數據css

RDBMS

所謂關係數據庫,是創建在關係模型基礎的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據python

SQLmysql

SQL是結構化語言,是一種用來操做關係數據庫的數據庫語言,linux

SQL語句 說明 舉例
DQL 數據查詢語言 select
DML 數據操做語言 insert、update、delete
TPL 事物處理語言 begin、transaction、commit、rollback
DCL 數據控制語言 grant、revoke
DDL 數據定義語言 create、drop
CCL 指針控制語言 declare、cursor

MySQL

MySQL是一個關係數據庫管理系統nginx

特色:算法

  • 使用C和C++編寫,並使用了多種編譯器進行測試,保證源代碼的可移植性
  • 支持多種操做系統,如Linux、Windows、AIX、FreeBSD、HP-UX、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris等
  • 爲多種編程語言提供了API,如C、C++、Python、Java、Perl、PHP、Eiffel、Ruby等
  • 支持多線程,充分利用CPU資源
  • 優化的SQL查詢算法,有效地提升查詢速度
  • 提供多語言支持,常見的編碼如GB23十二、BIG五、UTF8
  • 提供TCP/IP、ODBC和JDBC等多種數據庫鏈接途徑
  • 提供用於管理、檢查、優化數據庫操做的管理工具
  • 大型的數據庫。能夠處理擁有上千萬條記錄的大型數據庫
  • 支持多種存儲引擎
  • MySQL 軟件採用了雙受權政策,它分爲社區版和商業版,因爲其體積小、速度快、整體擁有成本低,尤爲是開放源碼這一特色,通常中小型網站的開發都選擇MySQL做爲網站數據庫
  • MySQL使用標準的SQL數據語言形式
  • Mysql是能夠定製的,採用了GPL協議,你能夠修改源碼來開發本身的Mysql系統
  • 在線DDL更改功能
  • 複製全局事務標識
  • 複製無崩潰從機
  • 複製多線程從機

No.2 數據完整性

一個數據庫就是一個完整的業務單元,能夠包含多張表,在表中爲了更加精準的存儲數據,保證數據的正確性,能夠在建立表的時候,爲表增長一些強制性的驗證,包括數據類型、約束sql

數據類型

  • 整數:int,bit數據庫

  • 小數:decimal編程

  • 字符串:varchar,charvim

  • 日期時間: date, time, datetime

  • 枚舉類型(enum)

  • decimal表示浮點數,如decimal(5,2)表示共存5位數,小數佔2位

  • char表示固定長度的字符串,如char(3),若是填充ab時會補一個空格

  • varchar表示可變長度的字符串,如varchar(3),填充ab時就會存儲ab

  • 字符串text表示存儲大文本,當字符大於4000時推薦使用

  • 對於圖片、音頻、視頻等文件,不存儲在數據庫中,而是上傳到某個服務器上,而後在表中存儲這個文件的保存路徑
數值類型 類型 字節大小 有符號範圍(Signed) 無符號範圍(Unsigned)
TINYINT 1 -128 ~ 127 0 ~ 255
SMALLINT 2 -32768 ~ 32767 0 ~ 65535
MEDIUMINT 3 -8388608 ~ 8388607 0 ~ 16777215
INT/INTEGER 4 -2147483648 ~2147483647 0 ~ 4294967295
BIGINT 8 -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709551615
字符串 類型 字節大小 示例
CHAR 0-255 類型:char(3) 輸入 'ab', 實際存儲爲'ab ', 輸入'abcd' 實際存儲爲 'abc'
VARCHAR 0-255 類型:varchar(3) 輸 'ab',實際存儲爲'ab', 輸入'abcd',實際存儲爲'abc'
TEXT 0-65535 大文本

日期時間類型

類型 字節大小 示例
DATE 4 '2020-01-01'
TIME 3 '12:29:59'
DATETIME 8 '2020-01-01 12:29:59'
YEAR 1 '2017'
TIMESTAMP 4 '1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC

約束

  • 主鍵primary key:物理上存儲的順序
  • 非空not null:此字段不容許填寫空值
  • 唯一unique:此字段的值不容許重複
  • 默認default:當不填寫此值時會使用默認值,若是填寫時以填寫爲準
  • 外鍵foreign key:對關係字段進行約束,當爲關係字段填寫值時,會到關聯的表中查詢此值是否存在,若是存在則填寫成功,若是不存在則填寫失敗並拋出異常

No.3 命令行腳本

數據庫操做

show databases; 查看數據庫 use 數據庫名; 使用數據庫 select database(); 查看當前使用的數據庫 create database 數據庫名 charset=utf8; 建立數據庫 drop database 數據庫名; 刪除數據庫

數據表操做

show tables; 查看當前數據庫中的全部表 desc 表名; 查看錶結構 建立表 create table students( id int unsingned primary key auto_increment not null, name varchar(20) default '', age int unsingned default 0, height descimal(3,2) default 1.8, gender enum('男','女') default '男' ) alter table 表名 add 列名 類型; 添加字段 alter table 表名 change 類型及約束; 修改字段 alter table 表名 change 原名 新名 類型及約束; 修改字段(重命名字段) alter table 表名 drop 列名; 刪除字段 drop table 表名; 刪除表 show create table 表名; 查看錶的建立語句

數據增刪改查

insert into 表名 values(); 所有列插入 insert into 表名(列1,...) values(); 部分列插入 insert into 表名(列1,...) values(),...; 插入多條數據

delete from 表名 where 條件; 刪除刪選出的數據

update 表名 set 列1=值1,列2=值2... where 條件; 修改數據

select 列1,列2,... from 表名; 查詢數據

數據備份與恢復

備份

mysqldump –uroot –p 數據庫名 > 數據庫名.sql;

恢復

建立新的數據庫
mysql -uroot –p 新數據庫名 < 數據庫名.sql

No.4 數據庫設計

關係型數據庫建議在E-R模型的基礎上,咱們須要根據產品經理的設計策劃,抽取出來模型與關係,制定出表結構,這是項目開始的第一步,在開發中有不少設計數據庫的軟件,經常使用的如power designer,db desinger等,這些軟件能夠直觀的看到實體及實體間的關係,設計數據庫,多是由專門的數據庫設計人員完成,也多是由開發組成員完成,通常是項目經理帶領組員來完成

三範式

通過研究和對使用中問題的總結,對於設計數據庫提出了一些規範,這些規範被稱爲範式

第一範式(1NF) 強調的是列的原子性,即列不可以再分紅其餘幾列

第二範式(2NF) 首先是 1NF,另外包含兩部份內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須徹底依賴於主鍵,而不能只依賴於主鍵的一部分

第三範式(3NF) 首先是 2NF,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的狀況

E-R模型

  • E表示entry,實體,設計實體就像定義一個類同樣,指定從哪些方面描述對象,一個實體轉換爲數據庫中的一個表

  • R表示relationship,關係,關係描述兩個實體之間的對應規則,關係的類型包括包括一對1、一對多、多對多

  • 關係也是一種數據,須要經過一個字段存儲在表中

  • 實體A對實體B爲1對1,則在表A或表B中建立一個字段,存儲另外一個表的主鍵值

MySQL看這一篇就夠了

  • 實體A對實體B爲1對多:在表B中建立一個字段,存儲表A的主鍵值
    MySQL看這一篇就夠了

  • 實體A對實體B爲多對多:新建一張表C,這個表只有兩個字段,一個用於存儲A的主鍵值,一個用於存儲B的主鍵值
    MySQL看這一篇就夠了

邏輯刪除

  • 對於重要數據,並不但願物理刪除,一旦刪除,數據沒法找回
  • 刪除方案:設置isDelete的列,類型爲bit,表示邏輯刪除,默認值爲0
  • 對於非重要數據,能夠進行物理刪除
  • 數據的重要性,要根據實際開發決定

No.5 MySQL查詢

準備測試數據

建立數據庫
create database python charset=utf8; 使用數據庫 use python; 建立students表 create table students( id int unsigned primary key auto_increment not null, name varchar(20) default '', age tinyint unsigned default 0, height decimal(5,2), gender enum('男','女','中性','保密') default '保密', cls_id int unsigned default 0, is_delete bit default 0 ); 建立classes表 create table classes ( id int unsigned auto_increment primary key not null, name varchar(30) not null ); 向students表中插入數據 insert into students values (0,'小明',18,180.00,2,1,0), (0,'小月月',18,180.00,2,2,1), (0,'彭于晏',29,185.00,1,1,0), (0,'劉德華',59,175.00,1,2,1), (0,'黃蓉',38,160.00,2,1,0), (0,'鳳姐',28,150.00,4,2,1), (0,'王祖賢',18,172.00,2,1,1), (0,'周杰倫',36,NULL,1,1,0), (0,'程坤',27,181.00,1,2,0), (0,'劉亦菲',25,166.00,2,2,0), (0,'金星',33,162.00,3,3,1), (0,'靜香',12,180.00,2,4,0), (0,'郭靖',12,170.00,1,4,0), (0,'周杰',34,176.00,2,5,0); 向classes表中插入數據 insert into classes values (0, "python_01期"), (0, "python_02期");

查詢全部字段

select * from students;

查詢指定字段

select name from students;

使用as給字段起別名

select id as 序號,name as 姓名,gender as 性別 from students;

使用as給表起別名

select s.id,s.name from students as s;

消除重複行

select distinct gender from students;

條件

使用where子句對錶中的數據篩選,結果爲True的行會出如今結果集中

where後面支持比較運算符、邏輯運算符、模糊查詢、範圍查詢、空判斷

比較運算符

  • 等於: =

  • 大於: >

  • 大於等於: >=

  • 小於: <

  • 小於等於: <=

  • 不等於: != 或 <>
select * from students where id > 3; 查詢id大於3的學生 select * from students where id <= 4; 查詢小於等於4的學生 select * from students where name != '黃蓉'; 查詢名字不是黃蓉的 select * from students where is_delete=0; 查詢沒有被刪除的

邏輯運算符

  • and
  • or
  • not
select * from students where id > 3 and gender=0; 查詢id大於3的女同窗 select * from students where id < 4 or is_delete=0; 查詢id<4沒被刪除的同窗

模糊查詢

  • like
  • %表示任意多個任意字符
  • _表示一個任意字符
select * from students where name like '黃%'; 查詢姓黃的同窗 select * from students where name like '李_'; 查詢姓黃而且名字是兩個字的同窗 select * from students where name like '黃%' or name like '%澤'; 查詢姓黃的或者最後一個字是澤的同窗

範圍查詢

  • in表示在一個非連續的範圍內
  • between ... and ...表示在一個連續的範圍內
select * from students where id in(1,4,5); 查詢id是1或者4或者5的同窗 select * from students where id between 3 and 7; 查詢id爲3到8的同窗 

空判斷

  • 注意:null與''是不一樣的
  • 判空is null
select * from students where height is null; 查詢沒有填寫身高的同窗 select * from students where height is not null; 查詢填寫了身高的同窗

優先級

  • 優先級由高到低的順序爲:小括號,not,比較運算符,邏輯運算符
  • and比or先運算,若是同時出現並但願先算or,須要結合()使用

排序

語法

select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]

說明

  • 將數據先按照列1進行排序,若是列1相同,按照列2,以此類推
  • asc從小到大排列,即升序(默認)
  • desc從大到小排序,即降序
select * from students where gender=1 and is_delete=0 order by id asc; 查詢未刪除的男生升序排列 select * from students order by age desc,height desc;查詢全部同窗,按年齡排序,年齡相同的按身高排序

聚合

總數

select count(*) from students; 查詢表中總共有多少條數據

最大值

select max(age) from students where gender=1; 查詢全部男生中最老的

最小值

select min(age) from students where gender=2; 查詢全部女生中年齡最小的

求和

select sum(age) from students; 查詢全部同窗的總年齡

平均值

select avg(height) from students where is_delete=0 and gender=2; 查詢未刪除的女生的平均身高

分組

group by 將查詢結果按照一個或多個字段進行分組,字段值相同的爲一組

SELECT gender FROM students GROUP BY gender;

group by + group_concat() group_concat(字段名)能夠做爲一個輸出字段來使用,表示分組之後,根據分組查看某字段的集合

select gender,group_concat(name) from students group by gender; +--------+-----------------------------------------------------------+ | gender | group_concat(name) | +--------+-----------------------------------------------------------+ | 男 | 彭于晏,劉德華,周杰倫,程坤,郭靖 | | 女 | 小明,小月月,黃蓉,王祖賢,劉亦菲,靜香,周杰 | | 中性 | 金星 | | 保密 | 鳳姐 | +--------+-----------------------------------------------------------+ select gender,group_concat(id) from students group by gender; +--------+------------------+ | gender | group_concat(id) | +--------+------------------+ | 男 | 3,4,8,9,14 | | 女 | 1,2,5,7,10,12,13 | | 中性 | 11 | | 保密 | 6 | +--------+------------------+

group by + 聚合函數 能夠經過聚合函數來對這個值的集合作一些操聚合操做

select gender,avg(height) from students group by gender; +--------+-------------+ | gender | avg(height) | +--------+-------------+ | 男 | 177.750000 | | 女 | 173.428571 | | 中性 | 162.000000 | | 保密 | 150.000000 | +--------+-------------+

group by + having having表達式,用來分組之後設定條件篩選數據,功能和where同樣,可是having只能用於group by

select gender,count(*) from students group by gender having count(*)>2; +--------+----------+ | gender | count(*) | +--------+----------+ | 男 | 5 | | 女 | 7 | +--------+----------+

group by + with rollup 在最後增長一行,計算該列的和

select gender,count(*) from students group by gender with rollup;
+--------+----------+
| gender | count(*) | +--------+----------+ | 男 | 5 | | 女 | 7 | | 中性 | 1 | | 保密 | 1 | | NULL | 14 | +--------+----------+

分頁

當數據量很大的時候,就不可能在一頁中查看全部數據了,須要對它進行分頁操做

語法

select * from 表名 limit start,count

說明

從start開始,獲取count條數據

select * from where gender=1 limit 0,3; 查詢前三條男生記錄

鏈接

mysql支持三種鏈接查詢

  • 內鏈接 查詢的結果爲兩個表匹配到的數據

MySQL看這一篇就夠了

  • 左鏈接 查詢的結果爲兩個表匹配到的數據,右表特有的數據,對於左表中不存在的數據使用null填充

MySQL看這一篇就夠了

  • 右鏈接 查詢的結果爲兩個表匹配到的數據,左表特有的數據,對於右表中不存在的數據使用null填充

MySQL看這一篇就夠了

語法

select * from 表1 inner或left或right join 表2 on 表1.列 = 表2.列
select * from students inner join classes on students.cls_id = classes.id; 使用內關聯查詢班級表和學生表
+----+--------+------+--------+--------+--------+-----------+----+-------------+
| id | name | age | height | gender | cls_id | is_delete | id | name | +----+--------+------+--------+--------+--------+-----------+----+-------------+ | 1 | 小明 | 18 | 180.00 | 女 | 1 | | 1 | python_01期 | | 2 | 小月月 | 18 | 180.00 | 女 | 2 |  | 2 | python_02期 | | 3 | 彭于晏 | 29 | 185.00 | 男 | 1 | | 1 | python_01期 | | 4 | 劉德華 | 59 | 175.00 | 男 | 2 |  | 2 | python_02期 | | 5 | 黃蓉 | 38 | 160.00 | 女 | 1 | | 1 | python_01期 | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 |  | 2 | python_02期 | | 7 | 王祖賢 | 18 | 172.00 | 女 | 1 |  | 1 | python_01期 | | 8 | 周杰倫 | 36 | NULL | 男 | 1 | | 1 | python_01期 | | 9 | 程坤 | 27 | 181.00 | 男 | 2 | | 2 | python_02期 | | 10 | 劉亦菲 | 25 | 166.00 | 女 | 2 | | 2 | python_02期 | +----+--------+------+--------+--------+--------+-----------+----+-------------+ select * from students as s left join classes as c on s.cls_id = c.id; 使用左關聯查詢班級表和學生表 +----+--------+------+--------+--------+--------+-----------+------+-------------+ | id | name | age | height | gender | cls_id | is_delete | id | name | +----+--------+------+--------+--------+--------+-----------+------+-------------+ | 1 | 小明 | 18 | 180.00 | 女 | 1 | | 1 | python_01期 | | 2 | 小月月 | 18 | 180.00 | 女 | 2 |  | 2 | python_02期 | | 3 | 彭于晏 | 29 | 185.00 | 男 | 1 | | 1 | python_01期 | | 4 | 劉德華 | 59 | 175.00 | 男 | 2 |  | 2 | python_02期 | | 5 | 黃蓉 | 38 | 160.00 | 女 | 1 | | 1 | python_01期 | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 |  | 2 | python_02期 | | 7 | 王祖賢 | 18 | 172.00 | 女 | 1 |  | 1 | python_01期 | | 8 | 周杰倫 | 36 | NULL | 男 | 1 | | 1 | python_01期 | | 9 | 程坤 | 27 | 181.00 | 男 | 2 | | 2 | python_02期 | | 10 | 劉亦菲 | 25 | 166.00 | 女 | 2 | | 2 | python_02期 | | 11 | 金星 | 33 | 162.00 | 中性 | 3 |  | NULL | NULL | | 12 | 靜香 | 12 | 180.00 | 女 | 4 | | NULL | NULL | | 13 | 郭靖 | 12 | 170.00 | 男 | 4 | | NULL | NULL | | 14 | 周杰 | 34 | 176.00 | 女 | 5 | | NULL | NULL | +----+--------+------+--------+--------+--------+-----------+------+-------------+ select * from students as s right join classes as c on s.cls_id = c.id; 使用右關聯查詢班級表和學生表 +------+--------+------+--------+--------+--------+-----------+----+-------------+ | id | name | age | height | gender | cls_id | is_delete | id | name | +------+--------+------+--------+--------+--------+-----------+----+-------------+ | 1 | 小明 | 18 | 180.00 | 女 | 1 | | 1 | python_01期 | | 2 | 小月月 | 18 | 180.00 | 女 | 2 |  | 2 | python_02期 | | 3 | 彭于晏 | 29 | 185.00 | 男 | 1 | | 1 | python_01期 | | 4 | 劉德華 | 59 | 175.00 | 男 | 2 |  | 2 | python_02期 | | 5 | 黃蓉 | 38 | 160.00 | 女 | 1 | | 1 | python_01期 | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 |  | 2 | python_02期 | | 7 | 王祖賢 | 18 | 172.00 | 女 | 1 |  | 1 | python_01期 | | 8 | 周杰倫 | 36 | NULL | 男 | 1 | | 1 | python_01期 | | 9 | 程坤 | 27 | 181.00 | 男 | 2 | | 2 | python_02期 | | 10 | 劉亦菲 | 25 | 166.00 | 女 | 2 | | 2 | python_02期 | +------+--------+------+--------+--------+--------+-----------+----+-------------+ select s.name,c.name from students as s inner join classes as c on s.cls_id = c.id; 查詢學生姓名及班級名稱 +--------+-------------+ | name | name | +--------+-------------+ | 小明 | python_01期 | | 小月月 | python_02期 | | 彭于晏 | python_01期 | | 劉德華 | python_02期 | | 黃蓉 | python_01期 | | 鳳姐 | python_02期 | | 王祖賢 | python_01期 | | 周杰倫 | python_01期 | | 程坤 | python_02期 | | 劉亦菲 | python_02期 | +--------+-------------+

子查詢

子查詢 在一個 select 語句中,嵌入了另一個 select 語句, 那麼被嵌入的 select 語句稱之爲子查詢語句

主查詢 主要查詢的對象,第一條 select 語句

主查詢和子查詢的關係

  • 子查詢是嵌入到主查詢中
  • 子查詢是輔助主查詢的,要麼充當條件,要麼充當數據源
  • 子查詢是能夠獨立存在的語句,是一條完整的 select 語句

子查詢分類

  • 標量子查詢: 子查詢返回的結果是一個數據(一行一列)
  • 列子查詢: 返回的結果是一列(一列多行)
  • 行子查詢: 返回的結果是一行(一行多列)

查詢大於平均年齡的學生

select * from students where age > (select avg(age) from students);

查詢還有學生在班的全部班級名字

select name from classes where id in (select cls_id from students);

需求: 查找班級年齡最大,身高最高的學生

select * from students where (height,age) = (select max(height),max(age) from students);

查詢的執行順序

from表名>where>group by>slect distinct>having>order by>limit

No.6 Python與MySQL交互

準備數據

建立京東數據庫
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);

數據庫設計

建立商品分類表

create table goods_cates( id int unsigned primary key auto_increment not null, name varchar(40) not null );

建立商品品牌表

create table goods_brands ( id int unsigned primary key auto_increment not null, name varchar(40) not null );

建立商品表

create table goods( id int unsigned 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) );

建立顧客表

create table customer( id int unsigned auto_increment primary key not null, name varchar(30) not null, addr varchar(100), tel varchar(11) not null );

建立訂單表

create table orders( id int unsigned auto_increment primary key not null, order_date_time datetime not null, customer_id int unsigned, foreign key(customer_id) references customer(id) );

建立訂單狀態表

create table order_detail( id int unsigned auto_increment primary key not null, order_id int unsigned not null, goods_id int unsigned not null, quantity tinyint unsigned not null, foreign key(order_id) references orders(id), foreign key(goods_id) references goods(id) );

PyMySQL操做流程

Connection對象

用於創建與數據庫的鏈接

conn=connect(參數列表)
host:鏈接的mysql主機,若是本機是'localhost'
port:鏈接的mysql主機的端口,默認是3306
database:數據庫的名稱
user:鏈接的用戶名
password:鏈接的密碼
charset:通訊採用的編碼方式,推薦使用utf8
close() 關閉鏈接
commit() 提交 cursor() 返回cursor對象,執行sql並返回結果

Cursor對象

返回cursor對象,執行sql並返回結果

rowcount只讀屬性,表示最近一次execute()執行後受影響的行數 connection得到當前鏈接對象 close()關閉 execute(operation [, parameters ])執行語句,返回受影響的行數,主要用於執行insert、update、delete語句,也能夠執行create、alter、drop等語句 fetchone()執行查詢語句時,獲取查詢結果集的第一個行數據,返回一個元組 fetchall()執行查詢時,獲取結果集的全部行,一行構成一個元組,再將這些元組裝入一個元組返回

增刪改查

增刪改

import pymysql if __name__ == '__main__': conn = pymysql.connect(host='',port=3306,database='jing_dong',user='root',password='123456',charset='utf8') cursor = conn.cursor() # 增長 count = cursor.execute('insert into goods(name,cate_name,brand_name) values("硬盤","","")') print(count) count = cursor.execute('insert into goods(name) values("光盤")') print(count) # 更新 count = cursor.execute('update goods set name="機械硬盤" where name="硬盤"') # 刪除 count = cursor.execute('delete from goods where id=6') print(count) conn.commit() cursor.close() conn.close()

查詢一條數據

import pymysql if __name__ == '__main__': conn = pymysql.connect(host='',port=3306,database='jing_dong',user='root',password='123456',charset='utf8') cursor = conn.cursor() count = cursor.execute('select id,name from goods where id<=4') print(count) for i in range(count): ret = cursor.fetchone() print(ret) conn.commit() cursor.close() conn.close()

查詢多條數據

import pymysql if __name__ == '__main__': conn = pymysql.connect(host='',port=3306,database='jing_dong',user='root',password='123456',charset='utf8') cursor = conn.cursor() count = cursor.execute('select id,name from goods where id<=4') print(count) ret = cursor.fetchall() print(ret) conn.commit() cursor.close() conn.close()

參數化

sql語句的參數化,能夠有效防止sql注入

import pymysql if __name__ == '__main__': conn = pymysql.connect(host='',port=3306,database='jing_dong',user='root',password='123456',charset='utf8') cursor = conn.cursor() count = cursor.execute('select id,name from goods where id<=%s',4) print(count) ret = cursor.fetchall() print(ret) conn.commit() cursor.close() conn.close()

No.7 視圖

視圖是什麼?

通俗的講,視圖就是一條SELECT語句執行後返回的結果集,因此咱們在建立視圖的時候,主要的工做就落在建立這條SQL查詢語句上,視圖是對若干張基本表的引用,一張虛表,查詢語句執行的結果,不存儲具體的數據(基本表數據發生了改變,視圖也會跟着改變),方便操做,特別是查詢操做,減小複雜的SQL語句,加強可讀性

定義視圖

create view 視圖名稱 as select語句;

查看視圖

show tables;

使用視圖

select * from 視圖名稱;

刪除視圖

drop view 視圖名稱;

視圖的做用

提升了重用性,就像一個函數
對數據庫重構,卻不影響程序的運行
提升了安全性能,能夠對不一樣的用戶
讓數據更加清晰

No.8 事務

什麼是事務?

所謂事務,它是一個操做序列,這些操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位,只有事務內的全部操做所有執行成功纔會提交到數據庫,只要有一條執行失敗,也不會提交,普遍應用於訂單系統、銀行系統

事務四大特性

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔離性(Isolation)
  • 持久性(Durability)

    開啓事務

    start transaction;

    提交事務

    commit;

    回滾事務

    rollback;

    No.9 索引

    什麼是索引?

    索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏全部記錄的引用指針,索引就像一本書的目錄,加快查找速度

    索引的使用

    查看索引

    show index from 表名;

    建立索引

    create index 索引名稱 on 表名(字段名稱(長度))

    刪除索引

    drop index 索引名稱 on 表名;

    No.10 權限

  • 在生產環境下操做數據庫時,絕對不可使用root帳戶鏈接,而是建立特定的帳戶,授予這個帳戶特定的操做權限,而後鏈接進行操做,主要的操做就是數據的crud

  • MySQL帳戶體系:根據帳戶所具備的權限的不一樣,MySQL的帳戶能夠分爲如下幾種

    • 服務實例級帳號:,啓動了一個mysqld,即爲一個數據庫實例;若是某用戶如root,擁有服務實例級分配的權限,那麼該帳號就能夠刪除全部的數據庫、連同這些庫中的表

    • 數據庫級別帳號:對特定數據庫執行增刪改查的全部操做

    • 數據表級別帳號:對特定表執行增刪改查等全部操做

    • 字段級別的權限:對某些表的特定字段進行操做

    • 存儲程序級別的帳號:對存儲程序進行增刪改查的操做
  • 賬戶的操做主要包括建立帳戶、刪除帳戶、修改密碼、受權權限等

No.11 主從

主從同步的定義

主從同步使得數據能夠從一個數據庫服務器複製到其餘服務器上,在複製數據時,一個服務器充當主服務器(master),其他的服務器充當從服務器(slave),由於複製是異步進行的,因此從服務器不須要一直鏈接着主服務器,從服務器甚至能夠經過撥號斷斷續續地鏈接主服務器,經過配置文件,能夠指定複製全部的數據庫,某個數據庫,甚至是某個數據庫上的某個表

使用主從同步的好處:

  • 經過增長從服務器來提升數據庫的性能,在主服務器上執行寫入和更新,在從服務器上向外提供讀功能,能夠動態地調整從服務器的數量,從而調整整個數據庫的性能。
  • 提升數據安全,由於數據已複製到從服務器,從服務器能夠終止複製進程,因此,能夠在從服務器上備份而不破壞主服務器相應數據
  • 在主服務器上生成實時數據,而在從服務器上分析這些數據,從而提升主服務器的性能

主從同步的機制

Mysql服務器之間的主從同步是基於二進制日誌機制,主服務器使用二進制日誌來記錄數據庫的變更狀況,從服務器經過讀取和執行該日誌文件來保持和主服務器的數據一致

在使用二進制日誌時,主服務器的全部操做都會被記錄下來,而後從服務器會接收到該日誌的一個副本。從服務器能夠指定執行該日誌中的哪一類事件(譬如只插入數據或者只更新數據),默認會執行日誌中的全部語句

每個從服務器會記錄關於二進制日誌的信息:文件名和已經處理過的語句,這樣意味着不一樣的從服務器能夠分別執行同一個二進制日誌的不一樣部分,而且從服務器能夠隨時鏈接或者中斷和服務器的鏈接

主服務器和每個從服務器都必須配置一個惟一的ID號(在my.cnf文件的[mysqld]模塊下有一個server-id配置項),另外,每個從服務器還須要經過CHANGE MASTER TO語句來配置它要鏈接的主服務器的ip地址,日誌文件名稱和該日誌裏面的位置(這些信息存儲在主服務器的數據庫裏)

配置主從同步的步驟

  1. 在主服務器上,必須開啓二進制日誌機制和配置一個獨立的ID
  2. 在每個從服務器上,配置一個惟一的ID,建立一個用來專門複製主服務器數據的帳號
  3. 在開始複製進程前,在主服務器上記錄二進制文件的位置信息
  4. 若是在開始複製以前,數據庫中已經有數據,就必須先建立一個數據快照(可使用mysqldump導出數據庫,或者直接複製數據文件)
  5. 配置從服務器要鏈接的主服務器的IP地址和登錄受權,二進制日誌文件名和位置

詳細配置主從同步的方法

主和從的身份能夠本身指定,咱們將虛擬機Ubuntu中MySQL做爲主服務器,將Windows中的MySQL做爲從服務器

  1. 備份主服務器原有數據到從服務器

若是在設置主從同步前,主服務器上已有大量數據,可使用mysqldump進行數據備份並還原到從服務器以實現數據的複製

  • 在主服務器Ubuntu上進行備份,執行命令
mysqldump -uroot -p123456 --all-databases --lock-all-tables > ~/master_db.sql
-u :用戶名 -p :密碼 --all-databases :導出全部數據庫 --lock-all-tables :執行操做時鎖住全部表,防止操做時有數據修改 ~/master_db.sql :導出的備份數據(sql文件)位置,可本身指定
  • 在從服務器Windows上進行數據還原
mysql –uroot –p123456 < master_db.sql
  1. 配置主服務器master
  • 編輯設置mysqld的配置文件,設置log_bin和server-id
    vim /etc/mysql/mysql.conf.d/mysqld.cnf
    server-id           = 1 log_bin = /var/log/mysql/mysql-bin.log
  • 重啓mysql服務
    service mysql restart
  • 登入主服務器Ubuntu中的mysql,建立用於從服務器同步數據使用的賬號
    mysql –uroot –p123456
    GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave'; FLUSH PRIVILEGES;
  • 獲取主服務器的二進制日誌信息
    SHOW MASTER STATUS; -File: 使用的日誌文件名字 Position: 使用的文件位置
    1. 配置從服務器slave(Windows中的MySQL)
  • 找到Windows中MySQL的配置文件
  • 編輯my.ini文件,將server-id修改成2,並保存退出
  • 重啓MySQL服務

進入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: 前面查詢到的主服務器日誌文件位置

開啓同步,查看同步狀態

start slave; 開啓同步 show slave status \G; 查看同步狀態

測試主從同步

在主服務器上建立一個數據庫,在從服務上查看

相關文章
相關標籤/搜索