mysql詳解常用命令操作,利用SQL語句創建數據表—增刪改查



關系型數據庫的核心內容是 關系 即 二維表


MYSQL的啟動和連接
show variables; 【所有的變量】     1服務端啟動       查看服務狀態         sudo /etc/init.d/mysql status  狀態         sudo /etc/init.d/mysql start   開啟         sudo /etc/init.d/mysql stop    停止                   ....  restart  重啟                   ....  reload  生效配置【熱】,不是所有都可以生效     2 客戶端連接       mysql -h 主機地址 -u 用戶名 -p 密碼       mysql -hlocalhost -uroot -p
庫的命名規則:
  1,數字,字母,__,但是不能是純數字
  2, 庫名區分字母大小寫
  3,不能使用特殊字符 和 MYSQL關鍵字
   基本操作
    1,查看所有庫,所有表
      show databases;
      show tables;
    2. 創建庫
      create database 庫名;
      create database 庫名 character set utf8;  設置庫的字符集類型
        如何更改庫的默認字符集:
          1 更改配置文件: 部分系統不一樣 文件名【mysqld.cnf】
              1 獲取root 權限
              2 cd/etc/mysql/mysql.d
              3 cp mysqld.cnf mysqld.cnf.bak
              4 subl mysqld.cnf
              5 在[mysqld]下:
                character_set_server=utf8 [更改庫的默認字符集]
              6 /etc/init.d/mysql restart
        
    3.查看創建庫的語句
      show create database 庫名;
    4,查看當前所在位置庫
      select database();
    5. 切換庫
      use 庫名;
    6.刪除庫
      drop database 庫名;
  創建表:
    表的基本操作:
      1 創建表:           【表名.frm(表結構) 表名.ibd(表數據) 存儲引擎innodb】
        create table 【if not exist】表名(
          字段名 數據類型,
          字段名 數據類型,
          字段名 數據類型
          )character set utf8;
