1. 程式人生 > 實用技巧 >try catch finally,return執行

try catch finally,return執行

mysql 的概述

1.什麼是資料庫

資料庫就是一個 儲存資料的倉庫

2. 都有哪些公司在用資料庫

購物網站, 金融機構, 遊戲網站, 論壇網站

3. 提供資料庫服務的軟體

  1. 軟體分類

    mysql sql_server oracle mariadb db2 mongodb

  2. 在生產環境中,如何選擇使用哪個資料庫

    1. 是否開源

      • 開源軟體: 個人使用,免費, 企業使用, 收費 mysql mariadb mongodb
      • 商業軟體: 收費 oracle db2 sql_server
    2. 是否跨平臺

      • 不跨平臺: sql_server
      • 跨平臺: 以上都是
    3. 公司的型別

      商業軟體: 政府部門, 金融機構

      開源軟體: 個人公司, 中小型企業

4.mysql 的特點

  1. 關係型資料庫

    1. 關係型資料庫的特點

      1. 資料是以行和列的形式去儲存的
      2. 這一系列的行和列稱為 表
      3. 表中的每一行 叫 一條記錄
      4. 表中的每一列 叫 一個欄位
      5. 表和表之間的邏輯關聯叫關係
    2. 什麼叫關係型資料庫

      1. 關係型資料庫儲存

        表1 : 學生資訊表

        姓名 年齡 班級

        牛郎 25 aid1803

        織女 23 aid1801

      2. 非關係型資料庫中儲存

  2. 跨平臺

    可以在 unix linux windows 上執行資料庫服務

  3. 支援 多種程式語言

    python, java, php ...

5. mysql 的安裝

  1. ubuntu 安裝 mysql 服務 redhat(紅帽子),centos, ubuntu

    1. 安裝服務端

      sudo apt install mysql-server

    2. 安裝客戶端

      sudo apt install mysql-client

  2. windows 安裝 mysql 服務

    1. 官網下載 安裝包
    2. 雙擊, 按照教程安裝即可

6. mysql 服務

  1. 服務端啟動

    1. 檢視 mysql 服務狀態

      sudo /etc/init.d/mysql status

    2. 停止, 啟動, 重啟 mysql 服務

      sudo /etc/init.d/mysql stop |start | restart

  2. 客戶端連線

    1. 命令格式

      mysql -h 主機地址 -u使用者名稱 -p密碼

      mysql -hlocalhost -uroot -p123456

    2. 本地連線 可以 省略 -hlocalhost

MYSQL 基本操作

7. 基本sql 命令

sql 命令的使用規則

  1. 每條 sql 命令必須以 ; 結尾
  2. sql 命令不區分字母大小寫
  3. 使用 \c 來終止命令的執行 (linux 中 ctrl + c)

庫的管理

  1. 庫的基本操作

    1. 檢視已有的庫

      show databases;

    2. 建立庫

      create database 庫名

      create database 庫名 default charset=utf8

    3. 檢視建立庫的語句

      show create database 庫名

    4. 檢視當前所在庫

      select database();

    5. 切換庫

      use 庫名;

    6. 檢視庫中已有表

      show tables;

    7. 刪除庫

      drop database 庫名;

  2. 庫名的命名規則

  3. 可以使用數字, 字母 , 下劃線_ , 但不能使用純數字

  4. 庫名區分字母大小寫

  5. 庫名具有唯一性

  6. 不能使用特殊字元和 mysql 關鍵字

  7. 練習

    1. 建立庫 aid1803db, 指定字符集為 utf-8
    2. 切換到該庫 aid1803
    3. 檢視當前所在庫
    4. 檢視庫中已有的表
    5. 檢視 aid1803 的字符集(檢視建立庫的語句)
    6. 刪除庫 aid1803db
create database aid1803 default charset=utf8;
use aid1803;
select database();
show tables;
show create database aid1803;
drop database aid1803;

