02-數(shù)據(jù)庫MySQL[Python]

一洛史、數(shù)據(jù)的完整性之實(shí)體完整性

  • 數(shù)據(jù)的完整性
    作用:保證用戶輸入的數(shù)據(jù)保存到數(shù)據(jù)庫中是正確的荒适。
    實(shí)質(zhì):創(chuàng)建表的時(shí)候給表中的字段添加約束。

  • 實(shí)體完整性
    實(shí)體:表中的一行或者一條記錄代表一個(gè)實(shí)體
    實(shí)體完整性的作用:標(biāo)識(shí)每一行數(shù)據(jù)不重復(fù)
    約束類型:主鍵約束【primary key】羞芍、唯一約束【unique】糠聪、自動(dòng)增長列【auto_increment】

  • 主鍵約束【primary key】
    特點(diǎn):數(shù)據(jù)唯一,且不能為null;
    它的值用來唯一標(biāo)識(shí)表中的某一條記錄;
    場(chǎng)景:在多個(gè)表的關(guān)聯(lián)關(guān)系中;

    // id設(shè)置為主鍵
    create table student(id int, name varchar(50), primary key(id));
    
    
  • 唯一約束【unique】
    作用:在非主鍵列中不能輸入重復(fù)的值;

    create table student(id int primary key, name varchar(50) unique);
    
    

    primary key和unique之間的區(qū)別?

    • 二者都強(qiáng)調(diào)的是唯一性
    • 在同一個(gè)表中声旺,只能出現(xiàn)一個(gè)primary key笔链,可以出現(xiàn)多個(gè)unique
    • primary key不允許為null,但是unique是允許的
  • 自動(dòng)增長【auto_increment】
    給主鍵添加添加自動(dòng)增長性腮猖,字段只能是整數(shù)類型鉴扫;
    場(chǎng)景: 一般添加給主鍵;

    create table student(id int primary key auto_increment, name varchar(50) unique);
    
    

二澈缺、數(shù)據(jù)的完整性之域完整性

  • 域完整性
    作用:限制單元格數(shù)據(jù)的正確性坪创,域代表當(dāng)前單元格炕婶;
    約束類型:數(shù)據(jù)類型、非空約束【not null】莱预、默認(rèn)值約束【default】

  • 數(shù)據(jù)類型

    數(shù)字類型:int float doule decimal
    日期類型:date
    字符串類型:char varchar
    
    
  • 非空約束【not null】

    create table student( id int primary key auto_increment, name varchar(50) not null);
    
    

    非空柠掂,即表示插入數(shù)據(jù)時(shí)不能為空;為空時(shí)依沮,數(shù)據(jù)庫立即報(bào)錯(cuò)涯贞。

  • 默認(rèn)值約束【default】

    create table student(id int primary key auto_increment, name varchar(50), addr varchar(50) default "shenzhen")
    
    // 不使用默認(rèn)值
    insert into student (id,name, addr) values(1,'aaa','guagnzhou');
    // 使用默認(rèn)值
    insert into student(id,name, addr) values(2,'bbb',default);
    insert into student(id,name) values(3,'ccc');
    
    

二、數(shù)據(jù)的完整性之引用完整性

  • 外鍵約束【foreign key】
    注意: 添加外鍵必須先有主鍵危喉,主鍵和外鍵的類型必須保持一致宋渔;
    作用: 將兩個(gè)甚至多個(gè)毫無關(guān)聯(lián)的表產(chǎn)生聯(lián)系
    備注: 一張表中可以有多個(gè)外鍵
    例如: 學(xué)生表,成績(jī)表

    // 創(chuàng)建學(xué)生表
    create table student(stu_id int primary key, s_name varchar(50)) charset=utf8;
    
    // 添加學(xué)生數(shù)據(jù)
    insert into student  values(1001, '張三');
    insert into student  values(1002, '李四');
    insert into student  values(1003, '王五');
    insert into student  values(1004, '趙六');
    insert into student  values(1005, '田七');
    insert into student  values(1006, '王八');
    insert into student  values(1007, '老九');
    
    // 創(chuàng)建成績(jī)表
    // 外鍵stu_id辜限,外鍵約束對(duì)應(yīng)的student的stu_id
    create table score(sco_id int primary key, score int, stu_id int,foreign key(stu_id) references student(stu_id)) charset=utf8;
    insert into score values(1, 89, 1001);
    insert into score values(2, 97, 1002);
    insert into score values(3, 99, 1003);
    insert into score values(4, 82, 1004);
    insert into score values(5, 86, 1005);
    
    

