MySQL的基本操做

1、mysql的啓動和鏈接mysql

  1.、服務控制(啓動、查看狀態、中止、重啓,重載)正則表達式

     兩種方法(Ubuntu系統)sql

    • sudo /etc/init.d/mysql start | status | stop | restart | reload
    • service mysql start | status | stop | restart | reload

  2 、鏈接數據庫數據庫

    • mysql -h主機地址 -u用戶名 [-P3306] -p密碼

2、庫的管理函數

  一、建立庫(指定字符集)性能

    create database 庫名;測試

    create database 庫名 default charset = utf8 #指定字符集ui

  二、查看庫的字符集spa

    show create database 庫名;rest

  三、查看當前所在庫

    select database();

  四、切換庫

    use 庫名;

  五、查看庫已有表

    show tables;

  六、刪除庫

    drop database 庫名;

3、表管理(表的建立、查看、刪除)

  一、建立表

    create table 表名(字段名1 數據類型1,字段2 數據類型2...);

    create table 表名(字段名1 數據類型1,字段2 數據類型2...)default charset = utf8;

  二、查看錶的字符集和存儲引擎

    show create table 表名;

  三、查看錶結構

    desc 表名;

  四、刪除表

    drop 表名;

4、表字段管理

  一、添加字段(add)

    alter table 表名 add 字段名 數據類型;  #默認添加到末尾

    alter table 表名 add 字段名 數據類型 first;  #添加到第一個字段

    alter table 表名 add 字段名 數據類型 after 字段名;  # 添加到指定字段後面

  二、修改字段數據類型

    alter table 表名 modify 字段名 新數據類型;

    注: 修改數據類型時會受到表中原有數據類型的限制

  三、修改字段名

    alter table 表名 change 舊名 新名 數據類型;

  四、刪除字段

    alter table 表名 drop 字段名;

  五、修改表名 

    alter table 表名 rename 新表名;

5、表記錄操做(表內容的增、刪、改、查)

  一、插入表記錄  

    insert into 表名 values(記錄1的字段的值),(記錄2的字段的值)...;

    insert into 表名(指定要插入的字段名) values(記錄1的字段的值),(記錄2的字段的值)...;

    注意: 沒有指定插入字段名的話,後面必須插入所有字段的值,若是指定了只需插入指定字段值便可。

 

  二、查詢表記錄

    select * from 表名;  # 查看全部的表記錄

    select 字段1,字段2...... from 表名;  # 查看指定字段記錄

    注:其它更復雜的查詢後面逐步說明

  三、刪除表記錄

    delete from 表名 where 條件;

    注:delete 語句後面若是不加where子句,會將表中全部記錄刪除。

  四、更新表記錄

    update 表名 set 字段1=值1,字段2=值2...... where 條件;

    注意:update 語句後面若是不加where子句,會將表中全部記錄修改。

 

 

進階查詢部分

PS:此表做爲下面示例所用(表名:sanguo)

 id name gongji fangyu sex country
1 諸葛亮 120 20 蜀國
2 司馬懿  119    25 魏國
3 關5羽 188 60 蜀國
4 趙雲6 200 66 魏國
5 孫權 100 60 吳國
6 貂蟬 666 10 魏國
7 NULL 1000 99 魏國
8   1005 88 蜀國
9 9周瑜 80 100 吳國
10 黃忠 130 80 蜀國
11 孫策 110 90 吳國
12 荀粲 80 100 魏國
13 華佗 60 200 NULL

 

