1. 程式人生 > >MySQL學習筆記:基本資料型別與查詢操作

MySQL學習筆記:基本資料型別與查詢操作

#客戶端將資料儲存到資料庫伺服器上的過程
    1、連線到伺服器 mysql -u xxx -p xxx
    2、選擇一個庫 use xxx
    3、建立表或者修改表
    4、斷開與資料庫伺服器的連線 exit; | quit; | \q

#mysql的資料型別
#數值型別(有符號和無符號)
    1、整形
        bigint 極大整形
            0-2**64-1
        int 大整形(4個位元組) 2^32-1 = 42億多
        smallint 小整形(2個位元組)
            0-65535
        tinyint 微笑整形(1個位元組)    
            預設signed:-128 到 127
            unsigned:0 到 2^8-1=255
    2、浮點型
        float(4位元組,最多顯示7個有效位)            
        用法:float(m,n) m為十進位制下總位數 n為十進位制下小數位位數
            float(5,2)範圍是 -999.99到999.99
            插入時,自動補全小數位,多出來的小數位會四捨五入
            當有效數字位多於7位時,顯示時,只顯示準確的前七位,其他都是亂的
        
        double(8位元組,最多顯示15個有效位)
        用法:double(m,n) m為十進位制下總位數 n為十進位制下小數位位數
    
        decimal(佔M+2個位元組,最多顯示28個有效位)
        用法:decimal(M,D)

        多用decimal和float,用double的很少
    
#字元型別
    1、char(定長)
        寬度取值範圍:1-255;即字串最長為255個字元
        不給定寬度時為1
    2、varchar(變長)    
        寬度取值範圍:1-65535,沒有預設寬度,必須指定
        
    char是定長字串,不足定長的部分會被空格補齊,但是效能高
    varchar是邊長字串,節省空間,但是效能低
    
#列舉型別
    欄位值只能在列舉的範圍內取選擇
    1、enum單選(最多有65536個不同的值)
        欄位名 enum(值1,值2 ......)
    2、set多選(最多有64個不同的值)
        欄位名 set(值1,值2 ......)
    
    比如:
    create table t6(
        name char(15),
        sex enum("boy","girl","secret"),
        hobby set("girl","boy","MySQL","Python","C++","PHP"));
    #enum和set只能列舉字串型別
    insert into t6 values( "Lucy","secret","C++,PHP");
    #set多選時,用雙引號括住,中間直接填值
    
#日期時間型別
    1、year年份,插入YYYY
    2、date日期,插入YYYYMMDD
    3、time時間,插入HHMMSS
    4、datatime日期與時間,插入YYYYMMDDHHMMSS
    5、timestamp日期時間,插入YYYYMMDDHHMMSS

    注意:
    插入記錄時datatime不給值,預設返回NULL
          timestamp不給值,預設返回系統當前時間

#查詢表
    1、and且
    2、or或
    3、is null空, is not null非空
    
    注意:
    空值NULL必須用is 或者is not 去匹配
    ""空字串必須用 = 或者 != 匹配
    
    4、範圍內比較
        between A and B
        in (A,B,C ...)
        not in (A,B,C ...)
    5、模糊比較
        欄位名 like 表示式
        _ 匹配單個字元
        % 匹配0到多個字元
    
        比如
        select * from table1 where name like "___"
        匹配名字長度為3的童鞋
        select * from talbe1 where name like "趙%"
        匹配姓趙的童鞋
        select * from table1 where name like "__%"
        匹配名字至少有兩個字元的童鞋

#SQL查詢執行順序
    3、select    ...聚合函式 from ...
    1、where
    2、group by
    4、having    
    5、order by
    6、limit
    
#order by語句
    作用:給查詢的結果進行排序
    方式:升序,降序
        ACS(預設):升序
        DESC:降序
    語法:order by 欄位名 排序方式
    
#limit永遠放在最後寫
    limit n 顯示幾條記錄
    limit m,n m表示從第幾條記錄開始顯示,n表示顯示幾條
        
#聚合函式
    分類:
    avg(欄位名):求平均值
    sum(欄位名):求欄位的和
    max(欄位名):求欄位的最大值
    min(欄位名):求欄位的最小值
    count(欄位名):統計該欄位記錄個數
    
    比如,顯示成績最大值
    select max(score) as "highest score" from table8;
    顯示成績平均值
    select avg(score) as "average score" from table8;
    顯示成績高於100的學生人數
    select count(*) from table8 where score>=100

