1. 程式人生 > 其它 >MySQL基礎篇之子查詢概述

MySQL基礎篇之子查詢概述

子查詢

某些情況下,當進行一個查詢時,需要的條件或資料要用另外一個 select 語句的結果,這個時候,就要用到子查詢。

例如:

為了給主查詢(外部查詢)提供資料而首先執行的查詢(內部查詢)被叫做子查詢。

一般根據子查詢的嵌入位置分為,where型子查詢,from型子查詢,exists型子查詢。

1、where型子查詢

where型子查詢即把內層sql語句查詢的結果作為外層sql查詢的條件.

  • 子查詢要包含在括號內。
  • 建議將子查詢放在比較條件的右側。
  • 單行操作符對應單行子查詢,多行操作符對應多行子查詢。
    • 單行操作符 右邊子查詢必須返回的是單個值,單行比較運算子(=,>,>=,<,<=,<>)
    • 多行操作符 右邊子查詢可以返回多行,但必須是單列,ALL, ANY,IN 其中,ALL和ANY運算子必須與單行比較運算子(=,>,>=,<,<=,<>)結合使用

  IN:等於任何一個

  ALL:和子查詢返回的所有值比較。例如:sal>ALL(1,2,3)等價於sal>1 && sal>2 && sal>3,即大於所有。

  ANY:和子查詢返回的任意一個值比較。例如:sal>ANY(1,2,3)等價於sal>1 or sal>2 or sal>3,即大於任意一個就可以。

  EXISTS:判斷子查詢是否有返回結果(不關心具體行數和內容),如果返回則為TRUE,否則為FALSE。

#子查詢

#where型子查詢

#查詢比“小紅”的工資高的員工編號

SELECT * FROM t_salary

WHERE basic_salary > (SELECT basic_salary FROM t_employee INNER JOIN t_salary ON t_employee.eid=t_salary.eid WHERE t_employee.ename=’小紅’);

#查詢和小紅,小李在同一個部門的員工

SELECT * FROM t_employee

WHERE dept_id IN(SELECT dept_id FROM t_employee WHERE ename=’小紅’ OR ename = ‘小李’);

SELECT * FROM t_employee

WHERE dept_id = ANY(SELECT dept_id FROM t_employee WHERE ename=’小紅’ OR ename = ‘小李’);

#查詢全公司工資最高的員工編號,基本工資

SELECT eid,basic_salary FROM t_salary

WHERE basic_salary = (SELECT MAX(basic_salary) FROM t_salary);

SELECT eid,basic_salary FROM t_salary

WHERE basic_salary >= ALL(SELECT basic_salary FROM t_salary);

2、from型子查詢

from型子查詢即把內層sql語句查詢的結果作為臨時表供外層sql語句再次查詢.

#from型

#找出比部門平均工資高的員工編號,基本工資

SELECT t_employee.eid,basic_salary

FROM t_salary INNER JOIN t_employee INNER JOIN (

SELECT emp.dept_id AS did,AVG(s.basic_salary) AS avg_salary

FROM t_employee AS emp,t_salary AS s

WHERE emp.eid = s.eid

GROUP BY emp.dept_id) AS temp

ON t_salary.eid = t_employee.eid AND t_employee.dept_id = temp.did

WHERE t_salary.basic_salary > temp.avg_salary;

3、exists型子查詢

#exists型

#查詢部門資訊,該部門必須有員工

SELECT * FROM t_department

WHERE EXISTS (SELECT * FROM t_employee WHERE t_employee.dept_id = t_department.did);

4、複製表子查詢(瞭解)

(1)複製表

(1)拷貝表結構

CREATE TABLE newadmin LIKE admin;

(2)拷貝表結構和資料(但約束與索引除外)

CREATE TABLE newadmin AS ( SELECT * FROM admin ) ;

(3)拷貝表結構+資料

CREATE TABLE newadmin LIKE admin;

INSERT INTO newadmin SELECT * FROM admin;

(4)跨資料庫拷貝表

CREATE TABLE newadmin LIKE shop.admin;

CREATE TABLE newshop.newadmin LIKE shop.admin;

(5)拷貝一個表中其中的一些欄位(指定新名),其中一些資料

CREATE TABLE newadmin AS

(

SELECT id, username AS uname, password AS pass FROM admin WHERE id<10

) ;

(6)在建立表的同時定義表中的欄位資訊。

create table tt

(

eid int primary key auto_increment

)

as

(

select employee_id as eid,first_name,last_name,email from employees

);

(2)複製資料

在 INSERT 語句中加入子查詢。

不必書寫 VALUES 子句。

子查詢中的值列表應與 INSERT 子句中的列名對應。

INSERT INTO emp2

SELECT * FROM employees WHERE department_id = 90;

INSERT INTO sales_reps(id, name, salary, commission_pct)

SELECT employee_id, last_name, salary, commission_pct

FROM employees

WHERE job_id LIKE ‘%REP%’;

想了解前端培訓開發技術知識,關注我,有更多精彩內容分享!

文章轉載連結:http://www.atguigu.com/jsfx/4646.html