python_MySQL數據庫

MySQL數據庫的特色:
    一、是關係型數據庫
        關係型數據庫的特色
            一、數據是以行和列的的形式存儲的
            二、這一系列的行和列稱爲表
            三、表中的每一行叫作記錄
            四、表中的每一列叫作字段
            五、表和表之間的邏輯關聯叫作關係
            六、關係型數據庫的核心內容是:關係 即二維表
        示例:
            一、關係型數據庫存儲
                表1:學生信息表
                    姓名        年齡        班級
                     aa         20        1712
                     bb         25        1713
                表2:班級信息表
                    班級        班主任
                    1712     曹操    
                    1713     劉備
                說明:要找到學生aa的班主任是誰,須要經過班級字段來找到班主任
            二、非關係型數據庫存儲(是以鍵值對的形式存儲的)
                {姓名:「aa」,年齡:20,班級:1712,班主任:「曹操」}
            兩者之間的比較:
                非關係行數據的性能比較高(查找數據的速度)可是會形成數據的冗餘

    二、跨平臺
        能夠在Unix、Linux、Windows上運行MySQL服務
    三、支持多種語言編程語言
    四、是基於硬盤的讀寫
MySQL的安裝:
    一、Linux系統下安裝MySQL服務
        一、安裝服務端:sudo apt-get install mysql-server
        二、安裝客戶端:sudo apt-get install mysql-client
        三、初始的用戶名和密碼在/etc/mysql/debian.cnf文件中,使用 cd /etc/mysql/ 進去目錄,subl debian.cnf 打開查看
啓動和鏈接MySQL服務
    一、服務端啓動
        一、查看MySQL服務的狀態:sudo /etc/init.d/mysql status
        二、啓動MySQL服務:sudo /etc/init.d/mysql start
        三、中止MySQL服務:sudo /etc/init.d/mysql stop
        四、重啓MySQL服務:sudo /etc/init.d/mysql restart
    二、客戶端連接
        一、命令格式:mysql -h主機名 -u用戶名 -p密碼(-h和-u後面能夠添加空格,-p後面不能夠)
            mysql -h localhost -u debian-sys-maint -pLo0r79JmxvMFNtA
        二、本地鏈接能夠省略 -h 選項
            mysql  -u debian-sys-maint -pLo0r79JmxvMFNtA
        三、斷開與服務端的鏈接:exit  quit   \q
基本的SQL命令:
    一、SQL命令的使用規則
        一、每條命令必須以分號(;)結尾(說明中文分號無效)
        二、SQL命令不區分字母大小寫
        三、使用\c終止命令的執行
    二、庫的管理(指定字符集)
        一、庫的基本操做
            一、查看已有的庫:show databases;
                (有四個默認的庫,不要修改或刪除:information_schema,mysql,performance_schema,sys)
            二、建立庫:create database 庫名 default charset=utf8;
            三、查看建立庫的語句:show create database 庫名;
                ( CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */)
            四、查看當前所在庫:select database();
            五、切換庫:use 庫名;
            六、查看庫中已有的表:show tables;(若是當前的庫爲NULL則會報錯:ERROR 1046 (3D000): No database selected)
            七、刪除庫:drop database 庫名;
        二、庫的命名規則
            一、可使用數字、字母、_,可是不能是純數字
            二、庫名區分字母大小寫
            三、庫名具備惟一性(不能重複)
            四、不能使用特殊字符和mysql關鍵字
    三、表的管理:
        一、表的基本操做:
            一、建立表:
                create table 表名(
                    字段名1 數據類型,
                    字段名2 數據類型,
                    ....
                )
            二、查看建立表的語句(字符集):show create table 表名;
            三、查看錶結構:desc 表名;
            四、刪除表:drop table 表名;
        二、注意:
            一、全部的數據都是以文件的形式存儲在數據庫目錄下
            二、數據庫目錄:/var/lib/mysql
    四、表記錄的管理:
        一、在表中插入記錄
            一、insert into 表名 values(值1,值2),...  說明:值就是每一個字段對應的值,python

    二、insert into 表名(字段名1,字段名2...)values(值1,值2...)說明:給指定的字段添加值  mysql

    三、insert into 表名 values(一條記錄1),(一條記錄2)... 說明:能夠同時添加多條記錄
        二、查看錶記錄
            一、select * from 表名;*號表明全部的字段
            二、select 字段名1,字段名2,... from 表名;linux

  三、更新表的記錄
            一、update 表名 set 字段=值,字段=值,...where 條件;
            二、注意:update語句後若是不加where子句,表中全部記錄該字段的值都會更改
        四、刪除表記錄
            一、delete from 表名 where 條件1 and 條件2;
            二、注意:delete語句後若是不加where子句,表中的全部記錄都會被刪除面試

    五、如何更改默認字符集:
        一、方法:經過更改Mysql的配置文件實現
        二、步驟:
            一、獲取root權限:sudo -i
            二、修改mysql配置文件:vi /etc/mysql/mysql.conf.d/mysqld.cnf
                一、點擊a鍵進入編輯狀態
                二、在[mysqld]下 插入character_set_server = utf8
                三、點擊Esc鍵退出編輯狀態
                四、點擊Shift + :
                四、輸入wq命令寫入並退出 (輸入q!退出不保存)
            三、重啓mysql服務:sudo /etc/init.d/mysql restartsql

  說明:更改默認字符集以後,並不影響以前建立好的數據庫和數據庫中的數據表,要想修改已經建立好的數據庫編碼和數據表的編碼:shell

    數據庫:alter database fruit character set utf8;數據庫

    數據表:alter table user character set utf8;編程

