日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL—增删改查,分组,连表,limit,union,alter,排序,去重

發(fā)布時間:2025/3/14 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL—增删改查,分组,连表,limit,union,alter,排序,去重 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MySQL增刪改查

?

在表格的增刪改查中,查的內(nèi)容是最多的,包括group by ,join,limit,union,alter,排序都是服務(wù)于查的

#sql語句數(shù)據(jù)行操作補(bǔ)充#增加:#insert into table_name(字段1,字段2) values('屬性1','屬性2'),('屬性1','屬性2') 插入多行數(shù)據(jù)#insert into t1(字段1,字段2) select 字段1,字段2 from t2; (某張表的某幾列數(shù)據(jù)選擇出來,插入)#刪除:delete from table_name [where id =/!=/>/< /<> 2] and/or name='啥啥啥'#truncate table t1;#改: update t1 set name='gkx' ,age=19 where id>12 and name='x' #可以同時改多個字段 ''' #查:內(nèi)容較多:# 查所有,查部分字段,后面跟 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) ;# 根據(jù)選擇來選擇#select * from t1 where id between 5 and 12;#閉區(qū)間 5和12也能取到#select * from dmsxb where b_dm in (select b_dm from dmsxb group by b_dm having count(*)>1)##還可以選擇查詢語句,不過這個語句結(jié)果需要為一個常量 select age,name,(select count(1) from tb) from tb1;#習(xí)題17和21#條件 ## case when 條件 then 【字段或者默認(rèn)值】 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 三元運(yùn)算# 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; #顯示前十條 相當(dāng)于select *from t1 limit 0,10;#select * from t1 limit 4,5; #從第4行開始的5行 (不包含第4行)#select * from t1 limit 5 offset 4 #從第4行開始的五行#實(shí)現(xiàn)分頁:#page = int(input('page')) select * from limit (page-1)*10 , 10; 前者為起始位置#select * from t1 order by id desc limit 10; (后10行:先降序排列,再選前十行) '''limit 數(shù)值越大越慢,比如 limit 300000,10 它會先掃描30萬行,然后再取下10行 '''#排序:#select * from t1; #默認(rèn)是從小到大排 即 asc ----> ascending#select * from t1 order by 列名 desc; 即 desc ----> descending#select * from t1 order by 列1 desc,列2 asc ; #根據(jù)列1從大到小排列,如果相同按列2從小到大排列 增刪改查,limit,order by # 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` )#修改字段類型,并設(shè)置主鍵# ALTER TABLE `category ` MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`id`);#建表后創(chuàng)建唯一索引: # 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(); 打印當(dāng)前時間#2. desc table_name; 查看字段的屬性 #3. show create table table_name ; 查看表的創(chuàng)建代碼 #3. show create table table_name \G ; 豎著看,查看表的創(chuàng)建代碼 ALTER命令

?

分組的實(shí)現(xiàn),注意事項(xiàng),總結(jié)