6、where 子句

  ps:配合查詢、修改、刪除操做

  語法格式(以查詢爲例):

    select * from 表名 where 條件;

  一、where 子句後的運算符操做

    數值比較運算符:=、!=、>、>=、<、<=
    字符比較運算符:=、!=
    示例:
      找出攻擊力高於150的英雄和攻擊值
       select name,gongji from sanguo  where gongji > 150;
      找出防護力不等於100的英雄信息
       select * from sanguo where fangyu != 100;
  二、邏輯比較
     運算符:and  、or
     and:兩個或多個條件須要同時知足
     or:兩個或多個條件知足一條便可
    示例:
      找出攻擊值大於200的蜀國英雄的名字和攻擊值
       select name,gongji from sanguo where gongji > 200 and country = "蜀國";  
      將吳國英雄中攻擊值爲110的英雄的攻擊值設置爲100,防護值設置爲60
       update sanguo set gongji=100 where gongji=110;
  三、範圍內比較
    between  and 、in、not in
    語法:
      字段名 between 值1 and 值2
      字段名 in 值1 或 字段名 in (值1,值2...)
      字段名 not in 值1
    示例:
      
      查找攻擊值在100-200之間的蜀國英雄信息
        select * from sanguo where gongji between 100 and 200;
      找到蜀國和吳國之外國家的女英雄信息
       select * from sanguo where sex="女" and country not in ("蜀國","吳國");
  四、查詢空
    is null 、is not null
    示例:
      查找姓名爲NULL的蜀國女英雄信息
        select * from sanguo where name is null and sex="女";
      查找姓名爲""的英雄的id、姓名和國家
       select * from sanguo where name="";
      注意: null 爲空值,必須用 is 或者 is not 去匹配,而""爲空字符串,用 = 或者 != 去匹配。
  五、模糊比較
    語法:where 字段名 like 表達式;
      表達式:
        _ : 匹配單個字符
        % : 匹配0到多個字符(null不會被匹配)
    示例: 
      匹配名字中至少有兩個字的英雄
       select * from sanguo where name like "_%_";
      匹配名字爲三個字的英雄
       select * from sanguo where name like "___";
      匹配姓趙的英雄
       select * from sanguo where name like "趙%";
 
  六、正則匹配查詢 regexp
    語法:where 字段名 regexp 正則表達式;
    經常使用的正則表達式符號:
      ^ : 以...開頭
      $ : 以...結尾
      .  : 匹配任意一個字符
      [] : 包含...內容
      *  : 匹配前面的子表達式零次或屢次
 
    示例:
      匹配名字中帶數字的英雄信息
       select * from sanguo where name regexp "[0-9]";
      匹配名字中以數字開頭的記錄
       select * from sanguo where name regexp "^[0-9]";
      匹配名字中以數字結尾的記錄
       select * from sanguo where name regexp "[0-9]$";
      匹配以 司 開頭,以 懿 結尾的記錄
       select * from sanguo where name regexp "^司.*懿$";
 
7、order by子句(排序)
  語法格式:order by 字段名 排序方式;
  排序方式:asc(默認):升序  desc:降序
  示例:
    將英雄按防護值從低到高排序
     select * from sanguo  order by fangyu asc;  #asc 可不寫
    將蜀國英雄按攻擊值從高到底排序
    select * from sanguo where country = "蜀國" order by gongji desc;
    將魏蜀兩國的男英雄中名字中爲三個字的英雄按防護值升序排列
    select * from sanguo
       where sex = "男" and country in ("魏國","蜀國") and name like "___"
       order by fangyu;
8、limit子句
  做用:用於限制顯示查詢的記錄條數
  語法:limit m,n;
    m:表示從第m+1條開始顯示記錄
    n:表示顯示多少條記錄
  # m能夠省略
  # 永遠放在SQL語句的最後面
  示例:
    查找防護值倒數第2名到倒數第4名的蜀國英雄記錄
     select * from sanguo where country = "蜀國" order by fangyu limit 1,3;
    查找攻擊值前3名且名字不爲空值的蜀國英雄的姓名、攻擊值和國家
     select name,gongji,country from sanguo
        where country = "蜀國" and name is not null 
        order by gongji desc limit 3;
