1. 程式人生 > >MySQL—增刪改查,分組,連表,limit,union,alter,排序,去重

MySQL—增刪改查,分組,連表,limit,union,alter,排序,去重

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='啥啥啥'
#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從小到大排列
增刪改查,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` )

#修改欄位型別,並設定主鍵
    # 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去重