MYSQL數據庫

什么是數據庫?

數據庫(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 語句的后面是要創建的數據庫名稱。建議數據庫名稱盡可能是有意義和具有一定的描述性。

  1. 重復創建同一個數據庫是會提示你,數據庫已經存在了
    改進方案:
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;
  • 解析:
      1. 如果你不想字段為空 可以設置字段的屬性為 NOT NULL, 在操作數據庫時如果輸入該字段的數據為NULL ,就會報錯。
      1. AUTO_INCREMENT定義列為自增的屬性,一般用于主鍵,數值會自動加1。
      1. INT 定義的字段為整形
      1. VARCHAR 定義可變的字符串,最大的長度為30。
      1. PRIMARY KEY關鍵字用于定義列為主鍵。
      1. ENGINE 設置存儲引擎。
      1. 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屬性。現在分別對他們的屬性含義做個解釋。

    1. ON DELETE restrict(約束):當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除。
    • no action:意思同restrict.即如果存在從數據,不允許刪除主數據。

    • cascade(級聯):當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則也刪除外鍵在子表(即包含外鍵的表)中的記錄。

    • set null:當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(不過這就要求該外鍵允許取null)

    1. 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

前提條件

  1. 確保已經創建了數據庫TEST
  2. 確保已經在數據庫TEST中已經創建了表STUDENT
  3. 確保連接數據庫的密碼和數據庫名稱,以及端口和數據庫的IP地址
  4. 確認以及安裝了PyMySQL模塊了

測試例子

  1. 簡單的訪問,查詢一條數據
    # -*- 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(): 接收全部的返回結果行.

  1. 獲取訪問數據庫,并且插入數據
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提交到數據庫

  1. 事務提交: commit()方法游標的所有更新操作, 回滾: rollback()方法回滾當前游標的所有操作
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容