#group by 分類    
    該過程是先按照欄位給所有資料分組,然後再計算其他要求的資料
    比如:select country from t8 group by country
        查詢都有哪些國家
    
    注意:
    1、group by之後的欄位名必須是select之後的欄位名
    2、如果select之後的欄位名和group之後的欄位名不一致,必須進行聚合處理,否則必須因為結果行數不一樣而出錯
    
    示例:查詢所有國家中英雄數量最多的前兩名的國家名稱和英雄數量
    select country,count(*) as Num from table8 group by country order by Num 
    
    示例:找出平均攻擊力大於105的國家的前兩名,顯示國家名和平均攻擊力
    select country,avg(damage) from table8 group by country having avg(damage)>105 limit 2

    注意:
    1、having語句通常與group by語句聯合使用,用於過濾由group by語句返回的記錄集
    2、where的優先順序高於group,只能對分組之前的結果進行篩選;having優先順序低於group,用於對group之後的結果進行分組
    
#distinct(不重複的)
    作用:不顯示欄位的重複值
    示例:select distinct country from sanguo;
    如果select country,name from sanguo;    則當且僅當country和name都相同時才能去重

#查詢表時做數學運算
    運算子:+、-、*、/、%
    示例:select id,name,score * 10 from table8;

#約束:為了保證資料的完整性、一致性、有效性的規則,可以限制無效資料插入到資料表中

#預設約束
    作用:插入記錄時,如果不給該欄位賦值,則使用預設值
    格式:欄位名 資料型別 default值
    
#非空約束
    作用:不允許該欄位的值有NULL記錄
    格式:欄位名 資料型別 not null
    
#表記錄的修改
    delete from table_name where 條件;
    不加where將表記錄全部刪除
    
    update table_name set 欄位名=值1, where 條件


#索引:對資料庫表中的一列或者多列進行排序的結構(MySQL中是BTREE)
    優點:防止多次遍歷資料庫記錄,加快檢索速度(相當於對索引排序後進行二分,MySQL中最多分三層)
    缺點:進行增加、修改、刪除時,索引也需要動態維護,降低了資料的變更速度;需要佔用物理空間

#普通索引(index):
    規則:
    1、一個表中可以有多個index欄位
    2、欄位的值可以有重複、且可以為NULL值
    3、經常把做查詢條件的欄位設定為index欄位
    4、index欄位的key標誌時MUL
    
    建立普通索引:
    1、建立表的時候建立索引欄位
        index(欄位名1),index(欄位名2)......
    2、向已存在的表中建立索引欄位
        create index 索引名 on table(欄位名);

#檢視普通索引
    1、desc 表明;    檢視key標誌為MUL即可
    2、show index from table

#刪除普通索引
    drop index 索引名 on table_name
    只能一個一個刪除

#小知識點
    在MySQL中呼叫bash命令
    system bash命令

#唯一索引(unique)規則
    一個表中可以有多個unique欄位
    unique欄位的值不允許重複,但是可以為空
    unique的key值是UNI

#建立唯一索引
    1、在建立表時建立
        create table t1(
        id int default 0,
        name char(20) unique);
    2、也是在建立表時建立,和建立普通索引差不多
        create table t1(
        id int default 0,
        name char(30),
        unique(id),
        unique(name));
    3、在已存在的表中建立
        create unique index name_ on t1(name);

#檢視唯一索引
    1、desc
    2、show index from t1\G;
    
#刪除唯一索引
    drop index name from t2;

#主鍵(primary key)
    1、一個表中只能由一個主鍵欄位
    2、對應欄位的值不允許重複,且不能為空值
    3、KEY標誌位PRI    
    4、一般把表中唯一能夠表示一條記錄的欄位設定為主鍵欄位

#建立主鍵
    1、在建立表時建立,和unique一樣
        create table t3(
        id int primary key,
        name char(20)
        );        

        create table t3(
        id int,
        name char(20),
        primary key(id)
        );        

    2、在已存在的表上加入
        alter table t2 add primary key(name);
        
#刪除主鍵
    alter table t2 drop primary key;
    
#複合主鍵的概念

#自增長屬性
    作用:通常和主鍵一起配合使用
#建立表時建立自增長屬性
    欄位名 資料型別 primary key auto_increment
#使用
    插入記錄時,不會動態維護,但會保證表內id不一樣
    根據實驗,可能有一個變數在記錄表中自增屬性的最大值,然後每次插入預設時,用最大值+1

#向已存在表中新增自增長屬性
    alter table table_name modify 欄位名 資料型別 primary key auto_increment
    
#刪除帶自增長屬性的主鍵
    先刪除自增長屬性,但是該欄位還是主鍵:alter table t3 modify 欄位名 資料型別;