客戶端把數據存儲到數據庫服務器上的過程(面試會問到)
    一、鏈接到數據庫服務器:mysql -h -u -p
    二、選擇庫:use 庫名;
    三、建立/修改表
    四、斷開與數據庫的鏈接:exit 、quit、\q
數據類型:
    一、數值類型(有符號signed 和 無符號 unsigned)
        一、整型
            一、int 大整型(佔4個字節):
                    取值範圍:0~2**32-1
            二、tinyint 微小整型(佔1字節)
                一、有符號(signed默認)取值範圍:-128~127
                二、無符號(unsigned) 取值範圍:0~2**8-1
            三、smallint 小整型(佔2字節)
                取值範圍:0~65535
            四、bigint 極大整型(佔8字節)
                取值範圍:0~2**64-1
        二、浮點型
            一、float(4個字節,最多顯示7個有效位)
                一、用法:字段名 float(m,n) m表明總位數,n表明小數位位數
                    float(5,2)取值範圍:-999.99~999.99;會根據小數第3位進行四捨五入
                    說明:m總位數不要超過7位,不然7位以後數字會隨機生成。
                二、double(8字節,最多顯示15個有效位)
                    用法:字段名 double(m,n)
                三、decimal(佔M+2個字節,最多顯示28個有效位)
                    用法:decimal(M,D)bash

     說明:浮點型插入整數時會自動補全小數位數;
    二、字符類型
        一、char(定長)
            一、寬度取值範圍:1~255
            二、不給寬度默認爲寬度爲1
        二、varchar(變長)(輸入要的值不能超過變長值,儲存空間根據實際輸入的數值來肯定)
            一、取值範圍:1~65535
            二、注意:
                一、varchar沒有默認寬度,必須給定一個寬度
                二、char和varchar使用時都給寬度,但不能超過各自的範圍
            三、char 和 varchar 的特色
                一、char浪費存儲空間可是性能高
                二、varchar節省存儲空間,性能低(須要計算須要佔用的存儲空間)
            四、字符類型的寬度和數值類型的寬度的區別
                一、數值類型的寬度爲顯示寬度,只用於select查詢時使用,和佔用存儲空間的大小無關,可用zerofill查看效果
                二、字符類型的寬度超過則沒法存儲
    三、枚舉類型
        一、定義:字段值只能在列舉的範圍內選擇
        二、enum 單選(最多有65535個不一樣的值)
            字段名 enmu(值1,值2,...)
        三、set 多選(最多有64個不一樣的值)
            字段名 set(值1,值2,...),插入值的時候每一個值之間用逗號分隔開
    四、日期時間類型
        一、year: 年 YYYY
        二、date:日期 YYYYMMDD
        三、time:時間 HHMMSS
        四、datetime:日期時間 YYYYMMDDHHMMSS
        五、timestamp:時間日期 YYYYMMDDHHMMSS
        六、說明:
            一、datetime 不給值默認返回NULL
            二、timestamp不給值默認返回系統當前時間
表字段的操做:
    一、語法:alter table 表名 執行動做
        一、添加字段(add):
            一、添加到末尾
                alter table 表名 add 字段名 數據類型
            二、添加到開始
                alter table 表名 add 字段名 數據類型 first
            三、添加到指定位置
                alter table 表名 add 字段名 數據類型 after 已有字段名
        二、刪除字段(drop):
            alter table 表名 drop 字段名
        三、修改數據類型(modify):
            alter table 表名 modify 字段名 新的數據類型
        四、修改字段名
            alter table 表名 change 舊名 新名 數據類型
        五、修改表名
            alter table 表名 rename 新表名
