MySQL中CRUD操作及常用查詢語(yǔ)法舉例詳解
Mysql-CURD
CRUD : Create(創(chuàng)建), Retrieve(讀取),Update(更新),Delete(刪除)。
1. Create
語(yǔ)法:
INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) , (value_list) , ...;
案例:
CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
sn INT NOT NULL UNIQUE COMMENT '學(xué)號(hào)',
name VARCHAR(20) NOT NULL,
qq VARCHAR(20)
);
1.1 單行數(shù)據(jù) + 全列插入
inser into students values (1, 20250123, 'Jack' , NULL);
1.2 多行數(shù)據(jù) + 指定列插入
inser into (sn , name , qq) students values (20250124, 'ali' , "123456789") , (20250125 , "alger" , "23456781");
1.3 插入否則更新
1.3.1 on duplicate key
主鍵 或者 唯一鍵 沒(méi)有沖突,則直接插入。
主鍵 或者 唯一鍵 如果沖突,則刪除后再插入。
語(yǔ)法:
INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...
案例:
insert into students values (1 , 20250126 , "Jack" , "345678912") on duplicate key update sn = 20250126;
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)被更新。
1.3.2 replace
語(yǔ)法:
REPLACE ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...
2. Retrieve
語(yǔ)法:
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
2.0 select 順序
SQL SELECT 語(yǔ)句的典型執(zhí)行順序?yàn)椋?/p>
FROM(指定數(shù)據(jù)來(lái)源表,是查詢的基礎(chǔ))。WHERE(篩選行,對(duì) FROM 后的結(jié)果進(jìn)行條件過(guò)濾)。SELECT(指定要查詢的列或表達(dá)式)。ORDER BY(對(duì)結(jié)果集排序)。LIMIT(限制結(jié)果集的行數(shù),多用于分頁(yè)等場(chǎng)景)。

