网站都是用什么编写的,阿里云一键wordpress,贵阳网站建设运营,童装店网页设计素材文章目录 子查询什么是子查询where后面使用子查询from后面使用子查询select后面使用子查询exists、not existsin和exists区别 unionunion alllimit #x1f308;你好呀#xff01;我是 山顶风景独好 #x1f495;欢迎来到我的博客#xff0c;很高兴能够在这里和您见面… 文章目录 子查询什么是子查询where后面使用子查询from后面使用子查询select后面使用子查询exists、not existsin和exists区别 unionunion alllimit 你好呀我是 山顶风景独好 欢迎来到我的博客很高兴能够在这里和您见面 希望您在这里可以感受到一份轻松愉快的氛围 这里不仅可以获得有趣的内容和知识也可以畅所欲言、分享您的想法和见解。 欢迎一起踏上探险之旅挖掘无限可能共同成长 大家订阅本专栏本专栏旨在为SQL初学者提供一条逐步迈向高级应用的学习之路带您从零开始一步一步练习逐步掌握SQL的精髓实现技能的提升与飞跃 子查询
什么是子查询
select语句中嵌套select语句就叫做子查询。select语句可以嵌套在哪里 where后面、from后面、select后面都是可以的。
select ..(select)..
from ..(select)..
where ..(select)..where后面使用子查询
案例找出高于平均薪资的员工姓名和薪资。 错误的示范
select ename,sal from emp where sal avg(sal);错误原因where后面不能直接使用分组函数。 可以使用子查询
select ename,sal from emp where sal (select avg(sal) from emp);from后面使用子查询
小窍门from后面的子查询可以看做一张临时表。 案例找出每个部门的平均工资的等级。 第一步先找出每个部门平均工资。
select deptno, avg(sal) avgsal from emp group by deptno;第二步将以上查询结果当做临时表tt表和salgrade表进行连接查询。条件t.avgsal between s.losal and s.hisal
select t.*,s.grade from (select deptno, avg(sal) avgsal from emp group by deptno) t join salgrade s on t.avgsal between s.losal and s.hisal;select后面使用子查询
select e.ename,(select d.dname from dept d where e.deptno d.deptno) as dname from emp e;exists、not exists
在 MySQL 数据库中EXISTS存在用于检查子查询的查询结果行数是否大于0。如果子查询的查询结果行数大于0则 EXISTS 条件为真。即存在查询结果则是true。
主要应用场景
EXISTS 可以与 SELECT、UPDATE、DELETE 一起使用用于检查另一个查询是否返回任何行EXISTS 可以用于验证条件子句中的表达式是否存在EXISTS 常用于子查询条件过滤例如查询有订单的用户等。
drop table if exists t_customer;
drop table if exists t_order;create table t_customer(customer_id int,customer_name varchar(32)
);create table t_order(order_id int,order_price decimal(5,1),customer_id int
);insert into t_customer(customer_id,customer_name) values(1,zhangsan);
insert into t_customer(customer_id,customer_name) values(2,lisi);
insert into t_customer(customer_id,customer_name) values(3,wangwu);insert into t_order(order_id, order_price, customer_id) values(10, 1000.0, 1);
insert into t_order(order_id, order_price, customer_id) values(20, 2000.0, 1);
insert into t_order(order_id, order_price, customer_id) values(30, 3000.0, 2);
insert into t_order(order_id, order_price, customer_id) values(40, 4000.0, 2);commit;
select * from t_customer;
select * from t_order;现在我们来看一个简单的案例假设我们要查询先前有过订单的顾客而订单信息保存在 t_order 表中顾客信息保存在 t_customer 表中。我们可以使用以下 sql 语句
select * from t_customer c where exists(select * from t_order o where o.customer_idc.customer_id);在这个查询语句中子查询用于检查是否有订单与每个客户相关联。如果子查询返回至少一行则表示该顾客已经下过订单并返回此客户的所有信息否则该顾客将不被包含在结果中。
以下是这个查询语句的执行过程
首先查询表 t_customer 中的所有顾客信息以下简称为顾客表对于顾客表中的每一行都执行一次子查询子查询查询该顾客有没有订单如果有则在结果集中保留该顾客信息如果没有则将该顾客排除最终返回有订单顾客的所有信息。
除了 EXISTS也可以使用 NOT EXISTS 条件从 SELECT、UPDATE、DELETE 语句中获取子查询的返回结果。NOT EXISTS 用于检查一个子查询是否返回任何行如果没有行返回那么 NOT EXISTS 将返回 true。
例如我们想要查找所有没有下过订单的顾客可以使用以下 sql 语句
select * from t_customer c where not exists(select * from t_order o where o.customer_idc.customer_id);在这个查询语句中如果没有任何与顾客相关联的订单则 NOT EXISTS 子查询将返回一个空结果集这时候 WHERE 条件为 true并将返回所有顾客信息。如果顾客有订单则 NOT EXISTS 子查询的结果集将不为空WHERE 条件为 false则不会返回该顾客的信息。
总之无论是 EXISTS 还是 NOT EXISTS都是非常有用的 SQL 工具。可以通过它们来结合子查询来动态过滤查询结果使 SQL 查询变得更加灵活和高效。
in和exists区别
IN 和 EXISTS 都是用于关系型数据库查询的操作符。不同之处在于
IN 操作符是根据指定列表中的值来判断是否满足条件而 EXISTS 操作符则是根据子查询的结果是否有返回记录集来判断。EXISTS 操作符通常比 IN 操作符更快尤其是在子查询返回记录数很大的情况下。因为 EXISTS 只需要判断是否存在符合条件的记录而 IN 操作符需要比对整个列表因此执行效率相对较低。IN 操作符可同时匹配多个值而 EXISTS 只能匹配一组条件。
下面是一个简单的示例用于演示 IN 和 EXISTS 之间的区别。假设我们有两个表 orders 和 productsorders 表中记录了订单信息products 表中记录了商品信息。现在我们想查询所有“手机”和“平板电脑”这两种商品中至少有一笔订单销售了 $1000 以上的商品
使用 IN 操作符
SELECT *
FROM products
WHERE product_name IN (手机, 平板电脑)
AND product_id IN (SELECT product_idFROM ordersWHERE order_amount 1000
);使用 EXISTS 操作符
SELECT *
FROM products
WHERE product_name IN (手机, 平板电脑)
AND EXISTS (SELECT *FROM ordersWHERE orders.product_id products.product_idAND order_amount 1000
);总之IN 和 EXISTS 都是用于条件过滤的操作符但其实现方式和性能特点都不同需要根据具体情况进行选择和使用。
unionunion all
不管是union还是union all都可以将两个查询结果集进行合并。 union会对合并之后的查询结果集进行去重操作。 union all是直接将查询结果集合并不进行去重操作。union all和union都可以完成的话优先选择union allunion all因为不需要去重所以效率高一些。 案例查询工作岗位是MANAGER和SALESMAN的员工。
select ename,sal from emp where jobMANAGER
union all
select ename,sal from emp where jobSALESMAN;以上案例采用or也可以完成那or和union all有什么区别考虑走索引优化之类的选择union all其它选择or。 两个结果集合并时列数量要相同
limit
limit作用查询第几条到第几条的记录。通常是因为表中数据量太大需要分页显示。limit语法格式 limit 开始下标, 长度 案例查询员工表前5条记录
select ename,sal from emp limit 0, 5;如果下标是从0开始可以简写为
select ename,sal from emp limit 5;查询工资排名在前5名的员工limit是在order by执行之后才会执行的
select ename,sal from emp order by sal desc limit 5;通用的分页sql
假设每页显示3条记录pageSize 3 第1页limit 0, 3 第2页limit 3, 3 第3页limit 6, 3 第pageNo页limit (pageNo - 1)*pageSize, pageSize ✨ 这就是今天要分享给大家的全部内容了我们下期再见 我在CSDN等你哦我的主页