9、聚合函數
  avg(字段名):求字段的平均值
  sum(字段名):求和
  max(字段名):求最大值
  min(字段名):求最小值
  count(字段名):統計該字段記錄的條數
  示例:  
    找到最強攻擊值是多少
     select max(gongji) as best from sanguo;
     注:這裏的as 至關於設置一個別名best,能夠省略。
 
    統計一下id,name兩個字段分別有多少記錄
     select count(id),count(name) from sanguo;
     注:空值NULL不會被統計,空字符串""會被統計  
   
    統計蜀國英雄中攻擊值大於200的英雄的數量
     select count(*) from sanguo where country="蜀國" and gongji > 200; 
     # count(*)的意思是指被篩選出來的記錄只要有一個字段不是空值就會被統計
  
10、group by子句(先分組,再聚合)
  做用:給查詢的結果進行分組
  語法:group by 字段名;
  
  示例:
    統計sanguo表中一共有哪幾個國家
     select country from sanguo group by country;
 
    計算全部國家的平均攻擊力
     select countr,avg(gongji) from sanguo group by country;
     # 先分組,在求分組後每組的(國家)平均攻擊力,最後將國家去重顯示出來。
 
    查找全部國家中,英雄數量最多的前2名的國家的名稱及英雄數量
     select country,count(*) as 英雄數量 from sanguo
        group by country  order by  英雄數量 desc limit 2;
     # 可使用中文做爲別名
    
11、having  
  
 
  示例: 
    找出平均攻擊力大於105的國家的前2名,顯示國家名稱和平均攻擊力
     select country,avg(gongji) from sanguo
        group by country having avg(gongji) > 105
        order by avg(gongji) desc limit 2;
     注:1.having 語句一般與group by 語句聯合使用,用來過濾有group by語句返回的記錄集
      2.having語句彌補了where條件子句不能與聚合函數聯合使用的不足,where操做的
      是表中實際的字段,having操做的是集合函數生成的顯示列
 
12、distinct
  做用:不顯示字段的重複值 
  示例:
    sanguo表中一共有哪些個國家
     select distinct country from sanguo;
 
    計算蜀國一共有多少個英雄
     select count(distinct name) from sanguo where country = "蜀國";
 
       注:1.distinct處理的是distinct和from之間的全部字段,全部字段的值必須徹底相同才能夠去重
        2.distinct不能對任何字段作聚合處理
 
十3、查詢表記錄時能夠作數學運算
   + 、-、 *、/、 %
 
  示例:
     查詢時顯示全部英雄的攻擊力 * 10
     select name,gongji*10,country from sanguo;
 
總結(執行順序)
 
  一、where ...
  二、group by ...
  三、select ... 聚合函數 from 表名
  四、having ...
  五、order by ...
  六、limit ...
 
約束
 
做用:
  爲了保證數據的完整性、一致性、有效性,能夠限制無效的數據插入到數據表中
 
約束分類:
  默認約束(default)
     做用:在插入記錄時,若是不給該字段賦值,則使用默認值
     格式:
      字段名 數據類型 default 默認值,
 
  非空約束
     做用:不容許該字段的值有空值NULL記錄
     格式:
      字段名 數據類型 not null
 
   
  示例:
    建立一張表,name字段的默認值是「張三」
     create table t1(name varchar(20) default "張三", age tinyint unsigned);
       
    向表中添加一個字段,值不能爲空
     alter table t1 add id int not null;
 
 
索引
 
定義:
  對數據庫中表的一列或者多列的值進行排序的一種結構(MySQL中索引用Btree方式)
 
索引的優缺點:
   優勢:
    能夠加快數據的檢索速度
 
  缺點:
     當對錶中的數據進行增長、修改、刪除的時候,索引須要動態維護,下降了數據的維護速度
     索引須要佔用物理存儲空間(數據庫目錄/var/lib/mysql)
 
  建立索引:
     # name字段
      create index name on t1(name);
  
  ps:能夠開啓性能測試,有索引和無索引的檢索用時區別
    1.開啓性能測試
       show variables like "%pro%";
         set profiling = 1;
     2.查看性能分析結果      
       show profiles;
      # 與沒有索引的進行對比
    3.關閉性能測試
       set profiling = 0;
相關文章
相關標籤/搜索