在表格的增刪改查中,查的內容是最多的,包括group by ,join,limit,union,alter,排序都是服務於查的html
#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='啥啥啥' #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 ; 豎着看,查看錶的建立代碼
分組的實現,注意事項,總結mysql
#分組 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 前面 # -- 七、查詢學過「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; #注意在這個例子中 學號和姓名是惟一對應的,因此能夠直接選姓名,而不用聚合函數
連表操做sql
''' 連表最好是外鍵中的子表父表連 連表是支持 不一樣數據類型之間鏈接的,可是這樣子操做沒意義 ''' #連表: #兩張表不要緊,則不顯示: # 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的區別ide
#臨時表 # (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 最好