表的管理

  1. 表的基本操作

    1. 建立表(指定字符集)

      create table 表名(欄位名 資料型別, 欄位名 資料型別, ... ...);

      create table 表名(欄位名 資料型別, 欄位名 資料型別, ... ...)default charset = utf8;

    2. 檢視 建立表的語句(字符集)

      show create table 表名;

    3. 查看錶結構
      desc 表名;

    4. 刪除表
      drop table 表名;

  2. 表的命名規則(同庫的命名規則)

  3. 練習

    1. 建立庫 python
    2. 在庫 python 中建立表 py_mysql, 指定字符集 utf8, 表中欄位有 id int 和 name char(20) 兩個欄位
    3. 查看錶 py_mysql 的字符集以及儲存引擎
    4. 檢視 py_mysql 的表結構
    5. 刪除表 py_mysql
    create database python;
    use python;
    create table py_mysql (id int,name char(20))default charset=utf8;
    show create table py_mysql;
    desc py_mysql;
    drop py_mysql;
    
  4. 注意:

    1. 所有的資料都是以檔案的形式存放在資料庫目錄下
    2. 資料庫目錄: /var/lib/mysql

8.更改庫, 表 的預設字符集

  1. 方法

    通過 mysql 服務的配置檔案來實現

  2. 步驟

    實際可能不同, 但是 大致一樣

9. 表記錄管理

在表中插入記錄

insert into 表名 values(值1),(值2),...,(值n);

insert into 表名 (欄位名列表) values(值1),...(值n);

查詢表記錄

select * from 表名; #查詢所有欄位

select 欄位1, 欄位2,....,欄位n from 表名;

練習

  1. 檢視所有的庫
  2. 建立新庫 stu1
  3. 在庫 stu1 中建立表 students, 欄位要求如下
    1. id int
    2. name char(15)
    3. age int
    4. address char(20)
  4. 在表中插入一條記錄
  5. 在表中一次性插入兩條記錄
  6. 查看錶 stu1 的表結構
  7. 檢視所有表記錄
  8. 刪除表 students
  9. 刪除庫 stu1
1. show databases;
2. create database stu1;
3. create table students(id int,name char(15),age int,address char(20));
4. insert into students values(1,"mingyue",17,"china");
5.insert into students values(2,"shenxian",18,"jap"),(3,"xianhua",19"american");
6. show create table student;
7. select * from students;
8.drop table students;
9.drop database stu1;

10.客戶端把資料儲存到資料庫伺服器上的過程

  1. 連線到資料庫伺服器 mysql -uroot -p123456
  2. 選擇一個庫: use 庫名
  3. 建立表 或者 修改表 : create .....
  4. 斷開與資料庫伺服器的連線: exit | quit | \q

11.資料庫名詞

DB database 資料庫

DBMS database management system 資料庫管理系統:管理資料庫的軟體

DBS database system 資料庫系統 dbs = db + dbms + 資料庫應用+ users

12.資料庫中的資料型別

  1. 數值型(有符號signed和無符號unsigned)

    1. 整型

      1. int 大整型(4個位元組) 無符號:0~ 2**32 -1
      2. tinyint 微小整型(1個位元組)
        1. 有符號(signed 預設):-128 ~ 127
        2. 有符號(unsigned ):0~255
    2. 浮點型

      1. float(4 個位元組, 最多顯示 7 個有效位)

        1. 用法

          欄位名 float(m,n) m: 表示總位數 n:小數位位數

          salary float(5,2) 取值範圍: -999.99 ~ 999.99

        2. 注意

          1. 浮點型插入整數時會自動補全小數位位數

          2. 小數位如果多於指定的位數, 會對指定位的下一位進行四捨五入

            float(5,2) -> 23.128 -> 23.13

      2. double( 8 個位元組, 最多顯示 15 個有效位)

        1. 用法

          欄位名 double

          其餘 和 float 一致,

      3. decimal (M + 2 個位元組, 最多顯示 28 個有效位)

        1. 用法

          decimal(28,5)

  2. 字元型別

    1. char(定長)
      1. 取值範圍: 1~255
      2. 預設為 1 (不指定寬度)
    2. varchar(變長)
      1. 取值範圍: 1~ 65535
      2. 注意
        1. varchar 沒有預設寬度, 必須給定一個寬度值 name varchar(20)
    3. char 和 varchar 的特點
      1. char 定長浪費儲存空間, 但是效能高
      2. varchar 節省儲存空間, 但是效能低下,
  3. 列舉型別

    1. 定義

      欄位值只能在列舉的範圍內選擇

    2. enum(...) 單選(最多有 65535 個不同的值)

      欄位名 enum(值1, 值2,... , 值n)

    3. set(...) 多選(最多有64 個不同的值)

      欄位名 set(值1, 值2,....,值n)

  4. 日期時間型別

    1. year: 年 YYYY
    2. date: 日期 YYYYMMDD
    3. time: 時間 HHMMSS
    4. datatime: 日期時間 YYYYMMDDHHMMSS
    5. timestamp: 日期時間 YYYYMMDDHHMMSS