案例:
# 案例
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同學(xué)姓名',
chinese float DEFAULT 0.0 COMMENT '語(yǔ)文成績(jī)',
math float DEFAULT 0.0 COMMENT '數(shù)學(xué)成績(jī)',
english float DEFAULT 0.0 COMMENT '英語(yǔ)成績(jī)'
);
# 插入數(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);
2.1 全列查詢
select * from exam_result;
2.2 指定列查詢
select id , name , english from exam_result;
2.3 查詢并計(jì)算臨時(shí)表達(dá)式
select id , name , english + chinese + math from exam_result;
2.4 為2.3起別名
select id , name , english + chinese + math as total from exam_result;
select id , name , english + chinese + math total from exam_result;
2.5 查詢結(jié)果去重
select distinct math from exam_result;
2.6 where 條件
2.6.1 運(yùn)算符
比較運(yùn)算符:
| 運(yùn)算符 | 說(shuō)明 |
|---|---|
| >, >=, <, <= | 大于,大于等于,小于,小于等于 |
| = | 等于,NULL 不安全,例如 NULL = NULL 的結(jié)果是 NULL |
| <=> | 等于,NULL 安全,例如 NULL <=> NULL 的結(jié)果是 TRUE(1) |
| !=, <> | 不等于,區(qū)分 NULL 安全與 NULL 不安全 |
| BETWEEN a0 AND a1 | 范圍匹配,[a0, 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.6.2 英語(yǔ)不及格的同學(xué)及英語(yǔ)成績(jī)
select name , english from exam_result where english < 60;
2.6.3 語(yǔ)文成績(jī)?cè)?[80, 90] 分的同學(xué)及語(yǔ)文成績(jī)
select name , chinese from exam_result where chinese >= 80 and chinese <= 90; select name , chinese from exam_result where chinese between 80 and 90;
2.6.4 數(shù)學(xué)成績(jī)是 58 或者 59 分的同學(xué)及數(shù)學(xué)成績(jī)
select name , math from exam_result where math = 58 or math = 59; select name , math from exam_result where math in (58 , 59);
2.6.5 姓孫的同學(xué)及孫某同學(xué)
select name from exam_result where name like "孫%"; # 孫悟空、孫權(quán) select name from exam_result where name like "孫_"; # 孫權(quán)
2.6.5 語(yǔ)文成績(jī)好于英語(yǔ)成績(jī)的同學(xué)
select name , chinese , english from exam_result where chinese > english;
2.6.6 總分在200分以下的同學(xué)
select name , chinese + math + english total from exam_result where chinese + math + english < 200;
注意:total 不可以在 where 子句中使用。
2.6.7 不是孫某同學(xué)
select name from exam_result where name not like "孫_";
2.6.8 name不是NULL的
select name from exam_result where name is not null;
2.7 order by
asc 升序(默認(rèn))。
desc 降序。
語(yǔ)法:
SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...];
2.7.1 同學(xué)及數(shù)學(xué)成績(jī),按數(shù)學(xué)成績(jī)升序顯示
select name , math from exam_result order by math;
2.7.2 查詢同學(xué)各門成績(jī),依次按 數(shù)學(xué)降序,英語(yǔ)升序,語(yǔ)文升序的方式顯示
select name , math , english , chinese from exam_result order by math desc , english asc , chinese asc;
2.7.3 查詢姓孫的同學(xué)或者姓曹的同學(xué)數(shù)學(xué)成績(jī),結(jié)果按數(shù)學(xué)成績(jī)由高到低顯示
select name , math from exam_result where name like "孫%" or name like "曹%" order by math desc;
2.8 limit
語(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;
2.8.1 按 id 進(jìn)行分頁(yè),每頁(yè) 3 條記錄,分別顯示 第 1、2、3 頁(yè)。
select id , name , math , chinese , english from exam_result order by id asc limit 0,3; select id , name , math , chinese , english from exam_result order by id asc limit 3,3; select id , name , math , chinese , english from exam_result order by id asc limit 6,3;
3. Update
語(yǔ)法:
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
對(duì)查詢到的結(jié)果進(jìn)行列值更新。
3.1 將孫悟空同學(xué)的數(shù)學(xué)成績(jī)變更為 80 分
update exam_result set math = 80 where name = "孫悟空";
3.2 將總成績(jī)倒數(shù)前三的 3 位同學(xué)的數(shù)學(xué)成績(jī)加上 30 分
update exam_result set math = math + 30 order by chinese + math + english asc limit 3;
3.3 將所有人的數(shù)學(xué)成績(jī)更新為原來(lái)的2倍
update exam_result set math = math * 2;
注意:update通常需要判斷條件,更新全表的語(yǔ)句慎用!
4. Delete
語(yǔ)法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
4.1 刪除孫悟空
delete from exam_result where name = "孫悟空";
4.2 刪除整表內(nèi)容
delete from exam_result;
慎用!
5. 插入查詢結(jié)果
語(yǔ)法:
INSERT INTO table_name [(column [, column ...])] SELECT ...
1?? 創(chuàng)建一個(gè)表,結(jié)構(gòu)復(fù)制 exam_result 表。
create table no_duplicate_table like exam_result;
2?? 將 exam_result 查詢的結(jié)果插入到 no_duplicate_table 表。
insert into no_duplicate_table select id , name , chinese , math , english from exam_result;
6. 聚合函數(shù)
| 函數(shù) | 說(shuō)明 |
|---|---|
| COUNT([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 數(shù)量 |
| SUM([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 總和,不是數(shù)字沒(méi)有意義 |
| AVG([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 平均值,不是數(shù)字沒(méi)有意義 |
| MAX([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 最大值,不是數(shù)字沒(méi)有意義 |
| MIN([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 最小值,不是數(shù)字沒(méi)有意義 |
6.1 統(tǒng)計(jì)表中有多少行
select count(*) from exam_result;
NULL不計(jì)入結(jié)果。
select count(distinct col) from table-name 統(tǒng)計(jì)去重的結(jié)果。
6.2 統(tǒng)計(jì)數(shù)學(xué)總成績(jī)
select sum(math) from exam_result;
6.3 統(tǒng)計(jì)不及格同學(xué)的數(shù)學(xué)總成績(jī)
select sum(math) from exam_result where math < 60;
6.4 統(tǒng)計(jì)平均分
select avg(chinese + math + english) from exam_result;
6.5 返回英語(yǔ)最高分
select max(english) from exam_result;
6.6 返回?cái)?shù)學(xué)最低分
select min(math) from exam_result;
注意:select name, min(math) from exam_result;
報(bào)錯(cuò)信息:只有按 name 分組后才可以這樣使用,可通過(guò) where order by limit方式查詢。
7. group by子句
在 select 中使用 group by子句可以對(duì)指定列進(jìn)行分組查詢,通常與聚合函數(shù)一起使用。
準(zhǔn)備工作:創(chuàng)建一個(gè)雇員信息表(Oracle 9i經(jīng)典測(cè)試表)
DROP database IF EXISTS `scott`; CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE `scott`; DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `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`; CREATE TABLE `emp` ( `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`; CREATE TABLE `salgrade` ( `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'); 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); 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);
在 Oracle 9i 的經(jīng)典測(cè)試表(
SCOTT用戶下的EMP和DEPT表)中,deptno字段的外鍵關(guān)系是邏輯上的、約定俗成的,而不是通過(guò)數(shù)據(jù)庫(kù)物理外鍵約束(Foreign Key Constraint)強(qiáng)制實(shí)現(xiàn)的。
7.1 顯示每個(gè)部門的平均工資和最高工資
select deptno , avg(sal) , max(sal) from emp group by deptno;
SELECT 子句中的字段,要么必須包含在 GROUP BY 子句中,要么必須被包含在聚合函數(shù)(如 AVG, MAX, SUM, COUNT 等)中。
group by理解為分組,也可以理解為分表。
7.2 顯示每個(gè)部門不同崗位的平均工資和最低工資
select deptno , job, avg(sal) , min(sal) from emp group by deptno , job;
7.3 having
having 和 group by 配合使用,對(duì) group by 結(jié)果進(jìn)行過(guò)濾。
7.3.1 查詢每個(gè)部門的平均工資,并只顯示那些平均工資低于 2000 的部門
select avg(sal) from emp group by deptno having avg(sal) < 2000;
7.3 having 和 where 的區(qū)別
7.3.1 查詢每個(gè)部門的平均工資(但不包括員工名 SMITH 的員工數(shù)據(jù))。
select deptno , avg(sal) from emp where ename != "SMITH" group by deptno;
簡(jiǎn)單的比喻:
WHERE是原材料質(zhì)檢員,在加工(分組聚合)前就把爛蘋果(不合格的行)扔掉。HAVING是成品質(zhì)檢員,在加工(分組聚合)完成后,檢查做好的蘋果罐頭(分組結(jié)果),把不合格的整批罐頭扔掉。
where 之后,也是一個(gè)表。where 本質(zhì)是先過(guò)濾出你想要分組的表,之后再通過(guò) group by 進(jìn)行分組。
8. SQL查詢中各個(gè)關(guān)鍵字的執(zhí)行順序
from > on > join > where > group by > with > having > select > distinct > order by > limit
總結(jié)
到此這篇關(guān)于MySQL中CRUD操作及常用查詢語(yǔ)法舉例詳解的文章就介紹到這了,更多相關(guān)MySQL CRUD操作及查詢語(yǔ)法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql數(shù)據(jù)庫(kù) 主從復(fù)制的配置方法
本文主要介紹 mysql數(shù)據(jù)庫(kù) 主從負(fù)責(zé)的配置方法,在做數(shù)據(jù)庫(kù)開(kāi)發(fā)的時(shí)候有時(shí)候會(huì)遇到,這里做出詳細(xì)流程,大家可以參考下2016-07-07
MySQLexplain之possible_keys、key及key_len詳解
這篇文章主要介紹了MySQLexplain之possible_keys、key及key_len的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
MySQL設(shè)置密碼復(fù)雜度策略的完整步驟(附代碼示例)
MySQL密碼策略還可能包括密碼復(fù)雜度的檢查,如是否要求密碼包含大寫字母、小寫字母、數(shù)字和特殊字符等,這篇文章主要介紹了MySQL設(shè)置密碼復(fù)雜度策略的完整步驟,需要的朋友可以參考下2025-08-08
Windows下實(shí)現(xiàn)MySQL自動(dòng)備份的批處理(復(fù)制目錄或mysqldump備份)
Windows下實(shí)現(xiàn)MySQL自動(dòng)備份的批處理,新建目錄并復(fù)制壓縮,結(jié)合windows計(jì)劃任務(wù)方便實(shí)現(xiàn)每天的自動(dòng)備份2012-05-05
mysql正確刪除數(shù)據(jù)的方法(drop,delete,truncate)
這篇文章主要給大家介紹了關(guān)于mysql正確刪除數(shù)據(jù)的相關(guān)資料,DELETE語(yǔ)句是MySQL中最常用的刪除數(shù)據(jù)的方式之一,但也有幾種其他方法來(lái)實(shí)現(xiàn),需要的朋友可以參考下2023-10-10

