数据库(five day)——物物而不物于物,念念而不念于念。
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;