1. 程式人生 > >Mysql進階2

Mysql進階2

20809128 Mysql 進階

數據類型:

字符類型的寬度和數值類型的寬度的區別
1、數值類型的寬度為顯示寬度,只用於select查詢時顯示,和占用的存儲空間大小無關,可用zerofill來顯示效果
2、字符類型的寬度超過指定寬度則無法存儲
create table t1(
id int(3) zerofill,
name char(20)
);
insert into t1 values(1,"lucy"); ## 顯示效果為 001

表字段的操作

1、語法:alter table 表名 執行動作;
2、添加字段(add)
    1、添加到末尾
        alter table 表名 add 字段名 數據類型;
    2、添加到第一列
        alter table 表名 add 字段名 數據類型 first;
    3、添加到指定位置
        alter table 表名 add 字段名 數據類型 after 字段名;
3、刪除字段(drop)
    alter table 表名 drop 字段名;
4、修改字段數據類型(modify)
    alter table 表名 modify 字段名 新的數據類型;
5、修改字段名(change)
    alter table 表名 change 舊字段名 新字段名 數據類型;
6、修改表名(rename)
    alter table 表名 rename 新表名;

表記錄的管理

1、刪除表記錄
    1、delete from 表名 where 條件;
    2、註意
        delete語句後如果不加where條件子句會將表中所有記錄全部刪除
    3、示例
        create table t4(
        id int(3) zerofill,
        name varchar(20),
        sex enum("boy","girl")
        );

        insert into t4 values
        (1,"Lucy","girl"),
        (2,"Tom","boy"),
        (3,"Bob","boy");

        select * from t4;

更新表記錄

    1、update 表名 set 字段名=值1,字段名=值2,...,where 條件;
    2、註意
        update語句後如果不加where條件會將表中所有的值修改
    3、練習(見建表腳本MOSHOU.hero.txt)
        1、查找所有蜀國人的信息
            select * from hero where country="蜀國";
        2、查找女英雄的姓名、性別和國家
            select name,sex,country from hero where sex="女";
        3、把曹操的國籍改為蜀國
            update hero set country="蜀國" where name="曹操";
        4、把魏延的性別改為 女 ,國籍改為 泰國
        5、把id為2的記錄的姓名改為司馬懿,性別為男,國家為魏國
        6、刪除所有的泰國人
        7、將表中所有的記錄的國家改為吳國
        8、刪除所有英雄的信息

4、運算符操作(配合查詢、修改、刪除)
1、數值比較&字符比較
1、數值比較運算符:=、!=、>、>=、<、<=
2、字符比較運算符:=、!=
3、練習
1、找出攻擊力高於150的英雄的名字和攻擊力的值
2、找出防禦力值不是66的英雄信息
2、邏輯比較
1、運算符:and(多個條件同時滿足)
or(多個條件有一個滿足即可)
2、練習
1、找出攻擊值大於200的蜀國英雄的名字、攻擊值及國家
2、將吳國英雄中攻擊值為110的英雄的攻擊值設置為100,防禦值設置為60
3、查找蜀國和魏國的英雄信息
3、範圍內比較
1、運算符:between and、in、not in
2、語法
字段名 between 值1 and 值2
字段名 in(值1,值2,...,值N)
字段名 not in(值1,值2,...,值N)
3、練習
1、查找攻擊值在100-200之間的蜀國英雄信息
2、找到蜀國和吳國以外的國家的女英雄信息
3、找到編號為1、3或5的蜀國英雄和貂蟬的編號、姓名、國家
4、匹配空、非空
1、空:is null
2、非空:is not null
3、練習
1、查找姓名為空值(NULL)的蜀國男英雄信息
2、查找姓名為空字符串("")的英雄信息
4、註意
1、NULL :空值,必須用is或者is not去匹配
2、"" :空字符串,用 = 或者 != 去匹配
5、模糊比較
1、語法
字段名 like 表達式
2、表達式
1、 :匹配單個字符
2、% :匹配0到多個字符
3、練習
1、select id,name from sanguo where name like "
%_";

匹配名字中至少有兩個字符的

        2、select id,name from sanguo where name like "%";
            # 匹配除NULL之外的所有英雄信息
        3、select id,name from sanguo where name like "___";
            # 匹配名字中有三個字符的
        4、select id,name from sanguo where name like "趙%";
            # 匹配姓趙的英雄信息

SQL查詢

1、總結(執行順序)
    3、 select ...聚合函數 from ...
    1、 where ...
    2、 group by ...
    4、 having ...
    5、 order by ...
    6、 limit ...
