Python學(xué)習(xí)筆記二十(MySQL署驻、SQL、聯(lián)表查詢)

聯(lián)表查詢(多表查詢)

create table article(
id int unsigned auto_increment primary key,
title varchar(100) ,
content_path varchar(100),
content_num int unsigned,
author_id int unsigned,
is_del bit default 0
);

create table author(
id int unsigned auto_increment primary key,
name varchar(100),
address varchar(100),
is_del bit default 0
);

01現(xiàn)有數(shù)據(jù).png

連接查詢

  • inner join 數(shù)據(jù)的交集
  • left join 數(shù)據(jù)的交集 并上 左邊表的特有數(shù)據(jù)
  • right join 數(shù)據(jù)的交集 并上 右邊表的特有數(shù)據(jù)

inner join 內(nèi)連接或等值連接(相當(dāng)于兩表或者多表的的權(quán)重相等)

-- inner join 數(shù)據(jù)的交集
select * from article inner join author ;
select * from article inner join author on article.author_id = author.id;
02inner join.png

問題:數(shù)據(jù)表就是一個集合耕餐,每一條記錄就是集合中的一個值凡傅,內(nèi)聯(lián)查詢就是對兩個集合(表)求笛卡爾乘積[1],但是笛卡爾積的結(jié)果集并不是我們想要的結(jié)果肠缔,所以需要使用on 篩選出我們需要的結(jié)果集(笛卡爾積結(jié)果集的子集)

簡單來說內(nèi)聯(lián)查詢會得到 每個數(shù)據(jù)表記錄數(shù) 乘積 條記錄的結(jié)果集夏跷,如上面的兩張表article 和 author 分別有20 和 10 條記錄,會得到一個有 200(20*10)條記錄的結(jié)果集

注:

  • on 聯(lián)表查詢時明未,做條件篩選時的關(guān)鍵字
  • where 單表查詢時槽华,做條件篩選時的關(guān)鍵字
  • having 分組時,做條件篩選的關(guān)鍵字

left join 左連接 (左邊的權(quán)重大于右邊趟妥,左表為主)

-- 顯示公共部分猫态,以及左表特有的部分(author_id  為null 的五條記錄)
select * from article left join author on article.author_id = author.id;
03left join.png

right join 右連接 (右邊的權(quán)重大于左邊,右表為主)

-- 顯示公共部分,以及右表特有的部分
select * from article right join author on article.author_id = author.id;
04right join.png

自關(guān)聯(lián)

當(dāng)需要的數(shù)據(jù)都在一張表中亲雪,但普通的查詢又不能滿足需求時勇凭,可以通過自關(guān)聯(lián)的方式得到一張能滿足需求的表

05省市縣數(shù)據(jù)表.png

如上表,省市縣在一張表中义辕,如果要做三級聯(lián)動[2]需要自關(guān)聯(lián)查詢得到想要的數(shù)據(jù)虾标。

-- 查詢山東省的所有城市
select * from areas as a1 inner join areas as a2 on a1.pid = a2.aid where a2.atitle = "山東省";
06自關(guān)聯(lián).png

子查詢

查詢的嵌套 ,將一個查詢的結(jié)果集作為另一個查詢的輸入,可以作為條件灌砖,也可以作為數(shù)據(jù)源璧函。

-- 查詢山東省的所有城市 
select * from areas where pid = (select aid from areas where atitle = "山東省");
07子查詢.png

Python操作數(shù)據(jù)庫

pymysql安裝[3]

from pymysql import connect  # 導(dǎo)入模塊

