日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL学习(四、子查询)

發布時間:2024/4/18 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL学习(四、子查询) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、子查詢

子查詢指的就是在一個查詢之中嵌套了其他的若干查詢,在使用select語句查詢數據時,有時候會遇到這樣的情況,在where查詢條件中的限制條件不是一個確定的值,而是一個來自于另一個查詢的結果。子查詢一般出現在FROM和WHERE子句中。
----------------------------------------------------------
1、子查詢在主查詢前執行一次
2、主查詢使用子查詢的結果
----------------------------------------------------------
練習
1、查詢大于公司平均工資的員工姓名
SELECT ename,sal FROM emp WHERE sal>(SELECT AVG(sal) FROM emp)
2、查詢出工資比MARTIN還要高的全部雇員信息

SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename = 'MARTIN')


使用子查詢的注意事項:
??? 1、子查詢要用括號括起來
??? 2、將子查詢放在比較運算符的右邊(增強可讀性)
??? 3、對單行子查詢使用單行運算符
??? 4、對多行子查詢使用多行運算符

?

二、子查詢的分類(根據子查詢的結果)

??? 1):單行單列子查詢:只包含一個字段的查詢,返回的查詢結果也只包含一行數據, 看做是一個值. 使用在WHERE之后。
??? 2):多行單列子查詢:只包含了一個字段,但返回的查詢結果可能多行或者零行,看做是多個值,使用在WHERE之后。
??? 3):多列子查詢:包含多個字段的返回,查詢結構可能是單行或者多行,看做是臨時表,使用在FROM之后。


單行單列子查詢
子查詢返回一行一列記錄,看做是一個值. 使用在WHERE之后.
1、返回一行記錄
2、使用單行記錄比較運算符:=;>;>=;<;<=;<>
--------------------------------------------------------------------------------
練習:
1、查詢大于公司平均工資的員工姓名
SELECT ename,sal FROM emp WHERE sal >
??? (SELECT AVG(sal) FROM emp)
2、查詢出工資比MARTIN還要高的全部雇員信息
SELECT * FROM emp WHERE sal >
??? (SELECT sal FROM emp WHERE ename = 'MARTIN')

多行單列子查詢
1、返回多行
2、使用多行比較運算符
???? IN:與列表中的任意一個值相等??????????? ?
???? ANY:與子查詢返回的任意一個值比較
??????? 1): = ANY:此時和IN操作符相同.???????????? 需求:查詢工資等于任意部門經理的員工信息.
??????? 2): > ANY:大于子查詢中最小的數據.????? 需求:查詢工資大于任意部門經理的員工信息.
??????? 3): < ANY:大于子查詢中最大的數據.????? 需求:查詢工資小于任意部門經理的員工信息.
???? ALL:與子查詢返回的每一個值比較
??????? 1): > ALL:大于子查詢中最大的數據.
??????? 2): < ALL:小于子查詢中最小的數據.
----------------------------------------------------------------------------------------------
練習:

select * from departments where department_id in (select department_id from employees group by department_id having avg(salary)>(select avg(salary) from employees))


多行多列子查詢
一般會把子查詢返回的結果當成一個臨時表,接著在臨時表上繼續查詢或者連接查詢;
注意,多行多列的子查詢返回的結果必須要設置一個臨時表名;

查詢出每個部門的編號、名稱、部門人數、平均工資:
SELECT d.deptno,d.dname,COUNT(e.empno),IFNULL(AVG(e.sal),0)
FROM dept d JOIN emp e USING (deptno)
GROUP BY d.deptno,d.dname

--------------------------------------------------
可以先把每一個部門的編號,總人數,平均工資先查詢出來.
SELECT deptno dno,COUNT(empno) count ,AVG(sal) avg? FROM emp GROUP BY dno
再和dept表聯合查詢部門名稱.
SELECT? dept.deptno,temp.count,temp.avg? FROM dept JOIN (SELECT deptno dno,COUNT(empno) count ,AVG(sal) avg? FROM emp GROUP BY deptno) temp ON dept.deptno = temp.dno

?


UNION/UNION ALL
JOIN是用于把表橫向連接,UNION/UNION ALL是用于把表縱向連接(一般用于做查詢的臨時表)
UNION 操作符用于合并兩個或多個 SELECT 語句的結果集。

注意,
1,UNION 內部的 SELECT 語句必須擁有相同數量的列。
2,列也必須擁有兼容的數據類型。
3,每條 SELECT 語句中的列的順序必須相同。
4,UNION 結果集中的列名總是等于 UNION 中第一個 SELECT 語句中的列名
5,UNION 操作符選取不同的值。如果允許重復的值,請使用 UNION ALL(性能高).

語法:
SELECT column_name(s) FROM table_name1
UNION|UNION ALL
SELECT column_name(s) FROM table_name2

在MYSQL 中實現FULL JOIN:
查詢員工的編號,名稱和部門名稱.

1:先在emp表中插入一條數據,并設置depto為NULL.
2:查詢
SELECT empno,ename,dname FROM emp LEFT JOIN dept USING (deptno)
UNION
SELECT empno,ename,dname FROM emp RIGHT JOIN dept USING (deptno)

————————————————
版權聲明:本文為CSDN博主「BigDodo」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38741971/article/details/80586149

總結

以上是生活随笔為你收集整理的MySQL学习(四、子查询)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。