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