MySQL—增刪改查,分組,連表,limit,union,alter,排序,去重
阿新 • • 發佈:2018-11-09
MySQL增刪改查
在表格的增刪改查中,查的內容是最多的,包括group by ,join,limit,union,alter,排序都是服務於查的
#sql語句資料行操作補充 #增加: #insert into table_name(欄位1,欄位2) values('屬性1','屬性2'),('屬性1','屬性2') 插入多行資料 #insert into t1(欄位1,欄位2) select 欄位1,欄位2 from t2; (某張表的某幾列資料選擇出來,插入) #刪除:delete from table_name [where id =/!=/>/< /<> 2] and/or name='啥啥啥'增刪改查,limit,order by#truncate table t1; #改: update t1 set name='gkx' ,age=19 where id>12 and name='x' #可以同時改多個欄位 ''' #查:內容較多: # 查所有,查部分欄位,後面跟 where條件,查完後排序 #select id,name from t1 where id>10 and name = 'aaa' #select id as setid ,name as setname from t1 where id>10 and name = 'aaa' # as 別名 #as 別名 #select name as cname ,age,1 from t1; #這裡的 1表示 增加一列,列名為1,該列所有行屬性也都為1 #select * from t1 where id in (1,2,5); #如果id在 1,2,5就選擇出來 #select * from t1 where id not in (1,2,5); #id除了1,2,5其他都選擇出來 #select * from t1 where id in (select id from t2 where id>2) ;# 根據選擇來選擇 #select * from t1 where id between 5 and 12; #閉區間 5和12也能取到 #select * from dmsxb where b_dm in (select b_dm from dmsxb group by b_dm having count(*)>1) ##還可以選擇查詢語句,不過這個語句結果需要為一個常量 select age,name,(select count(1) from tb) from tb1; #習題17和21 #條件 ## case when 條件 then 【欄位或者預設值】 else 欄位 END #select course_id,max(num),min(num),cname, # case when min(num) < 10 THEN 0 else min(num) end from score left join course on score.course_id = course.cid group by course_id; #if 三元運算 # select course_id,cname,tname,avg(if(isnull(score.num),0,score.num)) from score #萬用字元: #下劃線 : 表示後邊只能匹配一位,select * from tb12 where name like "a_" #百分號 : select * from tb12 where name like "a%"''' #limit:比如百度搜索,一次只顯示一頁,放置C/S端壓力 #select *from t1 limit 10; #顯示前十條 相當於select *from t1 limit 0,10; #select * from t1 limit 4,5; #從第4行開始的5行 (不包含第4行) #select * from t1 limit 5 offset 4 #從第4行開始的五行 #實現分頁: #page = int(input('page')) select * from limit (page-1)*10 , 10; 前者為起始位置#select * from t1 order by id desc limit 10; (後10行:先降序排列,再選前十行) ''' limit 數值越大越慢,比如 limit 300000,10 它會先掃描30萬行,然後再取下10行 ''' #排序: #select * from t1; #預設是從小到大排 即 asc ----> ascending #select * from t1 order by 列名 desc; 即 desc ----> descending #select * from t1 order by 列1 desc,列2 asc ; #根據列1從大到小排列,如果相同按列2從小到大排列
# Mysql增加主鍵或者更改表的列為主鍵的sql語句 # 新增表字段 # alter table table1 add transactor varchar(10) not Null; # alter table table1 add id int unsigned not Null auto_increment primary key # 修改某個表的欄位型別及指定為空或非空 # alter table 表名稱 change 欄位名稱 欄位名稱 欄位型別 [是否允許非空]; # alter table 表名稱 modify 欄位名稱 欄位型別 [是否允許非空]; # 修改某個表的欄位名稱及指定為空或非空 # alter table 表名稱 change 欄位原名稱 欄位新名稱 欄位型別 [是否允許非空 # 刪除某一欄位 # ALTER TABLE mytable DROP 欄位 名; # # 新增唯一鍵 # ALTER TABLE `test2` ADD UNIQUE ( `userid`) # 修改主鍵 # ALTER TABLE `test2` DROP PRIMARY KEY ,ADD PRIMARY KEY ( `id` ) # # 增加索引 # ALTER TABLE `test2` ADD INDEX ( `id` ) #修改欄位型別,並設定主鍵 # ALTER TABLE `category ` MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`id`); #建表後建立唯一索引: # create unique index UK_student_name on student (name); # 建表後新增約束 # alter table student add constraint uk_student_name unique (name); #修改表的列屬性 # alter table 表名 change 原列名 新列名 型別; --修改表的列屬性名 # alter table 表名 modify 列名 型別 ; --修改表的類型別 # alter table 表名 drop 列名; --刪除表的某一列 # alter table 表名 add 列名 型別; --新增某一列 # alter table 表名 rename 新表名; --修改表名 ''' #1. select now(); 列印當前時間 #2. desc table_name; 檢視欄位的屬性 #3. show create table table_name ; 查看錶的建立程式碼 #3. show create table table_name \G ; 豎著看,查看錶的建立程式碼ALTER命令
分組的實現,注意事項,總結
#分組 group by: #通過group by 按照所選列分組顯示,按所選列分組,所選列如果 不重複 的項有4個,就分成4組 # select part_id from t1 group by part_id; #錯誤:select part_id,name from t1 group by part_id; #這是不行的,因為它按part_id分組,聚合在一起,此時不知道 相同part_id但是不同name的,該如何取捨哪個name所以會報錯 #可以這麼寫: # select part_id,max(id) from t1 group by part_id; #當part_id 分組完後,留下id列中,相同part_id裡,id最大的那行 # select part_id,min(id) from t1 group by part_id; #結合count等聚合函式使用: 可以用as改名哦!!! #select count(id),part_id from t1 group by part_id; 用part_di分組,新增一列count(id),計算每組id數 #類似還有 count,max,min,sum,avg(比如avg(分數),取每個分組中,分數這個列的平均值i) # select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid #如果對於聚合函式結果進行二次篩選時,必須使用having! #select num from 表 group by num having max(id) > 10 #選擇出最大id大於10的,按num分組的,所有分組 #加條件: select part_id from user where id !=1 group by part_id having count(*)>1; #··特別的:group by 必須在where之後,order by之前 #select num,nid from 表 where nid > 10 group by num,nid order nid desc #group 多列, 用兩列做分組, #select num,nid from 表 where nid > 10 group by num,nid order nid desc #選出nid大於10的,num,nid兩列分組後的 num,nid。並用nid排序 #比如:姓名和部門,用姓名和部門進行分組,選出年齡大於30的,同姓名同部門的所有使用者 #總結: #group by 是用來分組的,把某一列都聚合到同一組,所以select出的欄位要不就是這一列,要不要使用函式,要不和分組欄位是唯一對應關係的 #聚合函式有:(不能用where) #count(列名) max(列名) min(列名) sum(列名) avg(列名) #可以用as改名哦,select count(id) as count_id,part_id from user group by part_id having count(*)>1; #對於聚合函式的條件篩選不能用where,要用 having #group by可以多列進行聯合分組 #group by要寫在where 後面,order by 前面 # -- 7、查詢學過“1”課程並且也學過編號“2”課程的同學的學號、姓名; # -- score和student連表,找出所有選過1,2課程的學號,並且按學號分組 # select student.sid,student.sname from score left join student on score.student_id = student.sid where course_id in (1,2) group by student_id; #注意在這個例子中 學號和姓名是唯一對應的,所以可以直接選姓名,而不用聚合函式分組—group by
連表操作
''' 連表最好是外來鍵中的子表父表連 連表是支援 不同資料型別之間連線的,但是這樣子操作沒意義 ''' #連表: #兩張表沒關係,則不顯示: # select A.num, A.name, B.name from A,B Where A.nid = B.nid #建議不要用這種,不直觀 # select A.num, A.name, B.name from A inner join B on A.nid = B.nid #其實只要記一個left join就好,把表換位置就好啦 # left join(左聯接) A表所有顯示,如果B中無對應關係,則值為null #語法:select * from A left join B on A.aID = B.bID #展示左邊表所有的值,依據條件連線右邊表, 右邊表有,左邊表沒有的值,將在結果中右邊置為空 # right join(右聯接) B表所有顯示,如果B中無對應關係,則值為null #語法:select * from A right join B on A.aID = B.bID #展示右邊表所有的,依據條件連線左邊表, 左邊表有,右邊表沒有的值,將在結果中左邊置為空 # inner join(等值連線) 只返回兩個表中聯結欄位相等的行 #語法:select * from A inner join B on A.aID = B.bID #只展示兩邊表有的值,沒有的值不設定null,直接不顯示 #···無對應關係則不顯示!!!! #三者區別 : https://www.cnblogs.com/pcjim/articles/799302.html #連多張表: 圖在:20181007 mysql連表 #select * from 表A left join 表B on A.ID = B.ID # left join 表C on A.ID = C.ID # left join 表D on A.ID = D.ID # select 的時候,欄位可以 表示為 表名.欄位名 # 當表連線後,接下倆的join 就可以隨意使用 #舉例: # -- 20、課程平均分從高到低顯示(顯示任課老師); # select course_id,cname,tname,avg(num) from score # left join course on score.course_id = course.cid # left join teacher on course.teacher_id = teacher.tid # group by course_id order by avg(num) desc;連表操作
#組合 # 組合,自動處理重合 # select nickname from A union select name from B # # 組合,不處理重合 # select nickname from A union all select name from B組合
臨時表,distinct去重以及和group by的區別
#臨時表 # (select * from t1 where id > 2) as 臨時表名 #用法: # select sid from (select * from score where num>60) as b;臨時表
# https://blog.csdn.net/ljl890705/article/details/70602442 #distinct簡單來說就是用來去重的,而group by的設計目的則是用來聚合統計的,兩者在能夠實現的功能上有些相同之處,但應該仔細區分,因為用錯場景的話,效率相差可以倍計。 # ·····單純的去重操作使用distinct,速度是快於group by的。 # # distinct (說是效率不高) # distinct支援單列、多列的去重方式。 # 單列去重的方式簡明易懂,即相同值只保留1個。 # 多列的去重則是根據指定的去重的列資訊來進行,即只有所有指定的列資訊都相同,才會被認為是重複的資訊。 #單列去重: #select distinct(mobile) from talk_test; # 多列去重: # mysql> select distinct name,mobile from talk_test; #結合count使用: # select count(distinct col) from A; # select count(1) from (select 1 from A group by col) alias; # 兩個極端: # 1.資料列的所有資料都一樣,即去重計數的結果為1時,用distinct最佳 # 2.如果資料列唯一,沒有相同數值,用group 最好distinct去重