python基礎(六):數據庫(以mysql爲例)

Day15:python數據庫

數據庫:按照數據結構來,組織、管理、存儲數據的倉庫,可以和編程語言結合

1.MySQL安裝

mysql屬於關係型數據庫
1.選擇custom:
安裝第一步
2.只需要選擇這一個進行安裝就可以了
安裝第二步
3.對上一步中選擇好的,點開按圖中選擇就可以了
安裝第三步

SQL語句的基本語法

DDL:data definition language,數據定義語言:建庫建表如create,修改庫表alter,刪除庫表drop等,給數據倉庫定義

DML:data manipulation language,數據庫操作語言對數據的查詢,插入,刪除,更新操作,對數據內容進行操作

DCL: data control language,數據庫控制語言,對用戶 的管理

1.數據定義語言DDL

1.數據庫操作

  • 創建數據庫:create database if not exists 數據庫名
  • 刪除數據庫:drop database 數據庫名
  • 查看數據庫:show databases;
  • 定義數據庫字符集: create database if not exists 數據庫名 default charset=utf8

2.數據表操作

  • 創建表:create table if not exists table(字段 字段類型(字段長度) [字段屬性 [字段約束]);
  • 查看錶:show tables;
  • 查看錶結構:desc table;
  • 查看錶創建語句:show create table;
  • 刪除表:drop table if not exists table_
  • 修改表名:alter table table_old rename as table_new
  • 修改字段名:alter table table_ change old_字段 new_字段 字段類型及屬性
  • 修改字段類型:alter table table_ modify 字段名 字段類型及屬性
  • 添加字段:alter table table_ add 字段名 字段類型及屬性
  • 刪除字段: alter table table_ drop 字段名
  • 約束:主鍵 ,唯一,自增長,外鍵:
    • create table if not exists table_(xxx primary key ,…)
    • create table if not exists table_(xxx primary key ,…, constraint 外鍵名稱 foreign key(從表某字段) references 主表(主表某字段,這個字段需要有唯一性約束))
    • alter table 從表名 add constraint 外鍵名稱 foreign key(從表某字段) references 主表(主表某字段,這個字段需要有唯一性約束)
    • 1.兩個表必須是InnoDB表;2.使用在外鍵關係的域(字段)必須爲索引型(Index)。所以要爲設置外鍵的字段建立index;3.使用在外鍵關係的兩個域(字段)數據類型要相同。
  • mySQL引擎:innodb,myisam : create table MM(xxxxx)engine=InnoDB

功能對照表:

對比項 MyISAM表 InnoDB表
事務處理 不支持 支持
數據行鎖定 不支持,只有表鎖定 支持
外鍵約束 不支持 支持
表空間大小 相對小 相對大,最大是2倍
全文索引 支持 不支持
COUNT問題 執行COUNT(*)查詢時,速度慢

2.數據操作語言DML

數據庫操作語言:insert,update,delete

  • 添加數據:

    • 指定字段名添加:insert into table_(field1,fied2,field3…) values(value1,value2,value3…)
    • 不指定字段名,匹配所有列添加:insert into table_ values(value1,value2,vaule3…) #要與table列順序全匹配
    • 添加多列數據:insert into table_ values (value1,value2,vaule3…),(value1,value2,vaule3…),…();
    • select 添加:INSERT INTO table2 SELECT * FROM table1;
  • 刪除數據:

    • 條件刪除:delete from 表名 where condition;
    • 刪除所有:delete from 表名;truncate 表名;truncate刪除會重置索引
  • 更新數據:

    • 條件更新:update 表名 set 字段1 = value1 ,字段2 = value2 where condition
    • 更新所有:update 表名 set 字段1 = value1 ,字段2 = value2
  • 查詢數據:

    • 查所有:select * from table_name;
    • 查指定列:select field1 ,field2 from table_name
  • 查指定條件數據:

    • between…and :查詢在兩個之間的記錄

    • is null:查詢爲空的記錄

    • is not null :查詢不爲空的記錄

    • like:模糊查詢 %,_,*模糊匹配

    模式 描述
    ^ 匹配輸入字符串的開始位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 ‘\n’ 或 ‘\r’ 之後的位置。
    |RegExpMultiline 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
    . 匹配除 “\n” 之外的任何單個字符。要匹配包括 ‘\n’ 在內的任何字符,請使用象 ‘[.\n]’ 的模式。
    […] 字符集合。匹配所包含的任意一個字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
    [^…] 負值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。
    p1 p2
    * 匹配前面的子表達式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價於{0,}。
    + 匹配前面的子表達式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價於 {1,}。
    {n} n 是一個非負整數。匹配確定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個 o。
    {n,m} m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。
    • in : 查詢在某個集合內的

    • and:條件1 and 條件二 :查詢同時滿足條件1 和條件2的所有記錄

    • or : 條件1 or 條件二 :查詢滿足條件1 或條件2的所有記錄

    • not :條件1 not 條件二 :查詢滿足條件1 且不滿足條件2的所有記錄
    • xor 異或:條件1 xor 條件二 :查詢不同時滿足條件1 和條件2的所有記錄
    • 算術運算符:大於:>, 小於:< ,等於 =, 大於等於:>= ,小於等於<= ,不等於<>
  • 分組查詢:group by 分組查詢屬於聚合函數,可以和count,average,sum等一起使用

    • select * from table_name group by 字段
  • 分頁查詢:

    • 每頁顯示記錄數page_number:select * from commodity limit (page-1)*page_number,page_number
  • 排序:order by + asc(升序)/desc(降序)

  • 子查詢:內層查詢的結果作爲另外一個查詢的條件;select * from xxx where id = (select cc from aa)

  • 連接查詢:內連接(inner join…on),外連接(左外連接:left join …on ,右外連接 right join …on),全連接(full join…on)

小知識:Where子句中使用的連接語句,在數據庫語言中,被稱爲隱性連接。Inner join……on子句產生的連接稱爲顯性連接。(其他Join參數也是顯性連接)Where 和Inner join產生的連接關係,沒有本質區別,結果也一樣。但是!隱性連接隨着數據庫語言的規範和發展,已經逐漸被淘汰,比較新的數據庫語言基本上已經拋棄了隱性連接,全部採用顯性連接了。在 SQL-92 標準中,內聯接可在 FROM 或 WHERE 子句中指定。這是 WHERE 子句中唯一一種 SQL-92 支持的聯接類型。WHERE 子句中指定的內聯接稱爲舊式內聯接。

  • 聚合函數:sum(),avg(),count(),max(),min()

注意:如果統計的列中只有NULL值,那麼MAX和MIN就返回NULL

注意:sum和avg函數—求和與求平均!!表中列值爲null的行不參與計算,要想列值爲NULL的行也參與組函數的計算,必須使用IFNULL函數對NULL值做轉換。

python 連接msyql

  • 連接mysql的基本步驟:
#1、導入pymysql模塊
import pymysql      
#2、 建立連接
conn=pymysql.Connect(host='localhost',user='root',password='123456',db='school',charset='utf8')
#3、 獲取遊標,,通過遊標的位置獲取相應的數據(重要)
cur=conn.cursor()
#4、 組裝sql語句
sql="insert into job values('%s','%s','%s','%s')"   
#在使用格式化輸出的時候,%s爲字符串輸出類型,需要加引號
#5、 execute()執行sql語句
cur.execute(sql % data)     
#data爲元組
#6-1、 如果是增、刪、改操作,需要commit()操作
conn.commit()
#6-2、 如果是查詢操作,則執行抓取操作,fetchone()、fetchmany()、fetchall()
data_one=cur.fetchone()     
#獲取一條數據,遊標下移,後面獲取將從遊標位置繼續
data_many=cur.fetch_many()  
#以元組類型存儲
data_all=cur.fetchall()
#7、 關閉連接
conn.close()
  • 操作mysql並將處理結果寫入excel
import pymysql
import xlwt
class Connect(object):  #定義Connect類,用於實例化連接對象
    def __init__(self,host,user,password,db,charset):
        self.host=host
        self.user=user
        self.password=password
        self.db=db
        self.charset=charset
    def getConnect(self):   #定義獲得連接方法
        conn=pymysql.connect(host=self.host,user=self.user,password=self.password,db=self.db,charset=self.charset)
        return conn   #必須要有return才能成功建立連接
conn=Connect('localhost','root','123456','movies','utf8').getConnect()
cur=conn.cursor()
'''
----------------- 通過pymysql模塊插入兩條數據 -----------------------
'''
def insertData(data):
    sql_1="insert into movieRank values('%s','%f','%f','%d','%f')"
    cur.execute(sq_l1 % data)
    conn1.commit()
    print("插入了{}條數據!".format(cur.rowcount))
data1=('犬之島',617.35,0.0908,2,1309.09)
data2=('湮滅',145.34,0.0199,9,5556.77)
# insertData(data1)
# insertData(data2)
'''
------------- 執行SQL語句查詢數據,並通過xlwt模塊操作excel寫入文件 --------------
'''python
sql_2="select * from movierank"     #SQL查詢語句
cur.execute(sql_2)  #執行SQL語句
table_frame=cur.description  #description就是sql語句中的desc,描述的是表結構,上一句的execute相當於定位到表movierank,描述的表結構,爲橫向排列
list1=[]    #定義空列表,用於存放表頭
for row in table_frame:
    list1.append(row[0])    #將表結構中每行第一個元素加入到list1中
wb=xlwt.Workbook()
new_sheet=wb.add_sheet('Movies data')
for i in range(len(list1)):
    new_sheet.write(0,i,list1[i])   #在第一行寫入表頭
alldata=cur.fetchall()  #通過fetchall()獲取所有數據
for j in range(len(alldata)):
    for k in range(len(alldata[i])):
        new_sheet.write(j + 1,k, alldata[j][k]) #for循環遍歷通過write()方法將數據寫入excel
wb.save("./movieRank.xls")
  • 通過Python操作pymysql進行分頁查詢
import pymysql  #導入模塊
conn=pymysql.Connect(host='localhost',user='root',password='123456',db='jobinfo',charset='utf8')   #建立連接
cur=conn.cursor()   #建立遊標
currentPage=1   #當前頁碼
pageNum=10      #每頁數據數量
for page in range(1,21):    #for循環從第1頁打印到20頁:   
    sql = "select * from job limit %d,%d"   #組裝sql語句
    start_index = (currentPage - 1) * pageNum
    cur.execute(sql % (start_index, pageNum))
    print("************:獲取第{}頁**************".format(page))
    for row in cur.fetchall():
        print(row)

經常使用select * from students,score WHERE students.sno = score.sno;
這樣的語句,今天使用左外連接時候寫的SQL語句:

select * from students left join score where students.sno = score.sno;

執行報錯:

syntax to use near 'where students.sno = score.sno' at line 1

查了一下在外連接的時候使用on進行條件連接;

2.在內連接不加條件的時候就是全連接,因爲連接指向就是先進行全連接然後再進行on條件篩選,如果是外連接則必須有on;

在CNDN看到了一篇講解SQL語句的執行順序的,如下:

執行順序:

  1. FROM:對FROM子句中的前兩個表執行笛卡爾積,生成虛擬表VT1。
  2. ON:對VT1應用ON篩選器。只有那些使爲真的行才被插入VT2。
  3. OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行將作爲外部行添加到VT2,生成VT3。 如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重複執行步驟1到步驟3,直到 處理完所有的表爲止。
  4. 對VT3應用WHERE篩選器。只有使爲TRUE的行才被插入VT4。
  5. GROUP BY:按GROUP BY 子句中的列列表對VT4中的行分組,生成VT5。
  6. CUBE|ROLLUP:把超組插入VT5,生成VT6。
  7. HAVING:對VT6應用HAVING篩選器。只有使爲TRUE的組纔會被插入VT7。
  8. SELECT:處理SELECT列表,產生VT8。
  9. DISTINCT:將重複的行從VT8中移除,產生VT9。
  10. ORDER BY:將VT9中的行按ORDER BY子句中的列列表排序,生成一個有表(VC10)。
  11. TOP:從VC10的開始處選擇指定數量或比例的行,生成表VT11,並返回給調用者。

MySQL最常用分組聚合函數 —- “講解很好包括用法和注意事項”

發佈了33 篇原創文章 · 獲贊 20 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章