四皇拣、多表查詢

  • 表與表之間的關(guān)系

    1. 一對(duì)一, 通過嵌套的方式
    2. 一對(duì)多(多對(duì)一), 添加外鍵
    3. 多對(duì)多, 單獨(dú)創(chuàng)建一張新的表
  • 合并結(jié)果集
    作用:將兩個(gè)select語句的查詢結(jié)果合并到一起;
    兩種方式:union去除重復(fù)記錄【并集】、union all獲取所有的結(jié)果薄嫡;

    // 創(chuàng)建表A和表B
    create table A( name varchar(10), score int );
    create table B( name varchar(10), score int );
    
    // 插入數(shù)據(jù)
    insert into A values('a',10),('b',20),('c',30);
    insert into B values('a',10),('d',40),('c',30);
    
    // union合并結(jié)果集
    select * from A
    union
    select * from B;
    +------+-------+
    | name | score |
    +------+-------+
    | a    |    10 |
    | b    |    20 |
    | c    |    30 |
    | d    |    40 |
    +------+-------+
    
    // union all合并結(jié)果集
    select * from A
    union all
    select * from B;
    +------+-------+
    | name | score |
    +------+-------+
    | a    |    10 |
    | b    |    20 |
    | c    |    30 |
    | a    |    10 |
    | d    |    40 |
    | c    |    30 |  
    +------+-------+
    
    // 問題: 如果遇到列數(shù)不相同的情況
    create table C( name varchar(10), score int, age int);
    insert into C values('a',100,29),('e',20,18),('c',300,10);
    insert into C values('a',10,29),('e',20,18),('c',30,10);
    
    select * from A
    union
    select name,score from C;
    +------+-------+
    | name | score |
    +------+-------+
    | a    |    10    |
    | b    |    20   |
    | c    |    30   |
    | a    |    100 |
    | e    |    20   |
    | c    |    300 |
    +------+-------+
    
    

    注意:被合并的兩個(gè)結(jié)果氧急,字段、字段類型必須相同;

  • 內(nèi)連接inner join
    內(nèi)連接:查詢左右表都有的數(shù)據(jù)毫深,不要左右中空的那一部分态蒂;
    內(nèi)連接:左右連接的交集;

    語法:
    select 列1,列2,列N from
    tableA 
    inner join 
    tableB
    on tableA.列 = tableB.列  (此處表連接成一張大表费什,完全當(dāng)成一張普通表看)
    where,having,group by.... (條件照常寫)
    
    例如:
    查詢每個(gè)學(xué)生的具體信息
    select 
    tableA.*,tableB.score
    from 
    student tableA 
    inner join 
    score tableB
    on 
    tableA.stu_id=tableB.stu_id;
    
    select 
    tableA.*,score
    from 
    student tableA 
    inner join 
    score tableB
    on 
    tableA.stu_id=tableB.stu_id;
    
    
  • 左連接left join
    左連接1: 得到的是A的所有數(shù)據(jù),和滿足某一條件的B的數(shù)據(jù);

    左連接2: 得到的是A中的所有數(shù)據(jù)減去"與B滿足同一條件 的數(shù)據(jù)"手素,然后得到的A剩余數(shù)據(jù)鸳址;