練習:
    一、填空題:
        一、MySQL中的數據類型有 數值類型、字符類型、枚舉類型、日期時間類型
        二、關係型數據庫的核心內容是 關係 即 二維表
    二、簡答題:
        一、簡述客戶端把數據存儲到數據庫服務器上的過程
        答:
            一、鏈接MySQL服務器數
            二、選擇庫 use 庫名
            三、添加\修改表
            四、斷開與數據庫的鏈接 exit | quit | \q
        二、char和varchar的區別?各自的特色
        答:
            一、char(定長),所佔用的內容空間已經由定長決定了,雖然多佔用內存,可是效率高
            二、varchar(不定長),所佔用的內控空間由添加字段的數據自己決定,可是須要計算佔用的空間,效率低,省內存
    三、操做題:
        一、建立一個庫school
            create database school;
        二、在庫中建立表students來存儲學生信息,字段以下學生(id)要求顯示寬度爲3位,不夠用0填充
           姓名(name),年齡(age只能爲正數)、成績(score浮點)、性別(sex單選)、愛好(likes多選)、入學時間(年月日)
            use school;
            create table students(
            id int(3) zerofill,
            name char(20),
            age tinyint unsigned,
            score float(4,1),
            sex enum('男','女'),
            likes set('打籃球','學習','購物','打遊戲','打仗'),
            go_school_time date
            )default charset = utf8;   
        三、查看students的表結構
            desc students;
        四、在students表中增長一個字段id,加在第一列
            alter table students add kid int first;
        五、在表中任意插入5條記錄
            insert into students values(1,1,'曹操',60,80,'男','打仗,打遊戲',20000912);
            insert into students values(2,2,'劉備',50,90,'男','打仗,打遊戲',20000912);
            insert into students values(3,3,'關羽',45,70,'男','打仗,打遊戲',20000912);
            insert into students values(4,4,'張飛',40,60,'男','打仗,打遊戲',20000912);
            insert into students values(5,5,'小喬',20,100,'女','學習,購物',20000912);
        六、查看全部學生的姓名、成績、和入學時間
            select name,score,go_school_time from students;服務器

名詞介紹
    一、DB(Database)
        DB就是數據庫,存儲數據庫的倉庫
    二、DBMS(Database Management System)
        數據庫管理系統
        數據庫管理的軟件有MySQL、Oracle....
    三、DBS(Database System)
        數據庫系統
        DBS = DB(存儲)+DBMS(數據庫軟件)+數據庫應用(財務管理系統、人事管理系統)+用戶
where 條件子句(配合查、改、刪操做)
    一、語法格式:
        select * from 表名 where 條件;
運算符操做(配合查詢、修改、刪除操做)
    一、數值比較&字符比較:
        一、數值比較運算符:=  !=  > >= < <=
        二、字符比較運算符:=  !=
        三、語法格式:
            查詢:select * from 表名 where 字段名 運算符 數字/字符;
            修改:update 表名 set 字段名=值,...where 字段名 運算符 數字/字符;
            刪除:delete from 表名 where 字段名 運算符 數字/字符;
    二、邏輯比較:
        一、運算符:
            and(多個條件同時知足)
            or(多個條件有一個條件知足就能夠)
    三、範圍內比較:
        一、運算符:between and 、 in 、not in
        二、語法格式
            字段名 between 值1 and 值2(包括值1和值2)
            字段名 in(值1,值2,...)
            字段名 not in (值1,值2,...)
    四、匹配空、非空
        一、空:is null
        二、非空:is not null
        三、注意:
            一、null:空值,必須用is 或者is not 去匹配
            二、‘’:空字符串,用 = 或者 !=  去匹配
    五、模糊比較
        一、語法格式:字段名 like 表達式
        二、表達式
            一、_:匹配單個字符
            二、%:匹配0到多個字符,不能是NULL
