数据库(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;`
`
相关推荐
ZFSS5 小时前
Localization Translate API 集成与使用指南
java·服务器·数据库·人工智能·mysql·ai编程
东风破1376 小时前
达梦DMDRS搭建、以及DMDRS双向同步
数据库·oracle·dm达梦数据库
KaMeidebaby7 小时前
卡梅德生物技术快报|抗独特型抗体开发:半抗原检测技术瓶颈拆解,抗独特型抗体开发工程化实践
前端·数据库·人工智能·其他·百度·新浪微博
NiceCloud喜云7 小时前
Claude Files API 深入:从上传、复用到配额管理的工程化指南
android·java·数据库·人工智能·python·json·飞书
A XMan.8 小时前
域名Whois信息查询V2版API接入指南
数据库
heimeiyingwang8 小时前
【架构实战】可观测性体系:从监控到全链路追踪
网络·数据库·架构
网管NO.18 小时前
SQL 日期函数全套精讲!时间格式化、日期加减、年月日提取,做日报周报直接套用
数据库·sql
杨云龙UP8 小时前
Linux 根分区被日志吃满?一次 58G Broker 日志清理实战_2026-05-20
linux·运维·服务器·数据库·hdfs·apache
sdk大全8 小时前
Studio 3T for MongoDB 2025.13.0
数据库·mongodb
码农阿豪8 小时前
平替MongoDB:金仓多模数据库助力电子证照国产化实践
数据库·mongodb