MySQL表的增刪查改操作實(shí)例代碼
CRUD : Create(創(chuàng)建), Retrieve(讀取),Update(更新),Delete(刪除)
一、Create(insert)
語法:
INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ... value_list: value, [, value] ...
[ ]內(nèi)的是可以省略的
案例:
創(chuàng)建一個(gè)學(xué)生表
1.1 單行數(shù)據(jù) + 指定列插入
value_list 數(shù)量必須和定義表的列的數(shù)量及順序一致
可以不用指定id,因?yàn)閙ysql會(huì)用默認(rèn)的值進(jìn)行自增
1.2 單行數(shù)據(jù) + 全列插入
全列插入可以省略values左側(cè)的列屬性
1.3 多行數(shù)據(jù) + 全列插入
多行數(shù)據(jù)用逗號(hào)隔開
1.4 多行數(shù)據(jù) + 指定列插入
1.5 插入是否更新
可能會(huì)出現(xiàn)由于主鍵或者唯一鍵對(duì)應(yīng)的值已經(jīng)存在而導(dǎo)致插入失敗的情況
這時(shí)候我們希望能夠進(jìn)行可以選擇性的進(jìn)行同步更新操作????而不是直接報(bào)錯(cuò)
語法:
INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...
第一個(gè)錯(cuò)誤是因?yàn)橹麈I沖突,第二個(gè)錯(cuò)誤是因?yàn)槲覀儑L試更新的數(shù)據(jù)和其他行數(shù)據(jù)也沖突了
相當(dāng)于是多做一次嘗試,如果語句沖突了,就把insert操作改成updata操作
需要注意的是你也要保證更新的數(shù)據(jù)不要和其他行數(shù)據(jù)的主鍵發(fā)生沖突!!
-- 0 row affected: 表中有沖突數(shù)據(jù),但沖突數(shù)據(jù)的值和 update 的值相等
-- 1 row affected: 表中沒有沖突數(shù)據(jù),數(shù)據(jù)被插入
-- 2 row affected: 表中有沖突數(shù)據(jù),并且數(shù)據(jù)已經(jīng)被更新
也可通過 MySQL row_count()函數(shù)獲取受到影響的數(shù)據(jù)行數(shù) (-1表示沒有)
1.6 插入是否替換(replace)
-- 主鍵 或者 唯一鍵 沒有沖突,則直接插入;
-- 主鍵 或者 唯一鍵 如果沖突,則刪除后再插入
-- 1 row affected: 表中沒有沖突數(shù)據(jù),數(shù)據(jù)被插入
-- 2 row affected: 表中有沖突數(shù)據(jù),刪除后重新插入
二、Retrieve(select)
語法:
SELECT [DISTINCT]//去重 {* | {column [, column] ...} [FROM table_name] //從某個(gè)表里去提取 [WHERE ...] //篩選條件 [ORDER BY column [ASC | DESC], ...] //排序 LIMIT ... //限定篩選出來的結(jié)果條數(shù)
-- 創(chuàng)建表結(jié)構(gòu)
CREATE TABLE exam_result ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL COMMENT '同學(xué)姓名', chinese float DEFAULT 0.0 COMMENT '語文成績', math float DEFAULT 0.0 COMMENT '數(shù)學(xué)成績', english float DEFAULT 0.0 COMMENT '英語成績' );
--插入測(cè)試數(shù)據(jù)
INSERT INTO exam_result (name, chinese, math, english) VALUES ('唐三藏', 67, 98, 56), ('孫悟空', 87, 78, 77), ('豬悟能', 88, 98, 90), ('曹孟德', 82, 84, 67), ('劉玄德', 55, 85, 45), ('孫權(quán)', 70, 73, 78), ('宋公明', 75, 65, 30); Query OK, 7 rows affected (0.00 sec) Records: 7 Duplicates: 0 Warnings: 0
2.1 select列
2.1.1 全列查詢(*)
--通常情況下不建議使用*進(jìn)行全列查詢
--1.查詢的列越多,意味著需要傳輸?shù)臄?shù)據(jù)量越大(線性遍歷);
--2 .可能會(huì)影響到索引的使用 。
2.1.2 指定列查詢
--指定列的順序不需要按定義表的順序來
2.1.3 查詢字段為表達(dá)式
--表達(dá)式不包含字段
-- 表達(dá)式包含一個(gè)字段
-- 表達(dá)式包含多個(gè)字段
2.1.4 為查詢結(jié)果指定別名(as)
語法:
SELECT column [AS] alias_name [...] FROM table_name;
多個(gè)別名:
2.1.5 結(jié)果去重(distinct)
- -98分重復(fù)了
--去重結(jié)果 +distinct
2.2 where條件
比較運(yùn)算符:
邏輯運(yùn)算符:
案例1:英語不及格的同學(xué)即英語成績 ( < 60 )
SELECT name, english FROM exam_result WHERE english < 60;
案例2:語文成績?cè)?[80, 90] 分的同學(xué)及語文成績
-- 使用 AND 進(jìn)行條件連接
SELECT name, chinese FROM exam_result WHERE chinese >= 80 AND chinese <= 90;
-- 使用 BETWEEN ... AND ... 條件
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
案例3:數(shù)學(xué)成績是 58 或者 59 或者 98 或者 99 分的同學(xué)及數(shù)學(xué)成績
-- 使用 OR 進(jìn)行條件連接
SELECT name, math FROM exam_result WHERE math = 58 OR math = 59 OR math = 98 OR math = 99;
-- 使用 IN 條件
SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);
案例4: 姓孫的同學(xué) 及 孫某同學(xué)
-- % 匹配任意多個(gè)(包括 0 個(gè))任意字符
SELECT name FROM exam_result WHERE name LIKE '孫%';
-- _ 匹配嚴(yán)格的一個(gè)任意字符
SELECT name FROM exam_result WHERE name LIKE '孫_';
案例5:語文成績好于英語成績的同學(xué)
-- WHERE 條件中比較運(yùn)算符兩側(cè)都是字段
SELECT name, chinese, english FROM exam_result WHERE chinese > english;
案例6:總分在 200 分以下的同學(xué)
-- WHERE 條件中使用表達(dá)式
sql的篩選順序并不代表執(zhí)行順序,首先我得知道from 哪張表找,然后要帶著where的篩選條件,接著才是進(jìn)行具體的篩選
根據(jù)上圖我們會(huì)發(fā)現(xiàn)如果直接在篩選條件那里重命名也是不可以的??!因?yàn)閷?duì)列做重命名已經(jīng)是屬于顯示范疇了,相當(dāng)于是已經(jīng)把數(shù)據(jù)拿完了然后在最后把列名字改一改,是最后一步了!所以語法上不允許的?。?/p>
了解mysql語句的執(zhí)行順序可以幫助我們更好地理解一些奇怪的現(xiàn)象
-- 別名不能用在 WHERE 條件中
SELECT name, chinese + math + english 總分 FROM exam_result WHERE chinese + math + english < 200;
案例7:語文成績 > 80 并且不姓孫的同學(xué)
-- AND 與 NOT 的使用
SELECT name, chinese FROM exam_result WHERE chinese > 80 AND name NOT LIKE '孫%';
案例8:孫某同學(xué),否則要求總成績 > 200 并且 語文成績 < 數(shù)學(xué)成績 并且 英語成績 > 80
-- 綜合性查詢
SELECT name, chinese, math, english, chinese + math + english 總分 FROM exam_result WHERE name LIKE '孫_' OR ( chinese + math + english > 200 AND chinese < math AND english > 80 );
2.3 NULL的查詢
‘ ’ 和NULL沒有關(guān)系!!
-- NULL 和 NULL 的比較,= 和 的區(qū)別
2.4 結(jié)果排序(order by)
語法:
SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...]; //依據(jù)哪一列做排序
-- ASC 為升序(從小到大) //ascending order
-- DESC 為降序(從大到?。?//descending order
-- 默認(rèn)為 ASC
注意:沒有 ORDER BY 子句的查詢,返回的順序是未定義的,永遠(yuǎn)不要依賴這個(gè)順序
案例1:同學(xué)及數(shù)學(xué)成績,按數(shù)學(xué)成績升序顯示
案例2:同學(xué)及qq號(hào),按姓名排序顯示
--NULL視為比任何值都小,升序出現(xiàn)在最上面。
案例3:查詢同學(xué)各門成績,依次按數(shù)學(xué)降序,英語升序,語文升序的方式顯示
--多字段排序,排序優(yōu)先級(jí)隨書寫順序
案例4:查詢同學(xué)及總分,由高到低
--ORDER BY中可以使用表達(dá)式
--ORDER BY子句中可以使用列別名
案例5:查詢姓孫的同學(xué)或者姓曹的同學(xué)數(shù)學(xué)成績,結(jié)果按數(shù)學(xué)成績由高到低顯示
-- 結(jié)合 WHERE 子句 和 ORDER BY 子句
2.5 篩選分頁結(jié)果 (limit)
語法:
-- 起始下標(biāo)為 0
-- 從 0 開始,篩選 n 條結(jié)果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 從 s 開始,篩選 n 條結(jié)果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
-- 從 s 開始,篩選 n 條結(jié)果,比第二種用法更明確,建議使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
建議:對(duì)未知表進(jìn)行查詢時(shí),最好加一條 LIMIT 1,避免因?yàn)楸碇袛?shù)據(jù)過大,查詢?nèi)頂?shù)據(jù)導(dǎo)致數(shù)據(jù)庫卡死
功能:按id進(jìn)行分頁,每頁3條記錄,分別顯示 第1、2、3頁
總結(jié): 篩選出來和顯示出來肯定是兩碼事,一定是先篩選后顯示1、from先確保在哪個(gè)表里找 2、where帶著篩選條件 3、開始做篩選工作 (前三步都是在篩選) 4、as起別名 5、order根據(jù)別名進(jìn)行排序之后的顯示 6、limit分頁顯示(后三步是在顯示)
三、Update
語法:
UPDATE table_name SET column = expr [, column = expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]
對(duì)查詢到的結(jié)果進(jìn)行列值更新(一般要加where條件否則會(huì)全部被更新)
案例1:將孫悟空同學(xué)的數(shù)學(xué)成績變更為80分
--更新值為具體值
案例2:將曹孟德同學(xué)的數(shù)學(xué)成績變更為60分,語文成績變更為70分
--一次更新多個(gè)列
案例3:將總成績倒數(shù)前三的3位同學(xué)的數(shù)學(xué)成績加上30分
--數(shù)據(jù)更新,不支持math+=30這種語法
update exam_result set math=math+30 order by chinese+english+math asc limit 3;
案例4:將所有同學(xué)的語文成績更新為原來的2倍
注意:更新全表的語句慎用!--沒有WHERE子句,則更新全表
update exam_result set chinese=chinese*2;
四、Delete
4.1 刪除數(shù)據(jù)
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
案例1:刪除孫悟空同學(xué)的考試成績
delete from exam_result where name='孫悟空';
案例2:去掉班級(jí)的第一名
delete from exam_result order by english+math+chinese asc limit 1;
案例3:刪除整張表數(shù)據(jù)(delete只是刪表數(shù)據(jù),不刪表結(jié)構(gòu))
注意:刪除整表操作要慎用!
--先插入一點(diǎn)數(shù)據(jù)
--刪掉整張表數(shù)據(jù)
我們會(huì)發(fā)現(xiàn)我們只是把表數(shù)據(jù)給刪除了,但是表的結(jié)構(gòu)還在??!計(jì)數(shù)器沒有變
4.2 截?cái)啾恚╰runcate)
TRUNCATE [TABLE] table_name
--插入數(shù)據(jù)
--清空表
我們會(huì)發(fā)現(xiàn)計(jì)數(shù)器被重置了??!
注意:這個(gè)操作慎用
1. 只能對(duì)整表操作,不能像DELETE一樣針對(duì)部分?jǐn)?shù)據(jù)操作;
2. 實(shí)際上MySQL 不對(duì)數(shù)據(jù)操作,所以比DELETE更快,但是TRUNCATE在刪除數(shù)據(jù)的時(shí)候,并不經(jīng)過真正的事務(wù)(不會(huì)被記錄到日志里),所以無法回滾
三種日志:
bin log: 歷史上操作過的sql語句優(yōu)化之后保留下來——方便主從同步、備份、恢復(fù)
redo log:確保宕機(jī)、斷電的時(shí)候數(shù)據(jù)不丟失(因?yàn)閿?shù)據(jù)可能在內(nèi)存中存著)——保證崩潰安全
undo log:做事務(wù)回滾、事務(wù)的隔離性
3. 會(huì)重置AUTO_INCREMENT項(xiàng)
五、插入查詢結(jié)果(insert+select)
INSERT INTO table_name [(column [, column ...])] SELECT ...
案例:刪除表中的重復(fù)記錄,重復(fù)的數(shù)據(jù)只能有一份
--建表
--插入測(cè)試數(shù)據(jù)
不能用distinct的去重,因?yàn)樗⒉挥绊懺?/strong>
但是我們可以將insert和select結(jié)合起來用,將distinct篩選出來的數(shù)據(jù)插入到空表中??!然后再改一下表的名字??!
第一步:create table no_duplicate_table like duplicate_table;建立一張和原表結(jié)構(gòu)相同的空表
第二步:insert into no_duplicate_table select distinct * from duplicate_table; 查詢?cè)砣ブ睾蟮慕Y(jié)果然后插入到新表中
第三步:rename table duplicate_table to old_duplicate_table,no_duplicate_table to duplicate_table;將原表重命名備份一下,然后再把新表的名字改成原表的名字
問題:為什么最后是通過rename的方式進(jìn)行的?
——>創(chuàng)建一個(gè)數(shù)據(jù)庫其實(shí)就是創(chuàng)建一個(gè)文件夾,創(chuàng)建一張表其實(shí)就是創(chuàng)建一個(gè)文件,對(duì)應(yīng)的系統(tǒng)調(diào)用就是mkdir和touch,而rename背后的也是類似rename這樣的系統(tǒng)調(diào)用,平時(shí)我們用的move指令重命名也是類似的,如果我今天想把一個(gè)文件上傳到linux下,可能上傳得很慢,我想等這個(gè)文件上傳好之后,把這個(gè)文件放到某個(gè)目錄下,我希望他放入的過程是原子的,所以我們一定不能直接把這個(gè)文件直接上傳到對(duì)應(yīng)的目錄下,因?yàn)樯蟼鞯倪^程一直在寫入,一定不是原子的,所以一般我們喜歡這個(gè)要上傳的文件上傳到一個(gè)臨時(shí)的目錄下,等全都上傳完成之后,再把整個(gè)文件move到特定的目錄下,這個(gè)move是原子的。
所以總的來說,單純就是相等一切都就緒了,然后統(tǒng)一放入、更新、生效等。因?yàn)槲覀兊?strong>move操作和重命名操作實(shí)際上就是在文件系統(tǒng)里就是改這個(gè)文件所在的目錄里面文件名和inode的映射關(guān)系,他相較于冗長地向表中插入和冗長的上傳行為比起來非常輕。很有可能我這個(gè)目錄有很多文件包括正在操作的這個(gè)文件正在被外部的網(wǎng)站或者各種語言正在訪問,所以我們不能著急動(dòng)這個(gè)表而是應(yīng)該先把這個(gè)表先傳到臨時(shí)目錄然后再統(tǒng)一move過去,這是一種比較推薦的做法
六、聚合函數(shù)
案例1:統(tǒng)計(jì)班級(jí)共有多少同學(xué)
-- 使用 * 做統(tǒng)計(jì),不受 NULL 影響
-- 使用表達(dá)式做統(tǒng)計(jì)
案例2:統(tǒng)計(jì)本次考試的數(shù)學(xué)成績分?jǐn)?shù)個(gè)數(shù)
-- NULL 不會(huì)計(jì)入結(jié)果
-- COUNT(math) 統(tǒng)計(jì)的是全部成績
-- COUNT(DISTINCT math) 統(tǒng)計(jì)的是去重成績數(shù)量
案例3:統(tǒng)計(jì)數(shù)學(xué)成績總分
案例4:統(tǒng)計(jì)數(shù)學(xué)的平均分
案例5:數(shù)學(xué)不及格的人有多少
案例6:統(tǒng)計(jì)平均總分
案例7:返回英語最高分
案例8:返回 > 70 分以上的數(shù)學(xué)最低分
聚合函數(shù):1、在應(yīng)用層上更多的是在未來進(jìn)行某種程度上的數(shù)據(jù)統(tǒng)計(jì),是有自己的現(xiàn)實(shí)需求的2、大部分聚合都是簡單的場(chǎng)景,還有一部分場(chǎng)景需要對(duì)信息做完分組之后做聚合
七、分組聚合統(tǒng)計(jì)(group by)
分組的目的是為了方便后面的聚合統(tǒng)計(jì) (比如說分成男生女生然后分別做統(tǒng)計(jì))
在select中使用group by 子句可以對(duì)指定列進(jìn)行分組查詢
select column1, column2, .. from table group by column;
案例:準(zhǔn)備工作,創(chuàng)建一個(gè)雇員信息表(來自oracle 9i的經(jīng)典測(cè)試表)
1、EMP員工表
2、DEPT部門表
3、SALGRADE工資等級(jí)表
//利用source將該備份文件恢復(fù)到數(shù)據(jù)庫中 DROP database IF EXISTS `scott`;//如果曾經(jīng)有這個(gè)名字是數(shù)據(jù)庫就刪掉 CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;//創(chuàng)建這個(gè)數(shù)據(jù)庫 USE `scott`;//使用這個(gè)數(shù)據(jù)庫 DROP TABLE IF EXISTS `dept`;//如果有這個(gè)名字的部門表叫把他刪掉 CREATE TABLE `dept` (//創(chuàng)建部門表 `deptno` int(2) unsigned zerofill NOT NULL COMMENT '部門編號(hào)', `dname` varchar(14) DEFAULT NULL COMMENT '部門名稱', `loc` varchar(13) DEFAULT NULL COMMENT '部門所在地點(diǎn)' ); DROP TABLE IF EXISTS `emp`;//如果有這個(gè)名字的部門表叫把他刪掉 CREATE TABLE `emp` (//創(chuàng)建員工表 `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇員編號(hào)', `ename` varchar(10) DEFAULT NULL COMMENT '雇員姓名', `job` varchar(9) DEFAULT NULL COMMENT '雇員職位', `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇員領(lǐng)導(dǎo)編號(hào)', `hiredate` datetime DEFAULT NULL COMMENT '雇傭時(shí)間', `sal` decimal(7,2) DEFAULT NULL COMMENT '工資月薪',//外鍵 `comm` decimal(7,2) DEFAULT NULL COMMENT '獎(jiǎng)金', `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部門編號(hào)'//外鍵 ); DROP TABLE IF EXISTS `salgrade`;//如果有這個(gè)名字的部門表叫把他刪掉 CREATE TABLE `salgrade` (//薪資表 可以客觀反應(yīng)這個(gè)員工在公司的重要程度 `grade` int(11) DEFAULT NULL COMMENT '等級(jí)', `losal` int(11) DEFAULT NULL COMMENT '此等級(jí)最低工資', `hisal` int(11) DEFAULT NULL COMMENT '此等級(jí)最高工資' ); //插入部門 insert into dept (deptno, dname, loc) values (10, 'ACCOUNTING', 'NEW YORK');//核算部門 insert into dept (deptno, dname, loc) values (20, 'RESEARCH', 'DALLAS');//搜索部門 insert into dept (deptno, dname, loc) values (30, 'SALES', 'CHICAGO');//銷售部門 insert into dept (deptno, dname, loc) values (40, 'OPERATIONS', 'BOSTON');//運(yùn)營部門 //插入員工 insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20); insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10); //插入不同等級(jí)的薪資 insert into salgrade (grade, losal, hisal) values (1, 700, 1200); insert into salgrade (grade, losal, hisal) values (2, 1201, 1400); insert into salgrade (grade, losal, hisal) values (3, 1401, 2000); insert into salgrade (grade, losal, hisal) values (4, 2001, 3000); insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);
1、顯示每個(gè)部分的平均工資和最高工資
select deptno,max(sal) 最高,avg(sal) 平均 from EMP group by deptno;
對(duì)先分組——>再聚合統(tǒng)計(jì)的三種理解:
1、指定列名(分組的條件depton),實(shí)際分組是用該列的不同的行數(shù)數(shù)據(jù)(組內(nèi)一定是相同的—->可以被聚合壓縮)來進(jìn)行分組的!
2、分組,就是把一組按照條件拆分成多個(gè)組,然后各自進(jìn)行組內(nèi)的聚合統(tǒng)計(jì)
3、分組(“分表”),就是把一張表按照條件在調(diào)劑上拆成了多個(gè)子表,然后分別對(duì)各自的子表進(jìn)行聚合統(tǒng)計(jì)
2、顯示每個(gè)部門的每種崗位的平均工資和最低工資
select deptno,job,avg(sal) 平均,min(sal) 最低 from EMP group by deptno, job;
注意:不能在select后面跟具體的并不是分組條件的列,只能是具體的分組條件的列以及聚合函數(shù)
報(bào)錯(cuò)原因:ename沒有在分組條件中出現(xiàn),無法進(jìn)行壓縮聚合
group by是一個(gè)分組函數(shù),你要篩查的數(shù)據(jù)列,都應(yīng)該考慮一個(gè)情況,就是分組的時(shí)候,如果當(dāng)前分組條件相同,接下來的分組依據(jù)是什么!
3、顯示平均工資低于2000的部門和它的平均工資
(1) 統(tǒng)計(jì)各個(gè)部門的平均工資
select deptno,avg(sal) deptavg from EMP group by deptno;
(2)having和group by配合使用,對(duì)group by結(jié)果進(jìn)行過濾
--having經(jīng)常和group by搭配使用,作用是對(duì)聚合后的統(tǒng)計(jì)數(shù)據(jù)進(jìn)行條件篩選,作用有些像where。
select deptno,avg(sal) deptavg from EMP group by deptno having deptavg<2000;
where vs having
面試題:SQL查詢中各個(gè)關(guān)鍵字的執(zhí)行先后順序 from > on> join > where > group by > with > having > select > distinct > order by > limit
總結(jié)
到此這篇關(guān)于MySQL表的增刪查改操作的文章就介紹到這了,更多相關(guān)MySQL表增刪查改內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL全文索引、聯(lián)合索引、like查詢、json查詢速度哪個(gè)快
這篇文章主要介紹了MySQL全文索引、聯(lián)合索引、like查詢、json查詢速度大比拼,通過實(shí)例代碼截圖的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02MySQL海量數(shù)據(jù)(2億級(jí)表字段)無損更新方案
在大型互聯(lián)網(wǎng)應(yīng)用中,數(shù)據(jù)表動(dòng)輒達(dá)到億級(jí)規(guī)模,當(dāng)需要對(duì)生產(chǎn)環(huán)境中的海量表進(jìn)行字段更新時(shí),如何在不影響業(yè)務(wù)正常讀寫的情況下完成任務(wù),是每個(gè)DBA和開發(fā)者都會(huì)面臨的挑戰(zhàn),本文將以一個(gè)真實(shí)案例詳細(xì)講解四種漸進(jìn)式更新方案及其實(shí)現(xiàn)原理,需要的朋友可以參考下2025-04-04解決SQLyog連接MySQL出現(xiàn)錯(cuò)誤Plugin caching_sha2_password co
當(dāng)使用SQLyog連接MySQL時(shí),如果遇到插件caching_sha2_password無法加載的錯(cuò)誤,可以通過更改密碼并將其標(biāo)識(shí)為mysql_native_password來解決,具體步驟包括:打開命令提示符窗口,登錄MySQL,修改密碼并更換插件,然后使用新密碼連接SQLyog2025-01-01Mysql 數(shù)據(jù)庫中設(shè)備實(shí)時(shí)狀態(tài)表水平分表
在使用 Mysql 數(shù)據(jù)庫存儲(chǔ)設(shè)備上報(bào)日志時(shí),存在一張?jiān)O(shè)備實(shí)時(shí)狀態(tài)表,隨著時(shí)間推移,數(shù)據(jù)量變得十分龐大,為了更好地管理和查詢數(shù)據(jù),提高數(shù)據(jù)庫性能,需要對(duì)該表進(jìn)行水平分表操作,下面就來介紹一下如何實(shí)現(xiàn)2025-06-06