鄭州門(mén)戶(hù)網(wǎng)站建設(shè)手機(jī)系統(tǒng)流暢神器
目錄
一、Create創(chuàng)建
1、單行數(shù)據(jù)+全列插入
2、多行數(shù)據(jù)+指定列插入
3、插入更新
4、替換
二、Retrieve查詢(xún)
1、SELECT 列
1.1、?全列查詢(xún)
1.2、指定列查詢(xún)
1.3、查詢(xún)字段為表達(dá)式?
1.4、結(jié)果去重
2、where條件
2.1、英語(yǔ)不及格的同學(xué)及英語(yǔ)成績(jī) ( < 60 )
2.2、語(yǔ)文成績(jī)?cè)?[80, 90] 分的同學(xué)及語(yǔ)文成績(jī)
2.2.1、使用 AND 進(jìn)行條件連接
2.2.1、使用 BETWEEN ... AND ... 條件
2.3、數(shù)學(xué)成績(jī)是 58 或者 59 或者 98 或者 99 分的同學(xué)及數(shù)學(xué)成績(jī)
2.3.1、使用 OR 進(jìn)行條件連接
2.3.2、?使用 IN 條件
2.4、姓孫的同學(xué) 及 孫某同學(xué)
2.4.1、% 匹配任意多個(gè)(包括 0 個(gè))任意字符
2.4.2、_ 匹配嚴(yán)格的一個(gè)任意字符
2.5、語(yǔ)文成績(jī)好于英語(yǔ)成績(jī)的同學(xué)
2.6、總分在 200 分以下的同學(xué)
2.7、語(yǔ)文成績(jī) > 80 并且不姓孫的同學(xué)
2.8、孫某同學(xué),否則要求總成績(jī) > 200 并且 語(yǔ)文成績(jī) < 數(shù)學(xué)成績(jī) 并且 英語(yǔ)成績(jī) > 80
2.9、NULL 的查詢(xún)
3、結(jié)果排序
3.1、同學(xué)及數(shù)學(xué)成績(jī),按數(shù)學(xué)成績(jī)升序顯示
3.2、同學(xué)及 qq 號(hào),按 qq 號(hào)排序顯示
3.3、查詢(xún)同學(xué)各門(mén)成績(jī),依次按 數(shù)學(xué)降序,英語(yǔ)升序,語(yǔ)文升序的方式顯示
3.4、查詢(xún)同學(xué)及總分,由高到低
3.5、查詢(xún)姓孫的同學(xué)或者姓王的同學(xué)數(shù)學(xué)成績(jī),結(jié)果按數(shù)學(xué)成績(jī)由高到低顯示
4、?篩選分頁(yè)結(jié)果?
三、Update
1、將李四同學(xué)的數(shù)學(xué)成績(jī)變更為 80 分
2、將趙六同學(xué)的數(shù)學(xué)成績(jī)變更為 60 分,語(yǔ)文成績(jī)變更為 70 分
3、將總成績(jī)倒數(shù)前三的 3 位同學(xué)的數(shù)學(xué)成績(jī)加上 30 分
4、將所有同學(xué)的語(yǔ)文成績(jī)更新為原來(lái)的 2 倍
四、Delete
1、刪除數(shù)據(jù)
1.1、刪除李四同學(xué)的考試成績(jī)
1.2、刪除整張表數(shù)據(jù)
2、截?cái)啾?
五、插入查詢(xún)結(jié)果?
六、聚合函數(shù)
1、統(tǒng)計(jì)班級(jí)共有多少同學(xué)
2、統(tǒng)計(jì)班級(jí)收集的 qq 號(hào)有多少
3、統(tǒng)計(jì)本次考試的數(shù)學(xué)成績(jī)分?jǐn)?shù)個(gè)數(shù)
4、統(tǒng)計(jì)數(shù)學(xué)成績(jī)總分
5、?統(tǒng)計(jì)平均分?
6、返回英語(yǔ)最高分
7、返回 > 70 分以上的數(shù)學(xué)最低分
七、group by子句的使用
1、顯示每個(gè)部門(mén)的平均工資和最高工資
2、顯示每個(gè)部門(mén)的每種崗位的平均工資和最低工資
3、顯示平均工資低于2000的部門(mén)和它的平均工資
3.1、統(tǒng)計(jì)各個(gè)部門(mén)的平均工資
3.2、having和group by配合使用,對(duì)group by結(jié)果進(jìn)行過(guò)濾
CRUD : Create(創(chuàng)建), Retrieve(讀取),Update(更新),Delete(刪除)
一、Create創(chuàng)建
語(yǔ)法:
INSERT [INTO] table_name[(column [, column] ...)]VALUES (value_list) [, (value_list)] ...value_list: value, [, value] ...
?案例:
創(chuàng)建一張學(xué)生表:
1、單行數(shù)據(jù)+全列插入
insert into 表名 values (數(shù)據(jù)1,數(shù)據(jù)2,...);
?查看插入結(jié)果:
select * from 表名
2、多行數(shù)據(jù)+指定列插入
insert into 表名 (字段1, 字段2, ...) values (數(shù)據(jù)1, 數(shù)據(jù)2, ...);
3、插入更新
?之前由于 主鍵 或者 唯一鍵 對(duì)應(yīng)的值已經(jīng)存在而導(dǎo)致插入失敗,現(xiàn)在可以把對(duì)應(yīng)的插入操作更改成更新操作。
語(yǔ)法:
INSERT ... ON DUPLICATE KEY UPDATEcolumn = value [, column = value] ...
-- 0 row affected: 表中有沖突數(shù)據(jù),但沖突數(shù)據(jù)的值和 update 的值相等
-- 1 row affected: 表中沒(méi)有沖突數(shù)據(jù),數(shù)據(jù)被插入
-- 2 row affected: 表中有沖突數(shù)據(jù),并且數(shù)據(jù)已經(jīng)被更新
通過(guò) MySQL 函數(shù)獲取受到影響的數(shù)據(jù)行數(shù):
select row_count();
4、替換
?主鍵 或者 唯一鍵 沒(méi)有沖突,則直接插入。?主鍵 或者 唯一鍵 如果沖突,則刪除后再插入。
二、Retrieve查詢(xún)
?語(yǔ)法:
SELECT[DISTINCT] {* | {column [, column] ...}[FROM table_name][WHERE ...][ORDER BY column [ASC | DESC], ...]LIMIT ...
案例:
創(chuàng)建一個(gè)學(xué)生成績(jī)的表結(jié)構(gòu):
?插入數(shù)據(jù):
1、SELECT 列
1.1、?全列查詢(xún)
通常情況下不建議使用 * 進(jìn)行全列查詢(xún)
- 查詢(xún)的列越多,意味著需要傳輸?shù)臄?shù)據(jù)量越大。
- 可能會(huì)影響到索引的使用。
1.2、指定列查詢(xún)
指定列的順序不需要按定義表的順序來(lái):
1.3、查詢(xún)字段為表達(dá)式?
表達(dá)式包含多個(gè)字段:
為查詢(xún)結(jié)果指定別名:
語(yǔ)法:
SELECT column [AS] alias_name [...] FROM table_name;
其中 as 可以省略。
1.4、結(jié)果去重
2、where條件
比較運(yùn)算符:
運(yùn)算符 | 說(shuō)明 |
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的結(jié)果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的結(jié)果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0 AND a1 | 范圍匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, ...) | 如果是 option 中的任意一個(gè),返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多個(gè)(包括 0 個(gè))任意字符;_ 表示任意一個(gè)字符 |
邏輯運(yùn)算符:
運(yùn)算符 | 說(shuō)明 |
AND | 多個(gè)條件必須都為 TRUE(1),結(jié)果才是 TRUE(1) |
OR | 任意一個(gè)條件為 TRUE(1), 結(jié)果為 TRUE(1) |
NOT | 條件為 TRUE(1),結(jié)果為 FALSE(0) |
2.1、英語(yǔ)不及格的同學(xué)及英語(yǔ)成績(jī) ( < 60 )
2.2、語(yǔ)文成績(jī)?cè)?[80, 90] 分的同學(xué)及語(yǔ)文成績(jī)
2.2.1、使用 AND 進(jìn)行條件連接
2.2.1、使用 BETWEEN ... AND ... 條件
2.3、數(shù)學(xué)成績(jī)是 58 或者 59 或者 98 或者 99 分的同學(xué)及數(shù)學(xué)成績(jī)
2.3.1、使用 OR 進(jìn)行條件連接
2.3.2、?使用 IN 條件
2.4、姓孫的同學(xué) 及 孫某同學(xué)
2.4.1、% 匹配任意多個(gè)(包括 0 個(gè))任意字符
2.4.2、_ 匹配嚴(yán)格的一個(gè)任意字符
2.5、語(yǔ)文成績(jī)好于英語(yǔ)成績(jī)的同學(xué)
WHERE 條件中比較運(yùn)算符兩側(cè)都是字段:
2.6、總分在 200 分以下的同學(xué)
WHERE 條件中使用表達(dá)式。
?別名不能用在 WHERE 條件中,這是因?yàn)?mysql 的執(zhí)行順序是先進(jìn)行判斷篩選條件,再提取結(jié)果。因此是先執(zhí)行的 where 條件,此時(shí)還不認(rèn)識(shí)別名。
2.7、語(yǔ)文成績(jī) > 80 并且不姓孫的同學(xué)
AND 與 NOT 的使用:
2.8、孫某同學(xué),否則要求總成績(jī) > 200 并且 語(yǔ)文成績(jī) < 數(shù)學(xué)成績(jī) 并且 英語(yǔ)成績(jī) > 80
綜合性查詢(xún)
2.9、NULL 的查詢(xún)
查詢(xún) students 表:
3、結(jié)果排序
語(yǔ)法:
-- ASC 為升序(從小到大)
-- DESC 為降序(從大到小)
-- 默認(rèn)為 ASC
SELECT ... FROM table_name [WHERE ...]ORDER BY column [ASC|DESC], [...];
注意:沒(méi)有 order by?子句的查詢(xún),返回的順序是未定義的,永遠(yuǎn)不要依賴(lài)這個(gè)順序。
3.1、同學(xué)及數(shù)學(xué)成績(jī),按數(shù)學(xué)成績(jī)升序顯示
3.2、同學(xué)及 qq 號(hào),按 qq 號(hào)排序顯示
?NULL 視為比任何值都小,升序出現(xiàn)在最上面,降序出現(xiàn)在最下面:
3.3、查詢(xún)同學(xué)各門(mén)成績(jī),依次按 數(shù)學(xué)降序,英語(yǔ)升序,語(yǔ)文升序的方式顯示
多字段排序,排序優(yōu)先級(jí)隨書(shū)寫(xiě)順序:
3.4、查詢(xún)同學(xué)及總分,由高到低
ORDER BY 中可以使用表達(dá)式:
?ORDER BY 子句中可以使用列別名:
3.5、查詢(xún)姓孫的同學(xué)或者姓王的同學(xué)數(shù)學(xué)成績(jī),結(jié)果按數(shù)學(xué)成績(jī)由高到低顯示
結(jié)合 WHERE 子句 和 ORDER BY 子句:
4、?篩選分頁(yè)結(jié)果?
語(yǔ)法:
-- 起始下標(biāo)為 0-- 從 0 開(kāi)始,篩選 n 條結(jié)果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;-- 從 s 開(kāi)始,篩選 n 條結(jié)果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;-- 從 s 開(kāi)始,篩選 n 條結(jié)果,比第二種用法更明確,建議使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
建議:對(duì)未知表進(jìn)行查詢(xún)時(shí),最好加一條 LIMIT 1?,避免因?yàn)楸碇袛?shù)據(jù)過(guò)大,查詢(xún)?nèi)頂?shù)據(jù)導(dǎo)致數(shù)據(jù)庫(kù)卡死。
按 id 進(jìn)行分頁(yè),每頁(yè) 3 條記錄,分別顯示 第 1、2、3 頁(yè)。
三、Update
對(duì)查詢(xún)到的結(jié)果進(jìn)行列值更新。
語(yǔ)法:
UPDATE table_name SET column = expr [, column = expr ...][WHERE ...] [ORDER BY ...] [LIMIT ...]
1、將李四同學(xué)的數(shù)學(xué)成績(jī)變更為 80 分
更新值為具體值。
查看原數(shù)據(jù):
?數(shù)據(jù)更新:
2、將趙六同學(xué)的數(shù)學(xué)成績(jī)變更為 60 分,語(yǔ)文成績(jī)變更為 70 分
一次更新多個(gè)列。
3、將總成績(jī)倒數(shù)前三的 3 位同學(xué)的數(shù)學(xué)成績(jī)加上 30 分
更新值為原值基礎(chǔ)上變更。
查看原數(shù)據(jù),別名可以在ORDER BY中使用:
?數(shù)據(jù)更新,不支持 math += 30 這種語(yǔ)法:
?查看更新后數(shù)據(jù):
4、將所有同學(xué)的語(yǔ)文成績(jī)更新為原來(lái)的 2 倍
沒(méi)有 WHERE 子句,則更新全表。
查看原數(shù)據(jù):
?
?數(shù)據(jù)更新:
?查看更新后數(shù)據(jù):
四、Delete
1、刪除數(shù)據(jù)
語(yǔ)法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
1.1、刪除李四同學(xué)的考試成績(jī)
1.2、刪除整張表數(shù)據(jù)
注意:刪除整表操作要慎用!
建立測(cè)試用表,并且插入數(shù)據(jù):
刪除整表數(shù)據(jù):
查看刪除結(jié)果:
再插入一條數(shù)據(jù),自增 id 在原值上增長(zhǎng):
查看數(shù)據(jù):
?查看表結(jié)構(gòu),會(huì)有 AUTO_INCREMENT=5?項(xiàng),表示下一個(gè)自增 id 是 5:
2、截?cái)啾?
語(yǔ)法:
TRUNCATE [TABLE] table_name
注意:這個(gè)操作慎用。
- 只能對(duì)整表操作,不能像 DELETE 一樣針對(duì)部分?jǐn)?shù)據(jù)操作;
- 實(shí)際上 MySQL 不對(duì)數(shù)據(jù)操作,所以比 DELETE 更快,但是TRUNCATE在刪除數(shù)據(jù)的時(shí)候,并不經(jīng)過(guò)真正的事物,所以無(wú)法回滾。
- 會(huì)重置 AUTO_INCREMENT 項(xiàng)
建立測(cè)試用表,并且插入數(shù)據(jù):
?截?cái)嗾頂?shù)據(jù),注意影響行數(shù)是 0,所以實(shí)際上沒(méi)有對(duì)數(shù)據(jù)真正操作:
查看刪除結(jié)果:
再插入一條數(shù)據(jù),自增 id 在重新增長(zhǎng):
?查看數(shù)據(jù):
?查看表結(jié)構(gòu),會(huì)有 AUTO_INCREMENT=2 ,表示下一個(gè)自增 id 是 2:
五、插入查詢(xún)結(jié)果?
語(yǔ)法:
INSERT INTO table_name [(column [, column ...])] SELECT ...
案例:刪除表中的的重復(fù)記錄,重復(fù)的數(shù)據(jù)只能有一份:
創(chuàng)建原數(shù)據(jù)表,并插入數(shù)據(jù):
?思路:
創(chuàng)建一張空表 no_duplicate_table,結(jié)構(gòu)和 duplicate_table 一樣:
?將 duplicate_table 的去重?cái)?shù)據(jù)插入到 no_duplicate_table:
?通過(guò)重命名表,實(shí)現(xiàn)原子的去重操作:
?通過(guò) rename 方式進(jìn)行重命名,是想等一切都就緒了,然后統(tǒng)一進(jìn)行放入、更新、生效等操作。
?查看最終結(jié)果:
六、聚合函數(shù)
函數(shù) | 說(shuō)明 |
COUNT([DISTINCT] expr) | 返回查詢(xún)到的數(shù)據(jù)的 數(shù)量 |
SUM([DISTINCT] expr) | 返回查詢(xún)到的數(shù)據(jù)的 總和,不是數(shù)字沒(méi)有意義 |
AVG([DISTINCT] expr) | 返回查詢(xún)到的數(shù)據(jù)的 平均值,不是數(shù)字沒(méi)有意義 |
MAX([DISTINCT] expr) | 返回查詢(xún)到的數(shù)據(jù)的 最大值,不是數(shù)字沒(méi)有意義 |
MIN([DISTINCT] expr) | 返回查詢(xún)到的數(shù)據(jù)的 最小值,不是數(shù)字沒(méi)有意義 |
1、統(tǒng)計(jì)班級(jí)共有多少同學(xué)
使用 * 做統(tǒng)計(jì),不受 NULL 影響:
2、統(tǒng)計(jì)班級(jí)收集的 qq 號(hào)有多少
NULL 不會(huì)計(jì)入結(jié)果:
3、統(tǒng)計(jì)本次考試的數(shù)學(xué)成績(jī)分?jǐn)?shù)個(gè)數(shù)
COUNT(math) 統(tǒng)計(jì)的是全部成績(jī):
COUNT(DISTINCT math) 統(tǒng)計(jì)的是去重成績(jī)數(shù)量:
4、統(tǒng)計(jì)數(shù)學(xué)成績(jī)總分
?不及格 < 60 的總分,沒(méi)有結(jié)果,返回 NULL:
5、?統(tǒng)計(jì)平均分?
統(tǒng)計(jì)英語(yǔ)成績(jī)平均分:
?
統(tǒng)計(jì)平均總分:
6、返回英語(yǔ)最高分
?
7、返回 > 70 分以上的數(shù)學(xué)最低分
七、group by子句的使用
分組的目的是為了分組之后,方便進(jìn)行聚合統(tǒng)計(jì)的。
在select中使用group by 子句可以對(duì)指定列進(jìn)行分組查詢(xún):
select column1, column2, .. from table group by column;
?分組統(tǒng)計(jì),需要指定列名,實(shí)際分組是用該列的不同行數(shù)據(jù)進(jìn)行分組的。分完組之后,同一組內(nèi)的該列條件是相同的,因此可以被聚合壓縮。
?分組,就是把一組按照條件拆成了多個(gè)組,進(jìn)行各自組內(nèi)的統(tǒng)計(jì)。
案例:
準(zhǔn)備工作,創(chuàng)建一個(gè)雇員信息表(來(lái)自oracle 9i的經(jīng)典測(cè)試表)
- EMP員工表
- DEPT部門(mén)表
- SALGRADE工資等級(jí)表
1、顯示每個(gè)部門(mén)的平均工資和最高工資
select deptno,avg(sal),max(sal) from EMP group by deptno;
2、顯示每個(gè)部門(mén)的每種崗位的平均工資和最低工資
select avg(sal),min(sal),job, deptno from EMP group by deptno, job;
?注意:當(dāng)我們?cè)趕elect后增加了一個(gè) ename 列時(shí),mysql發(fā)生了報(bào)錯(cuò)。
?這是因?yàn)?ename 不屬于分組條件,因此無(wú)法壓縮聚合。
?在原則上,只有在 group by 中出現(xiàn)的具體的列名稱(chēng),才可以在 select 中具體出現(xiàn)。另一類(lèi)可以直接在select中出現(xiàn)的是聚合函數(shù)。
3、顯示平均工資低于2000的部門(mén)和它的平均工資
3.1、統(tǒng)計(jì)各個(gè)部門(mén)的平均工資
select avg(sal) from EMP group by deptno
3.2、having和group by配合使用,對(duì)group by結(jié)果進(jìn)行過(guò)濾
select deptno, avg(sal) as myavg from EMP group by deptno having myavg<2000;
having是對(duì)聚合后的統(tǒng)計(jì)數(shù)據(jù),進(jìn)行條件篩選。?
?having經(jīng)常和group by搭配使用,作用是對(duì)分組進(jìn)行篩選,作用有些像where。
having與where的區(qū)別:
- where是對(duì)具體的任意列進(jìn)行條件篩選。
- having是對(duì)分組聚合之后的結(jié)果進(jìn)行條件篩選。
?