SQL查詢:
    一、總結(執行順序)
        完整的語句:select ...聚合函數 from ... where ... group by...having ... order by ...limit...;
        上面語句的執行順序:一、where 二、group by 三、select...聚合函數 from 四、having 五、order by 六、limit
    二、order by  
        一、做用:對查詢的結果進行排序
        二、語法格式:order by 字段名 排序方式;
        三、排序方式:
            一、ASC(默認):升序
            二、DESC:降序
            三、說明:這個排序方式不區分大小寫(asc,desc)
    三、limit (永遠放在SQL語句的最後面)
        一、做用:限制顯示查詢記錄的條數
        二、用法
            一、limit n   :顯示n條記錄
            二、limit m n :從m+1條記錄開始顯示,n表示顯示顯示幾條記錄
                示例:limit 1,3 :顯示2,3,4三條記錄        
            三、練習
                一、查找防護值倒數第二名至倒數第四名的蜀國英雄記錄
            select * from sanguo where country='蜀國' order by fangyu asc limit 1,3;
                二、查找攻擊值前三名且名字不爲空值的蜀國英雄的姓名,攻擊值和國家
            select name,gongji,country from sanguo where country='蜀國' and name is not NULL order by gongji desc  limit 3;
    四、聚合函數:
        一、分類
            一、avg(字段名):求字段的平均值
            二、sum(字段名):求字段的和
            三、max(字段名):求字段的最大值
            四、min(字段名):求字段的最小值
            五、count(字段名)統計該字段記錄的個數(空值NULL不會被統計,‘’能夠被統計)
        二、練習:
            一、攻擊力最強值
            select max(gongji) from sanguo;(默認的將max(gongji)作爲字段名,能夠經過as 來修改)
            二、統計一下表中id,name字段分別有多少條記錄
            select count(id) as,c_id count(name) as c_name from sanguo;
            三、計算蜀國英雄的總攻擊力
            select sum(gongji) from sanguo where country='蜀國';
            四、統計蜀國英雄中攻擊力大於200的英雄數量
            select count(*) from sanguo where country='蜀國' and gongji >200;
    五、group by
        一、做用:給查詢的結果進行分組
        二、練習
            一、查詢sanguo表中一共有幾個國家
            select country from sanguo group by country;
            二、計算全部國家的平均攻擊力
            select country,avg(gongji)from sanguo group by country;
            三、查找全部國家中 英雄數量最多的 前2名 的國家的名稱和英雄數量
            select country,count(*) from sanguo group by country order by count(*) desc limit 2;
        三、注意:
            一、group by以後的字段必需要爲select以後的字段
            二、若是select以後的字段和group by以後的字段不一致,則必需要對select以後的該字段作聚合處理
    六、having
        一、做用:對查詢的結果進行進一步的篩選
        二、練習
            一、找出平均攻擊力大於105的國家的前兩名,顯示國家名和平均攻擊力
            select country,avg(gongji) from sanguo group by country having avg(gongji)>105 order by avg(gongji) desc limit 2;
        三、注意:
            一、having語句一般與group by 語句聯合使用,用來過濾由group by語句返回的記錄集
            二、having語句的存在彌補了where關鍵字不能與聚合函數聯合使用的不足,having操做聚合函數生成的顯示列
            三、where只能操做表中實際存在的字段,having能夠操做聚合函數生成的顯示列
    七、distinct
        一、做用:不顯示字段的重複值
        二、練習:
            一、sanguo表中一共有多少個國家
            select distinct country from sanguo;
            二、計算蜀國一共有多少個英雄
            select count(distinct id) from sanguo where country='蜀國';
        三、注意
            一、distinct處理的是distinct和from之間的全部字段,全部字段值必須所有相同才能去重
            二、distinct不能對任何字段作聚合處理
    八、在查詢表記錄時作數學運算
        一、運算符: +  - *  / %
        二、練習:
            一、查詢時顯示全部英雄的防護力+5
            select id,name,fangyu+5 from sanguo;
約束
    一、做用:爲了保證數據的完整性、一致性、有效性
    二、約束分類
        一、默認約束(default)
            一、做用:在插入記錄時,若是不給字段賦值,則使用默認值
            二、格式:字段名 數據類型 default 默認值
        二、非空約束(not null)
            一、做用:不容許將該字段設置爲null
            二、格式:字段名 數據類型 not null