if __name__ == '__main__':
    #調(diào)用connect() 方法創(chuàng)建 Connection 對象 
    conn = connect(host="localhost", port=3306, user="root", password="dragon",
                   database="fang", charset="utf8")

    cs = conn.cursor()

    for tmp in range(20):
        cs.execute("""insert into article(title,author_id) values(%s,%s); """, ("dragon", 1000))
        conn.commit()

    conn.close()

  • connect() 方法的參數(shù)
    • 參數(shù)host:連接的mysql主機,如果本機是'localhost'
    • 參數(shù)port:連接的mysql主機的端口基显,默認(rèn)是3306
    • 參數(shù)database:數(shù)據(jù)庫的名稱
    • 參數(shù)user:連接的用戶名
    • 參數(shù)password:連接的密碼
    • 參數(shù)charset:通信采用的編碼方式蘸吓,推薦使用utf8
  • Connection 對象的方法
    • close()關(guān)閉連接
    • commit()提交
    • cursor()返回Cursor對象,用于執(zhí)行sql語句并獲得結(jié)果
  • Cursor對象
    • 用于執(zhí)行sql語句撩幽,使用頻度最高的語句為select美澳、insert、update摸航、delete
    • 獲取Cursor對象:調(diào)用Connection對象的cursor()方法
      Cursor 對象的方法
    • close()關(guān)閉
    • execute(operation [, parameters ])執(zhí)行語句,返回受影響的行數(shù)舅桩,主要用于執(zhí)行insert酱虎、update、delete語句擂涛,也可以執(zhí)行create、alter、drop等語句
    • fetchone()執(zhí)行查詢語句時浩蓉,獲取查詢結(jié)果集的第一個行數(shù)據(jù)运褪,返回一個元組
    • fetchall()執(zhí)行查詢時,獲取結(jié)果集的所有行狰右,一行構(gòu)成一個元組杰捂,再將這些元組裝入一個元組返回
  • Cursor 對象的屬性
    • rowcount只讀屬性,表示最近一次execute()執(zhí)行后受影響的行數(shù)
    • connection獲得當(dāng)前連接對象

sql注入問題

from pymysql import connect

if __name__ == '__main__':
    conn = connect(host="localhost", port=3306, user="root", password="fangfang",
                   database="fang", charset="utf8")

    article_id = input("請輸入id:")
    cs = conn.cursor()

    sql_str = """select * from article where id >%s; """ % article_id
    print(sql_str)
    # for tmp in range(20):
    cs.execute(sql_str)
    conn.commit()

    conn.close()
    
    # 運行結(jié)果
    # 請輸入id:123
    # select * from article where id >123;
    
    # 假設(shè) 我輸入
    # 請輸入id:123;delete from article 
    # select * from article where id >123;delete from article ;

    # 假設(shè)是插入語句
    # """inset into areas(atitle) values ("%s");""" % """a");delete from areas where (aid >"1"""
    # 如下
    # inset into areas(atitle) values ("a");delete from areas where (aid >"1");


08SQL注入 清空表數(shù)據(jù).png

解決方案

execute 可以傳參

def execute(self, query, args=None):
        """Execute a query

        :param str query: Query to execute.

        :param args: parameters used with query. (optional)
        :type args: tuple, list or dict

        :return: Number of affected rows
        :rtype: int

        If args is a list or tuple, %s can be used as a placeholder in the query.
        If args is a dict, %(name)s can be used as a placeholder in the query.
        """
        while self.nextset():
            pass

        query = self.mogrify(query, args)

        result = self._query(query)
        self._executed = query
        return result

# 實例
# 列表 或 元組傳值
# execute("""select * from article where id >%s; """,(123,)) 

# 字典傳值
# sql_str = """insert into article(title,author_id) values (%(title)s,%(author_id)s); """
# cs.execute(sql_str, {"author_id": 22,"title": "aaaa"})

事務(wù)

  • 事務(wù)作用:保證數(shù)據(jù)修改的完整性
  • 特性:
    數(shù)據(jù)操作后可以,可以回滾(注意刪除表,刪除庫沒辦法)
    acid 原子性,一致性,隔離性,持久性
  • 事務(wù)的操作
     begin棋蚌;-- 開啟事務(wù)
     start transaction嫁佳;-- 開啟事務(wù)
     commit; -- 提交事務(wù)
     rollback; -- 回滾

索引

  • 有什么用:加快查詢的速度
  • 原理:對我們的字段進行分組,如果大并發(fā)的情況下,修改數(shù)據(jù)會變慢
-- 創(chuàng)建
    create index 名字 on 表名(索引的字段);
-- 查看
    show index from 表名;
-- 刪除
    drop index 索引名 on 表名; # 必須指定表名