語法:
  select 
  列1,列2,列N 
  from
  tableA 
  left join 
  tableB
  on 
  tableA.列 = tableB.列  (此處表連接成一張大表,完全當(dāng)成一張普通表看)
  where,having,group by.... (條件照常寫)

  例如,左連接1:
  select 
  tableA.*,score
  from 
  student tableA 
  left join 
  score tableB
  on 
  tableA.stu_id=tableB.stu_id;

  例如,左連接2:
  select 
  tableA.*
  from 
  student tableA 
  left join 
  score tableB
  on 
  tableA.stu_id=tableB.stu_id
  where
  score is null;

  • 右連接right join
    右連接1: 得到的是B的所有數(shù)據(jù)泉懦,和滿足某一條件的A的數(shù)據(jù)稿黍;

    右連接2: 得到的是B中的所有數(shù)據(jù)減去 "與A滿足同一條件的數(shù)據(jù)",然后得到的B剩余數(shù)據(jù);

    語法:
    select 
    列1,列2,列N 
    from
    tableA 
    right join 
    tableB
    on 
    tableA.列 = tableB.列  (此處表連接成一張大表崩哩,完全當(dāng)成一張普通表看)
    where,having,group by.... (條件照常寫)
    
    例如:
    select 
    tableA.*,score
    from 
    student tableA 
    right join 
    score tableB
    on 
    tableA.stu_id=tableB.stu_id;
    
    

    左連接:即以左表為基準(zhǔn)巡球,到右表找匹配的數(shù)據(jù),找不到匹配的用NULL補(bǔ)齊;
    推薦左連接來代替右連接邓嘹,兼容性會(huì)好一些酣栈;

  • 自然連接natural join
    通過MySql自己的判斷完成連接過程,不需要指定連接條件汹押。MySql會(huì)使用表內(nèi)的矿筝,相同的字段,作為連接條件棚贾。

    select * from A natural join B;
    
    

五窖维、多表查詢

1榆综、男同學(xué)的考試科目及對(duì)應(yīng)成績(jī)
2、姓張同學(xué)的考試科目及對(duì)應(yīng)成績(jī)
3铸史、既有英語又有計(jì)算機(jī)成績(jī)的學(xué)生信息
4鼻疮、姓王的同學(xué)并且有一科以上成績(jī)大于90分的學(xué)生信息

5、查詢李四的考試科目(c_name)和考試成績(jī)(grade)
6琳轿、查詢計(jì)算機(jī)成績(jī)低于95的學(xué)生信息
7判沟、查詢都是湖南的學(xué)生的姓名、年齡利赋、院系和考試科目及成績(jī)

1水评、
SELECT name,sex,c_name,grade 
FROM 
student,score
WHERE
student.id=score.stu_id AND sex='男';
2、
SELECT name,c_name,grade
FROM
student,score
WHERE
student.id=score.stu_id AND name LIKE "張%"; 
3媚送、
SELECT student.*
FROM 
student,score s1,score s2
WHERE
student.id=s1.stu_id AND student.id=s2.stu_id 
AND
s1.c_name="計(jì)算機(jī)" AND s2.c_name="英語"; 
4中燥、
SELECT student.*
FROM
student,score
WHERE
student.id=score.stu_id AND grade>90 AND name LIKE "王%";
5、
SELECT name,c_name,grade 
FROM
student,score
WHERE
student.id=score.stu_id AND name="李四";
6塘偎、
SELECT student.*,c_name,grade 
FROM
student,score
WHERE
student.id=score.stu_id AND c_name="計(jì)算機(jī)" AND grade<95;
7疗涉、
SELECT name,2017-birth AS age,department,c_name,grade 
FROM
student,score
WHERE
student.id=score.stu_id AND address like "%湖南%";

找到表與表的對(duì)應(yīng)關(guān)系;
如果多張表中有同一個(gè)屬性名時(shí)必須標(biāo)注是哪個(gè)表中的屬性;

六、數(shù)據(jù)庫的備份和恢復(fù)

  • 備份
    生成SQL腳本吟秩,導(dǎo)出數(shù)據(jù)咱扣。

    語法:
    $ mysqldump -u root -p  數(shù)據(jù)庫名 > 生成sql腳本的路徑
    
    例如:
    $ mysqldump -u root -p mydb1 > ~/mydb1.sql
    
    
  • 恢復(fù)
    執(zhí)行sql腳本,恢復(fù)數(shù)據(jù)涵防。

    前提: 必須先創(chuàng)建數(shù)據(jù)庫【空的】
    注意: 需要先登錄數(shù)據(jù)庫闹伪,然后進(jìn)入指定的數(shù)據(jù)庫,執(zhí)行sql腳本
    語法:
      mysql> source sql腳本的路徑
    
    例如:
      mysql> create database test;
      mysql> use test;
      mysql> source ~/mydb1.sql;
    
    