索引
    一、定義:對數據庫中表的一列或者多列的值進行排序的一種結構(MySQL中用Btree方式(二叉樹))
    二、優勢:加快數據的檢索速度
    三、缺點
        一、當對錶中的數據進行增長、刪除或修改的時候,索引也要動態維護,下降了數據的維護速度
        二、索引須要佔用物理空間
    四、索引分類
        一、普通索引(index)
            一、使用規則:
                一、一個表中能夠有多個index字段
                二、字段的值能夠有重複,且能夠爲null值
                三、常常把作查詢條件的字段設置爲index字段
                四、index字段的key標誌是MUL
            二、建立index
                一、建立表時建立:index (字段名1),index(字段名2)
                    create table t2(
                    id int,
                    name char(15),
                    age tinyint unsigned,
                    index(id),inedx(name));
                二、在已有表中建立index
                    一、語法:
                        create index 索引名 on 表名(字段名)
                         create index age on t2(age);
                    二、注意:
                        索引名通常和字段名同樣
            三、查看普通索引
                一、經過desc 表名 -----→查看key標誌
                二、show index from 表名;
            四、刪除普通索引
                drop index 索引名 on 表名;
        二、惟一索引(unique key)
            一、使用規則
                一、一個表中能夠有多個unique字段
                二、unique字段的值不容許重複,但能夠爲空
                三、unique的key標誌是UNI
            二、建立惟一索引
                一、建立表的時候建立
                    方法一、unique (字段名1),unique(字段名2)
                    方法二、字段名 數據類型 unique
                二、在已有表中建立
                    create unique index 索引名 on 表名(字段名);

      示例:create unique index name on user(name);
            三、刪除惟一索引
                drop index 索引名 on 表名;
            注意:index unique在刪除時只能一個一個刪
        三、主鍵索引(primary key)
            一、使用規則
                一、一個表中只能有一個主鍵字段
                二、對應字段的值不能重複,且不能爲空
                三、主鍵字段的key標誌爲PRI
                四、把表中可以惟一標識一個一條記錄的字段設置爲主鍵,一般把表中記錄編號的字段設置爲主鍵
            二、建立主鍵(primary key)
                一、在建立表時
                    一、字段名 數據類型 primary key ;
                    二、primary key (字段名)
                    三、primary key (字段名1,字段名2):複合主鍵,當字段1,2的值都相同時纔算相同,通常不用
                二、在已有表中建立
                    一、alter table 表名 add primary key(字段名)
                三、刪除
                    一、alter table 表名 drop primary key  
                    說明:刪除主鍵後把不能重複的特性刪掉了,可是不能爲空的特性還在
                四、自增加屬性(auto_increment)
                    一、做用:一般和主鍵字段一塊兒配合使用
                    二、建立
                        一、在建立表的時候建立
                            字段名 數據類型 primary key auto_increment
                        二、在已有表中建立
                            alter table 表名 modify 字段名 數據類型 primary key auto_increment;
                    三、說明:有自增加屬性的字段在插入記錄時能夠用0來補位,值從1開始逐一遞增,若是字段填入的值比表中最後一個的值大
                            那麼他們之間的值將不存在。
                五、刪除主鍵及自增加屬性
                    一、alter table 表名 modify 字段名 數據類型 ;(先刪除自增加屬性)
                    二、alter table 表名 drop primary key;
        四、外鍵索引(foreign key)
            一、定義:讓當前表的字段值在另外一張表的範圍內選擇
            二、語法格式:
                foreign key (參考字段名) reference 被參考表名(被參考字段名) on delete 級聯動做 on update 級聯動做
            三、案例:
                表1:繳費信息表(財務)
                    學號        姓名            班級        繳費金額
                     1     唐伯虎        1712     20000
                     2     秋香            1712     19000
                表2:學生信息表(班主任)
                    學號        姓名            繳費金額
                     1      唐伯虎         20000
                create table jftab(
                id int primary key,
                name char(20),
                class char(7),
                money int
                )default charset=utf8;
                create table bjtab(
                -> stu_id int,
                -> name varchar(15),
                -> money int,
                -> foreign key(stu_id) references jftab(id) on delete cascade on update cascade
                -> )default charset=utf8;
            四、刪除外鍵
                一、語法格式:
                    alter table 表名 drop foreign key  外鍵名(bjtab_ibfk_1);
                二、注意
                    查看外鍵的方式:
                    show create table 表名;(查看 CONSTRAINT `bjtab_ibfk_1`)
            五、在已有表中添加外鍵
                alter table 表名 add foreign key(參考字段名)references 被參考表名(被參考字段名)on delete 級聯動做 on update 級聯動做
                說明:在已有表中添加外鍵時,會受到表中原有數據的限制
            六、級聯動做
                一、cascade:數據級聯更新
                    一、當主表刪除記錄時,若是從表有相關聯記錄則級聯刪除
                    二、當主表更新被參考字段值時,從表級聯更新參考字段值
                二、restrict(默認)
                    一、當主表刪除記錄時,若是從表中有相關聯記錄,則不容許主表刪除
                    二、當主表更新被參考字段值時,若是自從表有參考字段,則不容許更新
                三、set null
                    一、當主表刪除記錄時,從表中相關聯記錄外鍵字段值變爲null
                    二、update同理
                四、no action
                    同restrict同樣,都是當即檢查外鍵限制
            七、使用規則
                一、兩張表被參考字段和參考字段的數據類型要一致
                二、被參考字段必須是key的一種,一般是primary key

    五、在哪些字段上面適合添加索引
        一、在較爲頻繁的做爲查詢條件的字段應該建立索引
        二、惟一性太差的字段不適合單首創建索引,好比性別
        三、更新太頻繁的字段不適合建立索引
        四、不會出如今where子句中的字段不適合建立索引
    六、注意事項
        一、建立一個複合索引後,查詢只用到了其中的一個字段則不會使用索引
            建立複合索引:create index fangyu_country on sanguo(fangyu,country);
            explain能夠幫助咱們在不真正執行某個SQL語句的時候,就能夠分析sql語句
            mysql> explain select * from sanguo where country="蜀國"\G
                *************************** 1. row ***************************
                           id: 1         #查詢序列
                  select_type: SIMPLE    #查詢類型
                        table: sanguo    #查詢表名
                   partitions: NULL      
                         type: ALL       #掃描方式,ALL表示全表掃描    
                possible_keys: NULL      #可能使用到的索引
                          key: NULL      #實際使用到的索引
                      key_len: NULL      #使用索引的個數   
                          ref: NULL
                         rows: 8         #SQL語句掃描的行數
                     filtered: 12.50
                        Extra: Using where
                1 row in set, 1 warning (0.00 sec)
        二、使用模糊查詢時不會使用到索引
        三、若是查詢語句中使用了or只要其中一個條件沒有索引,則查詢時則不會使用索引