注意

  1. 插入記錄時, datatime 欄位不給值, 預設返回 NULL
  2. timestamp 欄位不給值預設返回系統當前時間

練習

  1. 建立表 stuinfo, 欄位要求如下:

    學號 id 大整型

    姓名 name 變長, 寬度為 15

    班級 classes 定長, 寬度為 7

    年齡: age 微小整型, 要求不能輸入負數

    身高: height 浮點型, 小數位為 2 位,

  2. 查看錶結構

  3. 在表 stuinfo 中插入2 條記錄(行)

  4. 查詢所有表記錄

  5. 查詢所有學生的姓名, 年齡和身高

create table stuinfo(id int, name varchar(15),classes char(7),age tinyint unsigned,height float(7,2));
desc stuinfo;
insert into stuinfo values(1,"mingyue","1803",18,1.85),(2,"shenhua","1803",19,1.86);
select * from stuinfo;
select name,age,height from stuinfo;

13. 表字段的操作

alter table  表名  執行動作; 


新增欄位

alter table 表名 add 欄位名  資料型別  first | after 欄位名;

刪除欄位

alter table 表名  drop  欄位名;

修改欄位資料型別

alter table 表名  modify   欄位名    新資料型別;

不能從 int 改成 tinyint , 在修改資料型別時, 會受到表中原有資料的限制

修改欄位名

alter table 表名 change 舊名  新名 資料型別;

修改表名

alter table 表名  rename 新表名;

14. 概念: 面試題

  1. 填空題
    1. mysql 中的資料型別 有 數值型 列舉型 字串型 日期型
    2. 關係型資料庫的核心內容是
  2. 簡答題
    1. 簡述客戶端把資料儲存到資料庫伺服器上的過程
    2. char 和 varchar 的區別? 各自的特點?
  3. 操作題
    1. 建立一個學校的庫 school
    2. 在庫中建立一張表 students 來儲存學生資訊 學號 姓名 年齡 成績 性別 愛好 入學時間
    3. 檢視students 的表結構
    4. 在 students 中新增一個欄位id, 新增在第一列,
    5. 在表中隨意插入 5 條記錄
    6. 檢視所有的學生資訊
    7. 檢視所有學生的姓名和成績
  4. 練習一個 vi 文字編輯器

MySql設計規範

字元型別的寬度和數值型別的寬度的區別

  1. 數值型別的寬度僅僅為顯示寬度, 只用於 select 查詢顯示, 和 佔用的儲存空間大小無關, 可用 zerofill 檢視效果
  2. 字元型別的寬度超過則無法儲存

where 條件子句

配合查詢, 修改, 刪除 , 操作 一起使用

語法格式

select * from 表名  where 條件;

表記錄的管理

刪除表記錄

delete from 表名 where 條件;

注意: delete 語句後如果不加 where 條件子句, 會將表中所有記錄全部刪除

更新表記錄

updata 表名 set 欄位名1=值1  欄位名2=值2,... where 條件;

update語句後如果不加 where 條件子句會將表中所有記錄全部更改

運算子操作

數值比較&字元比較

數值比較: = != >= > < <=

字元比較運算子 = !=

範圍內比較

運算子

between and

in

not in

語法

between 值1 and 值2
in(值1, 值2,...值n)

匹配空 非空

空: is null

非空 : is not null

注意:

  1. null : 空值,必須用 is 或者 is not 去匹配
  2. "" : 空字串,用 = 或者 != 去匹配

模糊查詢

_ : 匹配單個字元

% : 匹配0 到多個字元

示例:

  1. select name from sanguo where name like "_%_";
  2. select name from sanguo where name like "%";
  3. select name from sanguo where name like "___";
  4. select name from sanguo where name like "趙%"

正則匹配查詢

  1. where 欄位名 regexp "正則表示式";

  2. 正則表示式符號

    ^ : 以.... 開頭

    $ : 以.... 結尾

    . : 匹配任意一個字元

    []: 包含... 內容 [0~9]: 匹配帶數字的 [a-z]:匹配帶小寫字母的

    *: 星號前面的字元出現 0 個或者多次 .*

