什么是數據庫?
數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,
每個數據庫都有一個或多個不同的API用于創建,訪問,管理,搜索和復制所保存的數據。
我們也可以將數據存儲在文件中,但是在文件中讀寫數據速度相對較慢。
所以,現在我們使用關系型數據庫管理系統(RDBMS)來存儲和管理的大數據量。所謂的關系型數據庫,是建立在關系模型基礎上的數據庫,借助于集合代數等數學概念和方法來處理數據庫中的數據。
RDBMS即關系數據庫管理系統(Relational Database Management System)的特點:
1.數據以表格的形式出現
2.每行為各種記錄名稱
3.每列為記錄名稱所對應的數據域
4.許多的行和列組成一張表單
5.若干的表單組成database
RDBMS 術語
在我們開始學習MySQL 數據庫前,讓我們先了解下RDBMS的一些術語:
數據庫: 數據庫是一些關聯表的集合。
數據表: 表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
列: 一列(數據元素) 包含了相同的數據, 例如郵政編碼的數據。
行:一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
冗余:存儲兩倍數據,冗余降低了性能,但提高了數據的安全性。
主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據。
外鍵:外鍵用于關聯兩個表。
復合鍵:復合鍵(組合鍵)將多個列作為一個索引鍵,一般用于復合索引。
索引:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。類似于書籍的目錄。
參照完整性: 參照的完整性要求關系中不允許引用不存在的實體。與實體完整性是關系模型必須滿足的完整性約束條件,目的是保證數據的一致性
1. 安裝mysql:
windows下載安裝地址mysql地址
centos下載安裝命令
yum -y install mariadb mariadb-server
ubuntu上Mysql安裝
sudo apt-get install mysql mysql-client
2. 連接Mysql
先使用mysql命令連接到mysql的服務器,輸入安裝的時候自己設置的密碼
mysql -u root -p
然后輸入mysql的密碼即可進入mysql數據庫中
3. 簡單的SQL命令
3.1 查看當前mysql中有那些數據庫
show databases;
3.2 創建/刪除自定義的數據庫
- 創建數據庫
創建數據庫的時候,需要指定編碼charset=utf-8,要不然存儲中文會出現亂碼
create database test charset=utf8;
注意:1. create database 語句的后面是要創建的數據庫名稱。建議數據庫名稱盡可能是有意義和具有一定的描述性。
- 重復創建同一個數據庫是會提示你,數據庫已經存在了
改進方案:
create database if not exists database_name
注意: if not exists是語句的可選子句。 if not exists子句可防止創建數據庫服務器中已存在的新數據庫的錯誤。不能在MySQL數據庫服務器中具有相同名稱的數據庫。
- 刪除數據庫
drop database test;
注意:刪除重復的同一個數據庫的時候是會提醒你,數據庫不存在了
改進方案:
drop database if exists test;
注意:與create database語句類似,if exists是該語句的可選部分,以防止您刪除數據庫服務器中不存在的數據庫。
3.3 選擇數據庫
你連接到 MySQL 數據庫后,可能有多個可以操作的數據庫,所以你需要選擇你要操作的數據庫。 必須通過使用USE語句告訴MySQL要使用哪個數據庫。
use test;
從現在開始,所有操作(如查詢數據,創建新表, 增加表數據,刪除表數據)都將對當前數據庫(即test)產生影響。
3.4 數據類型
MySQL支持多種類型,大致可以分為三類:數值、日期/時間和字符串(字符)類型。
-
數值類型:
-
日期和時間類型: 表示時間值的日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。 每個時間類型有一個有效值范圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。
-
字符串類型:
3.5 創建表.
創建MySQL數據表需要以下信息:
表名、表字段名、定義每個表字段
語法: create table table_name (column_name column_type);
create table `student`(
`id` int auto_increment,
`name` varchar(30) not null,
primary key(`id`)
)engine=InnoDB default charset=utf8;
- 解析:
- 如果你不想字段為空 可以設置字段的屬性為 NOT NULL, 在操作數據庫時如果輸入該字段的數據為NULL ,就會報錯。
- AUTO_INCREMENT定義列為自增的屬性,一般用于主鍵,數值會自動加1。
- INT 定義的字段為整形
- VARCHAR 定義可變的字符串,最大的長度為30。
- PRIMARY KEY關鍵字用于定義列為主鍵。
- ENGINE 設置存儲引擎。
- CHARSET 設置編碼。
3.6刪除表
刪除表的語法很簡單,刪除表的同時,表里面的所有信息都會被刪除掉,所以該操作需要很小心。
語法: drop table table_name ;
3.7增數據
語法: inset into table_name (file1, file2, file3) values (value1, value2, value3)
insert into `student` (`name`) values('coco');
3.8查數據
語法: select column_name1, column_name2 from table_name [where] [limit n] [offset m]
注解:
1)查詢語句中你可以使用一個或者多個表,表之間使用逗號(,)分割,并使用WHERE語句來設定查詢條件。
2)SELECT 命令可以讀取一條或者多條記錄。
3)可以使用星號(*)來代替其他字段,SELECT語句會返回表的所有字段數據
4)可以使用 WHERE 語句來包含任何條件。
5)可以使用 LIMIT 屬性來設定返回的記錄數。
6)可以通過OFFSET指定SELECT語句開始查詢的數據偏移量。默認情況下偏移量為0。
select id,name from student where name='coco';
3.9改數據
語法: update table_name set field1=value1 fields2=value2 [where]
注解: 1) 可以同時更新一個或多個字段。 2) 可以在 WHERE 子句中指定任何條件。
update student set name='xxx' where id=1;
3.10刪數據
語法: delete from table_name [where]
注解: 1)如果沒有指定 WHERE 子句,MySQL 表中的所有記錄將被刪除。
delete from student where name='xxx';
4.進階
4.1 主鍵
語法: alter table table_name add primary KEY(primary_key_column);
注解: 1)簡單而言,主鍵就是一個用來唯一標識表中的每行記錄 2)主鍵的值必須是唯一的,非空的,每個表只有一個主鍵 3)主鍵的數據類型,int 類型 4)主鍵通常設為 auto_increment,自動生成唯一的序列值
4.2 外鍵
一張表中有一個非主鍵的字段指向了別一張表中的主鍵,就將該字段叫做外鍵。
語法:
alter table table_name1 add [constraint 約束名] foreign key(外鍵字段名) references table_name2(主鍵字段名);
使用外鍵的前提:
1. 表儲存引擎必須是innodb,否則創建的外鍵無約束效果。
2. 外鍵的列類型必須與父表的主鍵類型完全一致。
3. 外鍵的名字不能重復。
4. 已經存在數據的字段被設為外鍵時,必須保證字段中的數據與父表的主鍵數據對應起來。
4.3外鍵約束
on delete 和 on update都有restrict,no action, cascade, set Null屬性。現在分別對他們的屬性含義做個解釋。
-
- ON DELETE restrict(約束):當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除。
no action:意思同restrict.即如果存在從數據,不允許刪除主數據。
cascade(級聯):當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則也刪除外鍵在子表(即包含外鍵的表)中的記錄。
set null:當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(不過這就要求該外鍵允許取null)
-
- ON UPDATE restrict(約束):當在父表(即外鍵的來源表)中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許更新。
no action:意思同restrict.
cascade(級聯):當在父表(即外鍵的來源表)中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則也更新外鍵在子表(即包含外鍵的表)中的記錄。
set null:當在父表(即外鍵的來源表)中更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(不過這就要求該外鍵允許取null)。
4.4索引
什么是索引: MySQL索引的建立對于MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那么沒有設計和使用索引的MySQL就是一個人力三輪車。 實際上,索引也是一張表,該表保存了主鍵與索引字段,并指向實體表的記錄。 但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。
創建語法: create index [index_name索引名] on table_name([column_name 列名]);
刪除語法: drop index [index_name 索引名] on table_name;
查看語法: show index from table_name;
修改語法: alter table table_name add unique [index_name 索引名]
4.5聚合函數
什么是聚合函數: 對統計的結果進行二次篩選:分組,排序,算和,計算最大值,最小值,求取平均值等
1)group by 字段 : 按字段將記錄分組,通常和其它的函數聯合使用,group by 操作后,返回每一組的第一條記錄
2)order by:根據指定字段進行排序,默認升序(asc)排序,可以指定多個排序字段,按照字段先后分別排序。
3)sum(expr):求和
4)avg(expr):求平均數
5)count(expr):計數器,返回SELECT語句檢索到的行中非NULL值的數目
6)max(expr) 獲取最大值
7)min(expr) 獲取最小值
5. 其他查詢方法
5.1 介于什么之間
關鍵字:between and 作用:用來查詢過濾信息,在一個范圍內的搜素結果。
5.2 模糊查詢
1)關鍵字: like 作用:用來模糊查詢
例如: 查詢學生表中姓王的同學
select stuname, stusex from TbStudent where stuname like '王%';
例如: 查詢學生表中姓名中有王字的同學
select stuname from TbStudent where stuname like '%王%';
2)關鍵字: _ 作用:用來模糊查詢,但是只能有一個模糊查詢的位數
例如:查詢姓郭名字總共兩個字的學生的姓名(模糊)
select stuname from TbStudent where stuname like '郭_';
例如:查詢姓郭名字總共三個字的學生的姓名(模糊)
select stuname from TbStudent where stuname like '郭__';
5.3 去重
關鍵詞: distinct 作用:去除重復性的數據
例如:所有學生中語文成績(去重)
select distinct s_yuwen from TbStudent;
5.4 判斷
關鍵詞:if(字段,exp1,exp2) 或者 ifnull(字段,exp1,,exp2) 作用:if表達式中如果字段值為真則返回exp1的值,如果為假的話,返回exp2的值 ifnull表達式中如果字段的值為假則返回exp1的值,如果為假的話,返回exp2的值
例如: 查詢男女學生的人數(分組和聚合函數)
select if(stusex, '男', '女') as `性別`, count(stusex) as `人數` from TbStudent group by stusex;
5.5 分組聚合
關鍵詞: group by having 作用: HAVING語句通常與GROUP BY語句聯合使用,用來過濾由GROUP BY語句返回的記錄集。 HAVING語句的存在彌補了WHERE關鍵字不能與聚合函數聯合使用的不足
例如:查詢平均成績大于等于90分的學生的學號和平均成績
select sid as `學號`, avg(score) as `平均成績` from TbSC group by sid having avg(score)>=90;
5.6關聯
定義 A INNER/LEFT/RIGHT JOIN B操作中,A表被稱為左表,B表被稱為右表。
a) 內關聯: Inner Join on 作用:僅對滿足連接條件的列進行關聯,其中inner可省略
b) 左外連接:Left Outer Jion on 作用:其中outer可以省略。如A LEFT JOIN B,會輸出左表A中所有的數據,同時將符合ON條件的右表B中搜索出來的結果合并到左表A表中,如果A表中存在而在B表中不存在,則結果集中會將查詢的B表字段值(如此處的P.PUNISHMENT字段)設置為NULL。 所以,LEFT JOIN的作用是: LEFT JOIN:從右表B中將符合ON條件的結果查詢出來,合并到A表中,再作為一個結果集輸出。
c) 右外連接:Right Outer Jion on 作用:其中outer可以省略,而RIGHT JOIN剛好相反,“A RIGHT JOIN B ON ……”是將符合ON條件的A表搜索結果合并到B表中,作為一個結果集輸出:
python連接Mysql數據庫
使用python連接數據庫,使用py腳本形式去更新表的數據,實現CRUD操作
事務
事務機制具備四點:原子性,一致性,隔離性,持久性,簡稱ACID特性
原子性(atomicity):一個事務是不可分割的一個整體,執行操作的話,要做就要一起做,不做的話就都不做
一致性(consistency):數據庫的狀態從一個狀態變到另外一個狀態
隔離性(isolation):一個事務在執行的時候不能被其他的事務干擾。即各各事務之間的操作是互不干擾的
持久性(durability):一個事務一旦提交以后,對數據庫的變化就是永久性的
注解 理解原子性和一致性, 舉個例子: 轉賬:張三給李四轉賬100元。那數據庫假設需要 張三扣100,李四加100,記錄一條流水。 如果流水沒記錄成功,那整體回滾,張三也沒轉賬成功,李四也沒多錢。這就是原子性的體現。
而張三必須扣100,李四必須加100,這個就是一致性了,如果因為某些邏輯原因,導致張三扣了100,流水記錄100轉賬,而李四只加了60。然后這3條操作都成功了,那原子性就符合了,但是一致性就不符合了
連接數據庫
安裝PyMySQL
pip install PyMySQL
前提條件
- 確保已經創建了數據庫TEST
- 確保已經在數據庫TEST中已經創建了表STUDENT
- 確保連接數據庫的密碼和數據庫名稱,以及端口和數據庫的IP地址
- 確認以及安裝了PyMySQL模塊了
測試例子
- 簡單的訪問,查詢一條數據
# -*- encoding:utf-8 -*-
import pymysql
# 打開數據庫連接(connect, Connect, Connection)
#db = pymysql.connect("localhost IP地址","root賬號","password密碼","TEST數據庫", 3306 端口)
db = pymysql.Connect(host='localhost', port=3306, user='root', passwd='123456', db='srs', charset='utf8')
# 使用 cursor() 方法創建一個游標對象 cursor
cursor = db.cursor()
# 使用 execute() 方法執行 SQL 查詢
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法獲取單條數據.
data = cursor.fetchone()
print ("Database version : %s " % data)
# 關閉數據庫連接
db.close()
注意其中獲取數據的方法有如下幾種: fetchone(): 該方法獲取下一個查詢結果集。結果集是一個對象 fetchall(): 接收全部的返回結果行.
- 獲取訪問數據庫,并且插入數據
import pymysql
# 打開數據庫連接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法獲取操作游標
cursor = db.cursor()
# SQL 插入語句
sql = """INSERT INTO STUDENT(s_name, s_tel)
VALUES (%s, %s)""" % ('張三', '15664322132')
try:
# 執行sql語句
cursor.execute(sql)
# 提交到數據庫執行
db.commit()
except:
# 如果發生錯誤則回滾
db.rollback()
# 關閉數據庫連接
db.close()
注意,其中在執行插入,以及修改,刪除語句的時候需要使用commit提交到數據庫
- 事務提交: commit()方法游標的所有更新操作, 回滾: rollback()方法回滾當前游標的所有操作