#分組 group by:#通過group by 按照所選列分組顯示,按所選列分組,所選列如果 不重復(fù) 的項(xiàng)有4個,就分成4組# select part_id from t1 group by part_id;#錯誤:select part_id,name from t1 group by part_id; #這是不行的,因?yàn)樗磒art_id分組,聚合在一起,此時不知道 相同part_id但是不同name的,該如何取舍哪個name所以會報錯#可以這么寫:# select part_id,max(id) from t1 group by part_id;#當(dāng)part_id 分組完后,留下id列中,相同part_id里,id最大的那行# select part_id,min(id) from t1 group by part_id;#結(jié)合count等聚合函數(shù)使用: 可以用as改名哦!!!#select count(id),part_id from t1 group by part_id; 用part_di分組,新增一列count(id),計算每組id數(shù)#類似還有 count,max,min,sum,avg(比如avg(分?jǐn)?shù)),取每個分組中,分?jǐn)?shù)這個列的平均值i)# select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid#如果對于聚合函數(shù)結(jié)果進(jìn)行二次篩選時,必須使用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排序#比如:姓名和部門,用姓名和部門進(jìn)行分組,選出年齡大于30的,同姓名同部門的所有用戶#總結(jié):#group by 是用來分組的,把某一列都聚合到同一組,所以select出的字段要不就是這一列,要不要使用函數(shù),要不和分組字段是唯一對應(yīng)關(guān)系的#聚合函數(shù)有:(不能用where)#count(列名) max(列名) min(列名) sum(列名) avg(列名)#可以用as改名哦,select count(id) as count_id,part_id from user group by part_id having count(*)>1;#對于聚合函數(shù)的條件篩選不能用where,要用 having#group by可以多列進(jìn)行聯(lián)合分組#group by要寫在where 后面,order by 前面# -- 7、查詢學(xué)過“1”課程并且也學(xué)過編號“2”課程的同學(xué)的學(xué)號、姓名; # -- score和student連表,找出所有選過1,2課程的學(xué)號,并且按學(xué)號分組 # 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;#注意在這個例子中 學(xué)號和姓名是唯一對應(yīng)的,所以可以直接選姓名,而不用聚合函數(shù) 分組—group by

?

連表操作

''' 連表最好是外鍵中的子表父表連 連表是支持 不同數(shù)據(jù)類型之間連接的,但是這樣子操作沒意義 ''' #連表:#兩張表沒關(guān)系,則不顯示:# 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#其實(shí)只要記一個left join就好,把表換位置就好啦 # left join(左聯(lián)接) A表所有顯示,如果B中無對應(yīng)關(guān)系,則值為null#語法:select * from A left join B on A.aID = B.bID#展示左邊表所有的值,依據(jù)條件連接右邊表, 右邊表有,左邊表沒有的值,將在結(jié)果中右邊置為空# right join(右聯(lián)接) B表所有顯示,如果B中無對應(yīng)關(guān)系,則值為null#語法:select * from A right join B on A.aID = B.bID#展示右邊表所有的,依據(jù)條件連接左邊表, 左邊表有,右邊表沒有的值,將在結(jié)果中左邊置為空# inner join(等值連接) 只返回兩個表中聯(lián)結(jié)字段相等的行#語法:select * from A inner join B on A.aID = B.bID#只展示兩邊表有的值,沒有的值不設(shè)置null,直接不顯示#···無對應(yīng)關(guān)系則不顯示!!!!#三者區(qū)別 : 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 的時候,字段可以 表示為 表名.字段名# 當(dāng)表連接后,接下倆的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的區(qū)別

#臨時表# (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的設(shè)計目的則是用來聚合統(tǒng)計的,兩者在能夠?qū)崿F(xiàn)的功能上有些相同之處,但應(yīng)該仔細(xì)區(qū)分,因?yàn)橛缅e場景的話,效率相差可以倍計。 # ·····單純的去重操作使用distinct,速度是快于group by的。 # # distinct (說是效率不高) # distinct支持單列、多列的去重方式。 # 單列去重的方式簡明易懂,即相同值只保留1個。 # 多列的去重則是根據(jù)指定的去重的列信息來進(jìn)行,即只有所有指定的列信息都相同,才會被認(rèn)為是重復(fù)的信息。#單列去重:#select distinct(mobile) from talk_test;# 多列去重:# mysql> select distinct name,mobile from talk_test;#結(jié)合count使用:# select count(distinct col) from A;# select count(1) from (select 1 from A group by col) alias;# 兩個極端: # 1.數(shù)據(jù)列的所有數(shù)據(jù)都一樣,即去重計數(shù)的結(jié)果為1時,用distinct最佳 # 2.如果數(shù)據(jù)列唯一,沒有相同數(shù)值,用group 最好 distinct去重

?

轉(zhuǎn)載于:https://www.cnblogs.com/gkx0731/p/9820468.html

總結(jié)

以上是生活随笔為你收集整理的MySQL—增删改查,分组,连表,limit,union,alter,排序,去重的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。