2、order by
    1、作用:給查詢的結果進行排序
    2、排序方式
        1、ASC(默認) :升序
        2、DESC :降序
    3、語法格式
        order by 字段名 排序方式
    4、練習
        1、將英雄信息按防禦值從低到高排序
            select * from sanguo order by fangyu asc;
        2、將蜀國英雄信息按攻擊值從高到低排序
            select * from sanguo where country="蜀國" order by gongji DESC;
        3、將魏蜀兩國的男英雄中名字為三個字的英雄按防禦值升序排列
            select * from sanguo where
            country in("蜀國","魏國") and sex="男" and name like "___"
            order by fangyu;
    3、limit(永遠放在SQL語句的最後寫)
        1、作用 :限制顯示查詢記錄的條數
        2、用法
            1、limit n -->顯示幾條記錄
            2、limit m,n
                m -> 從第幾條記錄開始顯示,n表示顯示幾條
                ## m的值是從0開始計數的,3則表示第四條記錄開始
                limit 3,5 :顯示4-8條記錄
        3、練習
            1、查找攻擊值前三名且名字不為空值的蜀國英雄的姓名、攻擊值和國家
                -> select name,gongji,country from sanguo
                -> where
                -> name is not null and country="蜀國"
                -> order by gongji desc
                -> limit 3;
            2、查找防禦值倒數第二名到倒數第四名的蜀國英雄記錄
                -> select * from sanguo
                -> where
                -> country="蜀國"
                -> order by fangyu asc limit 1,3;

聚合函數

        1、分類
            1、avg(字段名) : 求字段的平均值
            2、sum(字段名) : 求字段的和
            3、max(字段名) : 求字段的最大值
            4、min(字段名) : 求字段的最小值
            5、count(字段名):統計該字段的記錄的個數
        2、練習
            1、攻擊力最強值是多少
                select max(gongji) from sanguo;
            2、統計一下表中id,name字段分別有獨傲少條記錄
                select count(id),count(name) from sanguo;
                ## 空值NULL不會被統計,空字符串""會被統計
            3、計算蜀國英雄的總攻擊力
                -> select sum(gongji) from sanguo
                -> where country="蜀國";
            4、統計蜀國英雄中攻擊值大於200的英雄的數量
                -> select count(*) from sanguo
                -> where 
                -> country="蜀國" and gongji>200;
    5、group by
        1、作用:給查詢的結果進行分組
        2、練習
            1、查詢sanguo表中一共有幾個國家
                select country from sanguo group by country;
            2、計算所有國家的平均攻擊力
                select country,avg(gongji) from sanguo
                group by country;
            3、查找所有國家中英雄數量最多的前兩名的國家名稱和英雄數量
                -> select country,count(*) from sanguo
                -> group by country
                -> order by count(*) desc
                -> limit 2;
        3、註意
            1、group by之後的字段名必須要為select之後的字段名
            2、如果select之後的字段名和group by之後的字段名不一致,則必須要對該字段值進行聚合處理(聚合函數)
    6、having語句
        1、作用:對查詢的結果進行進一步的篩選
        2、練習
            1、找出平均攻擊力大於105的國家的前兩名,顯示國家名和平均攻擊力
            -> select country,avg(gongji) from sanguo
            -> group by country
            -> having avg(gongji)>105
            -> order by avg(gongji) desc
            -> limit 2;
        3、註意
            1、having語句通常與group by語句聯合使用,用於過濾由group by語句返回的記錄集
            2、having語句的存在彌補了where條件子句不能與聚合函數聯合使用的不足,where只能操作表中實際存在的字段,having操作的是聚合函數生成的顯示列
    7、distinct
        1、作用:不顯示字段的重復值
        2、練習
            1、sanguo表中有哪幾個國家
                select distinct country from sanguo;
                # 多個字段用逗號隔開
            2、計算蜀國一共有多少個英雄
                select count(distinct name) from sanguo where country="蜀國";
            3、註意
                1、distinct處理的是distinct與from之間的所有字段,所有字段值必須全部相同才能去重
                2、distinct不能對任何字段做聚合處理
    8、查詢表記錄時做數學運算
        1、運算符
            +、-、*、/、%
        2、練習
            1、查詢顯示時所有英雄的攻擊力全部乘以10
                select id,name,country,gongji*10 as xgj from sanguo;
            2、查詢時顯示所有英雄的防禦力+5
                select id,name,country,fangyu+5 from sanguo;

約束

1、作用
    為了保證數據的完整性、一致性、有效性的規則
    可以限制無效的數據插入到數據表中
2、約束分類
    1、默認約束(default)
        1、作用 :在插入記錄時,如果不給該字段賦值,則使用默認值
        2、格式 :字段名 數據類型 default 值
    2、非空約束(not null)
        1、作用 :不允許該字段的值有NULL記錄
        2、格式 :字段名 數據類型 not null

索引

1、定義
    對數據庫中表的一列或者多列的值進行排序的一種結構(MySQL中用BTREE方式)
2、優點
    可以加快數據的檢索速度
3、缺點
    1、當你對表中的數據進行增加、修改和刪除的時候,索引也要動態維護,降低了數據的維護速度
    2、索引需要占用物理空間
4、索引類型
    1、普通索引(index)
        1、使用規則
            1、一個表中可以有多個index字段
            2、字段的值可以有重復,且可以為NULL值
            3、經常把做查詢條件的字段設置為index字段
            4、index字段的key標誌是MUL
        2、創建index
            1、創建表時創建
                index(字段名1),index(字段名2)
            2、在已有表中創建index
                create index 索引名 on 表名(字段名);
            3、註意
                索引名一般和字段名相同
        3、查看普通索引
            1、desc 表名;  -->查看key標誌為MUL
            2、show index from 表名;
        4、刪除普通索引
            drop index 索引名 on 表名;
            註意:
                刪除索引只能一個一個刪除
    2、唯一索引
    3、主鍵索引
    4、外鍵索引

Mysql進階2