首頁  >  文章  >  資料庫  >  怎麼分析Mysql中的巢狀子查詢問題

怎麼分析Mysql中的巢狀子查詢問題

PHPz
PHPz轉載
2023-05-27 23:46:271140瀏覽

Mysql嵌套子查詢

子查詢就是指的在一個完整的查詢語句之中,嵌套若干個不同功能的小查詢,從而一起完成複雜查詢的一種編寫形式,為了讓讀者更清楚子查詢的概念。

子查詢傳回結果
子查詢可以傳回的資料類型一共分為四種:

  • 單行單列:傳回的是一個具體列的內容,可以理解為一個單值資料;

  • #單行多列:傳回一行資料中多個列的內容;

  • 多行單列:傳回多行記錄之中同一列的內容,相當於給了一個操作範圍;

  • ##多行多列:查詢傳回的結果是一張臨時表;

在WHERE子句中使用子查詢

在WHERE子句之中處理單行單列子查詢、多行單列子查詢、單行多列子查詢。

單行單列子查詢
**範例一、**查詢公司之中薪資最低的僱員的完整資訊

--查询公司之中工资最低的雇员的完整信息
SELECT * 
FROM emp e
WHERE e.sal=(
  SELECT MIN(sal) 
  FROM emp);

**範例二、* *查詢出基本工資比ALLEN低的全部僱員資訊

-- 查询出基本工资比ALLEN低的全部雇员信息
SELECT * 
FROM emp e
WHERE e.sal<(
 SELECT sal 
 FROM emp 
 WHERE ename=&#39;ALLEN&#39;
);

**範例三、**查詢基本工資高於公司平均薪金的全部僱員資訊

--查询基本工资高于公司平均薪金的全部雇员信息
SELECT *
FROM emp e
WHERE e.sal>(
SELECT AVG(sal)
FROM emp);

單行多列子查詢。
**範例四、**找出與ALLEN從事同一工作,且基本薪資高於僱員編號為7521的全部僱員資訊,

--查找出与ALLEN从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息,
SELECT *
FROM emp e
WHERE e.job=(
  SELECT job
  FROM emp 
  WHERE ename=&#39;ALLEN&#39;) 
  AND e.sal>(
  SELECT sal
  FROM emp 
  WHERE empno=7521);

**範例五、**查詢與SCOTT從事同一工作且工資相同的僱員資訊

SELECT *
FROM emp e
WHERE (e.job,e.sal) = (
  SELECT job,sal
  FROM emp 
  WHERE ename=&#39;SCOTT&#39;)
  AND ename<>&#39;SCOTT&#39;;

**範例六、**查詢與僱員7566從事同一工作且領導相同的全部僱員資訊

  --查询与雇员7566从事同一工作且领导相同的全部雇员信息
SELECT *
FROM emp e
WHERE (e.job,e.mgr) =(
        SELECT job,mgr
        FROM emp
      WHERE empno=7566
);

**範例七、**查詢與ALLEN從事同一工作且在同一年僱用的全部僱員資訊(包括ALLEN)

--查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)
SELECT *
FROM emp e
WHERE (e.job,to_char(e.hiredate,&#39;yyyy&#39;))=(
           SELECT job,to_char(hiredate,&#39;YYYY&#39;)
            FROM emp
            WHERE ename=&#39;ALLEN&#39;
);

多行單列子查詢
主要使用三種操作符:IN、ANY 、ALL

IN操作

**範例八、**查詢出與每個部門中最低工資相同的全部僱員資訊

--查询出与每个部门中最低工资相同的全部雇员信息
SELECT *
FROM emp e
WHERE e.sal IN(
     SELECT MIN(sal)
    FROM emp
    GROUP BY deptno
);

# **範例九、**查詢出不與每個部門中最低工資相同的全部僱員資訊

--查询出不与每个部门中最低工资相同的全部雇员信息
SELECT *
FROM emp e
WHERE e.sal NOT IN(
     SELECT MIN(sal)
    FROM emp
    GROUP BY deptno
);

FROM子查詢:

FROM字句以後跟上的資料來源不只是資料表,還能夠是一個查詢結果,這就是FROM子查詢
通常FROM子查詢的傳回類型的多行多列的結果集javascript

查詢出平均薪資高於2000的職位名稱以及該職位的平均薪資java

第一种方式:能够使用HAVING字句实现

SELECT job,AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal)>2000;

第二种方式:使用FROM子查询

SELECT job,avgsal
FROM (
  SELECT job,AVG(sal) AS avgsal
    FROM emp
      GROUP BY job) temp
WHERE temp.avgsal>2000;

查詢出有佣金的而且薪資高於佣金的員工資訊:web

SELECT e1.empno,e1.ename,e1.comm,e2.sal
FROM emp e1,emp e2
WHERE e1.comm IS NOT NULL AND e1.comm<e2.sal
AND e1.empno=e2.empno;

總結:

1.FROM 子查詢的資料來源是另一個查詢的結果,這個子查詢的結果至關於一張臨時資料表

2.必須為子查詢定義別名

3.若是要使用子查詢中的字段,則應該使用"別名.字段名"的方式進行引用

select子查詢

select後面的子查詢使用,只能是標量查詢

#案例:查詢每個部門的員工數量

SELECT d.*,(
    SELECT COUNT(*)
    FROM employees
    WHERE employees.`department_id`=d.department_id
)

FROM
    departments d;

#案例:查詢員工號碼=102的部門名稱

SELECT department_name
FROM
employees e
INNER JOIN
    departments d
ON
    e.`department_id`=d.`department_id`
WHERE
    e.`employee_id`=102;

用子查詢

SELECT (
SELECT department_name
FROM
    employees e
INNER JOIN
    departments d
ON
    e.`department_id`=d.`department_id`
WHERE
    e.`employee_id`=102
);
`department_id`=d.`department_id`
WHERE
    e.`employee_id`=102;

用子查詢

SELECT (
SELECT department_name
FROM
    employees e
INNER JOIN
    departments d
ON
    e.`department_id`=d.`department_id`
WHERE
    e.`employee_id`=102
);

以上是怎麼分析Mysql中的巢狀子查詢問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除