安裝教程原網址http://www.cnblogs.com/iscodercn/p/5488633.html
慕課網視頻教程總結
show create table provinces;查看編碼,引擎整型:tingint->smallint->mediumint->int->bigint;
浮點類型: float(M,D) double(M,D) [M總位元 D小數點後面的數]
日期:time:+-8385959data:1000、1、1-9999、23、59
timestamp:1970-2037 year:1970-2069
use t1; 使用庫 show database();查看使用的庫 desc tb1;查看錶結構 查看內容,select;
AUTO_INCREMENT 自動編號,且必須與主鍵組合使用 預設情況下,起始值為1,每次的增量為1
PRIMARY KEY主鍵,作用是使值具有唯一性,即值不能重複,主鍵不設定自動成長要手動添加編號
PRIMARY KEY一張資料表只能有一個UNIQUE KEY 可以有多個,且可以為空白,也可以保證唯一性,UNIQUE KEY 中的內容不能重複,例如表中username已經有一個“tom”了,就不能再次添加一個‘tom’
約束保證完整性和唯一性
主鍵約束:PRIMARY KEY 類似身份證id唯一約束:UNIQUE KEY 保證註冊使用者名稱唯一預設值: DEFAULT 預設為男非空約束:NOT NULL外鍵約束:FOREIGN KEY 實現一對多
外鍵:
mysql> CREATE TABLE provinces( -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, -> pname VARCHAR(20) NOT NULL -> );mysql> CREATE TABLE users( -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, -> username VARCHAR(20) NOT NULL, -> pid SMALLINT UNSIGNED, -> FOREIGN KEY(pid) REFERENCES provinces(id) //pid 外鍵列,id 參照列,類型必須相同 -> );
父表先寫,字表參照
外鍵約束的本質就是增加資料的可重複利用性。也就是說假如我們有一個省份的表:P表,這個表裡儲存著中國34個省份名稱並且有唯一編號約束(比方說1.河南省 2.四川省 3.廣東省 4.吉林省……);現在有個統計各省GDP的表A,有個統計人籍貫的表B,還有一個統計各省人口的表C。如果把各省的名字再輸入一遍的話那就需要輸入4遍省份的名字,這種工作像評論區有些手插在褲襠裡不動手操作還罵老師教的不好的人肯定會覺得很麻煩;為了這些人,MySQL發明了一個非常牛逼的方法:從那個P表裡把個省份的序號直接引用過來分別填在A、B、C表中,這樣P表中的資訊就被A、B、C三個表給共用了,就達到了一次輸入,永久使用的目的。
表級約束與資料行層級條件約束由運算元目的多少來決定。資料行層級條件約束既可以在列定義時聲明,也可以在列定義後聲明,表級約束只能在列定義後聲明。
添加多列:alter table users1 add (tt varchar(10) not null, ll tinyint not null);
添加外鍵約束:ALTER TABLE users2 ADD FOREIGN KEY(pid) REFERENCES provinces (id);
添加預設約束:ALTER TABLE users2 ALTER age SET DEFAULT 15;
刪除預設約束:ALTER TABLE users2 ALTER age DROP DEFAULT;
資料表的修改操作:無非就是添加列,刪除列,添加約束,刪除約束。用的是ALTER,而INSERT是對資料表添加插入記錄用的。
刪除主鍵約束:ALTER TABLE tbl_name DROP PRIMARY KEY刪除唯一約束:ALTER TABLE tbl_name DROP {INDEX|KEY} index_name刪除外鍵約束:ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
資料表更名 ALTER TABLE user2 RENAME user3;或 RENAME TABLE user2 TO user3
修改列定義;<br>ALTER TABLE tableName MODIFY columnName SMALLINT UNSIGNED NOT NULL FIRST;<br>ALTER TABLE tableName CHANGE oldColumnName newColumnName INT NOT NULL AFTER username;<br>
建立了少去改,破壞結構
約束:not null非空約束和default預設約束都沒有表級約束,只有資料行層級條件約束。primary key主鍵約束和unique key唯一約束和foreign key外鍵約束,表級約束和資料行層級條件約束都有。
記錄操作:curd
section A
- 資料庫系統解決的問題:持久化儲存,最佳化讀寫,保證資料的有效性
- 先設計表結構
E(表)-R 模型(實體vs關係) 三範式
- 第一範式(1NF):列不可拆分 --姓名屬性不可拆為姓和名
- 第二範式(2NF):唯一標識 --id
- 第三範式(3NF):引用主鍵 --id是基於主鍵的
為了更加準確的儲存資料,保證資料的正確有效,可以在建立表的時候,為表添加一些強制性的驗證,包括資料欄位的類型、約束1、欄位類型 --資料有效性
- 在mysql中包含的資料類型很多,這裡主要列出來常用的幾種
- 數字:int,decimal
- 字串:char(固定文本,不夠補空格:電話),varchar(可變有限文本:姓名), text(大文本)
- 日期:datetime(到秒),date(到天)
- 布爾:bit(3) --用0,1表示性別,開銷小
- 邏輯刪除:0,1 重要資料
2、約束 --限制條件
- 主鍵primary key --找的速度快,表只能有一個,作為唯一id使用???自動成長
- 非空not null --姓名不可為空
- 惟一unique --不能重複,身份證
- 預設default --預設值
- 外鍵foreign key --
A。圖形介面(
phpMyAdmin , navicat)ip地址+。。。root root
Navicat Premium 是一套多串連資料庫開發工具,讓你在單一應用程式中同時串連多達六種資料庫:MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL,可一次快速方便地訪問所有資料庫。
資料庫設計預留欄位,便於後期修改
mysql目錄:
bin目錄 儲存可執行檔檔案data目錄 儲存資料檔案docs目錄 文檔 include目錄 儲存包含的標頭檔lib目錄 存放庫檔案share目錄 錯誤訊息和字元集
語句規範:
關鍵字和函數名大寫;資料庫、表、欄位名小寫;sql語言結尾用分號。
cmd命令 啟動/關閉服務
- 一般對於重要資料,會設定一個isDelete的列,類型為bit,表示邏輯刪除(保護資料)
3.資料操作
select * from 表名
全列插入:insert into 表名 values(...) //values(0,'李春',1,'1990-1-1',0)與表結構一一對應預設插入:insert into 表名(列1,...) values(值1,...) //(name,gender) values('黃蓉',0)同時插入多條資料:insert into 表名 values(...),(...)...;或insert into 表名(列1,...) values(值1,...),(值1,...)...; //(name) ('楊哥') ,('郭襄')
- 主鍵列是自動成長,但是在全列插入時需要佔位,通常使用0,插入成功後以實際資料為準
- 修改
update 表名 set 列1=值1,... where 條件
delete from 表名 where 條件
alter table students add isdelete bit default 0;如果需要刪除則update students isdelete=1 where ...;
資料備份
sudo -s
cd /var/lib/mysql
mysqldump –uroot –p 資料庫名 > ~/Desktop/備份檔案.sql;按提示輸入mysql的密碼 /密碼別輸錯啊,巨坑
資料恢複 --進入備份檔案夾
串連mysqk,建立資料庫
退出串連,執行如下命令
mysql -uroot –p 資料庫名 < ~/Desktop/備份檔案.sql根據提示輸入mysql密碼
section B:查詢(90%)
select * from 表名;
- from關鍵字後面寫表名,表示資料來源於是這張表
- select後面寫表中的列名,如果是*表示在結果中顯示表中所有列
- 在select後面的列名部分,可以使用as為列起別名,這個別名出現在結果集中
- 如果要查詢多個列,之間使用逗號分隔
消除重複行
- 在select後面列前使用distinct可以消除重複的行
select distinct gender from students;
這行屬性和其他行比
條件
- 使用where子句對錶中的資料篩選,結果為true的行會出現在結果集中
- 文法如下:
select * from 表名 where 條件;
select * from students where id>3;
select * from students where isdelete=0;
邏輯運算子
select * from students where id>3 and gender=0;
模糊查詢
- like
- %表示任意多個任一字元
- _表示一個任一字元
- 查詢姓黃的學生
select * from students where sname like '黃%';
範圍查詢
- in表示在一個非連續的範圍內
- 查詢編號是1或3或8的學生
select * from students where id in(1,3,8);
- between ... and ...表示在一個連續的範圍內
- 查詢學生是3至8的學生
select * from students where id between 3 and 8;
空判斷
- 注意:null與' '是不同的 /一個不佔記憶體,一個佔位置的Null 字元串
- 判空is null
- 查詢沒有填寫地址的學生
select * from students where hometown is null;
- 判非空is not null
- 查詢填寫了地址的學生
select * from students where hometown is not null;
section C:彙總 --為了統計
- 為了快速得到統計資料,提供了5個彙總函式
- count(*)表示計算總行數,括弧中寫星與列名,結果是相同的
- 查詢學生總數
select count(*) from students;
- max(列)表示求此列的最大值
- 查詢女生的編號最大值
select max(id) from students where gender=0;
- min(列)表示求此列的最小值
- 查詢未刪除的學生最小編號
select min(id) from students where isdelete=0;
select sum(id) from students where gender=1;
- avg(列)表示求此列的平均值
- 查詢未刪除女生的編號平均值
select avg(id) from students where isdelete=0 and gender=0;
分組
- 按照欄位分組,表示此欄位相同的資料會被放到一個組中
- 分組後,只能查詢出相同的資料列,對於有差異的資料列無法出現在結果集中
- 可以對分組後的資料進行統計,做彙總運算
- 文法:
select 列1,列2,彙總... from 表名 group by 列1,列2,列3...
select gender as 性別,count(*)from studentsgroup by gender;
select hometown as 家鄉,count(*)from studentsgroup by hometown;
分組後的資料篩選
select 列1,列2,彙總... from 表名group by 列1,列2,列3...having 列1,...彙總...
- having後面的條件運算子與where的相同
- 查詢男生總人數
方案一select count(*)from studentswhere gender=1;
排序
select * from 表名order by 列1 asc|desc,列2 asc|desc,...
- 將行資料按照列1進行排序,如果某些行列1的值相同時,則按照列2排序,以此類推
- 預設按照列值從小到大排列
- asc從小到大排列,即升序
- desc從大到小排序,即降序
- 查詢未刪除男生學生資訊,按學號降序
select * from studentswhere gender=1 and isdelete=0order by id desc;
select * from subjectwhere isdelete=0order by stitle;
分頁
- 當資料量過大時,在一頁中查看資料是一件非常麻煩的事情
- 文法
select * from 表名limit start,count
- 從start開始,擷取count條資料
- start索引從0開始
總結
select distinct *from 表名where ....group by ... having ...order by ...limit star,count
- 執行順序為:
- from 表名
- where ....
- group by ...
- select distinct *
- having ...
- order by ...
- limit star,count
- 實際使用中,只是語句中某些部分的組合,而不是全部
串連查詢
- 串連查詢分類如下:
- 表A inner join 表B:表A與表B匹配的行會出現在結果中
- 表A left join 表B:表A與表B匹配的行會出現在結果中,外加表A中專屬的資料,未對應的資料使用null填充
- 表A right join 表B:表A與表B匹配的行會出現在結果中,外加表B中專屬的資料,未對應的資料使用null填充
- 在查詢或條件中推薦使用“表名.列名”的文法
- 如果多個表中列名不重複可以省略“表名.”部分
- 如果表的名稱太長,可以在表名後面使用' as 簡寫名'或' 簡寫名',為表起個臨時的簡寫名稱
section D: python操作Mysql資料庫 非常好的課程
Python DB API (統一介面規範)的 connection(資料庫連接對象) 和 cursor(資料庫互動對象)以及 excptions(資料庫異常類)
pip install PyMySQL
串連:
import pymysqlconn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="", db="imook", charset="utf8" )cur = conn.cursor()print(conn)print(cur)cur.close() #記得都要關閉conn.close()
---不要起import的包名作為檔案名稱啊!
在connection上建立Cursor來執行查詢和擷取結果
如果只是fetchall的話,我一般直接在cursor.execute(sql)之後直接進行遍曆而不執行fetchall,效果是一樣的
for row in cursor:
print row
復原實物出錯可以複原,銀行轉賬 如果要讓資料表支援事務,則需設定表的ENGINE = INNODB
insert,update,delete,注意加conn.commit()才能更新資料庫