MySQL子查詢的使用詳解上篇
前言
子查詢指一個(gè)查詢語(yǔ)句嵌套在另一個(gè)查詢語(yǔ)句內(nèi)部的查詢,這個(gè)特性從MySQL 4.1開始引入。
SQL 中子查詢的使用大大增強(qiáng)了 SELECT 查詢的能力,因?yàn)楹芏鄷r(shí)候查詢需要從結(jié)果集中獲取數(shù)據(jù),或者 需要從同一個(gè)表中先計(jì)算得出一個(gè)數(shù)據(jù)結(jié)果,然后與這個(gè)數(shù)據(jù)結(jié)果(可能是某個(gè)標(biāo)量,也可能是某個(gè)集 合)進(jìn)行比較。
需求分析與問(wèn)題解決
#方式一: SELECT salary FROM employees WHERE last_name = 'Abel'; SELECT last_name , salary FROM employees WHERE salary > 1 1 000 ; #方式二:自連接 SELECT e2 .last_name , e2 . salary FROM employees e1 , employees e2 WHERE e1.last_name = ' Abel ' AND e1. ` salary ` < e2. ` salary `
#方式三:子查詢 SELECT last_name,salary FROM employees WHERE salary > ( SELECT salary FROM employees WHERE last_name = 'Abel' );
子查詢的基本使用
子查詢的基本語(yǔ)法結(jié)構(gòu)
子查詢(內(nèi)查詢)在主查詢之前一次執(zhí)行完成。
子查詢的結(jié)果被主查詢(外查詢)使用 。
注意事項(xiàng)
子查詢要包含在括號(hào)內(nèi)
將子查詢放在比較條件的右側(cè)
單行操作符對(duì)應(yīng)單行子查詢,多行操作符對(duì)應(yīng)多行子查詢
子查詢的分類
分類方式1:
我們按內(nèi)查詢的結(jié)果返回一條還是多條記錄,將子查詢分為 單行子查詢 、 多行子查詢 。
分類方式2:
我們按內(nèi)查詢是否被執(zhí)行多次,將子查詢劃分為 相關(guān)(或關(guān)聯(lián))子查詢 和 不相關(guān)(或非關(guān)聯(lián))子查詢 。子查詢從數(shù)據(jù)表中查詢了數(shù)據(jù)結(jié)果,如果這個(gè)數(shù)據(jù)結(jié)果只執(zhí)行一次,然后這個(gè)數(shù)據(jù)結(jié)果作為主查詢的條件進(jìn)行執(zhí)行,那么這樣的子查詢叫做不相關(guān)子查詢。
同樣,如果子查詢需要執(zhí)行多次,即采用循環(huán)的方式,先從外部查詢開始,每次都傳入子查詢進(jìn)行查詢,然后再將結(jié)果反饋給外部,這種嵌套的執(zhí)行方式就稱為相關(guān)子查詢。
單行子查詢
代碼示例
題目:查詢工資大于149號(hào)員工工資的員工的信息
題目:返回job_id與141號(hào)員工相同,salary比143號(hào)員工多的員工姓名,job_id和工資
SELECT last_name, job_id, salary FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141) AND salary > (SELECT salary FROM employees WHERE employee_id = 143);
題目:返回公司工資最少的員工的last_name,job_id和salary
SELECT last_name, job_id, salary FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);
HAVING中的子查詢
顯式員工的employee_id,last_name和location。其中,若員工department_id與location_id為1800的department_id相同,則location為’Canada’,其余則為’USA’。
SELECT employee_id, last_name, (CASE department_id WHEN (SELECT department_id FROM departments WHERE location_id = 1800) THEN 'Canada' ELSE 'USA' END) location FROM employees;
非法使用子查詢
SELECT employee_id, last_name FROM employees WHERE salary = (SELECT MIN(salary) FROM employees GROUP BY department_id);
多行子查詢
也稱為集合比較子查詢
內(nèi)查詢返回多行
使用多行比較操作符
多行比較操作符
代碼示例
題目:返回其它job_id中比job_id為‘IT_PROG’部門任一工資低的員工的員工號(hào)、姓名、job_id 以及salary
題目:返回其它job_id中比job_id為‘IT_PROG’部門所有工資都低的員工的員工號(hào)、姓名、job_id以及id
題目:查詢平均工資最低的部門id
SELECT department_id FROM employees GROUP BY department_id HAVING AVG(salary) <= ALL ( SELECT AVG(salary) avg_sal FROM employees GROUP BY department_id)
SELECT department_id FROM employees GROUP BY department_id HAVING AVG(salary) = ( SELECT MIN(avg_sal) FROM ( SELECT AVG(salary) avg_sal FROM employees GROUP BY department_id ) dept_avg_sal )
到此這篇關(guān)于MySQL子查詢的使用詳解上篇的文章就介紹到這了,更多相關(guān)MySQL子查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysqldump加-w參數(shù)備份數(shù)據(jù)時(shí)需要注意的事項(xiàng)
這篇文章主要介紹了mysqldump加-w參數(shù)備份數(shù)據(jù)時(shí)需要注意的事項(xiàng),需要的朋友可以參考下2014-06-06mysql中插入表數(shù)據(jù)中文亂碼問(wèn)題的解決方法
mysql是我們項(xiàng)目中非經(jīng)常常使用的數(shù)據(jù)型數(shù)據(jù)庫(kù),下面這篇文章主要給大家介紹了關(guān)于mysql中插入表數(shù)據(jù)中文亂碼問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09解決MySQL因不能創(chuàng)建臨時(shí)文件而導(dǎo)致無(wú)法啟動(dòng)的方法
這篇文章主要跟大家介紹了關(guān)于解決MySQL因不能創(chuàng)建臨時(shí)文件而導(dǎo)致無(wú)法啟動(dòng)的方法,文中通過(guò)示例代碼介紹了詳細(xì)的解決方法,對(duì)大家具有一定的的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06mysql密碼過(guò)期導(dǎo)致連接不上mysql
mysql密碼過(guò)期了,今天遇到了連接mysql,總是連接不上去,下面有兩種錯(cuò)誤現(xiàn)象,有類似問(wèn)題的朋友可以參考看看,或許對(duì)你有所幫助2013-05-05Mysql中禁用與啟動(dòng)觸發(fā)器教程【推薦】
在使用MYSQL過(guò)程中,經(jīng)常會(huì)使用到觸發(fā)器,但是有時(shí)使用不當(dāng)會(huì)造成一些麻煩。下面小編給大家?guī)?lái)了Mysql中禁用與啟動(dòng)觸發(fā)器教程,感興趣的朋友一起看看吧2018-08-08