數據導入
    一、做用:將文件系統的內容導入到數據庫中
    二、語法格式:
        一、load data infile '文件名' into table 表名 fields terminated by '分隔符' lines terminated by '分隔符';
        說明:文件爲絕對路徑
    三、xdl:     x:   1000:1000:xdl,,,:/home/xdl:/bin/bash(使用cat /etc/passwd | grep "xdl";命令查看)
        用戶名:密碼:UID:GID:   描述:   家目錄:  登陸權限
    四、把/ect/passwd/ 導入到MySQL數據庫中
    五、操做步驟:
        一、在數據庫中建立對應的表:
            create table userinfo(
            -> username char(20),
            -> password char(1),
            -> uid int,
            -> gid int,
            -> comment varchar(50),
            -> homedir varchar(50),
            -> shell varchar(50)
            -> );
        二、查看數據庫的默認搜索路徑:
            show variables like 'secure_file_priv';
        三、將系統文件拷貝到數據庫的默認搜索路徑中
            sudo cp /etc/passwd /var/lib/mysql-files
        四、將數據導入表中
            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 teriminated by '分隔符'
    三、練習:
        一、把userinfo 表中的用戶名,密碼,和uid號三個字段導出到userinfo.txt中
           select username,password,uid from userinfo
        -> into outfile '/var/lib/mysql-files/userinfo.txt'
        -> fields terminated by '   '
        -> lines terminated by '\n';
        二、將庫名爲mysql庫中的user表中的User,Host兩個字段的值導出到user2.txt
            select User,Host from user
            -> into outfile '/var/lib/mysql-files/user2.txt'
            -> fields terminated by '   '
            -> lines terminated by '\n';
    四、注意:
        一、導出的內容由SQL查詢語句決定
        二、執行導出命令時路徑必須指定在對應的數據庫目錄下
        三、show variables like 'secuer_file_priv';查詢路徑
表的複製
    一、表的複製
        一、語法格式
            create table 表名 select 查詢命令;
        二、練習
            一、複製userinfo表中的數據到userinfo2表中
                create table userinfo2 select * from userinfo;
            二、複製userinfo表的前10行記錄到uesrinfo3中
                create table userinfo3 select * from userinfo limit 10;
            三、複製userinfo表的用戶名、密碼、uid三個字段的2~10條記錄到userinfo4中
                create table userinfo4 select username,password,uid from userinfo limit 1,9;
        二、只複製表結構
            一、語法格式
                create table 表名 select...where false;
        三、注意複製表的時候不會把原有表的 鍵 屬性賦值過來
嵌套查詢
    一、定義:把內層的查詢結果做爲外層查詢的條件
    二、語法格式:
        select 查詢語句 where 條件 (select 查詢語句)
    三、練習:
        一、把uid的值小於這個字段的平均值的用戶和uid顯示出來
            方法1:select avg(uid) from userinfo;
                  select ussername,uid from userinfo where uid < 第一條查詢的結果
            方法2:
            select username,uid from userinfo where uid < (select avg(uid) as vag_uid from userinfo);
        二、查找userinfo表中用戶名在mysql庫下的user表中Host值爲localhost而且User值爲root的 用戶名
            select username from userinfo where username in (select User from mysql.user where Host='localhost' and User='root')
多表查詢
    一、兩種方式:
        一、select 字段名列表 from 表名列表;(笛卡爾積)
            select * from tt2,tt3;
        二、select 字段名列表 from 表名列表 where 條件
            select * from tt2,tt3 where tt2.uid = tt3.uid;
    二、練習
        一、顯示省和市的信息
            select sheng.S_name,city.C_name from sheng,city where sheng.S_ID = city.CFather_ID;
        二、顯示省、市、縣的信息
            select sheng.S_name,city.C_name,xian.X_name from sheng,city,xian where sheng.S_ID=city.CFather_ID and city.C_ID=xian.XFather_ID;
鏈接查詢
    一、內鏈接
        一、定義:從表中刪除與其餘被鏈接表中沒有匹配到的行
        二、語法格式
            select 字段名列表 from 表1 inner join 表2 on 條件
        三、練習
            一、顯示省、市信息
            select sheng.S_name,city.C_name from sheng inner join city on sheng.S_ID = city.CFather_ID;
            二、顯示省、市、縣的信息
            select sheng.S_name,city.C_name,xian.X_name from sheng inner join city on sheng.S_ID = city.CFather_ID inner join xian on city.C_ID=xian.XFather_ID;

    二、外鏈接
        一、左鏈接
            一、定義:以左表爲主顯示查詢結果
            二、語法:
                select 字段名列表 from 表1 left join 表2 on 條件
            三、練習:
                一、顯示省市信息
                select sheng.S_name,city.C_name from sheng left join city  on sheng.S_ID = city.CFather_ID;
        二、右鏈接
            一、定義:以右表爲主顯示查詢結果
            二、語法:
                select 字段名列表 from 表1 right join 表2 on 條件
            三、練習
                一、顯示省市信息
                select sheng.S_name,city.C_name from sheng right join city on sheng.S_ID = city.CFather_ID;
                二、顯示省市縣的信息,要求市所有顯示
                select sheng.S_name,city.C_name,xian.X_name from sheng right join city on sheng.S_ID = city.CFather_ID left join xian on city.C_ID=xian.XFather_ID;