sql 查詢

總結 (執行順序)

3.5 select ... 聚合函式 from 表名

  1. where...
  2. group by...
  3. having ...
  4. order by...
  5. limit ...

order by

  1. 作用: 給查詢的結果進行排序
  2. 語法格式: order by 欄位名 排序方式;
  3. 排序方式
    1. asx(預設): 升序
    2. desc : 降序

limit(永遠放在 sql 語句的最後寫)

  1. 作用: 限制希納是查詢記錄的個數
  2. 用法
    1. limit n: 顯示 n 條記錄
    2. limit m,n: 從第 (m+1)條開始, 顯示 n 條記錄

聚合函式

  1. 分類
    1. avg(欄位名): 求欄位的平均值
    2. sum(欄位名): 求和
    3. max(欄位名): 求最大值
    4. min(欄位名):求最小值
    5. count(欄位名): 統計該欄位記錄的個數
select sum(欄位名) from 表名;

count(欄位名) 空值不會被統計,空字串會被統計

group by(先分組,再聚合)

select 欄位名 from 表名 group by 欄位名;

select country,avg(gongji) from sanguo group country;

執行過程:

  1. 先分組(此時未去重) group by country
  2. 再聚合( 求每組的平均攻擊值)
  3. 去重

select country,count(*) from hero

group by country

order by count(*) desc

limit 2;

having

  1. 作用: 對查詢的結果進行進一步篩選

distinct

作用: 不顯示欄位的重複值

select distinct 欄位名 from 表名;

注意:

  1. distinct 處理的是 distinct 和 from 之間的所有欄位, 所有欄位的值必須完全相同才可以去重
  2. distinct 不能對任何欄位做聚合處理

查詢表資料的時候, 可以做數學運算

select 欄位名*10 from 表名

+ - * / 都可以

約束

  1. 作用

    為了保證資料的完整性 一致性 有效性, 可以限制無效的資料插入到資料表中

  2. 約束分類

    1. 預設約束(default)

      1. 作用: 在插入記錄時, 如果不給該欄位賦值,則使用預設值

      2. 格式

        欄位名 資料型別 default 預設值,

    2. 非空約束

      1. 作用: 不允許該欄位的值有空值 NULL 記錄

      2. 格式

        欄位名 資料型別 not null

索引

  1. 定義

    對資料庫中表的一列或者多列的值進行排序的一種結構(Mysql 中索引用 Btree 方式)

  2. 索引的優點

    可以加快資料的檢索速度

  3. 索引的缺點

    1. 當對錶中的資料進行增加, 修改, 刪除的時候, 索引需要動態維護, 降低了資料的維護速度
    2. 索引需要佔用物理儲存空間(資料庫目錄 /var/lib/mysql)
  4. 索引示例

    1. 執行 insert_.py 檔案 , 插入100 萬條資料
    2. 開始效能分析 set profiling = 1
    3. 執行 查詢語句 select name from t1 where name="lucy999999";
    4. 檢視效能分析結果 show profiles;
    5. 在 name 欄位建立索引 create index name on t1(name);
    6. 執行查詢語句 select name from t1 where name="lucy99999";
    7. 檢視效能分析結果 show profiles;
    8. 關閉效能分析 set profiling = 0;

SQL 高階

索引

  1. 普通索引
  2. 唯一索引
  3. 主鍵屬性

普通索引

使用規則:

建立

檢視

  1. desc 表名; -> 檢視key 標誌為MUL
  2. show index from 表名 \G

刪除

drop index 索引名 on 表名;

唯一索引

unique

使用規則

  1. 一個表中可以有多個 unique 欄位
  2. unique 欄位的值不允許重複,可以為空值 NULL
  3. unique 的 KEY 標誌是 UNI

建立

基本等同 index建立

  1. 建立表時建立 : unique(欄位名) ,unique(欄位名)

  2. 已有表中建立

    create unique index 索引名 on 表名(欄位名);

檢視, 刪除

desc 表名

show index from 表名;

drop index 索引名 on 表名;

主鍵索引

primary key

自增長屬性(auto_increment)

