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

MySQL增刪改查

 

在表格的增刪改查中,查的內容是最多的,包括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從小到大排列
增刪改查,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命令

 

分組的實現,注意事項,總結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;
    #注意在這個例子中 學號和姓名是惟一對應的,因此能夠直接選姓名,而不用聚合函數
分組—group by

 

連表操做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 最好
distinct去重
相關文章
相關標籤/搜索