1、主鍵沖突。
定義:當主鍵存在沖突(Duplicate key)時候,可以選擇性的進行處理:更新和替換。
先查詢一下student表。由表可以得知,id為主鍵,自增長。
可以看出 student 表中,已經有1個id為1的記錄了,接下來我再插入一次id為1的編號的數據,就會顯示主鍵沖突,插入數據失敗。
這個時候,主鍵沖突就出現了。
a)、更新。
語法:insert into 表名字[字段列表(一定要包含主鍵)] values (字段值列表) on duplicate key update 字段 = 新值;
例子:將【student】表中的編號為1的姓名修改成李四。
insert into student(id,name,age) values(1,'李四',22) on duplicate key update name = '李四'; -- 這個地方值更改了name,沒有更改age。
insert into student values(1,'李四',15) on duplicate key update name = '李四'; -- 這個地方值更改了name,沒有更改age。
insert into student(id,name,age) values(1,'李四',22) on duplicate key update name = '李四',age = 22; -- name 與 age 都跟着改變了。
b)、替換。
語法:replace into 表明字[字段列表(一定要包含表名字)] values(字段列表值);
例子:將【userinfo】表中的id為1的name改寫成王五,age改成30。
replace into student(id,name,age) values(1,'王五',30);
2、蠕蟲復制。
從已有的數據中獲取數據,然后將數據又進行新增操作,設局成倍成倍的增加。
表創建高級操作:從已有表創建新表(只復制表機構,不復制表內容)。
語法:create table [if not exists] 新表名 like 數據庫.表名字(如果是同一個數據庫,數據庫.可以省略);
意義:
a、從已有表拷貝數據到新表中。
b、可以迅速讓表中的數據膨脹到一定的數量,測試數據表的壓力及效率。
例子:使用表創建高級操作創建一個名叫【student2】的新表。
create table if not exists student2 like student;
蠕蟲復制數據語法:insert into 表名字[字段列表] select 字段列表/* from 數據表名;
例子:將【student】表中的數據通過蠕蟲復制的方式復制到student2表中。student表中有5條數據
insert into student2(name,age) select name,age from student;
在執行一下sql語句就又復制5條數據到student2表中了。
還可以蠕蟲復制自己表中的數據:insert into student2(name,age) select name,age from student2;
3、更新數據。
基本語法:update 表名 set 字段名 = 值 [where條件];
高級語法:update 表名 set 字段名 = 值 [where條件] [limit 更新數量];
例子:將【student2】表中的前5條age字段值更改為100。
4、刪除數據。
基本語法:delete 表名 set 字段名 = 值 [where條件];
高級語法:delete 表名 set 字段名 = 值 [where條件] [limit 刪除數量];
例子:刪除【student2】表中的前5條數據。
delete from student2 limit 5;
5、Truncate。
如上面的設置,如果表中的主鍵是自增長,那么刪除之后,自增長不會還原。
如果想要重置自增長,只能清空表(不會改變表結構)。
語法:truncate 表名字;
再次插入數據的時候,主鍵從1開始。
6、查詢語句。
基本語法:select 字段列表/* from 表名 [where條件];
完整語法:select [select選項] 字段列表 [字段別名] /* from 數據源 [where條件子句] [group by子句] [haviing子句] [order by子句] [limit子句];
6.1、select 選項。
對查出來的結果的處理方式,有兩種:
a)、all:默認的,保留所有的結果。
例子:查詢【查詢stuent】表中的所有數據。
select all * from student;
b)、distinct:去重,查出來后的結果,將重復的給去除掉(所有字段都相同)。
例子:查詢【my_product】表中的重復值去重。
如果主鍵自增長,就不能使用所有列去重了,要使用部分列的形式去去重。
select distinct age from student;
6.2、字段別名。
當數據進行查詢出來的時候,有時候名字並不一定滿足需求(奪標會有同名字段),這個時候就需要為字段進行重命名了。
語法:字段名 as 別名 / 字段名 別名
例子:為【student】表中的字段添加別名。
select id as 編號,name 姓名,age 年齡 from student;
6.3、數據源。
數據源:數據的來源,MySql是關系型數據庫,關系型的數據庫的來源都是數據表,本質上只要保證數據類似二維表,最終都可以作為數據源。
數據源又分為多種:單表數據源、多表數據源和查詢語句。
a)、單表數據源。
select * from 表名字;
b)、多表數據源。
select * from student,student2;
select * from student,student2;
多表數據源會形成“笛卡兒積”,從一張表中取出一條記錄以后,再去另外一張表中匹配所有記錄,而且全部保留(記錄數和字段),笛卡兒積其實沒什么用,應該盡量避免使用。
c)、子查詢。
數據的來源是一種查詢語句(查詢的結果是二維表)。
語法: select * from (select * from 表名字) as 別名(別名不能省);
select * from (select * from student) as stu;
6.4、where 子句。
where 子句用來判斷和篩選數據。where 子句的返回結果是 0 或者 1 ,0 代表false,1 代表true。
Where原理:where 是唯一 一個直接從磁盤獲取數據的時候就開始判斷的條件,從磁盤取出一條記錄,開始進行where判斷,如果判斷的結果成立,則保存到內存中,如果判斷失敗,則直接放棄。
一般情況下,where 都會結合着以下判斷條件使用。
比較運算符:>(大於)、<(小於)、>=(大於等於)、<=(小於等於)、<>(不等於)、!=(不等於)、like、between and(區間)、in(包含)、not in(不包含);
邏輯運算符:&&(and)、||(or)和!(not)。
7、Group by子句。
group by 是分組的意思,根據某個字段進行分組,相同的放一組,不同的放一組。
基本語法:group by 字段名 [asc|desc];
a)、單字段分組。
例子:根據【student2 】表的sex字段進行分組。
先查一下student2表中的數據。
select * from student2 group by sex;
分組后,得到的數據是2條,其實一般情況下只單純地分組是沒什么意義的。一般都會配合着一系列統計函數配合着使用。
Count():統計分組后的記錄數,每一組有多少條記錄。count里面可以有兩種參數:*代表統計,字段名代表統計對應的字段(Null不統計,切記)。
Max():統計每組中的最大數。
Min():統計最小記錄。
avg():統計平均值。
Sum():統計和。
例子:求分組后的總記錄數,age字段的最大值,age字段的最小值,age字段的平均值,age字段的總和。
從上圖可以看出,分組后的女生總數有3個,年齡最大的是28,最小的是20。分組后的男生總數有6人,年齡最大的是25,年齡最小的是18。
b)、多字段分組。
先根據一個字段進行分組,然后對分組后的結果再次按照其他字段進行分組。
c)、group_concat()。
可以對分組的結果中的某個字段進行字符串連接。
語法:group_concat(字段名);
例子:根據【student2】表中的sex字段進行分組,並得到分組后的name字段的值。
select sex, count(*), group_concat(name) from student2 group by sex;
8、Having子句。
與where子句一樣,是進行條件判斷用的。
where是針對磁盤數據進行判斷,進入到內存之后,會進行分組操作,分組結果就要使用having子句進行處理,having能做where能做的幾乎所有事情,但是where卻不能做having能做的事情。
a)、分組統計結果或者統計函數都只有having能夠使用。
例子:所有班級大於2的人數。
select c_id,count(*) from student2 group by c_id having count(*) > 2;
如果使用where,就會報錯。
b)、having能夠識別字段別名,where 不能(where是從磁盤中取數據,而磁盤中的數據沒有別名,只可能是字段名,別名是字段進入到內存以后才會產生的)。
例子:select c_id,count(*) as tt from student2 group by c_id having tt > 2;
用where就會報錯。select c_id,count(*) as tt from student2 group by c_id where tt >2;
9、Limit子句。
Limit子句是一種限制結果的語句,限制數量。
有兩種使用方式:
a)、只用來限制長度。
語法:limit 長度;
例子:查詢【studnet2】表中的前3條數據。
select * from student2 limit 3;
b)、主要用來實現分頁的。
語法:limit 起始位置, 長度;(起始位置從0開始)。
例子:查詢【student2】表中的第3條和第4條的數據。
select * from student2 limit 2,2;
10、Order by子句。
升序降序。
語法:order by 字段名 [asc|desc]; 默認是升序。
例子:根據【student2】表中的age字段,進行升序和降序操作。
End。