使用規則

  1. 一個表中只能有一個主鍵欄位
  2. 對應欄位的值不允許重複 且 不能為空值 NULL
  3. 主鍵欄位的KEY標誌為 PRI
  4. 把表中能夠唯一標識一條記錄的欄位設定為主鍵, 通常把表中記錄編號的欄位設定為主鍵

建立主鍵

  1. 建立表時建立

    1. 欄位名 資料型別 primary key auto_increment, 其他欄位
    2. primary key(欄位名); // 在最後寫 可以 型別 auto_increment,
  2. 在已有表中新增主鍵

alter table 表名 add primary key(欄位名) ;

  1. 刪除主鍵

    1. 先刪除自增長屬性(modify)

      alter table 表名 modify id int;

    2. 刪除主鍵

      alter table 表名 drop primary key;

主鍵有什麼約束

欄位值不允許重複也不允許為空值

主鍵約束 = 唯一約束 + not null

外來鍵約束

走神了....

資料匯入

把檔案系統的內容匯入到資料庫中

load data infile "檔名"
into table 表名
fields terminated by "分隔符"
lines terminated by "\n"

例項

  1. 在資料庫中建立對應的表

    create table userinfo(
    username char(20),
    password char(20),
        uid int,
        gid int,
        comment varchar(50),
        homedir varchar(50),
        shell varchar(50)
    )
    
  2. 將要匯入的檔案拷貝到資料庫的預設搜尋路徑中

    1. 檢視資料庫的預設搜尋路徑

      show variables like "secure_file_priv";

      /var/lib/mysql-files

    2. sudo cp /etc/passwd /var/lib/mysql-files/

  3. 執行資料匯入語句

    load data infile "/var/lib/mysql-files/passwd"
    into table userinfo
    fields terminated by ":"
    lines terminated by "\n";
    

資料匯出

將資料庫表中的記錄儲存到系統檔案裡

select ... from 表名 
into outfile "檔名"
fields terminated by "分隔符"
lines terminated by "\n";

表的複製

 create table 表名 select 查詢命令 ;

複製 userinfo 表中的全部記錄 , userinfo2

create table userinfo2  select * from userinfo;

複製 userinfo 表中username, password , uid 三個欄位的第 2 - 10 條記錄, userinfo.

create table userinfo3 select username,password,uid from userinfo limit 1,9;

複製表結構

create table 表名 select 查詢命令 where false;

複製表的時候不會把原有表的key 屬性複製過來

巢狀查詢(子查詢)

把內層的查詢結果作為 外層的查詢條件

例項

把uid 的值 小於 uid 平均值的使用者名稱 和 uid 號顯示出來

select username,uid  from userinfo 
where uid  < (select avg(uid)from userinfo) ;

連線查詢

  1. 內連線

    1. 從表中刪除與其他被連線的表中沒有匹配到的行

    2. 語法格式

      select 欄位名列表 from 表1
      
      
  2. 外連線

    1. 左連線
    2. 右連線

多表查詢

  1. select 欄位名列表 from 表名列表;
  2. select 欄位名列表 from 表名列表 where 條件;

mysql 使用者賬戶管理

開始 mysql 遠端連線

  1. 開始mysql 遠端連線

    1. 獲取 root 許可權 sudo -i

    2. cd 到配置檔案所在路徑 cd /etc/mysql/mysql.conf.d/

    3. vi mysqld.cnf

      bind-address = 127.0.0.1

      修改這一行, 註釋 或者 改成 * 任意

    4. 重啟 mysql 服務 /etc/init.d/mysql restart

新增授權使用者

  1. 使用 root 使用者連線到伺服器

    mysql -uroot -p123456

  2. 新增新的授權使用者

    create user "使用者名稱“@"ip地址"" identied by "密碼";

    create user "tiger"@"%" identified by "123456";

    ip地址的表示方式:

    1. % 表示使用者可以從任何地址連線到伺服器
    2. localhost 使用者只能從本地連線
    3. 指定一個 ip 表示使用者只能從此 ip 連線到伺服器

給使用者授權

grant 許可權列表 on 庫.表 to "使用者名稱"@"ip地址" with grant option;

grant all privileges on *.* to "tiger"@"%" with grant option;

許可權列表 : select, update, delete , insert , alter, drop, create, ...

庫.表: *.* 表示所有庫的所有表

連線遠端資料庫命令 : mysql -hIP地址 -umonkey -p密碼

練習