CREATE TABLE  `test`.`users` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
View Code
需要注意的是這個符號不是單引號,而是【`】這個符號
      2 查看創建表的語句(字符集,存儲引擎)
        show create table 表名;
      3 查看表結構,(詳細信息)
        desc 表名;
      4 刪除表
        drop table 表名;


root@tedu:/home/tarena/下載# cd /var/lib/mysql    【查看表的存儲路徑,下面都是表的存儲位置】
root@tedu:/var/lib/mysql# ls
auto.cnf ib_buffer_pool ib_logfile0 ibtmp1 mysql_upgrade_info sys
debian-5.7.flag ibdata1 ib_logfile1 mysql performance_schema text

【表名.frm(表結構)     表名.ibd(表數據)    存儲引擎innodb】

  斷開與數據庫連接:exit;|quit;|\q;
  
  數據類型
    1 數值類型
      1 整數 1個字節占8位
        1 int 大整型(占用4個字節)32 取值范圍:0~(2**32-1) 42億多
        2 tinyint 微小整型(占用1個字節)8 0~2**8-1
          有符號(signed默認) :-128~127
          無符號(unsigned) : 0~255
            age tinyint unsigned;
        3 smallint 小整型(2個字節)
        4 bigint 極大整型(8個字節)
      2 浮點型
        1 float (占用4個字節,最多顯示7個有效位)
          字段名:float(m,n) M->總位數,m的最大為7 n->小數位位數
          float(5,2) -999,99~999.99
            1 浮點型 插入整數時,自動補全小數位位數
            2 小數位如果多於指定位數,對指定位下一位四舍五入
          
        2 double  最多顯示15個有效位
          字段名 double(m,n)
        3 decimal(m,n)
          1 存儲空間(整數部分,小數部分分開存儲)
           規則:將9的倍數包裝成4個字節

              余數      字節
              0        0
              1-2       1
              3-4       2
              5-6       3
              7-8       4
                
              例:decimal(19,9)
                整數部分:10/9=1余1 4字節+1字節 =5
                小數部分:9/9=1余0    4字節+0字節 =4
                  消耗總共:9個字節

    2 字符類型
      1 char : 定長
        char(寬度) 寬度取值范圍:1~255 寬度指的是字符的寬度
        char(20)
        插入一個 'A' 也是占20個字節 ,沒有20字節就補空格
      2 varchar : 變長
        varchar(寬度) 寬度取值范圍 : 1~65535
      3 text / longtext(4G) / blob / longblob
      4 char 和 varchar 的特點為
        1 char : 浪費存儲空間,性能高
        2 varchar : 節省存儲空間,性能低
      5 字符類型的寬度和數值類型寬度的區別
        1 數值類型寬度為顯示寬度,只用於select 查詢時顯示,和占用存儲無關,可用zerofill查看效果
          id int(3) zerofill,
        2 字符類型的寬度超過后無法存儲
    3 枚舉類型
       1 單選 enum
          sex enum(值1,值2,...)
       2 多選 set
          hobby set(值1,值2,...)
          ###插入記錄時 'study,python,mysql'
    4 日期時間類型
      1 date: 'YYYY-MM-DD'
      2 datetime: 'YYYY-MM-DD HH:MM:SS'      【不給值,默認返回null】
      3 timestamp : 'YYYY-MM-DD HH:MM:SS'     【不給值,默認返回系統當前時間】
      4 time : 'HH:MM:SS' 【不常用】
          
          insert into 表(timesstamp) values(now());
          【可調用now()函數直接獲取當前時間插入】
      日期時間函數
         1 now() 返回服務器當前時間
         2 curdate() 當前日期
         3 date("1999-09-09 09:09:09") ---> 【1999-09-09】 提取年月日
         4 time('...') 提取 時分秒
         5 year('...')  提取 年
       where 字段名 運算符(now()-interval 時間間隔單位);
       時間間隔單位:
        2 day | 3 hour | 1 minute | 2 year | 3 month
       示例:
        1
查詢一天以內的 ----->   select * from t2 where cztime>=(now()-interval 1 day)
查詢一天之前,三天以內的記錄 ---->        SELECT * from t1 where cztime>=(now()-INTERVAL 15 day) and cztime<=(now()-INTERVAL 1 day)


表字段操作
    1 語法 alter table 表名...
    2 添加字段(add)
      alter table 表名 add 字段 數據類型; 【默認添加到字段最后】
      alter table 表名 add 字段 數據類型 first; 添加到字段首
      alter table 表名 add 字段 數據類型 after 字段名; 添加到哪個字段之后
    3  刪除字段  
      alter table 表名 drop 字段名;
    4 修改字段數據類型(modify)
      alter table 表名 modify 字段名 新數據類型;
      會受到表中已有數據的限制
    5 修改表名(rename)
      alter table 表名 rename 新表名;
    6 修改字段名(change)
      alter table 表名 change 原字段名 新字段名 數據類型;
  

  運算符操作  
    數值比較&&字符比較&&邏輯比較
      數值比較:= != > >= <=
      字符比較: = !=
      邏輯比較:
        and 兩個或者多個條件同時成立
         or  有一個條件滿足即可
     ...where country='蜀國' or country='魏國';   列出蜀國和魏國的記錄
    范圍內比較
      between 值1 and 值2
      in (值1,值2)
      not in(值1,值2)
+------+-----------+--------+--------+------+---------+
| id   | name      | gongji | fangyu | sex  | country |
+------+-----------+--------+--------+------+---------+
|    1 | 諸葛亮    |    120 |     20 || 蜀國    |
|    2 | 司馬懿    |    119 |     25 || 魏國    |
|    3 | 關羽      |    188 |     60 || 蜀國    |
|    5 | 孫權      |    100 |     60 || 吳國    |
+------+-----------+--------+--------+------+---------+
4 rows in set (0.00 sec)

mysql> select * from sanguo where (gongji between 100 and 200)and country='蜀國';
View Code between and     匹配空 和非空
      空: is null
      非空: is not null
      null: 空值,只能用is ,is not null 去匹配
      '' :空字符串,只能用 =,!= 去匹配
模糊查詢(like)
  1 where 字段名 like 表達式
  2 表達式
    1,_ : 匹配單個字符
    2, % : 匹配0到多個字符
  
  
select name from sanguo where name like "_%_";
#name中有兩個字符以上的

select name from sanguo where name like "%";
#匹配所有,但不包括null

select name from sanguo where name like "___";
#匹配名字為3個字符的

select name from sanguo where name like "趙%";
#匹配姓趙的英雄

 

  

 

表記錄的管理:插入
  插入語句,  
  insert into 表名 values(id1,'xxx'),(id2,'***')...; 【不用字段名,直接插入】
  insert into 表名(字段1,字段2,字段3..) values(值1,值2,值3,...); 【剩下沒有指定插入的值,將為成為空值(null)】
    INSERT INTO list(soure) VALUES('2018-5-8')     INSERT INTO list(soure) VALUES('2018-8-8'),('2019-9-8')

  查詢語句;
  1,select * from 表名 where 條件;
  2,select 字段1,字段2 from 表名  
    distinct : 不顯示字段的重復值
      1 。語法 select distinct 字段1,字段2 from 表名;
         如果字段1的值和字段2的值全部相同,才會去重,

  刪除表記錄(delete)
    1 delete from 表名 where 條件; 【不加where條件 全部刪除表記錄】
  更新表記錄(update)
    update 表名 set 字段1=值1,字段2=值2 where 條件

 

SQL高級查詢
  1 總結
     3 select ... 聚合函數 from 表名
      1 where ...
      2 group by ...
      4 having ...
      5 order by ...
      6 limit ...
  2 order by... 給查詢結果排序
    1 order by 字段名 ASC(默認升序) / DESC(降序)
    2 按防御值從高到低排序
     
    

    3 將蜀國英雄按攻擊值從高到低排序
       

    4 將魏蜀兩國英雄中名字為3個字符的,按防御值升序排序

        

  3 limit (永遠放在SQL命令的的最后寫)  

     1 顯示查詢記錄的條數     

     2 用法 

        limit n;--->顯示n條記錄

        limit m,n; -->從第m+1條記錄開始,顯示 n 條

     3 分頁

      每頁顯示5條記錄,顯示第4頁的內容

      每頁顯示n條記錄,顯示第M頁的內容

      第M頁,limit(m-1)*m,n

 4 聚合函數
    1 分類
      avg(字段名):求該字段的平均值
      sum(字段名):求和
      max(字段名):最大值
      min(字段名): 最小值
      count(字段名):統計該字段記錄的個數
        select max(gongji) from sanguo;
        select name,max(gongji) as max from sanguo; 引入別名函數 別名[max]
  5 group by : 給查詢的結果進行分組
    1 查詢表中都有哪些國家
      select country from sanguo group by country;
    2 計算每個國家的平均攻擊力
       先分組,再聚合, 再去重
        select country,avg(gongji) from sanguo group by country;
    3 select 之后的字段名如果沒有在group by 之后出現,則必須要對該字段進行聚合處理(聚合函數)  
    
    4 查找所有國家中英雄數量最多的前2名的國家名稱和英雄數量
        

 


 5 having 語句
    1 作用 :對查詢結果進行進一步的篩選
    2 找出平均攻擊力大於105的國家的前2名, 顯示國家名稱和平均攻擊力

      

 

    3

      1  having 語句通常和group by 語句聯合使用,過濾由 group by 語句返回的記錄集

       2  where 只能操作表中實際存在字段,having語句可操作由聚合函數生成的顯示列

 

    4   查詢記錄時做數學運算

       1 運算符    + - * / %

       2  查詢時顯示所有英雄攻擊力翻倍  

          select id,name,gongji*2 as newgj from sanguo;     

 

2 嵌套查詢(子查詢)
   1 定義: 把內層的查詢結果作為外層的查詢條件
   2 語法
      select ... from 表名 where 字段名 運算符 (select ... from 表名 where 條件);

 

     練習 找出每個國家攻擊力最高的英雄的名字和攻擊值
        

         上面的查詢可能會出現一些人BUG,所以為了防止BUG的發生,作出一點修改

           

 

多表查詢。連表查詢

1
SELECT * FROM list_char LEFT JOIN list_name on list_char.pid=list_name.pid

  1 兩種方式 
    1 笛卡爾積 : 不加where條件
       使用一條記錄跟后面的每個表的記錄逐一匹配 
    2 加where 條件
      select .. from 表1,表2 where 條件; 
4 連接查詢
  1 內連接(inner join)
    1 語法格式
      select 字段名列表 from 表1
      inner join 表2 on 條件;【可以加個 】
        

 inner join(等值連接) 只返回兩個表中聯結字段相等的行


  2 外連接
    1 左連接(left join)
      1 以左表為主 顯示查詢結果
      2 select 字段名列表 from 表1
        left join 表2 on 條件
        left join 表2 on 條件
      3 練習 ,
        顯示省,市詳細信息,要求省全部顯示  
            

    2 右連接(right join)
        以右表為主顯示查詢結果,用法同左連接一模一樣

left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 
right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄
inner join(等值連接) 只返回兩個表中聯結字段相等的行
    

  讀鎖(共享鎖)
  寫鎖(互斥鎖,排他鎖)

2 鎖粒度
  1 行級鎖:Innodb
    select : 加讀鎖,鎖1行
    update : 加寫鎖,鎖1行

  2 表級鎖 : MyISAM
    select : 加讀鎖,鎖當前整張表
    update : 加寫鎖,鎖1張表
    
6 存儲引擎(Engine)
  1 查看所有存儲引擎
    show engines;
  2 查看已有表的存儲引擎;      
    show create table 表名;
  3 創建表指定存儲引擎
    新表
      create table 表名(...) engine=myisam;

    已有表
      alter tbale 表名 engine=myisam;
常用存儲引擎的特點
    1 InnoDB 特點
      1,支持事務,外鍵,行級鎖
      2 共享表空間
        表名.frm : 表結構和索引信息
        表名.ibd : 表記錄
    2 MyISAM特點
      1 支持表級鎖
      2 獨享表空間
        表名.frm 表結構
        表名.myd 表記錄 mydata
        表名.myi 表索引 myindex
    3 MEMORY存儲引擎
      1 數據存儲在內存中,速度快
      2 服務器重啟,MYSQL服務重啟后表記錄消失
    
    4 如何決定使用哪個存儲引擎
      1 執行查詢操作多的表使用 MyISAM引擎 【使用 InnoDB節省資源,表加鎖比行加鎖節省資源】
      2 執行寫操作多的表使用 InnoDB

 


約束
  1 作用 : 保證數據的一致性,有效性
  2 約束分類
    1 默認約束 (default)
      插入記錄時,不給該字段賦值,則使用默認值
       sex enum('H','F') default 'S',
    2 非空約束(not null)
      不允許該字段的值為null
        id int not null,
        id int not null default 0
    
     create table t1(
       id int not null,
       name varchar(15) not null,
       sex enum('m','f','s') default 's',
       course varchar(20) not null default 'python'
       )character set utf8;
索引 
  1 定義 :
    對數據庫中表的一列或多列的值進行排序的一種結構(bTree)
  2 優點
    加快數據的檢索速度
  3 缺點
    1 當對表中數據更新時,索引需要動態維護,降低數據的維護速度
    2 索引需要占用物理存儲空間
4 索引示例
    使用 show variables like 'profiling' 查看當前狀態
    1 開啟運行時間檢測 : mysql> set profiling=1
    2 執行查詢語句        select name fromm t1 where name='lucy99999';
    3 查看執行時間        show profiles;
    4 在name 字段創建索引
      create index name on t1(name);
    5 再次執行查詢語句      select name fromm t1 where name='lucy99999';
  5 索引 排序都是bTree,,區別只是約束不一樣
      1 普通索引(index)
        1 使用規則
            1,可設置多個字段 ,字段值無約束
            2 把經常用來查詢的字段設置為索引字段
            3 KEY標志 : MUL
         2 創建
            1 創建表時創建 【create table t1 (id int ,name varchar(15) ,index(name),index(id));】 【創建兩個索引】
            2 在已有表中創建索引 【create index 索引名 on 表名(字段名);】-->索引名一般寫字段名
         3 查看索引
            1 desc表名;--->KEY標志為 MUL
            2 show index from 表名;
         4 刪除index
            drop index 索引名 on 表名;
      2 唯一索引(unique)
         1 使用規則:
            1 可設置多個字段
            2 約束:字段的值不允許重復,但可以為NULL
            3 KEY標志 : UNI
         2 創建
            1 創建表時
              unique(phnumber),
              unique(cardnumber)
            2 已有表
              create unique index 索引名 on 表名(字段名);
            3 查看,刪除同普通索引
              刪除:drop index 索引名 on 表名;
      3 主鍵索引(primary key)&&自增長屬性(auto_increment)
        1 使用規則
          1 只能有一個字段為主鍵字段
          2 約束:字段值不允許重復,也不能為NULL
          3 KEY標志:PRI
          4 通常設置記錄編號字段id,能夠唯一鎖定一條記錄
        2 創建
          1 創建表時
            1 id int primary key auto_increment,
            2 id int auto_increment,
              name varchar(20) not null
              primary key(id,name)) 復合主鍵
              auto_increment=10000,... 【ID從10000開始】
          2 已有表
            alter table 表名 add primary key(id);
            alter table 表名 auto_increment=10000; 【補充】
        3 刪除主鍵
          1,先刪除自增長屬性(modify更改數據類型)
            alter table 表名 modify id int;
          2 刪除主鍵
            alter table 表名 drop primary key;
      4 外鍵(foreign key)
          ***明天講***




 
         
數據導入
  1 作用: 把文件系統中的內容導入到數據庫中 出現亂碼情況往下看
  2 語法格式
    load data infile '文件名'
    into table 表名
    fields terminated by '分隔符'
    lines terminated by '\n'
  3 導入數據庫中
    1 在數據庫中創建對應的表
      
    2 執行數據導入
      1 查看搜索路徑
        show variables like 'secure_file_priv';
        

       2 拷貝文件到上圖路徑

       3 注意路徑和分隔符

          

   亂碼情況下,,更改字符編碼

 

 

 4 導出數據

       語法格式

        select ... from 表名 

        into outfile '文件名'  

        fields terminated by '分隔符'

        lines terminated by '\n';

        

 

    

 

  導入導出時,特別需要注意文件路徑,單詞的正確程度

     5 查看,更改文件權限

      1 【ls -l score.txt】

         r : 讀

         w : 寫

         x :可執行

 表的復制
  1 語法
    create table 表名 select ... from 表名 where 條件;
  2 示例
    

   3

   復制下表,且若每頁顯示2條記錄,復制第3頁的內容
    
    

     

   4  復制表結構

      create table 表名 select ...  from 表名 where false;

        

 

  


 

1  外鍵 
   1 定義: 讓當前表的字段值在另一張表的范圍內去選擇
   2 語法格式
     foreign key (參考字段名)
     regerances 主表(被參考字段名)
     on delete 級聯動作
     on update 級聯動作;
   3 使用規則
      1 主表,從表字段數據類型要一致
      2 主表 : 被參考字段是主鍵
      3 創建主鍵
        

    4 刪除外鍵

      alter table 表名 drop foreign key 外鍵名;

      外鍵名查看 : show create table 表名;  -- >CONSTRAINT `bjtab_ibfk_1` FOREIGN KEY (`stu_id`) REFERENCES `jftab` (`id`)【紅字為外鍵名】

    5 已有表創建主鍵

      alter table bjtab add foreign key(stu_id) references jftab(id);

      

   6 級聯動作:
      1 cascade 數據級聯刪除,級聯更新(參考字段)
      2 restrict(默認)
        如果從表中有相關聯記錄,不允許主表操作
      3 set null
        主表刪除,更新,從表相關聯記錄字段值為null,
      


MYSQL 用戶賬戶管理
   1 開啟mysql遠程連接(獲取root權限 改配置文件)
     bind-address
   2 用root 用戶添加授權用戶
     1 用root 用戶登錄mysql
     2 授權
        mysql> grant 權限列表 on 庫名.表名 to "用戶名"@"%" identified by "密碼" with grant option;
        權限列表 : all privileges | select | update
        庫名.表名 : db4.* | *.*(所有庫的所有表)
    3 示例
       1 添加授權用戶tiger,密碼123,對所有庫的所有表有所有的權限,可從任何IP去連接
    

  

數據備份(mysqldump,在linux終端操作)
  1 命令格式
    msyqldump -u用戶名 -p 源庫名 > ***.sql
      回車輸入數據庫密碼
  2 源庫名的表示方式
    --all-databases 備份所有庫
    庫名        備份一個庫
    -B 庫1 庫2 庫3  備份備份多個庫
    庫名 表1 表2 表3  備份多張表

數據恢復
  1 命令格式(linux終端)
    mysql -u用戶名 -p 目標庫名 < ***.sql
  2 從所有庫備份all.sql中恢復某一個庫
    mysql -u 用戶名 -p --one-database < all.sql
   
  注意:
    1,恢復庫時,如果恢復到原庫會將表中的數據覆蓋,,新增表不會刪除
    2 恢復庫時,如果庫不存在,則必須先創建空庫


MYSQL 調優
  1 創建索引
    在select .where .order by常涉及到的字段建立索引
    
  2 選擇合適的存儲引擎
    讀操作多 : MyISAM
    寫操作多 : InnoDB
  
  3 SQL語句優化(避免全表掃描)
    1 where 子句盡量不使用 != ,否則放棄索引
    2 盡量避免 NULL判斷,否則全表掃描  
      優化前 :
          select number from t1 where number is null;
      優化后 : 
        在number 字段設置默認值0,確保number 字段無NULL
        select number from t1 where number=0
    3 盡量避免用or 連接條件,否則全表掃描
      優化前:
        select id from t1 where id=10 or id=20
      優化后:
        select id from t1 where id=10
        union all
        select id fromm t1 where id=20
    4 模糊查詢盡量避免使用前置 % ,否則全表掃描
        select variable from t1 where name="%secure%";
    5 盡量避免使用 in 和 not in,否則全表掃描
      優化前
        select id from t1 where id in (1,2,3,4);
      優化后
        select id from t1 where id between 1 and 4;
    6 不能使用select * ...
        用具體字段代替*,不要返回用不到的任何字段

 

事務和事務回滾
  1 定義 : 一件事從開始發生到結束的整個過程。 
  2 作用 : 確保數據一致性
  3  事務和事務回滾應用
    1 SQL命令會 autocommit 到數據庫執行
    2 事務操作
      1 開啟事務
        mysql> begin; |  mysql> start transactions;
        mysql> SQL命令...
          ##此時autocommit 被禁用##
      2 終止事務
        mysql> commit; | rollback;

1 python交互
   1 python3 
      模塊名: pymysql
      安裝 : sudo pip3 install pymysql
          sudo pip3 install pymysql==版本號 【安裝指定版本】
      離線:pymysql.tar.gz
        解壓:setup.py
            python setup.py install 【必須加上install】
   2 python2 
    模塊名 : MySQLdb
    安裝  : sudo pip install mysql-python

pymysql 使用流程
  1 建立數據庫連接對象(db=pymysql.connect(...))
  2 創建游標對象CUR(cur=db.cur***)
  3 游標對象: cur.execute('SQL命令')
  4 提交 db.commit
  5 關閉游標對象
  6 關閉數據庫連接對象
connet連接對象
  1 db=pymysql.connet(參數列表)
    1 host =主機地址
    2 user =用戶名
    3 password =密碼
    4 database =庫名
     5 charset =編碼方式,推薦utf8
    6 port  =端口號
  2  db (數據庫連接對象)的方法
    1 db.close()斷開連接
    2 db.commit()提交到數據庫執行
    3 db.cursor()游標對象,用來執行sql命令
    4 db.rollback()回滾
  3 cursor 游標對象的方法
    1 erxecute(sql命令) : 執行SQL命令
    2 close() : 關閉游標對象
    3 fetchone() : 獲取查詢結果的第1條數據
    4 fetchmany(n): 獲取N條記錄
    5 fetchall() :獲取所有記錄

orm(Object Relation Mapping) 對象關系映射

 

  

#查詢一個表是否存在
SELECT table_name FROM information_schema.TABLES WHERE table_name ='tablename';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM