昆山做網(wǎng)站的kamese百度品牌專區(qū)
文章目錄
- 子查詢
- 什么是子查詢
- where后面使用子查詢
- from后面使用子查詢
- select后面使用子查詢
- exists、not exists
- in和exists區(qū)別
- union&union all
- limit
🌈你好呀!我是 山頂風景獨好
💕歡迎來到我的博客,很高興能夠在這里和您見面!
💕希望您在這里可以感受到一份輕松愉快的氛圍!
💕這里不僅可以獲得有趣的內(nèi)容和知識,也可以暢所欲言、分享您的想法和見解。
🚀 歡迎一起踏上探險之旅,挖掘無限可能,共同成長!
🏠大家訂閱本專欄!本專欄旨在為SQL初學者提供一條逐步邁向高級應(yīng)用的學習之路,帶您從零開始,一步一步練習,逐步掌握SQL的精髓,實現(xiàn)技能的提升與飛躍!😊
子查詢
什么是子查詢
- select語句中嵌套select語句就叫做子查詢。
- select語句可以嵌套在哪里?
- where后面、from后面、select后面都是可以的。
select ..(select)..
from ..(select)..
where ..(select)..
where后面使用子查詢
案例:找出高于平均薪資的員工姓名和薪資。
錯誤的示范:
select ename,sal from emp where sal > avg(sal);
錯誤原因:where后面不能直接使用分組函數(shù)。
可以使用子查詢:
select ename,sal from emp where sal > (select avg(sal) from emp);
from后面使用子查詢
小竅門:from后面的子查詢可以看做一張臨時表。
案例:找出每個部門的平均工資的等級。
第一步:先找出每個部門平均工資。
select deptno, avg(sal) avgsal from emp group by deptno;
第二步:將以上查詢結(jié)果當做臨時表t,t表和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 數(shù)據(jù)庫中,EXISTS(存在)用于檢查子查詢的查詢結(jié)果行數(shù)是否大于0。如果子查詢的查詢結(jié)果行數(shù)大于0,則 EXISTS 條件為真。(即存在查詢結(jié)果則是true。)
主要應(yīng)用場景:
- 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;
現(xiàn)在我們來看一個簡單的案例,假設(shè)我們要查詢先前有過訂單的顧客,而訂單信息保存在 t_order 表中,顧客信息保存在 t_customer 表中。我們可以使用以下 sql 語句:
select * from t_customer c where exists(select * from t_order o where o.customer_id=c.customer_id);
在這個查詢語句中,子查詢用于檢查是否有訂單與每個客戶相關(guān)聯(lián)。如果子查詢返回至少一行,則表示該顧客已經(jīng)下過訂單,并返回此客戶的所有信息,否則該顧客將不被包含在結(jié)果中。
以下是這個查詢語句的執(zhí)行過程:
- 首先查詢表 t_customer 中的所有顧客信息(以下簡稱為顧客表);
- 對于顧客表中的每一行,都執(zhí)行一次子查詢,子查詢查詢該顧客有沒有訂單,如果有,則在結(jié)果集中保留該顧客信息;如果沒有,則將該顧客排除;
- 最終返回有訂單顧客的所有信息。
除了 EXISTS,也可以使用 NOT EXISTS 條件從 SELECT、UPDATE、DELETE 語句中獲取子查詢的返回結(jié)果。NOT EXISTS 用于檢查一個子查詢是否返回任何行,如果沒有行返回,那么 NOT EXISTS 將返回 true。
例如,我們想要查找所有沒有下過訂單的顧客,可以使用以下 sql 語句:
select * from t_customer c where not exists(select * from t_order o where o.customer_id=c.customer_id);
在這個查詢語句中,如果沒有任何與顧客相關(guān)聯(lián)的訂單,則 NOT EXISTS 子查詢將返回一個空結(jié)果集,這時候 WHERE 條件為 true,并將返回所有顧客信息。如果顧客有訂單,則 NOT EXISTS 子查詢的結(jié)果集將不為空,WHERE 條件為 false,則不會返回該顧客的信息。
總之,無論是 EXISTS 還是 NOT EXISTS,都是非常有用的 SQL 工具??梢酝ㄟ^它們來結(jié)合子查詢來動態(tài)過濾查詢結(jié)果,使 SQL 查詢變得更加靈活和高效。
in和exists區(qū)別
IN 和 EXISTS 都是用于關(guān)系型數(shù)據(jù)庫查詢的操作符。不同之處在于:
- IN 操作符是根據(jù)指定列表中的值來判斷是否滿足條件,而 EXISTS 操作符則是根據(jù)子查詢的結(jié)果是否有返回記錄集來判斷。
- EXISTS 操作符通常比 IN 操作符更快,尤其是在子查詢返回記錄數(shù)很大的情況下。因為 EXISTS 只需要判斷是否存在符合條件的記錄,而 IN 操作符需要比對整個列表,因此執(zhí)行效率相對較低。
- IN 操作符可同時匹配多個值,而 EXISTS 只能匹配一組條件。
下面是一個簡單的示例,用于演示 IN 和 EXISTS 之間的區(qū)別。假設(shè)我們有兩個表 orders 和 products,orders 表中記錄了訂單信息,products 表中記錄了商品信息。現(xiàn)在我們想查詢所有“手機”和“平板電腦”這兩種商品中,至少有一筆訂單銷售了 $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 都是用于條件過濾的操作符,但其實現(xiàn)方式和性能特點都不同,需要根據(jù)具體情況進行選擇和使用。
union&union all
不管是union還是union all都可以將兩個查詢結(jié)果集進行合并。
union會對合并之后的查詢結(jié)果集進行去重操作。
union all是直接將查詢結(jié)果集合并,不進行去重操作。(union all和union都可以完成的話,優(yōu)先選擇union all,union all因為不需要去重,所以效率高一些。)
案例:查詢工作崗位是MANAGER和SALESMAN的員工。
select ename,sal from emp where job='MANAGER'
union all
select ename,sal from emp where job='SALESMAN';
以上案例采用or也可以完成,那or和union all有什么區(qū)別?考慮走索引優(yōu)化之類的選擇union all,其它選擇or。
兩個結(jié)果集合并時,列數(shù)量要相同:
limit
- limit作用:查詢第幾條到第幾條的記錄。通常是因為表中數(shù)據(jù)量太大,需要分頁顯示。
- limit語法格式:
- limit 開始下標, 長度
- 案例:查詢員工表前5條記錄
select ename,sal from emp limit 0, 5;
如果下標是從0開始,可以簡寫為:
select ename,sal from emp limit 5;
- 查詢工資排名在前5名的員工(limit是在order by執(zhí)行之后才會執(zhí)行的)
select ename,sal from emp order by sal desc limit 5;
- 通用的分頁sql
假設(shè)每頁顯示3條記錄:pageSize = 3
第1頁:limit 0, 3
第2頁:limit 3, 3
第3頁:limit 6, 3
第pageNo頁:limit (pageNo - 1)*pageSize, pageSize
? 這就是今天要分享給大家的全部內(nèi)容了,我們下期再見!😊
🏠 我在CSDN等你哦!我的主頁😍