八壮池、MySQL與Python的交互

- 安裝
    pip3 install pymysql

- 使用
import pymysql

# 鏈接數(shù)據(jù)庫
db = pymysql.Connect(host='127.0.0.1', port=3306, user='root', password='123456', database='test08', charset='utf8')
# 數(shù)據(jù)庫游標(biāo)
cursor = db.cursor()

# 查詢數(shù)據(jù)
db.begin()
cursor.execute("select * from students_info;")
db.commit()
# 獲取所有數(shù)據(jù)
print(cursor.fetchall())
# 獲取一個(gè)偏瓤,根據(jù)下標(biāo)取對(duì)應(yīng)的數(shù)據(jù)
print(cursor.fetchall()[0])
# 注: 不能同時(shí)使用,因?yàn)橛螛?biāo)會(huì)往后移動(dòng)

# 插入數(shù)據(jù)
db.begin()
cursor.execute("insert into students_info values ('2000', '老李', '18', '男', '廣東深圳', '1703', '89', '90', '81');")
db.commit()

# 更新數(shù)據(jù)
db.begin()
cursor.execute("update students_info set class='1807' where id=2000")
db.commit()

# 刪除數(shù)據(jù)
db.begin()
cursor.execute("delete from students_info where id=2000")
db.commit()

作者:西門奄
鏈接:http://www.reibang.com/u/77035eb804c3
來源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有椰憋,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處厅克。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市橙依,隨后出現(xiàn)的幾起案子证舟,更是在濱河造成了極大的恐慌,老刑警劉巖窗骑,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件女责,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡创译,警方通過查閱死者的電腦和手機(jī)鲤竹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辛藻,你說我怎么就攤上這事碘橘。” “怎么了吱肌?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵痘拆,是天一觀的道長。 經(jīng)常有香客問我氮墨,道長纺蛆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任规揪,我火速辦了婚禮桥氏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猛铅。我一直安慰自己字支,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布奸忽。 她就那樣靜靜地躺著堕伪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栗菜。 梳的紋絲不亂的頭發(fā)上欠雌,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音疙筹,去河邊找鬼富俄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛而咆,可吹牛的內(nèi)容都是我干的霍比。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼翘盖,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了凹蜂?” 一聲冷哼從身側(cè)響起馍驯,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玛痊,沒想到半個(gè)月后汰瘫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擂煞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年混弥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝗拿,死狀恐怖晾捏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哀托,我是刑警寧澤惦辛,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站仓手,受9級(jí)特大地震影響胖齐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗽冒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一呀伙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧添坊,春花似錦剿另、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至速客,卻和暖如春戚篙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溺职。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工岔擂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浪耘。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓乱灵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親七冲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痛倚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 一、數(shù)據(jù)的完整性之實(shí)體完整性 數(shù)據(jù)的完整性作用:保證用戶輸入的數(shù)據(jù)保存到數(shù)據(jù)庫中是正確的澜躺。實(shí)質(zhì):創(chuàng)建表的時(shí)候給表中...
    EndEvent閱讀 1,507評(píng)論 0 5
  • MYSQL 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫概要 2 簡(jiǎn)單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 MySQL基本操...
    Kingtester閱讀 7,811評(píng)論 5 116
  • (一)Oracle數(shù)據(jù)庫 1.oracle中row_id理解 ORACLE的row_id是一個(gè)偽列,其個(gè)是為18個(gè)...
    獨(dú)云閱讀 5,606評(píng)論 0 10
  • 觀其大綱 page 01 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫概要 2 簡(jiǎn)單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 M...
    周少言閱讀 3,156評(píng)論 0 33
  • 一掘鄙、上堂回顧 1.概念? 數(shù)據(jù)庫管理系統(tǒng)耘戚,數(shù)據(jù)庫,表? SQL的分類:DDL操漠、DML收津、DQL、DCL2.數(shù)據(jù)庫的使...
    WenErone閱讀 419評(píng)論 0 0