新增一個 授權使用者 monkey , 所有人都可以連線, 只對 db1 庫有查詢許可權

  1. 新增授權使用者 monkey
  2. 給 monkey 使用者授權
  3. 驗證 : mysql -hIP地址 -umonkey -p密碼

ip 地址檢視 : linux 命令列: ifconfig

刪除授權使用者

drop user "使用者名稱"@"IP地址";

drop user "tiger"@"%";

資料備份與恢復

備份

mysqldump -uroot -p 原庫名 > 路徑/*.sql

mysqldump -uroot -p db2 > /home/tarena/db2.sql

源資料庫的表示方式

--all-databases 備份所有庫

庫名 備份單個庫

-B 庫1 庫2 ... 備份多個庫

庫名 表1 表2 .. 備份制定庫的指定表

恢復

mysql -u使用者名稱 -p目標庫名 < 路徑/xxx.sql

備份分為 完全備份 和 增量備份

完全備份: mysqldump

增量備份: binlog日誌, xbackup 工具

從所有庫的備份檔案中恢復某一個庫 (--one-database)

mysql -u使用者名稱 -p --one-database 目標庫名 < all_mysql.sql

mysql -uroot -p  --one-database db2 < all_mysql.sql

注意:

  1. 恢復庫時庫中新增的表不會刪除
  2. 恢復時必須先建立空庫

事務和事務回滾

  1. 事務: 一件事從開始發生到結束的整個過程
  2. 作用: 確保資料的一致性

mysql 中預設 sql 語句會自動 commit 到資料庫

show variables like "autocommit";

事務應用

開始事務

start transaction;

此時 autocommit 被禁用 , sql 命令不會對資料庫中資料做修改

終止事務

commit; 提交: 代表資料庫 成功被修改

or

rollback; 回滾: 表示資料庫 出現了問題, 沒有 被修改

案例

儲存引擎

用來處理 表的 處理器

innodb myisam

儲存引擎的基本操作

  1. 檢視 已有表的儲存引擎

    show create table 表名;

  2. 建立表時指定儲存引擎

    create table 表名(...) engine = myisam;

  3. 檢視所有的儲存引擎

    show engines;

常用儲存引擎的特點

  1. innodb 特點
    1. 共享表空間
    2. 支援行級鎖
  2. myisam 特點
    1. 獨享表空間
    2. 支援表級鎖

如何決定使用那種 儲存引擎

  1. 執行查詢操作多的表使用 myisam 儲存引擎(使用 innodb 浪費資源)
  2. 執行寫操作比較多的表使用 innodb 儲存引擎

如何更改表的 預設儲存引擎

  1. sudo -i

  2. cd /etc/mysql/mysql.conf.d/

  3. vi mysqld.cnf

    [mysqld]

    default-storage-engine = myisam

  4. /etc/init.d/mysql restart

Memory 儲存引擎

memory : 表記錄儲存在記憶體中

表名.frm 表結構

特點 : 服務重啟之後結構在, 表記錄都消失

  1. 枷鎖的目的

    解決客戶端併發訪問的衝突問題

  2. 鎖型別

    讀鎖(select) 共享鎖

    ​ 加讀鎖之後不能更改表中內容,但可以進行查詢

    寫鎖(insert, update, delete ) 互斥鎖, 排他鎖

  3. 鎖粒度 操作完成後, 會自動釋放鎖

    表級鎖

    行級鎖

mysql 調優

  1. 選擇合適的儲存引擎
    1. 經常用來讀的表使用 myisam 儲存引擎
    2. 其餘的表都用 innodb 儲存引擎
  2. sql 語句調優 ( 儘量避免全表掃描)
    1. 在 select, where, order by , 常涉及到的欄位上建立索引
    2. where 子句中 儘量不要使用 != , 否則將放棄使用 索引 進行全表掃描
    3. 儘量避免用 NULL 值判斷, 否則會全表掃描
    4. 儘量避免 使用or 來連線條件, 也會進行全表掃描
    5. 模糊查詢儘量避免使用 前置 %, 導致全表掃描
    6. 儘量避免使用 select * ..., 要用具體的欄位列表代替 * , 不要返回用不到的任何欄位

python 資料庫程式設計

python資料庫介面 (python db-api)

為開發人員提供的資料庫應用程式設計介面

支援的資料庫服務軟體: mysql Oracle SQL_Server, mongodb..

python提供的操作 mysql 模組

python3: pymysql

python2: MySQLdb

pymsql 模組使用流程

  1. 建立資料庫連線
  2. 建立遊標物件
  3. 使用遊標物件的方法操作資料庫
  4. 提交 commit
  5. 關閉遊標物件
  6. 關閉資料庫連線

例項

#coding = utf-8
#1. 建立資料庫連線
db = pymysql.connect("localhost","root","123456","db2")  #這邊並不需要指定 預設字符集

#2. 建立遊標物件
cursor = db.cursor()

# 3. 利用遊標物件 cursor 的方法來操作資料庫
cursor.execute("insert into sheng values(1,20000,'四川省');")

# 4. 提交到資料庫 commit 
db.commit()

# 5. 關閉遊標物件
cursor.close()
# 6. 關閉資料庫連線
db.close()


建立資料庫連線 語法格式

2.32.43

  1. 語法格式

    物件名 = pymysql.connect("主機地址","使用者名稱","密碼","庫名",charset= "utf-8")

  2. connect連線物件支援的方法

    1. cursor() 建立一個遊標物件 db.cursor()
    2. commit() 提交到資料庫執行(表記錄增刪改)
    3. rollback() 回滾
    4. close() 關閉資料庫連線
  3. 遊標物件支援的方法

    1. execute("sql命令") 執行sql 命令
    2. fetchone() 取得結果集的第一條記錄
    3. fetchmany(n) 取得結果集的n 條記錄
    4. fetchall() 取得結果集的所有記錄
    5. close() 關閉遊標物件

例項

查詢表中記錄

#coding = utf-8
import pymysql as mq

db = mq.connect("192.168.102.133","mingyue","123","test")
cursor = db.cursor()

# 執行 sql 語句
cursor.execute("select * from t1;")
data = cursor.fetchall()
print("fetchone的結果:",data)

# 提交資料改變
db.commit()
# 關閉遊標物件
cursor.close()
# 關閉資料庫物件
db.close()

'''
fetchone的結果: ((1,), (1,), (2,), (3,))
'''

最終以元組的形式返回資料, 如果接收的長度 小於 查詢資料的長度, 會進行截斷操作

對元組進行處理, 就可以實現對資料的處理

python 使用面對物件 封裝 sql操作

#coding = utf-8

import pymysql

class mysql:
    def __init__(self,host,user,passwd,dbname,tablename):
        '''
        初始化 資料庫物件
        '''
        self.db =  pymysql.connect(host,user,passwd,dbname)
        self.cur = db.cursor()
        self.dbname = dbname
        self.tablename = tablename
    
    def select(self,name):
        '''
        查詢 資料庫中 內容
        '''
        checkcont = "select %s from %s;"%(name,tablename)
        self.cur.execute(checkcont)
        self.cur.close()
    
    def insert(self,tablename,l):
        '''
        插入內容到資料庫中
        '''
        try:
            for i in l:
                s = "insert into %s values (%s,%s,%s);"%(self.tablename,i[0],i[1],[2])
                self.cur.execute(s)
            self.db.commit()
        except:
            print("插入失敗,出現異常")
            self.db.rollback()
    
    def execute(self,sql):
        '''
        執行sql 命令 
        '''
        try:
            self.cur.execute(sql)
            self.db.commit()
        except:
            print("命令執行失敗,出現異常,請檢查 sql 語句是否正確書寫")
            self.db.rollback()
        
    def __del__(self):
        '''
        解構函式
        關閉遊標物件
        關閉 資料庫物件
        '''
        self.cur.close()
        self.db.close()


mysql 的圖形化操作

安裝 mariadb 系統自動會 新增一個 heidiSQL 可以使用這個 遠端連線資料庫

然後其他動動手指即可

E-R 模型 & ER圖

實體 - 關係 模型

  1. 實體
  2. 屬性
  3. 關係

可以進行聯想

  1. 定義: 實體之間的關係

  2. 分類

    一對一關係 (1:1) : 班級與 班長 連結串列

    一對多關係 (1:n) : 公司 和 職工 , 班級 和 學生 二叉樹

    多對多關係(m:n) : 學生和課程 集合

學生和課程的 ER圖

矩形框代替實體,菱形框代表關係, 橢圓形代表屬性