Mysql進階2
字符類型的寬度和數值類型的寬度的區別
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