1.子查詢
(1)where 子查詢
①多行單列
配合in和not in操作(類似于數據范圍查詢)
例:
顯示工資與各個經理相同的雇員信息(包含經理本身)。
select * from emp
where sal=(select sal from emp where job='MANAGER');
(2)HAVING 子查詢
伴隨著GROUP BY子句出現,在HAVING子句中子查詢的一般返回單行單列數據。
例:
查詢出平均工資最低的職位信息、此職位的人數。此職位的平均工資。
SELECT job,COUNT(empno),AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal)=(
SELECT MIN(asal)
FROM (SELECT AVG(sal) asal
FROM emp
GROUP BY job));
更簡便的做法:
SELECT job,COUNT(empno),AVG(sal)
FROM emp
GROUP BY job
ORDER BY AVG(sal) ASC
LIMIT 1;
(3)select 子查詢(很少用)
例:
顯示所有雇員的姓名、職位、部門名稱和部門位置。
方便演示,強行使用SELECT子查詢這種非主流子寫法:關聯emp和dept兩個表進行多表查詢更簡便。SELECT e.ename,e,job,
(SELECT dname FROM dept WHERE deptno=e.deptno),
(SELECT loc FROM dept WHERE deptno=e.deptno)
FROM emp e;
(4)from 子查詢
其用多表查詢也能實現效果,其主要目的是提升效率,提高查詢性能。
例:
查詢出每個部門的編號、名稱、位置、部門人數、平均工資。
多表查詢:
SELECT d.deptno,dname,loc,COUNT(empno),AVG(sal)
FROM dept d LEFT JOIN emp e
ON d.deptno=e.deptno
GROUP BY d.deptno;
其計數數據量:emp表14行,dept表4行;
? ? ? ? 14*4=56
from子查詢:
SELECT d.deptno,dname,loc,num,asal
FROM dept d LEFT JOIN
(
????????SELECT deptno,COUNT(empno) num,AVG(sal) asal
????????FROM emp
????????GROUP BY deptno
) temp
ON d.deptno = temp.deptno;
其計算數據量:
????????其子查詢先通過emp表查詢,對其進行整理分組為三組(14,3),再對dept表(4)進行配對。
? ? ? ? 14+3*4=26
2.更新操作
(1)數據的更新操作
(增、刪、改)
針對DML分為兩類:
- 查詢DQL
(執行順序:FROM-->WHERE-->GROUP BY-->HAVING-->SELECT-->ORDER BY-->LIMIT)
- 更新:增加、刪除、修改
復制表語句:
CREATE TABLE myemp AS SELECT * FROM emp;
刪除表語句:
drop table myemp;?
(2)插入數據
- 數字:直接寫數字
- 字符串:使用單引號括起來表示
- 日期:
- 符合格式的字符串,例如: '2025-07-16 14:10:00'
- DATETIME或DATE等函數的返回值
SQLite數據類型還有:
插入數據的語法格式:
INSERT INTO 表名稱[(字段,字段,...)] VALUES(值,值);
其有兩種寫法:
①可省略null部分,只需字段與值一一對應。
②省略字段部分,但不可省略null且得按表順序寫值。
如:
①
insert into myemp (empno,ename,job,hiredate,sal,deptno)?
values (1314,'GOUSHENG','PRESIDENT',
DATETIME('now','localtime'),6666,40);
②
insert into myemp
values (5200,'MARRY','SECRETARY',
DATETIME('now','localtime'),3000,99999,40);
(3)修改數據
語法:
UPDATE 表名稱 SET 字段=值,字段=值,... [WHERE 更新條件(s)]
如果不寫WHERE,表示修改所有數據。
? ? ? ? 1.將所有銷售的基本工資修改為2000
UPDATE myemp SET sal=2000 WHERE job='SALESMAN';
? ? ? ? 2.將公司最早雇傭的雇員的基本工資增長20%
UPDATE myemp SET sal=sal*1.2
WHERE hiredate=(SELECT MIN(hiredate)
FROM myemp);
? ? ? ? 3.將公司基本工資最低的雇員的基本工資修改為公司的平均工資。
--公司的最低基本工資
SELECT MIN(sal) FROM myemp;
--公司的平均工資
SELECT AVG(sal) FROM myemp;
--嵌套
UPDATE myemp SET sal=(SELECT AVG(sal) FROM myemp)
WHERE sal=(SELECT MIN(sal) FROM myemp);
? ? ? ? 4.將所有雇員的雇傭日期修改為今天。
UPDATE myemp SET hiredate=DATETIME('now','localtime');
(4)刪除數據
語法:
DELETE FROM 表名稱 [WHERE 刪除條件(s)];
如果不寫WHERE,表示刪除所有數據。
? ? ? ? 1.刪除公司工資最高的雇員。
DELETE FROM myemp
WHERE sal=(SELECT MAX(sal) FROM myemp);
? ? ? ? 2.刪除沒有領導的雇員。
DELETE FROM myemp WHERE mgr IS NULL;
? ? ? ? 3.刪除所有雇員。
DELETE FROM myemp;