數據備份(在linux終端下操做)
    一、命令格式:
        mysqldump -u用戶名 -p 源庫名 >  路徑/xxx.sql:
    二、源庫名的表示方式
        --all-database        備份全部庫
        庫名                    備份單個庫
        -B 庫1 庫2 ...         備份多個庫
        庫名 表1 表2         備份指定庫的指定表
    三、練習
        一、備份全部庫爲all_mysql.sql放到主目錄下mydata目錄中
        mysqldump -u debian-sys-maint -p --all-databases > ~/mydata/all_mysql.sql
        二、備份三個庫,放到mydata目錄中
        mysqldump -u debian-sys-maint -p -B db1 db2 db3 > ~/mydata/db1_db2_db3.sql
        三、備份省市縣的三張表
        mysqldump -u debian-sys-maint -p db3 sheng city xian > ~/mydata/sheng_city_xian.sql
數據恢復(在linux終端下操做)
    一、命令格式
        mysql -u用戶名 -p 目標庫名 < 路徑/xxx.sql
    二、從全部備份文件中恢復指定庫(--one-database)    
        mysql -u用戶名 -p --one-database 目標庫 < 路徑/xxx.sql
        說明:目標庫必須是全部備份中存在的庫名
    三、練習
        一、先備份db3庫,刪除省市縣三張表,
            drop table sheng,city,xian;
        二、在db3庫中建立一張新表t88888
            create table t88888(id int);
        三、恢復db3庫
    四、注意
        一、恢復時若是恢復到原有庫會將表中數據覆蓋,新增的表不會被刪除
        二、在恢復時若是恢復的庫不存在,則先要建立空庫
ER模型&ER圖
    一、定義:ER模型就是實體——關係模型,ER圖就是實體-關係圖
    二、三個概念
        一、實體
            一、定義:現實世界中任何能夠被認知、區分的實物
            二、示例
                一、學校:學生、教師、課程、班主任...
                二、企業:職工、產品...
        二、屬性
            一、定義:實體所具備的特性
            二、示例
                一、學生屬性:學號、姓名、年齡、性別、專業...
                二、產品屬性:產品編號、產品名稱、規格...
        三、關係
            一、定義:實體之間的關係
            二、分類
                一、一對一關係(1:1):班級和班長
                二、一對多關係(1:n):公司和職工、班級和學生
                三、多對多關係(m:n):學生和課程、商店和顧客
        四、ER圖的繪製
            一、矩形框表明實體、菱形框表明關係、橢圓形表明屬性。
            二、示例:
                學生選課系統

workbench(圖形化界面操做數據庫)
事務&事務回滾
    一、事務定義:一件事從開始到結束的整個過程
    二、屬性
        一、原子性:
            一個事務是不可分割的工做單位,事務中各個操做要麼都作,要麼都不作
        二、一致性:
            事務必須從一個一致性狀態到另外一個一致性狀態
        三、隔離性:
            一個事務的執行不能被其餘併發事務干擾
        四、持久性:
            一個事物一旦提交,它對數據的改變是永久性的
    三、事務及事務回滾的應用:
        一、mysql中默認sql語句會自動commit到數據庫
            show variables like ‘autocommit’;
        二、事務應用
            一、開啓事務:
                mysql> start transaction;#此時autocommit被禁用,SQL語句不會對數據庫中數據作修改
            二、終止事務;
                一、mysql> commit;
                二、mysql> rollback;
            三、注意:
                事務和事務回滾只針對對錶記錄的操做:增長、刪除、修改,對建立庫、建立表、查詢表記錄是無效的
python數據庫編程
    一、python數據庫接口(Python DB-API)
        一、定義:爲開發人員提供的數據庫應用編程接口
        二、python支持的數據庫服務軟件
            MySQL、Oracle、SQL_Server、Sybase、Mogodb
        三、Python提供的操做MySQL的模塊
            模塊名:pymysql
        四、pymysql的使用流程
            一、先創建數據庫鏈接
            二、建立遊標對象
            三、使用遊標對象的方法和SQL語句操做mysql數據庫
            四、提交commit
            五、關閉遊標
            六、關閉數據庫鏈接

import pymysql
#打開數據庫鏈接
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2',charset='utf8')
#建立一個遊標對象
cur = db.cursor()
#建立一個庫
cur.execute('create database if not exists python;')
#切換庫
cur.execute('use python;')
#建立一個表
cur.execute('create table if not exists t1(id int primary key,name varchar(20),score tinyint unsigned)default charset=utf8;')
#插入5條記錄
cur.execute("insert into t1 values(1,'貂蟬',88),(2,'趙子龍',100),(3,'諸葛亮',80),(4,'張飛',60),(5,'司馬懿',99);")
#提交
db.commit()
#關閉遊標
cur.close()
#關閉數據庫鏈接
db.close()
View Code

        五、須要安裝pymysql模塊
            一、安裝pip3:sudo apt install python3-pip
            二、安裝pymysql:pip3 install pymysql
        六、創建數據庫鏈接:
            一、語法格式:
                對象名=pymysql.connect('主機名','用戶名','密碼','庫名',port=3306,charset='utf8')
            二、connect對象(db)的方法
                一、cursor()    建立一個遊標對象:db.cursor()
                二、commit()    提交到數據庫 db.commit()
                三、rollback()    回滾 db.rollback()
                四、close()        關閉與數據庫的鏈接 db.close()
            三、cursor遊標對象(cur)的方法
                一、execute()        執行sql命令
                二、fetchone()        取得結果集的第一條記錄

