Mysql高階查詢,約束,索引
阿新 • • 發佈:2018-11-25
1、高階查詢
(1)總結 3、select ... 聚合函式 from 表名 1、where ... 2、group by ... 4、having ... 5、order by ... 6、limit ...; (2)order by:給查詢結果排序 order by 欄位名 ASC(升序,是預設的)/DESC(降序) (3)limit (永遠放在SQL命令的最後寫) 顯示查詢記錄的條數 用法: limit n; --->顯示 n 條記錄 limit m,n; ----->從第m + 1條記錄開始顯示n條記錄 limit 2,3; 顯示第3,4,5三條記錄 (4)分頁 每頁顯示5條記錄,顯示第4頁的內容 第1頁:limit (1-1)*5,5 # 1 2 3 4 5 第2頁:limit (2-1)*5,5 #6 7 8 9 10 第3頁:limit (3-1)*5,5 #11 12 13 14 15 ... 第m頁:limit (m-1)*n,n (5)聚合函式 分類 avg(欄位名) : 求該欄位的平均值 sum(欄位名) : 求和 max(欄位名) : 求最大值 min(欄位名) : 求最小值 count(欄位名) : 統計該段記錄的個數 (6)group by:給查詢的結果進行分組 計算每個國家的平均攻擊力: select country,avg(gongji) from sanguo group by country; 先分組 再聚合 再去重 注意: select 之後的欄位名如果沒有在group by 之後出現,則必須要對該欄位進行聚合(聚合函式) (7)、having語句 作用:對查詢結果進行進一步的帥選 練習:找出平均攻擊力大於105的國家的前2名,顯示國家名和平均攻擊力 mysql> 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、where只能操作表中實際存在欄位,having語句可操作由聚合函式生成的顯示列 (8)distinct:不顯示欄位的重複值 語法:select distinct 欄位1,欄位2 from 表名 select count(distinct country) as n from sanguo; 注意:distinct和from之間的所有欄位值都相同才會去重 (9)查詢表記錄時可以做數學運算 運算子:+ - * / % 示例: select id,name,gongji*2 from sanguo; 2、約束: (1)、作用:保證資料的一致性、有效性 (2)、約束分類: ①預設約束(default) 插入記錄時,不給該欄位賦值,則使用預設值 sex enum("M","F","S") default "S" ②非空約束(not null) 不允許該欄位的值為NULL id int not NULL id int not NULL default 0 3、索引: 對資料庫中的一列或多列的值進行排序的一種結構(BTree) (1)普通索引(index) 使用規則: ① 可設定多個欄位,欄位值無約束 ②把經常用來查詢的欄位設定為索引欄位 ③KEY標誌:MUL 普通索引的建立: ①建立表時建立 create table t1( ..., ..., index(name), index(id); ②已有表中建立: create index 索引名 on 表名(欄位名); 檢視索引: ①desc 表名; ②show index from 表名\G; 刪除普通索引: drop index 索引名 on 表名; (2)唯一索引(unique) ①使用規則: 可以設定多個欄位 約束:欄位值允許重複,但可以為NULL KEY標誌:UNI ②建立: 建立表時建立 unique(phnumber), unique(cardnumber) 已有表建立: create unique index 索引名 on 表名 ③檢視、刪除同普通索引 (3)主鍵索引(primary key) ① 使用規則: 一個表中只能有一個欄位為主鍵欄位 約束: 欄位值不允許重複,也不能為NULL KEY標誌:PRI 通常設定記錄編號欄位為id,能夠唯一鎖定一條記錄 ② 建立: 建立表時: 方法1: id int primary key auto_increment, name varchar(20) not null )auto_increment=10000,charset=utf8,engine=InnoDB; **InnoDB,MyISAM 兩種型別有什麼區別:MyISAM型別不支援事務處理等高階處理,而InnoDB型別支援。 MyISAM型別的表強調的是效能,其執行數度比InnoDB型別更快,但是不提供事務支援,而 InnoDB提供事務支援,外來鍵等高階資料庫功能。 MyISAM型別的二進位制資料檔案可以在不同作業系統中遷移。也就是可以直接從Windows系統拷貝 到linux系統中使用。 alter table 表名 auto_increment=10000; 方法2 :id int auto_increment, name varchar(20), primary key(id,name) #複合主鍵 已有表: alter table 表名 add primary_key(id); ③刪除主鍵 先刪除自增長屬性(modify) alter table 表名 modify id int 刪除主鍵: alter table 表名 drop primary key; (4)外來鍵(foreign key)