數(shù)據(jù)庫設(shè)計

三范式

  • 第一范式(1NF):強調(diào)的是列的原子性谷暮,即列不能夠再分成其他幾列蒿往。(一個數(shù)據(jù)一個字段)
  • 第二范式(2NF):首先是 1NF,另外包含兩部分內(nèi)容湿弦,一是表必須有一個主鍵瓤漏;二是沒有包含在主鍵中的列必須完全依賴于主鍵,而不能只依賴于主鍵的一部分。(確定主鍵蔬充,擁有主鍵)
  • 第三范式(3NF):首先是 2NF蝶俱,另外非主鍵列必須直接依賴于主鍵,不能存在傳遞依賴娃惯。即不能存在:非主鍵列 A 依賴于非主鍵列 B跷乐,非主鍵列 B 依賴于主鍵的情況。(減少重復(fù))

數(shù)據(jù)庫軍規(guī)


到此結(jié)?DragonFangQy 2018.5.15


  1. 笛卡爾乘積 ?

  2. 三級聯(lián)動數(shù)據(jù)庫資源,需要積分 ?

  3. pymysql模塊的安裝 ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趾浅,一起剝皮案震驚了整個濱河市愕提,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌皿哨,老刑警劉巖浅侨,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異证膨,居然都是意外死亡如输,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門央勒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來不见,“玉大人,你說我怎么就攤上這事崔步∥人保” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵井濒,是天一觀的道長灶似。 經(jīng)常有香客問我,道長瑞你,這世上最難降的妖魔是什么酪惭? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮者甲,結(jié)果婚禮上春感,老公的妹妹穿的比我還像新娘。我一直安慰自己过牙,他們只是感情好甥厦,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寇钉,像睡著了一般刀疙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扫倡,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天谦秧,我揣著相機與錄音竟纳,去河邊找鬼。 笑死疚鲤,一個胖子當(dāng)著我的面吹牛锥累,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播集歇,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼桶略,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诲宇?” 一聲冷哼從身側(cè)響起际歼,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姑蓝,沒想到半個月后鹅心,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡纺荧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年旭愧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宙暇。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡输枯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出占贫,到底是詐尸還是另有隱情用押,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布靶剑,位于F島的核電站,受9級特大地震影響池充,放射性物質(zhì)發(fā)生泄漏桩引。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一收夸、第九天 我趴在偏房一處隱蔽的房頂上張望坑匠。 院中可真熱鬧,春花似錦卧惜、人聲如沸厘灼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽设凹。三九已至,卻和暖如春茅姜,著一層夾襖步出監(jiān)牢的瞬間闪朱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奋姿,地道東北人锄开。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像称诗,于是被迫代替她去往敵國和親萍悴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • SQL語言基礎(chǔ) 本章寓免,我們將會重點探討SQL語言基礎(chǔ)癣诱,學(xué)習(xí)用SQL進行數(shù)據(jù)庫的基本數(shù)據(jù)查詢操作。另外請注意本章的S...
    厲鉚兄閱讀 5,314評論 2 46
  • MySQL技術(shù)內(nèi)幕:SQL編程 姜承堯 第1章 SQL編程 >> B是由MySQL創(chuàng)始人之一Monty分支的一個版...
    沉默劍士閱讀 2,412評論 0 3
  • 01 十月,已經(jīng)是深秋了困鸥。我坐在咖啡館靠窗的位置嗅蔬,目光呆滯地望向窗外。這家名為樹島的小咖啡館疾就,是我和蕭然平時最喜歡...
    絳洞花王閱讀 972評論 16 11
  • 我們把事情分成四大類澜术,重要緊急,重要不緊急猬腰,不重要緊急鸟废,不重要不緊急。想一想每天自己處理的都是哪一類事情呢姑荷?如果很...
    鵬鵬YH閱讀 176評論 2 1
  • 滿天那璀璨的星星盒延,仿佛你的眼睛 晶瑩又深邃,凝視在我的心里 我只對你敞開心胸鼠冕,傾訴我的哀痛 我只溫存在你的懷里添寺,奔...
    潛水的鳥閱讀 259評論 0 1