import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8')

cur = db.cursor()

sql_select = 'select * from t1;'

cur.execute(sql_select)

data = cur.fetchone()

print('fetchone的結果爲:',data) #fetchone的結果爲: (1, '貂蟬', 88)

db.commit()
cur.close()
db.close()
View Code

                三、fetchmany(數字)    取得結果集的第幾條記錄

import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8')

cur = db.cursor()

sql_select = 'select * from t1;'

cur.execute(sql_select)

data = cur.fetchmany(3)
all_data = cur.fetchall()

print('fetchmany的結果爲:',data)#fetchmany的結果爲: ((1, '貂蟬', 88), (2, '趙子龍', 100), (3, '諸葛亮', 80))
print('fetchall的結果爲:',all_data)
db.commit()
cur.close()
db.close()
View Code

                四、fetchall()        取得結果集的全部行
                五、close()            關閉遊標對象
                屬性:rowcount :    返回命令執行影響的條數

import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8')

cur = db.cursor()

sql_select = 'select * from t1;'
print('命令影響的條數:',cur.rowcount)

cur.execute(sql_select)
all_data = cur.fetchall()


print('fetchall的結果爲:',all_data)#fetchall的結果爲: ((1, '貂蟬', 88), (2, '趙子龍', 100), (3, '諸葛亮', 80), (4, '張飛', 60), (5, '司馬懿', 99))

db.commit()
cur.close()
db.close()
View Code
#rollback.py
import pymysql
db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','db3',charset='utf8')
cur = db.cursor()

try:
    cur.execute("update CCB set money = 95000 where name='轉錢';")
    cur.execute("update ICBC set money = 7000 where name= '借錢';")

    db.commit()
    print('ok')

except Exception as e:
    db.rollback()
    print("出現錯誤已經回滾")
cur.close()
db.close()
View Code
from pymysql import *

class MysqlPython:

    def __init__(self,host,user,password,db,port,charset='utf8'):
        self.host = host
        self.user = user
        self.pwd = password
        self.db = db
        self.port = port
        self.charset = charset

    def open(self):
        '''建立與數據庫的鏈接'''
        self.conn = connect(self.host,self.user,self.pwd,self.db,self.port,charset=self.charset)
        #建立遊標
        self.cur = self.conn.cursor()

    def close(self):
        '''關閉遊標、關閉與數據庫的鏈接'''
        self.cur.close()
        self.conn.close()

    def myexecute(self,sql):
        '''執行SQL命令'''
        self.open()
        try:
            self.cur.execute(sql)
            self.conn.commit()    
            print('操做成功')
        except Exception as e:
            self.conn.rollback()
            print('出現錯誤,已經回滾:',e)

    def myFetchone(self,sql):
        '''獲得一條記錄'''
        try:
            self.open()
            self.cur.execute(sql)
            data = self.cur.fetchone()
            return data
        except Exception as e:
            print('出現錯誤:',e)

    def myFetchmany(self,sql,n):
        '''獲得多條記錄'''
        try:
            self.open()
            self.cur.execute(sql)
            data = self.cur.fetchmany(n)
            return data
        except Exception as e:
            print('出現錯誤:',e)

    def myFetchall(self,sql):
        '''獲得所有記錄'''
        try:
            self.open()
            self.cur.execute(sql)
            data = self.cur.fetchall()
            return data
        except Exception as e:
            print('出現錯誤:',e)
View Code
#test.py

from MysqlPython import MysqlPython

# name = input("請輸入要修改爲績的學生姓名:")
# score = int(input("請輸入新的成績:"))

# sql = "update t1 set score=%s where name='%s';"%(score,name)
# mp = MysqlPython('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',3306)

# mp.myexecute(sql)
# mp.close()

sql = "select * from t1"
mp = MysqlPython('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',3306)
data = mp.myFetchone(sql)
print(data)
mp.close()


data = mp.myFetchmany(sql,3)
print(data)

data = mp.myFetchall(sql)
print(data)
View Code

select user_id,count(*) from comment group by user_id order by count(*) desc limit 10;
思路:首先找到全部的用戶,按用戶分組,按評論的文章計數而後降序,取前10條記錄

TCL(事務控制語言)

1.事務Transaction:要麼一塊兒成功,要麼一塊兒失敗.

2.事務的開始

  一個事務的結束,就是下一個事務的開始

3.事務的結束

  DDL(數據定義語言)語句可以自動提交事務:create, drop, alter

  DML(數據操縱語言)語句不會自動提交事務:insert, delete,update,select

4.commit:提交

5.rollback:回滾

相關文章
相關標籤/搜索