SQL查询语句

这就是重点。
DESC emp 显示表结构。
SELECT FROM emp 查询所有列。
SELECT empno, ename FROM emp 查询指定列。
WHERE job = 'CLERK' 查询指定的行。
NVL(comm, 0) 处理空值。
LIKE 'S__T%' 使用通配符进行模糊查询。
IN ('CLERK', 'ANALYST') 使用 IN 条件。
IS NULL/IS NOT NULL 检查 NULL 值。
GROUP BY deptno 组统计。
HAVING AVG(sal) < 2> SELECT e.name、e.sal、d.dname多表连接查询。
SELECT e.ename, ee.enamemgr_name 自连接查询。
SELECT ename FROM emp WHERE deptno = (SELECT deptno FROM emp WHERE ename = 'SMITH') 子查询示例。
SELECT ename FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 3 0) 使用 ALL 关键字。
SELECT FROM emp WHERE (job, deptno) = (SELECT job, deptno FROM emp WHERE ename = 'SMITH') 多列子查询。
选择a2 FROM (SELECT a1 ., ROWNUM rn FROM (SELECT FROM emp ORDER BY sal) a1 WHERE ROWNUM <= 1 0) a2 WHERE rn >= 6 分页查询。
CREATE TABLE mytable AS SELECT empno, ename, sal, job, deptno FROM emp 创建一个新表。
SELECT ename, sal, job FROM emp WHERE sal > 2 5 00 UNION SELECT ename, sal, job FROM emp WHERE job = 'MANAGER' 组合查询。
INSERT INTO myEmp SELECT empno, ename, sal, job, deptno FROM emp WHERE deptno = 1 0 插入数据。
UPDATE emp SET (job, sal, comm) = (SELECT job, sal, comm FROM emp WHERE ename = 'SMITH') WHERE ename = 'SCOTT' 使用子查询更新数据。

记住:先执行子查询,然后执行主查询。

SQL必知:四种常见的子查询(标量子查询、列子查询、行子查询和表子查询)

哎呀,让我问你这个问题。
当我第一次开始从事数据库工作时,我真的不知所措。
我记得有一个冬天,在一家小公司,他们的系统非常慢,老板急得跳了起来。

后来我发现很多SQL语句都充满了子查询,彼此分层。
如果你想一想,扫描一次数据库就足够了。
必须运行多次并重新运行结果。
是不是很慢?当我看到这些 SQL 时,我的心都碎了。

看看这个标量子查询,它返回一个值,就像检查某个客户下了多少订单一样,(SELECTCOUNT()FROMordersWHEREcustomer_id=customers.customer_id),没什么大不了的。
但如果嵌套多个,比如先查平均订单金额,然后用平均订单金额查哪个客户订单最多,查询就会被阻塞。
我见过最糟糕的一次是跨越四层的子查询,执行半天就超时了。
这一幕实在是太尴尬了。

列子查询、行子查询、表子查询,名字看起来很高级。
但在实践中我们发现我们还需要理顺逻辑。
例如,行子查询返回一行数据,有时需要再次聚合,从而比主查询复杂。
一位客户来找我,说他的 SQL 运行缓慢。
我一看,发现哦,子查询里内置了一个GROUP BY。
这不是自找麻烦吗?
最重要的是,如果使用太多子查询,SQL就会显得复杂。
如果你告诉别人,他们不会理解。
有一个同事写SQL,写子查询中的子查询。
他自己也分不清哪一层先走。
最后我帮他拆开,用JOIN重写,速度更快了。

为了优化,您确实需要使用索引。
我曾经有一个项目,子查询搜索某个表中某个字段的值,但结果是该字段没有索引。
每次执行子查询都要全表扫描,CPU直接增加。
后来我提出加索引,但老板不高兴,说加索引要花钱。
结果加了索引,查询速度立刻提升了N倍。
省钱是值得的,你不觉得吗?
所以子查询是个好东西,但是不要盲目使用。
如果问题可以用 JOIN 解决,就不要使用子查询。
如果这不起作用,请尝试再嵌套几次,看看是否会卡住。
这十年来我发现的坑足够写一本书了,而且都是血泪的教训。
你必须慢慢来。

更新SQL语句中,子查询返回多行值 无法执行。如何解决?

说白了,其实很简单,把子查询前面的=换成IN即可。
这个操作的主要目的是让查询更加灵活,避免因为数据量的变化而导致查询错误。

我们先来说说最重要的事情。
当你看到IN时,它实际上允许你匹配多个值,而=只能匹配一个特定的值。
比如我们去年跑的项目,大概有3 000层数据。
如果使用=,一旦received_code不存在,整个更新操作就会失败。

还有一点是,使用IN可以避免数据丢失带来的问题。
例如,有一个至关重要的细节。
如果一个received_code在子查询中没有匹配的元素,那么它不会被包含在更新列表中,因此不会影响其他数据。

一开始我以为IN和=的效果是一样的,后来发现这是错误的。
IN在处理大量数据时可能会有不同的性能。
等等,还有一件事。
很多人没有注意到。
使用 IN 时,如果子查询返回大量数据,可能会影响性能。

所以,我认为值得尝试将=替换为IN,这可以让你的查询更加健壮,提高查询的灵活性。