增長一條數據mysql
# 插入完整數據 1. insert into 表名(字段1,字段2,...,字段n) values (值1,值2,...,字段n); # 按照選定的字段依次傳值 2. insert into 表名 values (值1,值2,...,字段n); # 若是不選定字段,必須傳入表內 # 指定字段插入數據 insert into 表名(字段1,字段2,...) values (值1,值2,...)
增長多條數據sql
# 插入完整數據 insert into 表名(字段1,字段2,...,字段n) values (值1,值2,...,字段n), (值1,值2,...,字段n), (值1,值2,...,字段n) ...... ; # 插入指定數據 insert into 表名(字段1,字段2,...) values (值1,值2,...), (值1,值2,...), (值1,值2,...), ...... ;
插入查詢結果函數
# 複製別的表內數據 insert into 表名 (字段1,字段2,...字段n) select (字段1,字段2,...字段n) from 表2 where 條件;
修改數據工具
# 將按照條件搜索出來的數據對應的列名的值改成新值 update 表名 set 列名1=新值1,列名2=新值2 ... where 條件;
delete優化
# 1. 刪除全部數據,清空表 delete from 表名; # 2. 刪除表內指定的數據 delete from 表名 where 條件; # 刪除根據條件篩選出來的數據
truncate日誌
# 刪除全部數據,清空表 truncate 表名;
區別:code
查詢關鍵字的使用順序:排序
select 字段名 from 表名 where 條件 group by 條件 having 條件 order by 條件 limit 條件;
優先級:索引
where > group by > having > order by > limit
關鍵字rem
from # 後跟表名;指定從哪張表查詢 where # 後跟條件;根據條件進行查詢 group by # 後跟字段名;按照字段名對數據排序 having # 後跟條件,與 group by 連用;對分組後的結果再進行二次篩選 select # 後跟字段名或 * ;表示要展現的字段信息,* 表示選擇表內全部的字段 distinct # 用在字段名前,對篩選出來的字段進行去重 order by # 後跟 字段名 asc/desc;表示對字段進行排序,asc表示升序,desc表示降序,默認爲升序 limit # 限制結果的顯示條數
select 字段名 from 表名
1. 查詢表內指定字段的信息 select 字段1,字段2,...,字段n from 表名; # 查詢對應表內的字段1,字段2,...,字段n的信息 2. 查詢表內全部的信息 select * from 表名; # 查詢表內全部字段的信息
distinct
select distinct 字段名 from 表名; # 查詢表內字段信息,若是字段信息有重複的,則只顯示一個 例如: select distinct name from goods; # 查詢 goods 表內全部商品的名稱,並去重
where 條件
select * from 表名 where 條件; 例如: select * from goods where id < 10; # 查詢 goods 表內 id <10 的全部商品信息
條件
1. 比較運算符 大於:> ,大於等於:>= ,小於:< ,小於等於:<= ,不等於:!= 或 <> 例如: id>10 , id>=10 , id<10 , id<=10 , id!=10 , id<>10 2. between...and... 例如: id between 10 and 20 # id 在 10 到 20 之間的(包含 10 和 20 ) 3. in(值1,值2) 例如: id in(10,20) # id 是 10 或者 20 的 name in('張三','李四') # name 是 張三 或者 李四 的 4. 模糊條件(實際使用中最好不要使用,) 只匹配給出的字符,加了 % 表示給定字符的前或後是什麼內容都忽略,只要對應位置有給定字符就符合條件 - 以...開始:like 'ghjk%' # 查詢以 ghjk 開頭的信息 - 以...結束:like '%ghjk' # 查詢以 ghjk 結尾的信息 - 包含... : like '%ghjk%' # 查詢包含 ghjk 的信息 5. is NULL , is not NULL # 判斷字段是否是 NULl 例如: name is NULL # name 是 NUll 的 name is not NULL # name 不是 NULL 的 注意: name is '' # ''表示空字符串,不是NULL
group by
group by 必須跟在 where 條件 以後。
group by 字段名 # 將全部記錄按照某個相同字段進行分組,好比針對員工的職位分組,或者按照性別分組等 必須和聚合函數連用: - 聚合函數: - count(id) - max(salary) - min(salary) - avg(salary) - sum(salary) 例如: select gender,count(id) from staff group by gender; # 按照性別分組,而後顯示每一個性別的人數 select gender,max(age) from staff group by gender; # 按照性別分組,而後顯示每一個性別年齡的最大值 select gender,min(age) from staff group by gender; # 按照性別分組,而後顯示每一個性別年齡的最小值 select gender,avg(age) from staff group by gender; # 按照性別分組,而後顯示每一個性別年齡的平均值 select gender,sum(age) from staff group by gender; # 按照性別分組,而後統計每一個性別的年齡的綜合
having
having 必須跟在 group by 以後。
having 條件 # 過濾,對 group by 以後的數據進行二次篩選 與 where 的區別 執行優先級從高到低:where > group by > having 1. Where 發生在分組group by 以前,於是 Where 中能夠有任意字段,可是絕對不能使用聚合函數 2. having 發生在分組 group by 以後,於是 having 中可使用分組的字段,沒法直接取到其餘字段,可使用聚合函數 例如: # 按照性別分組,而後顯示平均年齡大於 26 的性別和平均年齡 select gender,avg(age) from staff group by gender having avg(age) >26;
order by
order by 字段名 asc(升序) / desc(降序) # 將字段排序 例如: select * staff order by age asc; # 將表 staff 內的信息按照年齡升序排列 select * staff order by age desc; # 將表 staff 內的信息按照年齡降序排列 select * staff order by age desc , id asc; # 將表 staff 內的信息按照年齡降序排列,若是年齡相同,再按照 id 升序排列
limit
limit offset , size # offset:行數據索引;size:取多少條數據 例如: select * from staff limit 0,10; # 將表 staff 的數據從第 1 條開始,取出10條信息 select * from staff limit 10,10; # 將表 staff 的數據從第 11 條開始,取出10條信息
使用外鍵將表關聯起來,使其用某種聯繫。
一對多
給 A 表內的字段增長約束,約束是表 B 內的一個字段,且 A 表內該字段的值可重複,B 表內該字段不可重複。
關聯方式:foreign key 建立方法:在被約束的表內添加 1. 建立表時建立:constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段) 2. 建立完成後添加:alter table 表名 constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段)
多對多
給 C 表內的多個字段增長約束,約束是 A 表內的字段和 B 表內的字段,且只有 C 表內的值能夠重複。
foreign key+一張新的表 建立方法:在新表內添加 1. 建立表時建立:constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段) 2. 建立完成後添加:alter table 表名 constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段)
一對一
給 A 表內的字段增長約束,約束是 B 表內的一個字段,且 A、B 兩個字段都不可重複。
關聯方式:foreign key+unique 建立方法:在被約束的表內添加 - 建立表時建立: 1. 先增長一個惟一字段:字段名 列類型 [約束條件] unique; 2. constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段) - 建立完成後添加: 1. 先增長一個惟一字段:字段名 列類型 [約束條件] unique; 2. alter table 表名 constraint 外鍵名 foreign key (被約束的字段) references 約束的表(約束的字段)
交叉鏈接
# 直接將兩張表的全部信息聯合起來,生成笛卡爾積 select * from 表A,表B;
左鏈接
# 優先顯示左表所有記錄 select * from 表A left join 表B on A.被外鍵約束字段=B.約束字段 # 將兩張表經過外鍵關聯到一塊兒的字段將兩張錶鏈接起來,若是左邊表的某些信息在右邊沒有,右邊的表會顯示 NULL
右鏈接
# 優先顯示左表所有記錄 select * from 表A right join 表B on A.被外鍵約束字段=B.約束字段 # 將兩張表經過外鍵關聯到一塊兒的字段將兩張錶鏈接起來,若是右邊表的某些信息在左邊沒有,左邊的表會顯示 NULL
內鏈接
# 只顯示匹配的行 select * from 表A inner join 表B on A.被外鍵約束字段=B.約束字段 # 將兩張表經過外鍵關聯到一塊兒的字段將兩張錶鏈接起來,只顯示兩張表都有內容的信息
鏈接查詢
將錶鏈接在一塊兒後,就能夠根據條件進行篩選想要的結果,方法和單表查詢基本一致 select * from 表A inner join 表B on A.被外鍵約束字段=B.約束字段 where 條件 group by 條件 having 條件 order by 條件 limit 條件;
子查詢
子查詢是將一個查詢語句嵌套在另外一個查詢語句中;
子查詢中能夠包含比較運算符:= 、 != 、> 、< 等;
優勢:增長索引會極大的提升查詢效率
缺點:建立索引會佔用大量的磁盤空間
爲了提升查詢效率,例如字典中的目錄。
一個特殊的文件。
B+ 樹
主鍵索引:加速查找、不能重複、不能爲空
primary key :
惟一索引 :加速查找,不能重複
unique(添加索引的字段名)
聯合惟一索引
unique(添加索引的字段名1,添加索引的字段名2)
普通索引:加速查找
index(添加索引的字段名)
聯合索引
index(添加索引的字段名1,添加索引的字段名2)
主鍵索引
建立
1. 建立表時添加 create table 表名( id int auto_increment , primary key(id) )charset utf8; 或 create table 表名( id int auto_increment primary key )charset utf8; 2. 增長 alter table 表名 change id id int auto_increment primary key; 3. 增長 alter table 表名 add primary key (id);
刪除
alter table 表名 drop primary key;
惟一索引
建立
1. 建立表時添加 create table t2( id int auto_increment primary key, name varchar(32) not null default '', unique u_name (name) )charset utf8 2. 增長 create index 索引名 ON 表名 (字段名) ; 3. 增長 alter table 表名 add index 索引名 (字段名)
刪除
alter table 表名 drop index 索引名;
普通索引
建立
1. 建立表時添加 create table t3( id int auto_increment primary key, name varchar(32) not null default '', index u_name (name) )charset utf8 2. 增長 create index 索引名 ON 表名 (字段名) ; 3. 增長 alter table 表名 add index 索引名 (字段名);
刪除
alter table 表名 drop index 索引名;
當使用 SQL 指令進行查詢時,若是用到了索引,成爲命中了索引。
不會命中索引的幾種狀況
不能在 SQL 指令中作四則運算,會下降查詢效率
使用函數
例如:select * from 表名 where reverse(email) = 'tom';
類型不一致
若是列類型是字符串,傳入查詢條件時沒有按照字符串的形式傳入
例如:select * from 表名 where name = tom; # 應該使用 name = 'tom'
排序條件爲索引,則 select 字段必須也是索引字段,不然沒法命中
當根據索引排序時候,select 查詢的字段若是不是索引,則速度仍然很慢 例如:select name from 表名 order by age # 假設 age 字段有索引,name 字段沒有索引 特別的: 若是是對主鍵排序,則不會影響 例如 select * from 表名 order by 主鍵字段;
組合索引最左前綴
使用聯合索引的狀況下:當最左邊一個字段存在的時候,就能夠命中,不然,不能命中 例如: index 索引名(字段1,字段2,字段3,字段4) 能夠命中的狀況: where 字段1=值 and 字段2=值 and 字段3=值 and 字段4=值; where 字段1=值 and 字段2=值 and 字段3=值; where 字段1=值 and 字段2=值; where 字段1=值; 不能命中的清空 where 字段2=值 and 字段3=值 and 字段4=值; where 字段2=值 and 字段3=值; where 字段2=值; 等等......
查看 SQL 指令是否命中索引
explain SQL指令 \G 例如: mysql> explain select * from user where name='zekai' and email='zekai@qq.com'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: user partitions: NULL type: ref 索引指向 all possible_keys: ix_name_email 可能用到的索引 key: ix_name_email 確實用到的索引 key_len: 214 索引長度 ref: const,const rows: 1 掃描的長度 filtered: 100.00 Extra: Using index 使用到了索引
慢查詢日誌
使用 MySQL 提供的工具記錄效率低的 SQL指令,後期進行優化
查看慢SQL的相關變量
mysql> show variables like '%slow%'; +---------------------------+-----------------------------------------------+ | Variable_name | Value | +---------------------------+-----------------------------------------------+ | log_slow_admin_statements | OFF | | log_slow_slave_statements | OFF | | slow_launch_time | 2 | | slow_query_log | OFF ### 默認關閉慢SQl查詢日誌, on | | slow_query_log_file | D:\mysql-5.7.28\data\DESKTOP-910UNQE-slow.log | ## 慢SQL記錄的位置 +---------------------------+-----------------------------------------------+ 5 rows in set, 1 warning (0.08 sec) mysql> show variables like '%long%'; +----------------------------------------------------------+-----------+ | Variable_name | Value | +----------------------------------------------------------+-----------+ | long_query_time | 10.000000 |
配置慢SQL變量
set global 變量名 = 值 # 查詢要配置的變量名 set global slow_query_log = on; # 打開記錄功能 set global slow_query_log_file="存儲路徑"; set global long_query_time=1; # 設定記錄的SQL指令執行時間閾值,超過記錄